Bjarne Stroustrup es un científico en computación y Catedrático de Ciencias de la Computación en la Universidad A&M de Texas. Es reconocido mundialmente por ser el creador del lenguaje de programación C++.
Stroustrup es un cand. scient. (el equivalente danés a un máster) en matemática y ciencias de la computación (1979) por la Universidad Aarhus, Deinamarca, y Doctor en ciencias de la computación (1979) por la Univesidad de Cambridge, Inglaterra. Anteriormente trabajó a la cabeza del departamenteo de Investigación en Programación de los laboratorios Bell de AT&T, desde su creación hasta finales de 2002.
En esta entrevista, Bjarne Stroustrup nos cuenta todo sobre el diseño y desarrollo de C++, los garbage collectors, el futuro de C++ y el rol de la barba en la creación de lenguajes de programación exitosos.
Computerworld publicó recientemente
esta excelente entrevista a Bjarne Stroustrup (en inglés), como parte de su serie ´´The A-Z of Programming Languages´´. A continuación una traducción al castellano con lo destacado de la nota.
¿Qué lo motivó para desarrollar C++?
Necesitaba una herramienta para diseñar e implementar una versión distribuida del kernel de Unix. En ese momento, 1979, no existía dicha herramienta. Necesitaba algo que pudiera expresar la estructura del programa, manipulara directamente el hardware, y que sea lo suficientemente eficiente y portable para programación de sistemas importantes.
Pueden encontrar más información y detalles acerda del diseño y evolución de C++ en mi notas de HOPL (Histoy of Programming Languages - Historia de los Lenguajes de Programación), las cuales pueden encontrar en mi página personal y en mi libro ´´El Diseño y Evolución de C++´´.
¿Qué problemas específicos intentaba resolver?
Los dos problemas que me vienen a la mente eran poder simular la infraestructura de comunicación inter-procesos para un sistema distribuido o un sistema de memoria compartida (para determinar qué servicios del Sistema Operativo podríamos correr en cada procesador por separado) y el escribir los drivers de red para este sistema. Obviamente, como Unix estaba escrito en C, también quería un alto grado de compatiblidad con C. Muy tempranamente, desde 1980 en adelante, fue utilizado por otras personas (con mi ayuda) para simular distintos protocolos de red y altoritmos de gestión de tráfico.
¿De dónde proviene el nombre de C++?
Mientras ´´C con Clases´´ (el ancestro de C++) se volvia popular dentro de Bell Labs, algunas personas pensaban que era un nombre demasiado largo y comenzaron a llamarlo ´´C´´. Esto significaba que tenían que aclarar a lo que se referián cuando debian que distinguirlo del lenguaje de Dennis Rithcie, al cual llamaban ´´Viejo C´´, ´´C original´´, y así. Algunos pensaban que era una falta de respeto hacia Dennis (ni él ni yo lo sentiamos así) y un día recibí un ´´pedido´´ de Bell Labs para que le cambiara el nombre. Como resultado, lo nombramos C84 por un tiempo. Este cambio no ayudó demaiado, así que pedí ayuda por sugerencias y elegí C++ de una lista de candidatos. Todos están de acuerdo que, semánticamente hablando, ++C hubiera sido todavía mejor, pero hubiera ocasionado demasiado problemas para quienes no conocen la sintaxis.
¿Hubo algún problema particularmente dificil o frustrante que hubo que superar durante la creación del lenguaje?
Montones! Para empezar, ¿cuales deberían ser las reglas fundamentales del lenguaje? ¿Qué debía estar en el lenguaje, y que debia quedar afuera? La mayoría quiere un lenguaje pequeño que brinde todas las características que encuentran útil en el resto de los lenguajes. Desafortunadamente, eso es imposible.
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 programación orientada a objetos) y efcientes para la programación 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 ejecución con un mínimo overhead (cero overheads comparando contra una versión en C).
Convencer a la comunidad de programadores del valor del chequeo de tipos fue sorprendemente dificil. La idea de chequear los argumentos de una función contra una delcaración de la función fue resistida fuertemente - al menos hasta que C adoptó la idea.
En la actualidad la programación 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 rápidas para usos muy demandantes. El enfoque de C++ hacia la Programación Orientada a Objetos fue (y es) básicamente 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 características que usualmente faltan en las primeras versiones de los lenguajes, y acceso directo (y efeciente) a una gran cantidad de código - no sólo código en C, sino también en Fortran y más ya que las convenciones de llamadas de C eran simples y similares a las que soportaban otros lenguajes. Después de todo, como solía decir, la reutilización comienza por utilizar algo que ya existe, en vez de esperar que alguien desarrolle nuevos componentes reutilizables. Por otro lado, C tiene varias vueltas sintácticas y semánticas, por lo que seguir a la par de C mientras fue evolucionando no es tarea fácil.
¿Cuáles son las principales diferencias entre C con Clases y C++?
La mayoría de las diferencias estuvieron en la técnica de implementación. C con Clases se implentó con un preprocesador, mientras que C++ requiere un compilador apropiado (por lo cual escribí uno). Era facil transcribir programas en C con Clases hacia C++, pero los lenguajes no eran 100% compatibles. Desde un punto de vista dle lenguaje, la mayor mejora fue la incorporación de funciones virtuales, lo cual permitió la programación orientada a objetos clásica. También se agregó la sobrecarga (incluyendo la sobrecarga de operadores). Vale destacar que las características fundamentales de C++ para la gestión de recursos generales, constructores y destructores ya se encontraban en las primeras versiones de C con Clases. Por otro lado, los templates (y las excepciones) se añadieron en versiones algo posteriores de C++ (1989) antes de esto, soliamos usar macros para expresar ideas generales de programación.
¿Qué hubiera hecho diferente en el desarrollo de C++ si hubiera tenido la oportunidad?
Esta pregunta es un poco injusto porque, por supuesto, no tenía el beneficio de casi 30 años de experiencia con C++, y mucho de lo que sé actualmente es el resultado de experimentar con versiones anteriores de C++. Por otro lado, en aquel entonces básicamente no tenía recursos (sólo yo y mi tiempo libre), por lo tanto si dijera (correctamente) que las funciones virtuales, los templates (con ´´conceptos´´, tal como los ofrece C++0x) y las excepciones hubieran hecho de C++85 un mejor lenguaje, estaría no sólo sugiriendo algo que no hubiera sabido diseñar en 1980, sino también que, aunque hubiera encontrado el diseño perfecto de forma mágica, no lo hubiera podido implementar en un tiempo razonable.
Creo que hubiera sido posible lanzar una mejor librería estandard en 1985 junto a C++ 1.0, la cual hubiera mejorado mucho con el tiempo. Con ´´mejor librería´´ me refiero a una librería con clases que incluyeran una mejora versión de funciones para soportar concurrencia y un set de clases de containers.
Más tarde, hubiera desarrrolaldo templates (claves para el estilo de programación genérico de C++) antes que herencia múltiple (no una gran característica, como muchos la consideran), y hubiera hecho más énfasis en las excepciones.