¿Habrá algún lenguaje de programación más elogiado que Lisp? Descubramos por qué nadie se apresura a aprenderlo.

Alan Kay, el padre de la POO, lo llamó «el mejor lenguaje de programación jamás creado«, mientras que el informático y ganador del premio Pulitzer, Douglas Hofstadter, lo describió como «uno de los lenguajes informáticos más importantes y sorprendentes«. Eric Raymond, cofundador de la Open Source Initiative, dijo que su estudio te proporcionaría una profunda iluminación y «te haría mejor programador«.

No se referían a Java, C++ ni siquiera a C. El favorito de los primeros desarrolladores y verdaderos hackers fue y sigue siendo Lisp.

El Lenguaje de la Inteligencia Artificial

John McCarthy el creador de Lisp
John McCarthy el creador de Lisp

El matemático John McCarthy creó Lisp a finales de la década de 1950. Se le atribuye la invención del término «inteligencia artificial» (IA) y el establecimiento de las bases de la programación funcional. En aquella época, McCarthy participaba en un proyecto de investigación y, para implementar conceptos totalmente nuevos en ese momento, desarrolló un lenguaje de programación. En 1960, publicó el artículo «Recursive Functions of Symbolic Expressions and Their Computation by Machine«, en el que presentaba Lisp a la comunidad científica.

En Lisp, todo gira en torno a las listas. Cada operador es una lista de elementos, y cada elemento puede ser a su vez una lista o un «átomo». Un átomo es la unidad mínima de datos, un número o un símbolo. Los pioneros de Lisp creían que el lenguaje reflejaba el funcionamiento del cerebro humano y que cualquier proceso inteligente podía codificarse en él.

Paul Graham, cofundador de Y Combinator, creador del portal Hacker News (escrito en Arc, un dialecto de Lisp) y evangelista de Lisp, comparó a McCarthy con Euclides y calificó el lenguaje de «descubrimiento científico»:

«En 1960, John McCarthy publicó un notable artículo en el que hizo por la programación lo que Euclides hizo por la geometría. <…> Lisp no es tanto un invento como un descubrimiento científico».

Paul Graham

Teniendo en cuenta que las tareas relacionadas con la IA siempre han consumido muchos recursos y que la potencia de los ordenadores en la década de 1980 era muy inferior a la actual, los desarrolladores de Lisp se esforzaron por obtener el máximo rendimiento del lenguaje. Así surgieron sofisticados compiladores que eran tan buenos como los de C. Poco a poco, se fue creando un aura mística en torno a Lisp, por dos razones.

La Mística de Lisp

Primera razón. A mediados de la década de 1970, los investigadores de IA empezaron a quedarse sin potencia de cálculo, y el ingeniero del MIT Peter Deutsch propuso desarrollar un ordenador específicamente para programas Lisp. En la década de 1980, Symbolics lanzó una serie de máquinas Lisp, cuya arquitectura estaba optimizada para este lenguaje. Así, Lisp pasó a asociarse a potentes programas de IA.

Foto de la máquina Symbolics 3640 LISP
Foto de la máquina Symbolics 3640 LISP

En la misma época, los fabricantes de máquinas Lisp y los laboratorios de investigación de IA ofrecían sus propias versiones del lenguaje. Lisp tenía muchos dialectos, y la comunidad se dividió. Para evitarlo, en 1981 un grupo de hackers empezó a trabajar en un estándar común para el lenguaje: Common Lisp. Incorporaba las mejores características de todos los dialectos existentes.

Segunda razón. En 1985, los profesores del MIT Harold Abelson y Gerald Jay Sussman publicaron el libro de texto Structure and Interpretation of Computer Programs, más conocido entre los hackers como Wizard Book («El libro del mago»). Este libro se utilizó para enseñar programación en Scheme, un dialecto de Lisp, a los estudiantes del MIT durante más de veinte años. Gracias al Libro del mago, Lisp pasó a ser percibido como un lenguaje a través del cual se podían comprender los conceptos filosóficos más profundos de la programación.

Libro Structure and Interpretation of Computer Programs
Libro Structure and Interpretation of Computer Programs

La popularidad de Lisp cayó a finales de la década de 1980. La investigación en IA pasó a un segundo plano, y los ordenadores más baratos y potentes inundaron el mercado y desplazaron a las máquinas Lisp.

La segunda oleada de popularidad del lenguaje se produjo tras la publicación de un ensayo de Paul Graham en el que lo calificaba como «el mejor lenguaje para startups«. En 1995, Paul y un amigo fundaron Viaweb y lanzaron un constructor de tiendas online del mismo nombre, escrito en el legendario lenguaje.

