Documentos de Académico
Documentos de Profesional
Documentos de Cultura
C
C
En esta entrevista, Bjarne Stroustrup nos cuenta todo sobre el diseo y desarrollo de C++,
los garbage collectors, el futuro de C++ y el rol de la barba en la creacin de lenguajes de
programacin exitosos.
Luego de un corto tiempo de confiar en la suerte y el buen gusto, me decid por un grupo
de "reglas a ojo" que pretendian asegurar que los programas en C++ fueran a la vez
elegantes (como en Simula67, el lenguaje que present la programacin orientada a
objetos) y efcientes para la programacin de sistemas (como C). Obviamente, no todos los
programas logran ambas cosas, pero la idea era (y es) lograr que un desarrollador
competente pueda expresar practicamente cualquier idea directamente y lograr su
ejecucin con un mnimo overhead (cero overheads comparando contra una versin en C).
En la actualidad la programacin orientada a objetos est por todos lados, por lo que a las
personas les cuesta creer que me fue imposible convencer a las personas de su utilidad
hasta que finalmente agregu funciones virtuales y demostr que eran lo suficientemente
rpidas para usos muy demandantes. El enfoque de C++ hacia la Programacin Orientada
a Objetos fue (y es) bsicamente el mismo que Simula, con simplificaciones y mejores de
peformance.
La compatibilidad con C fue (y es) una gran fuente de problemas y fortalezas. Al ser
compatible con C, los desarrolladores de C++ tenian garantizada una gran cantidad de
caractersticas que usualmente faltan en las primeras versiones de los lenguajes, y acceso
directo (y efeciente) a una gran cantidad de cdigo - no slo cdigo en C, sino tambin en
Fortran y ms ya que las convenciones de llamadas de C eran simples y similares a las
que soportaban otros lenguajes. Despus de todo, como sola decir, la reutilizacin
comienza por utilizar algo que ya existe, en vez de esperar que alguien desarrolle nuevos
componentes reutilizables. Por otro lado, C tiene varias vueltas sintcticas y semnticas,
por lo que seguir a la par de C mientras fue evolucionando no es tarea fcil.
Creo que hubiera sido posible lanzar una mejor librera estandard en 1985 junto a C++ 1.0,
la cual hubiera mejorado mucho con el tiempo. Con "mejor librera" me refiero a una
librera con clases que incluyeran una mejora versin de funciones para soportar
concurrencia y un set de clases de containers.
Entonces, si, vi utilizar a C++ para muchas cosas que no hubiera pensado, y ser usado de
muchas formas que no anticip, pero en general no estoy completamente sorprendido.
Muchas veces me desespera ver los intentos de forzar C++ en un molde que no encaja
simplemente porque alguien no se molest en aprender lo bsico de C++. Por supuesto,
las personas que hacen esto no creen que estn actuando irracionalmente; en cambio,
piensan que saben cmo programar y que no hay nada nuevo o diferente acerca de C++
que requiera que cambien sus hbitos y aprendan "trucos nuevos". Estas personas
estructuran su cdigo como lo haran, por ejemplo, para C o para Java, y luego se
sorprenden cuando C++ no funciona como esperan. Algunos hasta se enojan mucho,
aunque no entiendo porqu deberan enojarse al darse cuenta que tienen que tener ms
cuidado con el sistema de tipos en C++ que en C, o que no hay una compana brindando
librerias "gratis" y "estndard" para C++ como lo hay en Java. Para usar C++ bien se tiene
que utilizar el sistema de tipos, y se tienen que buscar librerias. Intentar construir una
aplicacin directamente con C++ a secas, o usando slo las libreras estndard, es una
prdida de tiempo y esfuerzo.
Me estoy refiriendo a los "conceptos", los cuales sern parte de C++0x. Para ms detalles,
vean mis notas sobre C++0x. Hasta que los "conceptos" estn disponibles para todos, se
pueden usar "constrains classes" para mejorar los chequeos; vean mi FAQ tcnico para
ms informacin.
Por supuesto que no es necesario esperar a C++0x para hacer programacin concurrente
en C++. Las personas hicieron esto durante aos, y la mayor parte de lo que el nuevo
estndard ofrece ya existe actualmente en otras formas.
No veo una razn importante que impidan que un lenguaje de propsito general crezca
con utilidades para distribucin. Sin embargo, yo sostengo (sin xito) que C++0x debera
hacer exactamente esto. Creo que eventualmente todos los principales lenguajes van a
proveer algn tipo de soporte para la distribucin, a travs de una combinacin de soporte
directo del lenguaje, soporte en tiempo de ejecucin, o librerias.
Otra aporte del legado de C++ es que hizo que la abstraccin sea manejable y posible de
realizar en reas aplicativas donde las personas necesitan programar en lenguaje de
mquina directamente, como con bits, bytes, words y direcciones.
Por cierto, cada tanto me encuentro con personas que asumen que, porque alago de C++
y lo dfiendo de sus detractores, pienso que es perfecto. Esto es obviamente absurdo. C++
tiene un montn de debilidades - y las conoczco mejor que nadie - pero el objetivo de
realizar el diseo y la implementacin no era no cometer errores (esto es imposible en un
proyecto tan grande, y bajo tales restricciones Draconianas). El objetivo era crear una
herramienta que, en manos competentes, sea efectiva para la construccin de sistemas
importantes para el mundo real. En esto, creo que tuvo xito ms all de mis mayores
expectativas.
Qu le responde a las crticas del lenguaje, como que hered
todas las falencias de C y que tiene una enorme cantidad de
caracertsticas que lo hacen "complicado"?
C++ hered las debilidades y fortalezas de C, y creo que hicimos un buen trabajo en
compensar las debilidades sin comprometer las fortalezas. C no es un lenguaje simple (el
estndard ISO tiene ms de 500 pginas), y la mayora de los lenguajes modernos son
ms grandes an. Obviamente, C++ (como C) es "complicado" comparado con otros
lenguajes de juguete, pero realmente no es tan grande al compararlo con otros lenguajes
modernos. Hay razones prcticas y slidas de porqu todos los lenguajes actuales que se
usan para trabajo industrial serio son "complicados": las tareas que deben resolver son
enormes y de una complejidad ms all de la imaginacin.
Otra razn para el tamao "incmodo" de los lenguajes actuales es su necesidad de ser
estables. Escrib cdigo en C++ hace 20 aos que an hoy corre, y estoy seguro que
seguir compilando dentro de otros 20 aos. Quienes construyen proyectos de
infraestructura grandes necesitan esta estabilidad. Sin embargo, para mantenerse
modernos y poder enfrentar nuevos desafios, los lenguajes deben crecer (tanto en
caractersticas del lenguaje como en libreras base), pero si quits algo, romps el cdigo.
Por lo tanto, los lenguajes que se construyen pensando en serio en los usuarios (como
C++ y C) tienden a mantener caractersticas durante dcadas, y tienden a "complicarse".
La alternativa son lenguajes hermosos para los cuales hay que re-escribir el cdigo cada 5
aos.
Segundo, estoy orgulloso de que C++ haya ayudado a mejorar la calidad del cdigo en
general, no slo dentro de C++. Los lenguajes ms nuevos, como Java y C#, utilizan
tcnicas que C++ hizo que fueran posibles para el uso en el mundo real, y comparado con
el cdigo de 20 aos atrs muchos sistemas en los que dependemos actualmente son
increiblemente confiables y fueron construidos bajo un presupuesto restringido.
Obviamente, podemos y debemos hacer mejor, pero podemos sentirnos orgullosos del
camino que recorrimos hasta ahora.
Mi visin de los GC es que yo creo que son la ltima aternativa para la administracin de
recursos, no la primera, y que es una herramienta ms entre tantas otras para el diseo de
un sistema, y no una herramienta fundamental para simplificar la programacin.
Cuando sea posible, recomiendo usar estos "manipuladores de recursos" como variables
con alcance (scope) restringido. En este caso, no hay un uso incorrecto de gestin de
memoria que el programador pueda hacer mal. Cuando la vida de un objeto no puede ser
acotada, recomiendo otros esquemas simples, como el uso de punteros "inteligentes"
(provsitos en C++0x), o representar la propiedad como miembro de una coleccin. Estas
tcnicas tienen la ventaja de que aplican uniformemente a todo tipo de recursos, y se
integran bien con varios y distintos enfoques para administrar errores.
Cuando se usa una gestin de recursos acotada y containers, se genera muy poca
"basura" y un GC se torna en algo rpido. Este asunto est detrs de mi opinin "C++ es
mi lenguaje de GC favorito porque genera muy poca basura".
Esperaba que un GC pudiera ser opcionalmente habilitado en C++0x, pero hubo muchos
problemas tcnicos as que tuve que conformarme con una especificacin sobre cmo
debera integrarse un GC al lenguaje, si fuera provisto. Como con casi todo respecto a
C++0x, existe una implementacin experimental.
Hay muchos ms aspectos de GC ms all de los mencionados aqu, pero bueno, esto es
una entrevista, no un libro.
Por supuesto que llevo escritos muchos documentos meramente tcnicos, pero mucho de
mi trabajo est apuntado a elevar el nivel de abstraccin de los programaas, a mejorar la
calidad de cdigo, y a explicarle a las pesonas cmo funcionan las cosas, y porqu.
Pedirle a un programador a que haga algo sin explicarle el motivo es tratarlo como si
fueran chicos: deberan sentirse ofendidos por esto. Mis ediciones de "The C++
Programming Language", D&E, "Teaching Standard C++ as a New Language", y mis notas
HOPL, son todos mis intentos de relacionar mejor mis ideales para C++, y de ayudar a
madurar a la comunidad de C++. Por supesto que esto fue tan slo exitoso en parte:
todava hay mucha programacin de "cortar y pegar", cdigo C++ de baja calidad, pero me
siento alentado por la cantidad de buen cdigo y la calidad de los sistemas producidos.