Buscando códigos por medio de google

General, Programación 2 Comments

Me vengo enterando que hay un servicio de google para buscar código en diferentes lenguajes de programación. La webpage es: http://google.com/codesearch.

Por ejemplo, para los superhackers: http://google.com/codesearch?q=explot+linux+2.6&hl=es&btnG=Buscar+c%C3%B3digo

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

¿Dónde están los ingenieros de software del mañana?

General, Programación 2 Comments

Leyendo el feed de barrapunto [barrapunto.com] me enteré de un artículo escrito por Robert B.K. Dewar y Edmond Schonberg, dos profesores de la Universidad de Nueva York: “Educación de Ciencias de la Computación: ¿Dónde están los ingenieros de software del mañana?“, donde hacen una crítica sobre las malas tendencias en las universidades al momento de enseñar cursos de programación y me parece buen idea difundir esto a las pocas personas que visitan el blog xD.

En mi caso estoy estudiando Ingeniería en Sistemas (nada del otro mundo) y algunas de las situaciones que señalan, son y están más que por enterados, que en los institutos tecnológicos del país suceden las mismas carencias y hasta más. Me gustó y hasta cierto punto me siento identificado (posiblemente a muchos otros les pase lo mismo) que comentan que nosotros como estudiantes necesitamos no precisamente que nos enseñen muchos lenguajes de programación, sino más que nada a Aprender a Programar, además de que están en nuestras manos entender y aprender todas esas lagunas mentales que los profesores nos dejan en clases.

Aquí un pequeño resumen del artículo en español más las reflexiones del autor del mismo.

En ella, apuntan a Java como “dañino” en el aprendizaje de la programación, así como critican a las universidades por no enseñar lenguajes sólidos como C, C++, Lisp y Ada. En lo personal estoy totalmente de acuerdo con éste artículo. Si bien tengo que admitir que mis estudios formales (por formales quiero decir “en clase”) en programación, en su mayoría, arrastran los defectos que señala este artículo. Sin embargo, siendo conciente de ello, intento profundizar éstos temas fuera de clase, y compensar esas carencias por mi cuenta.

El artículo se hizo eco en varios sitios, y parece un verdadero referente del estado actual de la educación formal en Ciencias de la computación. Como estudiante, recomiendo a todos aquellos que estén estudiando programación (o similar) leerlo.

En su mayoría, éste post es una traducción libre resumida de dicho artículo, así como opiniones y reflexiones personales agregadas.

Foto por Dominik Rusiecki - http://www.dominik-leszno.prv.pl/Según Dewar y Schoenberg, las tendencias más preocupantes que notan en los últimos años de educación, en resumen, son:
1 - Se están reduciendo los requerimientos de matemáticas en Ciencias de la Computación.
2 - El desarrollo de habilidades de programación en varios lenguajes está dando lugar a acercamientos tipo receta usando grandes bibliotecas y paquetes de prop´sito especial.
3 - El set de habilidades resultantes es insuficiente para la industria del software de hoy.

Creo que esto se coincide con otros posts en los que he hablado sobre “programadores express”. Hoy en día, para preparar a los “programadores” a salir al mercado laboral lo antes posible, se enseña lo básico para poder trabajar y listo. Éste artículo en general ataca a Java, ya que es el lenguaje usado en varias universidades para la introducción al curso, pero se aplicaría a cualquier lenguaje de alto nivel, sobre todo .NET.

En los comentarios de la noticia en Slashdot, un usuario comenta:
“desafortunadamente no llega lo suficientemente lejos al núcleo del problema, el cual es que las universidades de hoy están produciendo en masa lo que los empleadores quieren, en vez de los pensadores del mañana. Los empleadores no quieren más que zánganos reemplazables que vengan con una habilidad fácilmente definible la cual puedan reemplazar cuando aparezca una nueva palabra de moda. Esto NO ES a lo que las universidades deberían apuntar.”

Joel Spolsky (de joelonsoftware.com), aporta la idea de crear un bachillerato en artes para la programación, de ésta forma atraer estudiantes a Ciencias de la computación. Comenta cómo algunas universidades ya hacen algo similar, y plantea mientras tanto cuántos departamentos de ciencia han ganado una reputación gracias a lo que han escrito: X Window de MIT, Athena y la Lisp Machine, entre otros. “¿Dónde están esos hoy? ¿Qué nos han dado las universidades recientemente? ¿Cuál es el mejor colegio para un graduado de secundaria que ama programar pero no está emocionado con cálculo lambda?”