«Pensamos que si programábamos en Lisp, podríamos añadir funciones al producto más rápido que nuestros competidores y añadir funciones que ellos no podían. Y como Lisp es un lenguaje de muy alto nivel, podríamos arreglárnoslas con un pequeño equipo de desarrollo y ahorrar mucho dinero».

PAUL GRAHAM,
cofundador de Y Combinator, creador de Hacker News

Las palabras de Graham convencieron a algunos, pero estos entusiastas fueron pocos. Según las estadísticas de GitHub, Emacs Lisp ocupa el puesto 25 y Common Lisp el 49 en popularidad entre los usuarios del sitio. Sin embargo, sus mejores características han aparecido en otros lenguajes: por ejemplo, Python tomó prestado el generador de listas y C# el lenguaje de consulta integrado LINQ.

Lisp es el segundo lenguaje de programación más antiguo «superviviente», después de Fortran. En el índice TIOBE de 2024, Lisp ocupa el puesto 36, por delante de Objective-C, Bash y TypeScript.

Por qué a los Hackers les Encanta Lisp

Lisp se convirtió rápidamente en el lenguaje favorito de los hackers. En la primera versión del Jargon File, el legendario diccionario de jerga hacker, ni siquiera había una entrada separada para Lisp, ¡ya que se suponía que todos los hackers lo programaban! Luego apareció:

«LISP: (LISt Processing language, también conocido como Lots of Irritating Superfluous Parentheses – «un montón de paréntesis superfluos e irritantes») – el lenguaje nativo de la inteligencia artificial, basado en listas de longitud variable, árboles, interpretación de código como datos y viceversa. Desarrollado por John McCarthy en el MIT a finales de la década de 1950. Más antiguo que cualquier otro lenguaje de alto nivel de uso actual, excepto Fortran, pero los dialectos Lisp modernos son muy diferentes del original. Principal lenguaje de programación de alto nivel entre los hackers hasta principios de la década de 1980″.

Eric Raymond, cofundador de la Open Source Initiative, cree que Lisp sigue teniendo mejor aspecto que la mayoría de los lenguajes de programación actuales:

«En aquella época (en la década de 1970 – Ed.), Lisp era más potente y flexible que cualquier otro lenguaje. De hecho, incluso hoy en día su diseño es mejor que el de la mayoría de sus competidores más jóvenes. Lisp dio a los hackers libertad creativa e intelectual, por lo que sigue siendo el lenguaje favorito de los hackers».

Según Paul Graham, Lisp incorporó una serie de nuevas ideas cuando apareció:

  • Estructuras condicionales. Hoy en día, incluso los principiantes conocen el if/else. Pero fue McCarthy quien los inventó en Lisp. Gracias a él, llegaron a Algol, y de ahí se extendieron a otros lenguajes.
  • Recursividad. Como concepto matemático, la recursividad existía mucho antes de Lisp, pero fue el primer lenguaje en soportarla.
  • Un nuevo concepto de variables. En Lisp, todas las variables son punteros. Cuando un desarrollador asigna una variable a otra, se copia el puntero, no el valor de la variable que se está copiando.
  • Recolección de basura. Lisp fue el primero en introducir la recolección de basura, una característica básica de Java, C#, Python y otros lenguajes con gestión automática de memoria. Permite a los programadores manipular listas y estructuras de datos complejas sin preocuparse por las referencias colgantes y las fugas de memoria.
  • El lenguaje siempre está completamente disponible. No hay distinción entre tiempo de lectura, tiempo de compilación y tiempo de ejecución del código. Se puede compilar y ejecutar código en tiempo de lectura, leer o ejecutar código en tiempo de compilación, o leer y compilar código en tiempo de ejecución.

Pero el verdadero poder de Lisp reside en las macros:

«Sólo los mejores y más brillantes programadores siguen el camino de Lisp, ¡y sólo los más inteligentes de los Lispers se convierten en maestros de las macros!… Las macros son la mayor ventaja de Lisp y de cualquier lenguaje de programación».

DOUG HOYT,
programador

Las macros pueden utilizarse para convertir Lisp en otros lenguajes de programación y viceversa. Una persona que aprenda a escribir macros descubrirá que todos los demás lenguajes no son más que envoltorios de Lisp.

Meme Ciclos Lisp
Meme Ciclos Lisp – Fuente xkcd

Normalmente, cualquier lenguaje de programación tiene una biblioteca estándar: módulos, clases, objetos, constantes, variables globales, funciones, etc. Se pueden llamar desde cualquier programa escrito en ese lenguaje. Si la biblioteca no tiene la función necesaria, el desarrollador la escribe él mismo o añade una nueva clase. Y en Lisp, las macros se utilizan para ampliar la sintaxis.

