Por primera vez en sus catorce años de existencia, este blog se ocupa de los lenguajes de programación. Y empieza con todo un personaje, un visionario y creador de estos lenguajes, presente en Madrid como ponente del evento Connect, del centro de formación Keepcoding. Una encuesta de Stack Overflow afirma que JavaScript es el lenguaje más utilizado. Douglas Crockford es conocido por su participación en el desarrollo en 1995 del lenguaje en JavaScript y desde entonces como incansable explorador de nuevos paradigmas en la programación de software.
Suya es la tesis de que todos los lenguajes de programación en uso arrastran un problema fundacional, su asociación con la arquitectura von Neumann, concebida para ejecutarse una sola máquina en un único espacio de direccionamiento, en contraste, dice, con la computación distribuida que se ha impuesto en la industria de las TI.
En la conversación, necesariamente didáctica, Crockford soporta con paciencia y excelente humor el equívoco de ser considerado un critico de JavaScript. Lo desmiente, pero no puede evitar desmarcarse: “tengo que decir que me coloco al margen de la corriente principal de los lenguajes de programación. Dicho de otro modo: me considero un hereje o un renegado […] No soy representativo del modo de pensar de mucha gente acerca de la cuestión. Soy una voz en el desierto, aunque a estas alturas tampoco soy un buen predicador [risas].
Gracias por decirlo, pero en lugar de disuadirme ha conseguido que me interesen más sus respuestas […]
Tendré que extenderme, queda avisado [risas] Si no existieran los lenguajes de programación, tendríamos que usar instrucciones individuales para decir a una máquina que haga algo muy simple y sólo ese algo concreto por simple que sea. Con un número que está en cierto lugar de la memoria creamos un registro, pero con otro número situado en distinto lugar de la memoria se abrirá obligadamente otro registro; si queremos combinar ambos registros, vamos a tener que habilitar un nuevo espacio en la memoria, ya que cada espacio está asociado a cada número. Esto, que suena trivial, es lo que hace un ordenador. Y el resultado es una manera horrorosa de programar, debida a que resulta extraordinariamente difícil seguir el rastro de los números en cada célula de la memoria. Podía tener algún sentido en los años 40 o 50 del siglo pasado y, de hecho, los programas de aquella época fueron escritos así […]
Unas cuantas de aquellas máquinas están operativas, entre otras cosas porque nadie se atreve a meter mano en los programas originales y provocar un desaguisado […] Pero alguna vez habrá que liberarse del problema.
Sí, pero mientras tanto, tropezamos periódicamente con el problema. Porque así fueron diseñadas esas máquinas que todavía siguen operativas y en producción. Y cuando lo digo, no estoy pensando en anacronismos sino en los micrordenadores de 8 bits, con los que muchísima gente aprendió a programar y a los que debemos mucha de la popularidad que hoy tiene la tecnología dela información […] Pero a medida que los procesadores ganaron capacidad, nuestra ambición creció, porque hace mucho que dejó de tener sentido programar para una máquina específica: los lenguajes de programación nos ofrecen una abstracción que permite describir aquello que estamos tratando de conseguir y por eso, justamente por eso, tiene sentido que los humanos dispongamos de un programa que sea traducible a algo que una máquina pueda comprender.
¿Cuál ha sido la evolución de los lenguajes de programación durante su carrera profesional?
Pues he visto de todo [risas] Como estudiante, aprendí a programar máquinas de contabilidad con tarjetas perforadas, una suerte de placa con conexiones elementales, muy difíciles de programar en Fortran y otros lenguajes de alto nivel. He programado en C y en Pascal, con lenguajes estructurados, en Smalltalk y luego en JavaScript […] Cada uno con su distinto nivel de abstracción pero todos con la cualidad de multiplicar las habilidades de los programadores.
Es difícil entender por qué, habiendo estado asociado a la historia de JavaScript, un buen día descubrió que no era una buena idea […]
No. Lo que descubrí fue que JavaScript tiene partes buenas [nota: asi se llama su libro de 2008, JavaScript, The Good Parts] . Pero cuando lo dije tal cual, hubo gente que se mosqueó: ¿cómo podía a la vez calificarlo de ridículo y sostener que tenía partes buenas? Pero es que las tiene y esto hay que reconocerlo; a veces me pregunto si mi opinión ha tenido alguna infuencia real o sólo me han puesto una etiqueta en la espalda. O tal vez me corresponda algo de responsabilidad en el heccho de que JavaScript haya llegado a ser uno de los lenguajes más importantes [risas]
Desde aquel descubrimiento, usted ha participado en la creación de varios lenguajes de programacion que no han tenido la misma repercusión. En su opinión, ¿por qué el mercado necesita un nuevo lenguaje que se diferencie de los existentes?¿Qué atributo es el denominador común, si es que lo hay?
Buen punto. Todos los lenguajes, en mayor o menor grado se han basado en los principios de John von Neumann. Fue un matemático genial que, entre otros muchos hallazgos, en 1945 escribió un documento en el que explicaba cómo deberían funcionar los ordenadores y que ha dejado una enorme influencia en la posteridad: la gran mayoría de los ordenadores que usamos actualmente están basados en el modelo o arquitectura de von Neumann y no ha sido sustituído hasta hoy. Pero aquel modelo o arquitectura no contemplaba que los ordenadores se comunicarían unos con otros, aunque sea así como funcionan en la realidad: es extremadamente raro ver un ordenador que trabaje para sí mismo sin interactuar con algún otro. Por supuesto, incluyo los smartphones, que están todo el tiempo interactuando. [risas]
¿Una especie de pecado original de los lenguajes de programación?
Los lenguajes de programación están aún basados en la noción de que todo ocurre en una máquina. Esta idea es una fuente de ineficiencia, de errores y de vulnerabilidades que a veces atribuímos a otras razones […] ¿Por qué? Porque los lenguajes no nos proporcionan las herramientas que necesitamos para razonar acerca de cómo funciona la interacción entre las máquinas. En las aplicaciones modernas, la comunicación está embebida dentro de la computación. Incluso podría decirse que lo que llamamos ordenadores o computadores son realmente `comunicadores´ con capacidad para calcular, pero con el tiempo la comunicación se ha convertido en el elemento fundamental. Ahí está la clave: nuestros lenguajes de programación no la entienden.
[…] En la práctica, hay una pluralidad de lenguajes de programación y cada vez más, por lo que cabe preguntarse si no sería mejor que hubiera uno dominante.
Ha puesto el dedo en la llaga [risas] La mayor dificultad que tenemos consiste en decidir si podemos dejar que un lenguaje de programación se arrogue ese dominio, con el riesgo consiguiente de error […]
Pero, ¿hay una competicion real dentro de esa pluralidad de lenguajes?
Siempre hay competición real en todo lo que ocurre en un mercado. No hay una autoridad que pueda prescribir que todos los programas han de escribirse en un determinado lenguaje. Ha habido intentos de abordar la cuestión, como el lenguaje Ada, desarrollado por conveniencias militares de Estados Unidos y que pretendía establecer un lenguaje que hiciera posible que todos los sistemas trabajasen en común. En el fondo, respondia a algo bastante tonto: cuando el Pentágono compraba ordenadores a diferentes proveedores, descubría tarde que no podrían trabajar juntos. Entonces, llegaron a la conclusión de que seria posible elaborar un lenguaje único con el que todos pudieran trabajar por separado o al unísono. Se daba la circunstancia de que el presupuesto de defensa era tan voluminoso como para que todo el mundo se plegara a esa condición, pero aquella intención acabó fracasando.
[…] ¿Cuál es su papel en esta cadena de valor tan peculiar?
Realmente soy un bicho raro que tiene la inmensa suerte de ir por libre. Trato de ser diligente en hacer lo que considero correcto y, como consecuencia, cambio con frecuencia mis ideas. No lo recomiendo [risas] pero si sirviera para otros, yo diría que si tienes entre manos un proyecto de software y quieres acabarlo a tiempo, la regla número uno debería ser no dejarte llevar por la tentación de los cambios […] Cada cosa que cambies hará que el proyecto se retrase o posiblemente empeore.
[risas] ¿Hay un modelo de negocio relacionado con los lenguajes?
No, por una sencilla razón: no hay dinero en juego. Lo hubo en otros tiempos: en los años 80, la compañía Borland intentó comercializar unas herramientas que servían para hacer programas, pero aquello se perdió por el camino [nota: en sucesivas olas de adquisiciones; los activos residuales de Borland son propiedad de OpenText]. Actualmente, los lenguajes de programación son gratuitos, de manera que si alguien pretende ganar dinero, mejor será que se dedique a otra cosa.
A propósito: ¿cuál es su caso?
Estoy retirado. Me ha ido bien en la vida y no tengo necesidad de llegar a ciertos compromisos que no me gustan, pero sigo trabajando en lo mismo.
¿Cuánto tiempo se emplea en crear un nuevo lenguaje? ¿Cuánto influye la corriente de automatización, que todo lo invade?
El lenguaje de programación con el que estoy históricamente más asociado es JavaScript, que fue diseñado por Brendan Eich, un tipo muy brillante. Lo diseñó, lo implementó y lo integró en un navegador en sólo una docena de días. Algo sorprendente desde cualquier punto de vista. Creo que Brendan pensaba estar haciendo un prototipo para demostración, pero quien fuera su jefe llegó a la conclusión de que era suficiente y decidió darlo por acabado. Entonces, el autor dejó de corregir los errores, con lo que estos pasaron a ser un rasgo permanente de JavaSacript en el mismo plano que las cosas acertadas que conlleva. Si uno se fija sólo en estas cosas buenas, sin ninguna duda es uno de los mejores lenguajes que se hayan inventado.
En última instancia, ¿quién decide sobre la aceptabilidad o no de un nuevo lenguaje?
Actualmente, los programadores. Porque si ellos optan por no usarlo, estará condenado.
Ah, por un instante pensé que diría Google
[risas] Google tiene su propio lenguaje. O más de uno, pero el que más impulsa se llama Dart y fue concebido específicamente para competir con JavaScript. La verdad es que ni siquiera un poder fáctico como Google tiene la fuerza necesaria para dictar a todo el mundo qué lenguaje preferir.
Usted ha explicado, hoy mismo en su charla de Madrid, que el mundo necesita un lenguaje de programación distribuído. ¿Es viable, a la vista de las dificultdes?
Absolutamente. De hecho, esto es lo que mis colegas y yo tratamos de hacer. Sistemas distribuídos que usen lenguajes de programación que, empezando por lo básico, no entienden la distribución. Esto complica mucho las cosas, pero si alguien lo intenta y lo consigue tendrá éxito […]
¿Y usted cómo lo hace?
Distingo dos piezas en mi diseño. Una es un lenguaje de programación que realmente buscaría comunicarse: enviar mensajes, recibir mensajes, activar mensajes, esta es la idea matriz. La segunda pieza parte de la necesidad de un protocolo. Hay en la web protocolos como HTTP o SSL y otros, que transportan información de una máquina a otra, pero no están vinculados a un lenguaje determinado y esto ya nos advierte que el protocolo tiene que ser independiente del lenguaje […] Lo veo como una transición, en la que no pretendemos cambiarlo todo a la vez porque esta sería la mejor manera de que no funcione.
Ahora mismo, todo el mundo habla de inteligencia artificial. Usted ni la ha mencionado y eso que llevamos un buen rato hablando […]
Tal como se está llevando a la práctica, la inteligencia artificial no es capaz de entender lo que se hace con ella, pero es muy buena para trazar patrones que encajan en lo que ya se ha experimentado. Por consiguiente, puede ser factible para la IA escribir programas basados en todos los que hayan sido escritos antes, con el inconveniente de que la mayoría son inapropiados para el modo distribuido. Mi postura es que, a menos que haya una nueva fuente que la IA pueda imitar, no creo que nos vaya a ayudar mucho en este empeño nuestro.
[…] pero la IA puede ayudar industrializando su trabajo de desarrollo.
La IA es una especie de loro [risas]. Eso si, un loro con mucho talento, al que puedo puedo entrenar acerca de todo lo que ha ocurrido y para que hable de ello conmigo. Pero si le pregunto algo que no ha experimentado, empezará a enloquecer, como se ha visto: ya que no ha incorporado esa experiencia, se limitará a tratar de aplicar los patrones que ha aprendido y que sirven para otra cosa. En definitiva, lo que pasa es que carece de experiencia en el modo de programación que estoy proponiendo.
Tengo curiosidad por saber si la industria del hardware está involucrada de alguna manera en esta tendencia […]
Francamente, nos gustaría que la industria se fuera alejando de la arquitectura von Neumann en favor de otra nueva que, fundamentalmente, resolviera la cuestión de la comunicación a escala de la máquina. Sabemos que hay gente que está trabajando en el desarrollo de una CPU cuya misión primaria sería el envío de un mensaje, pero entiendo que prefieran no hablar de ello, puesto que serìa radicalmente diferente a lo que conocemos y por esto mismo no ven una perspectiva de adopción por parte de la industria; es algo bastante friki […] y una de las razones por las que me he decantado por un enfoque de transición.
Me ha puesto en la boca la última pregunta: ¿en qué está trabajando ahora?
Es público que llevo tiempo trabajando en un lenguaje de programación llamado Misty y este nombre define muy bien la naturaleza nebulosa del proyecto: ese lenguaje no existe y puede que no llegue a existir, ya que no puedo prometer que acabaré el proyecto. Lo cierto es que he hecho implementaciones varias a lo largo de los años y he vuelto a empezar cada vez de cero.
Vaya, se me ocurre una más: ¿cuál es la separación entre crear un lenguaje e implementarlo?
Sin implementación sería una pérdida de tiempo. Programar lenguajes puede darnos como resultado artefactos bonitos, ya que estamos creando una estructura y aquí la clave parece estar en el verbo crear: desde luego, podemos crear autómatas que salgan al mundo y hagan cosas útiles, pero esta historia no va de mercados sino de que con nuestro lenguaje podamos crear otro lenguaje mejor. Este es un proceso evolutivo que se remonta a los inicios de la computación.