Respecto a Java, el artículo dice: “Debido a la popularidad en aplicaciones web y la facilidad con la que novatos pueden producir programas gráficos, Java se ha convertido en el lenguaje más usado en los cursos introductorios a la programación.”
Consideran esto “un intento desviado de hacer la programación más divertida, tal vez en reacción a la reducción de anotados a Ciencias de la computación desde la caída de las .com.”

Las observaciones fueron que “a los estudiantes les resultaba difícil escribir programas sin interfase gráfica, no sentían la relación entre el programa fuente lo que el hardware haría, y (más dañino) no entendían las semánticas de punteros en absoluto, lo que hace muy desafiante el uso de C en programación de sistemas”.

Proponen éste principio: “La irresistible belleza de programar consiste en la reducción de procesos complejos formales a un pequeño set de operaciones primitivas. Java, en vez de exponer ésta belleza, anima a los programadores a enfocar la solución de problemas como un plomero en una ferretería: buscar en una multitud de cajones (paquetes) encontraremos algún dispositivo (clase) que hace más o menos lo que queremos. Cómo lo hace no es interesante! El resultado es un estudiante que sabe cómo armar un programa simple, pero no sabe cómo programar.”

Continúan su artículo con “Un verdadero programador puede escribir cualquier lenguaje“, en mi opinión, una verdad absoluta de la programación. “Por ejemplo, un verdadero programador debería poder programar herencia y envío dinámico en C, esconder información en Lisp, bibliotecas de manipulación de árboles en Ada, y recolector de basura en cualquier cosa menos Java.” Continuan con:

Porqué C Importa
“C es el lenguaje de bajo nivel que todos deben conocer”. En muchos lugares he leído “el lenguaje fundamental”, y otras frases aludiendo a C. “Puede ser visto como un lenguaje assembly portable, y como tal, expone la máquina subyacente forzando al estudiante a entender claramente la relación entre el software y el hardware. El análisis de performance es más directo, porque el costo de cada declaración está claro. Finalmente, compiladores (GCC por ejemplo) facilitan examinar el código assembly generado, lo cual es una excelente herramienta para entender el lenguaje y arquitectura de máquina.

Porqué C++ importa
C++ trae a C los conceptos fundamentales de la ingeniería del software moderno: encapsulación con clases y namespaces, esconder información a través de operaciones y datos protegidos y privados, programar por extensión a través de métodos virtuales y clases derivadas, etc. C++ también impulsa la administración de almacenamiento lo más lejos posible sin recolección de basura completo, con constructores y destructores.

Porqué Lisp Importa
Todo programador debe estar cómodo con programación funcional y con la importante noción de transparencia referencial. Un beneficio adicional es que el programa está escrito lo que suma a sintaxis abstracta, a saber la interpretación interna que usan la mayoría de los compiladores entre parsing y generación de código. Finalmente, Lisp es manejable a una definición propia muy compacta. Ver es intérprete de Lisp completo escrito en Lisp es una revelación intelectual que todo científico de la computación debería experimentar.

Porqué Java importa
A pesar de los comentarios negativos sobre Java, creen que tiene un rol importante en la instrucción de Ciencias de la Computación. Mencionan dos aspectos del lenguaje que deben ser parte del set de habilidades del programador:
1 - Entender programación concurrente (para la cual los threads o hilos proveen un modelo básico a bajo nivel).
2 - Reflection, a saber el entendimiento de que un programa puede ser instrumentado para examinar su propio estado y para determinar su propio comportamiento en un ambiente que cambia dinámicamente.

También describen que Ada es un lenguaje importante por otras tantas características, aunque ésto puede ser tomado con pinzas, viniendo del presidente y vicepresidente de AdaCore…

Para resumir, admiten que el lenguaje de programación no lo es todo. Concluyen algo como “un buen currículum incluirá una variedad de lenguajes, entendimiento de procesos de programación, en vez de un resumen de lenguajes populares percibidos”. Se sienten un poco consternados por la popularidad de lenguajes de scripting en cursos introductorios (Javascript, PHP, Atlas) quienes cargan con los defectos que le señalan a Java: “su ausencia de tipado fuerte lleva a un estilo de programación por prueba-y-error y les impide a los estudiantes adquirir la disciplina de separar el diseño de las interfaces de la especificación”.

