- C++ no es C. Usa el que más te convenga en cada momento.
- Si programas en C++, usa su librería estándar, STL, siempre que puedas.
- No reinventes la rueda, si necesitas mayor funcionalidad, usa librerías que la proporcionen y que estén en un estado de madurez suficiente, como la librería
boost. - No se recomienda que los castings se hagan de forma implícita o de la forma que lo hace C. Se recomienda usar su nueva sintaxis:
static_cast,dynamic_cast,const_castyreinterpret_cast. - Un casting con
static_castse evalúa en tiempo de compilación y es el más parecido al casting implícito de C. Se usa para convertir un tipo de dato en otro. - Un casting con
dynamic_castse usa para hacer castings en tiempo de ejecución pero sólo para objetos polimórficos, esto es, para recorrer la jerarquía de clases. No funcionará con tipos básicos. - Un casting con
const_castno cambia de tipo sino que cambia los modificadoresconstyvolatile. - Un casting con
reinterpret_castse usa para hacer cambios de tipo a nivel de bits, es decir, para convertir entre tipos totalmente distintos. - Una función dentro de una clase que tenga el modificador
const(por ejemplovoid MiClase::MiFuncion() const { ... }) no modifica el contenido del objeto (no modifica los campos del objeto). Esto se usa para ejecutar funciones dentro de instancias constantes. - Una función virtual pura debe ser declarada como
virtuale igualada a cero dentro de la clase:virtual void MiFuncionVirtualPura() = 0;. Este tipo de funciones deben ser implementadas en las clases derivadas. Además, no se pueden instanciar clases que tengan funciones virtuales puras. - Las variables miembro (propiedades) estáticas de una clase deben ser definidas fuera de la clase para que funcionen correctamente (si no se definen así, el error lo produce el linker:
Undefined reference to MiClase::count):class MiClase { public: static int count; } int MiClase::count = 0; - Las clases y funciones con plantillas se deben declarar e implementar en el mismo archivo ya que, como el código se genera en tiempo de compilación, si se declara en un
.hy se implementa en un.cpp, es el linker el que no encuentra el código generado. Hay más soluciones, pero ninguna es buena del todo. - Usa el sistema de gestión de excepciones de C++ y evita en lo posible el uso de valores de retorno indicando errores y sentencias
ifya que son mucho más propensas a errores. - Las excepciones deben representar el error que se produce, no quién las lanza o desde donde se lanzan.
- Siempre que puedas, usa objetos creados en el
stacken lugar de en elheap. Con esto evitarás fugas de memoria (memory leak en inglés) ya que los objetos se destruyen cuando finaliza el ámbito de los mismos. - Usa herramientas automatizadas para probar y depurar las aplicaciones (como
valgrindpara fugas de memoria). - Nunca confies en que lo has revisado todo.
Archivo para la categoría ‘Lenguajes’
17 pequeñas notas sobre programación en C++
Palabras con “ch”
Esta es la entrada tonta del día que, gracias a que se ha presentado la Nueva Gramática de la Lengua Española, se me ocurrió poner todas las palabras bisílabas que sólo utilizasen la extinta letra che
, hoy la ce hache:
chacha, chachi, chacho, cheche, Chechu, chicha, chiche, chichi, chicho, chocha, chocho, chuche, chucha y chucho.
Al final han salido 14, aunque algunas no están en el diccionario de la RAE, pero seguro que a nadie se le escapa el significado. Además, tampoco he contado las que tienen más vocales o consonantes entre estas. Ahora sólo se me ocurre Chencho
(el hijo pequeño de La gran familia). ¿Alguna más?
Y hasta aquí ha llegado la entrada chorra del día
.
Programando con estilo
Google ha liberado el código fuente de su actualizador, Google Update, es decir, la aplicación que actualiza todas las aplicaciones que tengas instaladas de Google; y lo ha hecho bajo el nombre de Omaha y con licencia Apache 2.0.
Pero la cuestión que quiero comentar es que hayan dado un buen paso hacia delante (que lo han hecho, por cierto), sino la calidad del código en sí (suelo echar un vistazo al código fuente de los proyectos libres, simplemente por ver como están hechos).
Independientemente de si está bien programado o no, de si han diseñado bien la arquitectura o no, la calidad del código es impresionante: está limpio, ordenado, bien indentado, con espacios entre operadores, con las llaves correctamente colocadas,… vamos, como a mi me gusta.
Habiendo visto más código fuente, sobre todo de proyectos GNU, este es uno en los que mejor está escrito el código. De hecho, se parece mucho al código de las aplicaciones que se escribían para el BeOS (que también eran en C++). Lo único que hecho en falta es que el tipo de dato que retorna una función no esté en una línea distinta (la anterior) a la del nombre y parámetros de la función, algo que se estilaba mucho en BeOS.
Sin duda es una buena noticia el hecho de que se liberase el código, pero también es buena noticia que haya tanta calidad en el mismo, ya que con el peso que tiene Google ahora mismo como ejemplo de hacer las cosas (no se si para bien o para mal, pero tiene peso) queda claro que habrá muchos seguidores que hagamos código similar con lo que nuestros proyectos ganarán en legibilidad y mantenibilidad.
Guía de estilo de programación
Después de mucho tiempo sin hacerla y después de también mucho tiempo rondando por mi disco duro, he puesto en el blog mi Guía de Estilo de programación.
Este documento muestra el estilo de programación que yo sigo a la hora de realizar mis proyectos, tanto personales como laborales.
Esta guía es sólo una recomendación a seguir, nadie está obligado a hacerlo, pero siguiendo estas recomendaciones (u otras recomendaciones pero siendo siempre coherente) se consigue que el código fuente de nuestros proyectos sean más legibles y, sobre todo, más mantenibles.
Si te gusta que tu código esté bien escrito, échale un vistazo y comenta tu punto de vista; aunque si has llegado hasta aquí seguro que también tienes la tuya propia y tu código ya sale “bien visto”
.
“Hola mundo!” en diferentes lenguajes de programación