Paul Graham denominó a las macros «programas que escriben programas». Y Peter Siebel considera Common Lisp un «lenguaje de programación programable», que es la esencia y la principal ventaja del lenguaje. Cuando programas en Common Lisp, no piensas: «Sería bueno que tuviera esta característica«, sino que la añades. No pierdes el tiempo intentando expresar una idea dentro de los estrechos límites de la sintaxis.

«Lisp es el antepasado de todos los lenguajes. Puede convertirse en cualquier lenguaje: desde un lenguaje de secuencias de comandos interpretado hasta un lenguaje compilado estática y eficientemente. Common Lisp es tan flexible que se puede ajustar y cambiar el código en cualquier etapa del desarrollo como se desee, pero al final se obtiene un diseño funcional, limpio y eficiente. Esto es imposible en cualquier otro lenguaje».

Un Programador de Common Lisp

Slava Akhmechet, fundador de RethinkDB, programador y bloguero, llegó a afirmar que había experimentado la iluminación de la que habla Eric Raymond:

«La iluminación llegó. Al principio no entendí nada, pero luego alcancé el nirvana en un instante. Todo se aclaró. Había oído muchas veces las palabras de Eric Raymond: «Merece la pena aprender Lisp por la profunda iluminación…», pero no las entendía. ¡Y por fin esa frase cobró sentido! <…> Alcancé un estado mental casi divino, mis puntos de vista sobre la informática dieron un vuelco. En ese mismo instante me hice miembro del culto a Lisp».

Slava Akhmechet
Meme iluminación Lisp
Meme iluminación Lisp – Fuente xkcd

La Utilidad de Lisp no es Evidente para Todos

Vale, si Lisp es tan genial, ¿por qué tan poca gente programa en él? El caso es que los beneficios de aprender este lenguaje no son evidentes para los desarrolladores principiantes. Si quieres dedicarte al desarrollo web, aprendes JavaScript, y si quieres escribir controladores, aprendes C/C++. Pero en el caso de Common Lisp, no es fácil explicar para qué sirve:

«No hay un beneficio obvio en aprender Common Lisp, como lo hay con C, Java y C++. El principal beneficio para un programador es la experiencia que proporciona».

PAUL GRAHAM,
cofundador de Y Combinator, creador de Hacker News

Matthew Butterick, bloguero, escritor y programador estadounidense, cree que Lisp tiene muchas ventajas, pero que sus partidarios no pueden exponerlas de forma accesible y concisa:

«Si Lisp y sus dialectos son tan buenos, debería haber una descripción concisa de sus ventajas. Es necesario mostrar todo el poder de Lisp en una hora, no en cien. Si los fanáticos de Lisp no lo hacen, no es de extrañar que Lisp y sus dialectos ocupen los puestos más bajos de los rankings».

El propio Butterick ofrece ejemplos ilustrativos. Por ejemplo, «Hola mundo» en Racket, uno de los dialectos más populares de Lisp, se escribe así:

(display "¡Hola mundo!")
(newline)

Incluso un no programador verá la diferencia entre una frase y esto:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hola mundo");
    }
}

La mayoría de los lenguajes de programación tienen expresiones que se evalúan a un valor y sentencias, es decir, comandos y acciones. Por ejemplo, en Python, x = 42 es una sentencia de asignación, mientras que x + 42 es una expresión. El siguiente código en Python no tendría ningún sentido:

42 + if 1 < 0: 100
else:
 200

Mientras que en Lisp este código daría un resultado bastante concreto. Después de todo, el operador condicional if es también una expresión. El programador puede utilizarlo en los cálculos como quiera, sólo necesita «ampliar un poco su mente».

«En Lisp no sufres las restricciones sintácticas que abundan en otros lenguajes. Esto simplifica tu trabajo y amplía tus posibilidades: puedes combinar partes del lenguaje de las formas más inusuales».

MATTHEW BUTTERICK

«Si lo que más le gusta a un programador es el código que expresa sus intenciones de forma sencilla y clara, entonces programar en Common Lisp es probablemente la actividad más placentera que se puede realizar con un ordenador. Se pueden hacer muchas más cosas en Lisp, y mucho más rápido, que en cualquier otro lenguaje».

PAUL GRAHAM

Qué se ha Escrito en Lisp

En 1996, Naughty Dog lanzó Crash Bandicoot, un juego que revolucionó la industria. Todo el mundo estaba entusiasmado con los brillantes gráficos y las animaciones. Crash Bandicoot se convirtió en uno de los juegos más populares de Sony PlayStation. Naughty Dog lanzó entonces Jak and Daxter: The Precursor Legacy, que recibió elogios de la crítica y una puntuación de 90 sobre 100 en Metacritic.