Finalizan con que enseñar los lenguajes correctos no es suficiente. Los estudiantes deben ser expuestos a las herramientas para construír programas confiables a gran escala. Como científico de computación, deberías tener algún conocimiento de cómo se alcanza el alto nivel de confiabilidad. “Nuestros estudiantes deben estar listos para este nuevo mundo”.

Hay que entender entonces, que el lenguaje de programación con el que se empieza, si bien probablemente influya el resto de la carrera, no debe ser lo más importante. Más que un lenguaje, hay que aprender a programar. El problema radica también en enseñar UNICAMENTE un lenguaje, que de todas formas, depende del estudiante. Si uno se queda solo con lo que aprende en clase… Si aparte de tener cursos/profesores malos, uno no intenta ir más allá de lo que le están inculcando, no va a haber mucho lugar para evolucionar como programador.


[Mirar fuente]

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Hoy domingo….

GNU/Linux, General, Programación 5 Comments

Hoy domingo estoy jugando con vim ;) .

Vim

vim 2

Ustedes deberían hacer lo mismo :P .

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5 out of 5)
Loading ... Loading ...

GDB para depurar programas en C/C++ en GNU/Linux

GNU/Linux, Programación 5 Comments

Miremos la descripción de gdb sacada del mismo man:

El proposito de un depurador como GDB es permitir al usuario ver lo que
esta ocurriendo “dentro” de otro programa mientras que se esta ejecu-
tando — o lo que estaba haciendo en el momento que fallo.

GDB puede hacer cuatro tipo de cosas (mas otras cosas para dar soporte
a estas) para ayudarte a capturar errores en el acto:

o Comenzar tu programa, especificando cualquier cosa que pueda
afectar a su comportamiento.

o Hacer que tu programa se pare al cumplirse las condiciones
especificadas.

o Examinar que ha pasado, cuando tu programa se ha parado.

o Cambiar cosas de tu programa, de tal manera que puedas experi-
mentar corrigiendo los efectos de un fallo y continuar para des-
cubrir otros.

Generalmente todas las distribuciones GNU/Linux ya tendrán este depurador instalado o en su defecto, lo encontraran en su administrador de paquetes preferido/formato de paquetes preferido (deb,rpm, etc..).

Me entere del programa entrado al canal de IRC de gentoo en freenode.org, la cuestión es que probaba el proyecto de fin de semestre para “Programación de Sistemas” en Gentoo, como la interfaz gráfica es usando Ncurses no creí que hubiera error alguno y bueno, paso lo que menos me imagine el programa brinco y aborto la ejecución al iniciar la compilación (el proyecto es un “Editor de Textos” para implementar el manejo de un compilador :P ). Entre mi dije, demonios!! yo que creía que todo iba ser miel sobre hojuelas :( , en fin, después de probarlo hace unos minutos me encontré con el error y supe solucionar :D .

Ahora empecemos con la parte práctica que es la más me gusta, para compilar un código con información útil para gdb hay que hacerlo de la siguiente manera (opción: –ggdb):

g++ [nombre].cpp -lncurses -ggdb -o [nombre_binario]

Para iniciar gdb con el binario es tan simple como poner el comando con el mismo nombre y el ejecutable a depurar:

Se puede ejecutar gdb sin argumentos ni opciones; pero la manera mas
comun de comenzar GDB es con uno o dos argumentos, especificando un
programa ejecutable con el argumento:

gdb programa

soullost@UnderHouse ~/c++/curses/editor $ gdb [nombre_binario]
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb)

Aquí empieza lo interesante.

Poner un breakpoint (lugar donde se detendrá el programa en ejecución para hacer acciones de depuración):

break [fichero:]funcion
Pone un punto de ruptura en funcion (en fichero).

(gdb) break separar
Breakpoint 1 at 0x804ad44

Para iniciar la ejecución de programa:

run [arglist]
Comienza tu programa (con arglist, si se especifica).

(gdb) run

Si establecimos un breakpoint, se detiene el programa y posteriormente después de realizar algunas acciones (como mirar valor de variables, adelantar unas líneas, etc..) queremos que el programa se siga ejecutando normalmente hacemos:

c Continua ejecutando tu programa (despues de parar, p.e. en un
punto de ruptura).

 (gdb) c 

Para mirar la pila de los eventos guardados por gdb:

bt Backtrace: muestra la pila del programa.

(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xb7cb7101 in raise () from /lib/libc.so.6
#2  0xb7cb88e8 in abort () from /lib/libc.so.6
#3  0xb7cedcbb in __libc_message () from /lib/libc.so.6
#4  0xb7cf3a00 in malloc_printerr () from /lib/libc.so.6
#5  0xb7cf56f9 in free () from /lib/libc.so.6
#6  0x08049bd8 in analizadorLexico ()
#7  0x0804ae76 in separar ()
#8  0x0804c727 in main ()

En este caso nos menciona más o menos lo siguiente:

#2 Abortado
#3 Aviso Error
#4 Aviso Error
#5 Ejecución de la función free()
#6 Entra a analizadorLexico()
#7 Entra a separar()
#8 Entra a main

Ya nos dijo que el error existe después de llamar a free(), para asegurarnos ejecutamos nuevamente el programa con las opciones next y step:

next. Nos dice en que línea va ejecutando el programa pero con un peculiaridad, si existe la llamada a una función simplemente la ejecuta y continua con la línea posterior después de la llamada a la función.

step. Lo mismo que lo anterior pero este si entra a la función y no simplemente la ejecuta, por lo que si se topa con alguna, entrará a la función y se ejecutará paso a paso desde la primera línea y al terminar regresará al punto donde fue llamada la función para continuar.

Ejemplo, continuando con la depuración del editor que nos causaba problemas:

(gdb) next
660                     while(ptrToken){
(gdb) next
661                             strcpy(tokens[z].nombre,ptrToken);
(gdb) next
662                             tokens[z].linea=i;
(gdb) next
663                             z++;
(gdb) next
664                             ptrToken = strtok(NULL," ");
(gdb) next
660                     while(ptrToken){

Cuando se usa step y pasa a ejecutar una función paso a paso.

(gdb) step
analizadorLexico (token=0x804f7a0 "inicio", linea=0) at main.cpp:702
702             int w=0;

Si en algunas casos queremos mirar el valor de alguna variable podemos usar print:

print expr
Muestra el valor de una expresion.

(gdb) print tokens[i]
$1 = {nombre = "inicio\000\000\000", linea = 0}

Y bueno, es algo básico que me ayudó a mirar el error que provocaba que el programa abortara la ejecución, el error tuvo que ver con la llamada a free() y que con comentarlo bastó para solucionarse :shock: y fue bastante raro porque en Dev C++ no provoco error alguno y el programa en windows corre bien.

Corriendo el programa en gnome-terminal :D

Editor

Si están interesados en más información sobre gdb pueden mirar:
man gdb (consola)
info gdb (consola)
http://www.ldc.usb.ve/~figueira/Cursos/ci3825/taller/material/gdb.html
http://www.ac.uma.es/educacion/cursos/informatica/FundSistOp/gdb.pdf

Hay bastante más información en google :P , nos vemos ;) .

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5 out of 5)
Loading ... Loading ...

Instalando PDCurses en Dev-C++

Programación No Comments

Nada del otro mundo, de hecho yo llegué a pdcurses buscando en las actualizaciones :P xD, bueno hay que hacer lo suiguiente:

1) Tener instalado Dev-C++ (más que obvio no?).

http://superb-west.dl.sourceforge.net/sourceforge/dev-cpp/devcpp-4.9.9.2_setup.exe

DevC++

2) Una vez instalado vamos Herramientas > Buscar Actualizaciones, ahi seleccionamos de mirror a devpaks.org, con todos los grupos y damos clic en Check for updates..

3) Después les mostrará una lista, buscamos pdcurses (casí al inicio) y clickeamos xD en Download selected.

PDCurses Download

4) Seguir el asistente para instalar.

PDCurses Instalar

5) Ya que termine la instalación satisfactoriamente, vamos a crear un nuevo proyecto: Archivo > Nuevo > Proyecto, seleccionamos la pestaña Other y :o dice PDCurses xD. Escribimos un nombre de proyecto y seleccionamos si va ser escrito en c o c++.

PDCurses Proyecto

6) Gurdamos en la carpeta que más nos guste y es todo :)

PDCurses View

Podemos ejecutar el ejemplo que ha creado (F9) :P .

Nos vemos!!

p.d El que todavía utilice TurboC lo puteamos 8O :evil:

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

« Previous Entries Next Entries »