“Hola mundo!” en Piet (Wikipedia)
Página descubierta desde Kabytes donde se implementa el famoso “Hola mundo!” en 421 lenguajes de programación diferentes.
Los más divertidos son los llamados lenguajes de programación esotéricos como el Piet, el Brainfuck, el Ook! o el Whitespace. Pero el resto también tienen su gracia, sobre todo los ensambladores de varias máquinas.
Además de esto, también tenemos el programa “99 botellas de cerveza” (“99 bottles of beer” en inglés, que es algo así como “Un elefante se balanceaba…” pero restando. Aquí sabemos que terminaremos algún día) implementado en 1259 lenguajes de programación diferentes (no sabía que había tantos).
Me ha llamado la atención la implementación en Delphi. Tan sencillo y amigable él, y aquí lo flipé.
Y para terminar de rayar la cabeza, recordemos el ininteligible “Hola mundo!” en C ofuscado.
P.D.: Yo que quería hacer mi propio lenguaje de programación al que llamaría D++ (porque D ya está cogido) y resulta que D++ también está cogido. ¡Leches!
Lenguajes de programación
Existen dos tipos de lenguajes de programación: por un lado, aquellos de los que la gente se queja todo el rato; por otro, los que nadie utiliza.
Bjarne Stroustrup, científico de la computación y desarrollador del lenguaje de programación C++.
Tod@s
La actual tendencia al desdoblamiento indiscriminado del sustantivo en su forma masculina y femenina va contra del principio de economía del lenguaje y se funda en razones extralingüísticas. Por tanto, deben evitarse estas repeticiones, que generan dificultades sintácticas y de concordancia, y complican innecesariamente la redacción y lectura de los textos.
Lo dice la RAE (negritas mías) y yo lo vi primero en DesEquiLIBROS.
Y como odio que se use la arroba (@) para simbolizar el género neutro. Llamadme Talibán del lenguaje (que no lo soy, que también cometo mis faltas) pero hay que cosas con las que no puedo.
Visor de expresiones regulares
strfriend es una página que te muestra la representación de la expresión regular que le indiques. Muy útil cuando quieres entender lo que hacen (aunque ya de por sí son complicadas de hacer como para entenderlas
). De todas formas, mejor planteároslo dos veces antes de usarlas.
En el dibujo anterior está la expresión ^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;,](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$ que valida múltiples direcciones de correo electrónico separadas por punto y coma.
Y no me acuerdo donde lo vi…
Curso de programación en Pascal
Buscando por el disco duro, como dije ayer, he encontrado el curso de Pascal que hicimos mi amigo Héctor (el que me da el hosting del blog) y yo en el año 2000 para la asociación de estudiantes (ya extinta, por desgracia) Unicyber.
Este curso es muy básico y sencillo tratando los elementos básicos del lenguaje incluyendo los tipos de datos, las estructuras de control y poco más.
Hay que tener en cuenta que esto es del 2000 (o antes, pero la fecha de creación del documento es de ese año) y que no ha sido modificado desde entonces, lo pongo aquí tal cual estaba. Además, había sido desarrollado por dos alumnos de segundo de informática con lo que el número de errores puede ser incontable (de hecho, en el pequeño vistazo que le di para imprimirlo ya he descubierto alguno).
No pretendo que aprendáis a programar en Pascal con él pero este curso se impartió en la asociación a 18 personas para la asignatura de E.D.I. y creo que aprobaron todas (bueno, igual el 90%, pero aún así es bastante, creo).
Curso de Programación en Pascal (PDF, 189 KB)
Por cierto, este documento no tiene licencia en él pero se aplica la misma que tiene el blog: Creative Commons: Reconocimiento, No comercial y Compartir bajo la misma licencia.
25 años de Turbo Pascal
Leo en Barrapunto que este se cumplen 25 años del lanzamiento de Turbo Pascal 1.0 para MS-DOS.
¡Qué recuerdos! Yo aprendí en la carrera a hacer listas lineales doblemente enlazadas en Pascal. En este lenguaje fueron mis primeros pasos en este mundo de la programación. Yo puedo presumir de que no empecé con BASIC (menos mal).
Incluso impartí un curso de Pascal (bastante simplón pero funcionó bastante bien) en una asociación de la Universidad. No lo he encontrado por la red (aunque estaba) así que en cuanto lo encuentre por el disco duro de casa lo pongo por aquí.
Luego, con eso del Windows y las interfaces gráficas, llegó el Delphi que no era más que Pascal orientado a objetos y con algún que otro añadido. Además, claro, de su entorno de desarrollo que permitía poner botones y demás controles de forma visual.
En Delphi tengo muchas aplicaciones hechas. Pero muchas. Lo único es que no están «hechas» del todo sino a medio hacer. Las únicas que se podrían permitir el lujo de ser para la comunidad son las que tengo en los downloads (y no mucho).
Después de la Universidad, con eso de que empiezas a trabajar, las empresas ya no usan tu querido Delphi, así que hay que moverse para no quedarse obsoleto. Y me moví hacia las tecnologías Web. Ahora todo toca en PHP, HTML, CSS, JavaScript, algo de Java,… pero vamos, que, de vez en cuando, si tengo tiempo, siempre le hecho un vistazo a todo lo que tengo hecho en Delphi. Incluso, a veces, hasta termino alguna de esas interminables aplicaciones.
Por cierto, creo que el Pascal es el mejor lenguaje de programación para aprender a programar. Sí, no me llaméis radical. Pero su sintaxis sencilla, su media potencia con los punteros (media pero válida para aprender) y su posibilidad de usar programación estructurada y programación orientada a objetos hace de él un buen lenguaje de aprendizaje. Y luego, si quieres hacer cosas más profesionales, usa Delphi (que también está la versión Turbo Delphi que es gratis).
Y si crees que no es libre, que sólo es para Windows, que… no, no, no. También tienes el FreePascal. Sintaxis extendida pero todo funcionando. Para aprender os recomiendo que lo probéis. Si ya sabéis programar y queréis hacer aplicaciones profesionales… mejor id a tecnologías Web. De momento es el futuro.
Fallo de segmentación en PHP
Haciendo un pequeño proyecto en PHP siguiendo el paradigma de la orientación a objetos, hoy me he encontrado con un pequeño problema del que PHP no te avisa.
Bueno, te avisa mostrando la pantalla del navegador totalmente en blanco (no genera ningún HTML) y si lo ejecutas mediante CLI te dice Fallo de segmentación (core dumped). Este es de los errores más bonitos que te pueden ocurrir programando, sobre todo cuando no eres tú el que hizo el software que falló.
Usando un poco el gdb como indican en la documentación de PHP cuando se produce un segfault, he visto que existen varias funciones que siempre se ejecutan en bucle infinito: zend_get_constant_ex(), zval_update_constant_ex() y zval_update_constant().
Como mi aplicación utiliza muchas constantes (no me gusta poner cadenas por el código; cada vez que una cadena se repite la refactorizo a una constante) me dio que pensar y al final (después de bastante rato) descubrí el error. Más o menos, para que lo podáis comprobar, bastaría con ejecutar en Linux el comando php5 -f segfault.php siendo segfault.php el siguiente código:
#!/usr/bin/php5
<?php
class BaseClass {
const THE_CONSTANT = "beosman";
}
class DerivedClass extends BaseClass {
const THE_CONSTANT = self::THE_CONSTANT;
function __construct() {
echo "THE_CONSTANT = ".self::THE_CONSTANT."\n";
}
}
$class = new DerivedClass();
?>
Para más información, estoy usando PHP versión 5.2.1 (Zend Engine v2.2.0) en Ubuntu 7.04 (kernel 2.6.20-17-generic).
Y por si alguien quire fuchicar un rato más porque no se queda agusto, para ejecutar gdb hay que usar el comando gdb php5 y luego, dentro de su propia consola hay que ejecutar el comando run /ruta/al/archivo/php/que/falla.php -e. Una vez que falle, hay que indicarle a gdb que imprima un backtrace mediante el comando bt.
QR Code
Navegando por la red he visto los códigos QR que son algo parecido a los códigos de barras que vemos todos los días pero estos son en dos dimensiones.
¿Y qué tienen de especial estos? Pues que pueden contener mucha más información que un código de barras normal. Un código de barras EAN13 puede contener hasta 13 caracteres numéricos mientras que un código QR puede contener hasta 4296 caracteres alfanuméricos (ASCII) aunque también puede almacenar otros tipos de datos (como números sólo, caracteres chinos y datos binarios).
Aquí en España están muy poco extendidos estos códigos pero en Japón están a la orden del día ya que aparecen en casi cualquier lado y, gracias a aplicaciones para móvil que los reconocen (en España algunos móviles ya las tienen), los usuarios tienen mucha información al alcance de su mano, como URL’s, programación de televisión, información de carteles, etc.
Lo que más me ha sorprendido (y gustado) es que se lleva mucho incluir un código QR en las tarjetas de visita conteniendo la información de una vCard, una tarjeta de visita electrónica que fácilmente se puede importar a los principales programas de PIM como iCal de Apple u Outlook de Microsoft.
Para decodificarlo hay que tener una aplicación que lo haga. Para PC solo he encontrado QuickMark for WebCam (está al final del todo de la página y hay que registrarse para bajarlo) que con una webcam puedes leer dichos códigos y te muestra su información.
Pero para el móvil hay muchos más, como i-nigma, Kaywa Reader o Semacode.
Y, como no, con un generador online de códigos QR, pues me he hecho mi propio código con mi vCard:
Aquí, lógicamente, hay poca información, vamos, la básica que se puede ver en este blog, pero en realidad se puede incluir bastante más.
Y como para friki yo, pues estoy pensando en hacerme una camiseta con el código. Ya os contaré
.
Cosas del ANSI C
Revisando el código fuente de la implementación del compilador de Ruby (así, por aprender) he visto algo en C que no había visto nunca (di que tampoco es que tenga mucha experiencia en C) y es la diferencia entre la declaración de parámetros entre ANSI C (C89) e ISO C (C99):
#include <stdio.h>
// compila con cualquier tipo de parámetros en la llamada (ANSI C)
int
testFunction1(parm1,parm2)
int parm1;
int parm2;
{
printf(“1. Funciona? parm1 = %d, parm2 = %d\n”,parm1,parm2);
printf(“1. En serio? parm1 = %s, parm2 = %d\n”,parm1,parm2);
return 0;
}
// compila pero sólo se le pueden pasar parámetros de tipo entero (ISO C)
int
testFunction2(int param1,int param2) {
printf(“2. Functiona? param1 = %d, param2 = %d\n”,param1,param2);
return 0;
}
int
main(void) {
printf(” -> testFunction1()\n”);
// funciona con cualquier tipo de parámetros (ANSI C)
testFunction1(“vida”,42);
printf(” <- testFunction1\n”);
// funciona sólo con enteros, con otro tipo no compila (ISO C)
printf(” -> testFunction2()\n”);
testFunction2(‘vida’,42);
printf(” <- testFunction2\n”);
return 0;
}
Con la primera forma, el tipo de los parámetros fuera de la declaración de la función, cuando se llamada a dicha función se le le puede parasar cualquier tipo de parámetros e, internamente, los convertirá al tipo declarado posteriormente aunque, como se puede ver en el segundo printf, dependiendo de si le pasas un %d o un %s, imprimirá una cosa u otra aunque su tipo sea distinto.
En la segunda forma, es el propio compilador el que muestra un error cuando pasas un parámetro que no coincide con el tipo declarado.
La salida es más o menos la siguiente (se puede ver que nuestro parámetro, aunque posteriormente declarado como int, también contiene la cadena vida):
-> testFunction1()
1. Funciona? parm1 = 134514096, parm2 = 42
1. En serio? parm1 = vida, parm2 = 42
<- testFunction1
-> testFunction2()
2. Funciona? param1 = 1986618465, param2 = 42
<- testFunction2
Para que esto compile también hay un pequeño truco y es que la palabra «vida» como primer parámetro de la segunda función va entre comillas simples, esto es, en lugar de tomarse como una cadena (char[] para ser exactos) se toma como un caracter (char), sí, como un caracter de 32 bits en lugar de 8 (es una palabra con 4 letras, un byte por letra). Por supuesto, con el correspondiente warning, pero compila.
Y aunque esto teóricamente es del C antiguo, viene muy bien para pasar cualquier tipo de parámetro a una función en lugar del famoso void*. El problema es saber, dentro de la función, qué es lo que llega.
No se si esta anotación es útil, pero al menos es curioso. El saber nunca está demás.
Rendimiento de PHP
Cuantas veces habré oído que si PHP es lento, que si el código es churrigueresco, que si las aplicaciones con PHP no son buenas… Y todo son bobadas.
Para lo de mal código la respuesta es bien sencilla: es el programador el responsable del código bueno o malo, no el lenguaje. Yo, al menos de momento, en todas las aplicaciones serias (las páginas web para el amigo del amigo pues como que no) hago código en condiciones. Y con «en condiciones» me refiero a utilizando un framework MVC, creando objetos de negocio y utilizando, siempre que algún problema se pueda solucionar con alguno de ellos, los patrones de diseño.
Para lo del rendimiento tenemos una página, The PHP Benchmark, donde nos lo ponen un poco más claro. Incluso tenemos una traducción en Sentido Web:
- Realizar un
foreaches siempre más rápido y si no recuperamos la clave del array mejor aún. - Un
fores más rápido si no calculamos previamente en una variable el tamaño del array que recorremos. Además,sizeofes más rápido quecount. - Cuando vamos a asignar el valor de una posición de un array a una variable para tratar con ella, es conveniente hacerlo por referencia (
$alias = & $array[$i]). - No es más rápido crear un objeto como referencia (
$obj =& new SomeClass();). ifes más rápido queswitch/casey ligeramente más rápido es usar===que==(en la referencia en español está equivocado).- Parece ser que el uso de comilla simple o doble en las últimas versiones se ha mejorado y no existe apenas diferencia.
- Contrariamente a lo que ponía en el manual hace tiempo, un
echo "aa"."aa"."aa";(echode una cadena concatenada) ahora es más rápido que elecho "aa","aa","aa";(echode varias cadenas separadas por coma). No sucede lo mismo para variables donde el tiempo viene siendo similar.
Además, si queremos acelerar un poquito más nuestro código PHP, tenemos lo que se llama un opcode cacher, que es un plugin que cachea el código PHP pero ya precompilado en su bytecode, con lo que en sucesivas llamadas al script, no es necesario recompilarlo y ejecutarlo sino sólo ejecutarlo ya que lo coge precompilado de la caché.
Dos ejemplos de estos plugins son eAccelerator y XCache. eAccelerator lo he probado y funciona bastante bien (no es la panacea pero sí que se nota a simple vista) y ahora quiero probar con XCache.
E independientemente de todo esto del rendimiento tengo que decir que PHP es un lenguaje más. Un lenguaje como otro cualquiera, con sus ventajas e inconvenientes y tan potente o útil como el partido que le pueda sacar el programador. Porque herramientas, plugins, frameworks y clases reusables son lo que sobra para hacer buen código. Ahora ya no hay excusa.
C ofuscado
int i;main(){for(;i["]<i;++i){––i;}"];read(‘-’-'-’,i+++"hell\
o, world!\n",’/'/’/'));}read(j,i,p){write(j/p+p,i–––j,i/i);}
Esto es un pequeño programa en C… o eso dicen. Pero ¿qué hace exactamente? Pues según ponía en la página web donde lo encontré (que ni me acuerdo porque lo tengo en el disco duro desde hace mil años), imprime "hello, world!" por pantalla. Típico.
Esto es un programa en C, como he dicho antes, pero en C ofuscado. Os podréis imaginar a los más frikis programando esto. Pues si no lo hacéis ya podéis ir empezando porque encima hay un concurso a nivel mundial: IOCCC.
Como no, lo probé. Bueno, yo no, pero lo haré. Una amiga sí e inicialmente en Windows no compila. Dice que no se encuentra la función read(). A ver si tengo un rato y lo pruebo en Linux y pongo el resultado. Y, ya de paso, si alguien me lo explica pues estupendo…
P.D.: Si alguien es tan friki geek como yo y prueba a compilarlo, tened cuidado con las comillas simples y dobles a copiar y pegar en el archivo .c. Ale, ya me contáis a ver qué tal os va…
P.D.2: Y si habéis probado esto y os gustan las cosas ofuscadas, también podéis probar a programar con algún lenguaje esotérico como Ook! o Brainfuck.
Actualización 23/01/2008: He probado a compilar el programa en Linux con gcc y funciona a la primera y sin problemas imprimiendo hello, world!. ¡Y sigo sin entenderlo! Podéis probar vosotros si queréis.
D 2.0
Hace menos de 7 meses que el lenguaje de programación D había llegado a su versión 1.0 después de mucho tiempo y ahora resulta que han saltado directamente a la versión 2.0. Impresionante.
Leyendo la lista de correo (no muy asiduamente, la verdad, tiene muchísimo tráfico) me entero de que ha habido un cambio grande en la arquitectura del compilador para el manejo de las variables y parámetros constantes aunque también parece ser que se seguirán corrigiendo errores en las versiones 1.x.
Este tipo de acciones me parecen cuanto menos sorprendentes. Este lenguaje, aunque creo que estremadamente potente y muy prometedor, no había llegado tener demasiados programadores, por lo que estos cambios radicales yo no los haría con versiones estables, es decir, yo me curraría un lenguaje con todo lo que quisiera que tuviera y, cuando lo tuviese suficientemente desarrollado y probado, lo lanzaría, dejando bastante tiempo entre versiones grandes. Más o menos estilo Java o estilo Ruby.
Pero bueno, el señor Walter Bright es el arquitecto y el sabrá lo que hace, teniendo en cuenta su dilatada experiencia en esto de los compiladores. Recordemos que fue el que escribió el primer compilador de C++ para MS-DOS.
Visto lo visto, habrá que leerse otra vez la documentación a ver si por fin empezamos a crear nuestro Sistema Operativo ¿quién se anima?