Captura del Juego Crash Bandicoot
Captura del Juego Crash Bandicoot

Con la ayuda de Lisp y Allegro CL, los desarrolladores crearon rápidamente herramientas para diseñar movimientos fluidos y texturas ricas. Diseñaron más de 500 objetos diferentes con una jugabilidad y unas características visuales únicas:

«Lisp fue la mejor solución para nosotros. Estábamos haciendo un juego innovador, así que tuvimos que lidiar con complejos comportamientos de los personajes y acciones en tiempo real. Los lenguajes como C son demasiado toscos para este tipo de proyectos, y Lisp es ideal».

ANDY GAVIN,
cofundador y programador de Naughty Dog

Mark Tarver, programador de Lisp con casi 30 años de experiencia, explicó así la diferencia entre C y Lisp:

«Escribir en C es como montar un mosaico de lentejas con pinceles y pegamento. Lisp es un arma neumática, potente y precisa. Abre mundos enteros que son inaccesibles para otros desarrolladores».

Aquí tienes una lista de proyectos que utilizan dialectos Lisp:

  • GNU Emacs – escrito por Richard Stallman en Emacs Lisp. Algunos fans incluso lo llaman en broma un sistema operativo.
  • Grammarly – un servicio online para comprobar la calidad de los textos en inglés.
  • Piano – un paquete de software Common Lisp utilizado por Boeing y Airbus.
  • El software del metro de Londres – está desarrollado en Common Lisp.
  • AutoCAD – el sistema utiliza un lenguaje interno llamado AutoLISP.
  • Apache Storm – un sistema de procesamiento de flujos de datos en tiempo real escrito en Clojure (un dialecto Lisp) y Java.

Perspectivas de Lisp

A pesar de su venerable antigüedad, Lisp está vivo e incluso sigue evolucionando en dialectos. De hecho, hace tiempo que dejó de ser un mero lenguaje de programación para convertirse en toda una familia de lenguajes con un enfoque original del desarrollo de software. Lisp tiene más de 20 dialectos, y los más conocidos siguen utilizándose en el desarrollo comercial y científico:

  • Common Lisp – el dialecto principal, lanzado en 1984 y adoptado como estándar ANSI en 1995. Soporta programación funcional, macros, closures y otras características acumuladas desde 1959 por otros dialectos.
  • Scheme – uno de los dialectos más antiguos, creado en la década de 1970 por investigadores del MIT. La peculiaridad del lenguaje es su diseño flexible y minimalista. Scheme no proporciona facilidades de POO, pero el desarrollador puede implementarlas, junto con otras herramientas, por sí mismo.
  • Clojure – un lenguaje compilado creado en 2007 que se ejecuta en las plataformas JVM y CLR. Soporta programación concurrente, macros y funciones como ciudadanos de primera clase. Se integra fácilmente con Java.
  • Racket – un descendiente de Scheme que vio la luz en 1994. Originalmente concebido como un lenguaje de enseñanza, con el tiempo se ha convertido en un entorno de programación orientado al lenguaje, es decir, en una herramienta para crear lenguajes.
  • Emacs Lisp – el dialecto en el que está escrito casi en su totalidad GNU Emacs. Fue creado por el autor del proyecto GNU y fundador de la Free Software Foundation, Richard Stallman, y el programador Guy Steele en 1985.
  • Arc – uno de los últimos dialectos Lisp, desarrollado por Paul Graham en 2008. El sitio de noticias Hacker News y algunas otras partes de Y Combinator están escritos en Arc.

Según el índice TIOBE, el dialecto más popular sigue siendo Common Lisp (36º puesto), seguido en la segunda mitad de la clasificación por Clojure, Racket y Scheme. Incluso teniendo en cuenta todos los dialectos, Lisp sigue siendo un lenguaje «underground». Sin embargo, Kent Pitman, uno de los veteranos de Lisp y colaborador técnico de X3J13, cree que el lenguaje tiene todas las posibilidades de recuperar su antigua popularidad:

«El principal problema de Lisp es que tuvo demasiado éxito comercial demasiado pronto. A mediados de la década de 1980, el mundo aún no se había enfrentado a los problemas de computación que Lisp podía resolver con éxito. Era la época de MacWrite, MacPaint y Lotus 1-2-3, y daba igual usar Lisp o C. Pero el mundo ha cambiado y los problemas son mucho más complejos. Creo que Lisp tiene mucho más que ofrecer al mundo hoy que antes».

Kent Pitman

Categorizado en:

Programación,