Mi licenciatura fue en Ciencia Cognitiva e Inteligencia Artificial. A partir de eso tuve una introducción de un curso a Lisp. Pensé que el lenguaje era interesante (como en "elegante") pero realmente no lo pensé mucho hasta que encontré la Décima Regla de Greenspun mucho más tarde:
Cualquier programa C o Fortran suficientemente complicado contiene una implementación ad hoc, especificada informalmente, llena de errores y lenta de la mitad de Common Lisp.
El punto de Greenspun fue (en parte) que muchos programas complejos tienen intérpretes incorporados. En lugar de construir un intérprete en un idioma, sugirió que podría tener más sentido usar un lenguaje como Lisp que ya tiene un intérprete (o compilador) incorporado.
En ese momento, había estado trabajando en una aplicación bastante grande que realizaba cálculos definidos por el usuario utilizando un intérprete personalizado para un idioma personalizado. Decidí intentar reescribir su núcleo en Lisp como un experimento a gran escala.
Tomó aproximadamente seis semanas. El código original era ~ 100,000 líneas de Delphi (una variante de Pascal). En Lisp eso se redujo a ~ 10,000 líneas. Sin embargo, aún más sorprendente fue el hecho de que el motor Lisp era 3-6 veces más rápido. ¡Y tenga en cuenta que este fue el trabajo de un neófito Lisp! Toda esa experiencia me abrió los ojos; Por primera vez, vi la posibilidad de combinar rendimiento y expresividad en un solo idioma.
Algún tiempo después, cuando comencé a trabajar en un proyecto basado en la web, audicioné varios idiomas. Incluí Lisp y Scheme en la mezcla. Al final, seleccioné una implementación de Esquema : Esquema Chez . He estado muy contento con los resultados.
El proyecto basado en la web es un "motor de selección" de alto rendimiento . Utilizamos Scheme de varias maneras diferentes, desde el procesamiento de datos hasta la consulta de datos y la generación de páginas. En muchos lugares, en realidad comenzamos con un idioma diferente, pero terminamos migrando a Scheme por razones que describiré brevemente a continuación.
Ahora puedo responder a tu pregunta (al menos en parte).
Durante la audición, observamos una variedad de implementaciones de Lisp y Scheme. En el lado de Lisp vimos (creo) Allegro CL, CMUCL, SBCL y LispWorks. En el lado del Esquema miramos (creo) Bigloo, Chicken, Chez, Gambit. (La selección del idioma fue hace mucho tiempo; por eso estoy un poco confusa. Puedo desenterrar algunas notas si es importante).
Inmediatamente estábamos buscando a) hilos nativos yb) soporte para Linux, Mac y Windows. Esas dos condiciones combinadas noquearon a todos, pero (creo) Allegro y Chez, así que para continuar con la evaluación tuvimos que aflojar el requisito de subprocesos múltiples.
Creamos un conjunto de pequeños programas y los usamos para evaluación y pruebas. Eso reveló una serie de problemas. Por ejemplo: algunas implementaciones tenían defectos que impedían que algunas pruebas se ejecutaran hasta su finalización; algunas implementaciones no pudieron compilar código en tiempo de ejecución; algunas implementaciones no podían integrar fácilmente el código compilado en tiempo de ejecución con el código precompilado; algunas implementaciones tenían recolectores de basura que eran claramente mejores (o claramente peores) que las otras '; etc.
Para nuestras necesidades, solo las tres implementaciones comerciales, Allegro, Chez y Lispworks, pasaron nuestras pruebas principales. De los tres, solo Chez pasó todas las pruebas con gran éxito. En ese momento, creo que Lispworks no tenía hilos nativos en ninguna plataforma (creo que sí) y creo que Allegro solo tenía hilos nativos en algunas plataformas. Además, Allegro tenía una tarifa de licencia de "llámenos" en tiempo de ejecución que no me gustó mucho. Creo que Lispworks no tenía una tarifa de tiempo de ejecución y Chez tenía un acuerdo directo (y muy razonable) (y solo funcionaba si usabas el compilador en tiempo de ejecución).
Después de haber producido fragmentos de código algo significativos tanto en Lisp como en Scheme, aquí hay algunos puntos de comparación y contraste:
Los entornos de Lisp son mucho más maduros. Obtienes mucho más por el dinero. (Dicho esto, más código también equivale a más errores).
Los entornos de Lisp son mucho más difíciles de aprender. Necesitas mucho más tiempo para ser competente; Common Lisp es un lenguaje enorme, y eso es antes de llegar a las bibliotecas que las implementaciones comerciales agregan. (Dicho esto, el caso de sintaxis de Scheme es mucho más sutil y complicado que cualquier otra cosa en Lisp).
Los entornos Lisp pueden ser algo más difíciles de producir binarios. Necesita "sacudir" su imagen para eliminar bits innecesarios, y si no ejercita su programa correctamente durante ese proceso, podría terminar con errores de tiempo de ejecución más adelante. . Por el contrario, con Chez compilamos un archivo de nivel superior que incluye todos los demás archivos que necesita y listo.
Dije antes que terminamos usando Scheme en varios lugares que originalmente no teníamos intención. ¿Por qué? Puedo pensar en tres razones fuera de mi cabeza.
Primero, aprendimos a confiar en Chez (y su desarrollador, Cadence). Pedimos mucho de la herramienta, y se entregó constantemente. Por ejemplo, Chez ha tenido históricamente un número trivialmente pequeño de defectos, y su administrador de memoria ha sido muy, muy bueno.
En segundo lugar, aprendimos a amar la actuación que obtuvimos de Chez. Estábamos usando algo que parecía un lenguaje de scripting, y estábamos obteniendo la velocidad del código nativo. Para algunas cosas que no importaban, pero nunca dolían, y a veces ayudaban muchísimo.
Tercero, aprendimos a amar la abstracción que el Esquema podría proporcionar. No me refiero solo a las macros, por cierto; Me refiero a cosas como cierres, lambdas, llamadas de cola, etc. Una vez que empiezas a pensar en esos términos, otros idiomas parecen bastante limitados en comparación.
¿Es el esquema perfecto? No; Es una compensación. Primero, permite que los desarrolladores individuales sean más efectivos, pero es más difícil para los desarrolladores asimilar el código de los demás porque faltan las señales que tienen la mayoría de los idiomas (por ejemplo, para bucles) en Scheme (por ejemplo, hay un millón de formas de hacerlo un bucle for). En segundo lugar, hay un grupo mucho más pequeño de desarrolladores para hablar, contratar, pedir prestado, etc.
Para resumir, creo que diría: Lisp y Scheme ofrecen algunas capacidades que no están ampliamente disponibles en ningún otro lugar. Esa capacidad es una compensación, por lo que es mejor que tenga sentido en su caso particular. En nuestro caso, los factores determinantes entre ir con Lisp o Scheme tenían más que ver con características muy fundamentales (soporte de plataforma, subprocesos de plataforma, compilación en tiempo de ejecución, licencias en tiempo de ejecución) que con las funciones de idioma o biblioteca. Nuevamente, en nuestro caso eso también fue una compensación: con Chez obtuvimos las características principales que queríamos, pero perdimos las amplias bibliotecas que tenían los entornos comerciales de Lisp.
Además, solo para reiterar: observamos los diversos Lisps y Esquemas hace mucho tiempo; Todos han evolucionado y mejorado desde entonces.