¿Usaría (un dialecto de) LISP para una aplicación del mundo real? ¿Dónde y por qué? [cerrado]


31

LISP (y dialectos como Scheme, Common LISP y Clojure) no han obtenido mucho apoyo de la industria a pesar de que son lenguajes de programación bastante decentes. (Por el momento, aunque parece que están ganando algo de tracción).

Ahora, esto no está directamente relacionado con la pregunta, ¿cuál sería usar un dialecto LISP para un programa de producción? ¿Qué tipo de programa y por qué? También se incluyen los usos del tipo de integración en algún otro código (por ejemplo, C), pero tenga en cuenta que es lo que quiere decir en su respuesta. Se prefieren conceptos amplios, pero las aplicaciones específicas también son aceptables.


66
¿Emacs cuenta como una aplicación del "mundo real"? gnu.org/software/emacs/emacs-lisp-intro
S.Lott

1
@ S.Lott: Sí. Si usa elisp para crear extensiones para Emacs, está bien y una aplicación de un dialecto LISP
Anto

GNU Guile está destinado exactamente para este propósito.

1
Si bien es interesante, ya no creo que esta pregunta sea adecuada para este sitio. Múltiples razones: 1- demasiado amplia, 2- invita a una lista de respuestas, 3- no hay una forma clara de decidir cuál es la respuesta "correcta", 4- demasiado localizada en el tiempo ("no ha obtenido mucho apoyo de la industria"), 5- invita a la discusión y al debate.
Andres F.

Respuestas:


18

¿Usarías un dialecto LISP para un programa de producción?

Absolutamente

¿Qué tipo de programa y por qué?

Lisp es un lenguaje dinámico de propósito general. Hoy en día, tiene las mismas dificultades básicas que otros lenguajes dinámicos de propósito general que no son publicados por Microsoft: hilos nativos, integración GUI, operación determinista del GC y huellas de memoria pequeñas.

Los hilos nativos son logrados por LispWorks y SBCL, creo. Posiblemente otros? No he investigado completamente.

LispWorks y Franz Common Lisp - productos comerciales - se integran en la GUI para grados de éxito. Al no tener el $$ para comprarlos, no sé qué tan bien funciona. Sospecho que funcionan bastante bien ...

Una operación GC determinista se puede hacer (se hace en Java a un cierto nivel de éxito), pero yo no sé si los sistemas existentes Lisp (unos) mantenidos tienen ningún código para hacer eso.

La pequeña huella de memoria, creo, es lograda por algunos Lisps.

Mi punto básico es que Common Lisp está técnicamente listo para hacer sistemas de producción. Y lo hace .

La gran mayoría de los desarrolladores se asustan por (elegir uno) lenguajes dinámicos, macros, paréntesis, falta de IDE favorito, mala experiencia en la universidad, no hay muchos trabajos, y luego no lo usan.

Personalmente, saltaría a la construcción de un sistema de producción completo en Common Lisp desde cero en un entorno de equipo.

editar: Realmente no respondí por qué Lisp en comparación con otros idiomas.

En mi experiencia con Lisp, no significativa, pero considerablemente más que 'hola mundo', he encontrado que el lenguaje es extremadamente útil después de los primeros dolores de "Argh new language". La mayoría del lenguaje se combina de una manera muy regular y bastante obvia que realmente no encuentro otros idiomas para operar. Parte de esto es la fusión de expresiones y declaraciones. Parte de esto es el tipo de datos de la lista principal. Parte de esto es el sistema de tipos. Parte de esto es el sistema macro. No me malinterpreten, sin embargo, no son puntos de dolor. Pero no me patean en la cara tanto como los puntos débiles de otros idiomas.

Un ejemplo simplista es la rutina de longitud de lista de Python. El enfoque de Python es llamar len(mysequence). Pero, si lo pensamos bien, una longitud es una propiedad de una secuencia. Entonces, mysequence.len()es una idea más apropiada. Lisp esencialmente elimina esa distinción sintáctica. (length thing)es tanto la sintaxis de llamada de función como la sintaxis de método. Por supuesto, algunas personas lo encuentran frustrante y quieren la diferencia sintáctica. Prefiero tener la regularidad.

edit2: Convertí la parte de mi tesis de MS que se ejecuta en el escritorio a Common Lisp y hasta ahora ha sido un placer trabajar con ella.


2
Por lo que escuché, LISP se usa en sistemas de producción completos, pero generalmente solo para cierto procesamiento lógico que es más fácil de codificar en LISP que otros lenguajes. La IA de videojuegos y el preprocesamiento de datos estadísticos fueron ejemplos que una vez me citaron. Una vez tuve un gerente que decía: "Cualquier sistema suficientemente complejo tiene una implementación LISP incorporada a medias". Un dicho similar fue "Cualquier sistema suficientemente hinchado tiene un lector de correo electrónico incorporado".
FrustratedWithFormsDesigner

44
@ Frustrado: Sí, esas son la enésima Ley de Greenspun y la Ley de jwz.
Paul Nathan

2
Clojure resuelve muchos de estos, simplemente en virtud de estar específicamente diseñados para ser compatibles y reemplazar a Java. Pero, por supuesto, también hay implementaciones de Scheme y CL para la JVM (por ejemplo, Kawa, ABCL).
Jörg W Mittag

44
Clojure es vagamente molesto para mí porque es otra fragmentación.
Paul Nathan

La fragmentación no es algo malo. Lo que es realmente molesto en Clojure es la falta de pares de puntos. ¿Se puede contar como un lenguaje similar a Lisp sin una cosa tan fundamental?
SK-logic

11

Personalmente, sé de personas que usan Lisp en forma de Clojure en un par de bancos de inversión y nuevas empresas en Londres. También elegí Clojure como el lenguaje de desarrollo principal para mi propia startup, así que estoy dispuesto a poner mi dinero donde está mi boca :-)

Descubrí que fue una experiencia muy esclarecedora aprender Clojure durante el año pasado (después de mucha experiencia con Java y C #). Las razones principales para esto son:

  • Tiene un énfasis bastante fuerte en la programación funcional (más que la mayoría de los demás Lisps). El autor y BDFL Rich Hickey ha citado frecuentemente a Haskell como una de sus inspiraciones para el diseño del lenguaje, lo que significa que obtienes cosas como estructuras de datos totalmente inmutables y secuencias infinitas perezosas, etc.
  • Metaprogramación macro : la filosofía "código es datos" de Lisp es difícil de entender a menos que la haya experimentado realmente, pero es una de las razones por las que Lisps es tan expresivo y productivo. Básicamente tiene el poder de extender el idioma para que coincida con su dominio problemático.
  • Fantástico soporte para la concurrencia multinúcleo : en realidad creo que Clojure es el mejor lenguaje para la programación concurrente en este momento. Ver http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey para una presentación esclarecedora sobre esto
  • El desarrollo interactivo en REPL es una forma excelente y productiva de crear aplicaciones. Le da una sensación real de poder para modificar dinámicamente el código de su aplicación en ejecución e inspeccionar mediante programación las estructuras de datos en vivo .....

También parece ser una opción práctica para el uso real de producción por las siguientes razones:

  • Ejecutar en la JVM con una interoperabilidad Java muy fácil le da acceso a todas las bibliotecas y herramientas en el ecosistema Java
  • Está ejecutando en la JVM, que es una plataforma probada para aplicaciones empresariales. Clojure se beneficia de todas las características agradables de JVM, como la excelente compilación GC y JIT de forma gratuita.
  • Es un lenguaje dinámico por defecto, lo que lo hace muy conveniente para el desarrollo y la creación rápida de prototipos con casi ningún estándar. Sin embargo, puede agregar sugerencias de tipo estático para obtener un rendimiento bastante bueno donde lo necesite.
  • Es una comunidad pragmática y útil : el tipo de cultura donde la gente hace las cosas y se enfoca en soluciones bien diseñadas que resuelvan problemas reales
  • Hay soporte de herramientas en múltiples IDEs . Personalmente uso Eclipse con el complemento en sentido antihorario (porque necesito la integración de Java) pero hay muchas otras opciones.

8

Usaría LISP si fuera la mejor opción para el trabajo. Solo algunas cosas que influyen en la "mejor opción":

  • soporte de proveedores. La implementación de LISP que utilizamos: si algo sale mal e interfiere con nuestro desarrollo y, por lo tanto, con nuestros plazos, ¿trabajará el proveedor para encontrar una solución con nosotros?
  • biblioteca de apoyo. ¿Qué bibliotecas hay disponibles? Manipulación de cadenas, matemática, acceso a datos, servlets web (o equivalentes LISP), kit de herramientas de ventanas, etc. No quiero tener que escribir estas cosas desde cero.
  • soporte de herramientas - ¿Qué tan bueno es el IDE? ¿Sólido / estable o escamoso? ¿Buen soporte de editor? Depurador integrado? Si necesito hacer un desarrollo de GUI en LISP, ¿hay un IDE visual o tengo que codificar el diseño de GUI a mano ( odio hacerlo).
  • aceptación del desarrollador (realmente no quiero tener que pasar demasiado tiempo enseñando a mis compañeros de equipo un idioma completamente nuevo)

Todos estos factores deben considerarse al decidir si LISP es apropiado para un proyecto. En el mundo corporativo, nunca lo he experimentado.


Estoy de acuerdo con usted en que la productividad a menudo está más influenciada por las herramientas y bibliotecas disponibles que por el lenguaje en sí (siempre que el lenguaje ofrezca alguna funcionalidad básica).
Giorgio

6

Absolutamente. Paul Graham lo explica bien .

... En 1995, sabíamos algo que no creo que nuestros competidores entendieran, y pocos entienden incluso ahora: cuando está escribiendo software que solo tiene que ejecutarse en sus propios servidores, puede usar el idioma que desee. ..

Elegimos Lisp. Por un lado, era obvio que el rápido desarrollo sería importante en este mercado. Todos comenzamos desde cero, por lo que una empresa que podría obtener nuevas funciones antes que sus competidores tendría una gran ventaja. Sabíamos que Lisp era un lenguaje realmente bueno para escribir software rápidamente, y las aplicaciones basadas en el servidor amplían el efecto del desarrollo rápido, porque puedes lanzar el software en el momento en que se hace.

Si otras compañías no quisieran usar Lisp, mucho mejor. Podría darnos una ventaja tecnológica, y necesitábamos toda la ayuda que pudiéramos obtener ...

Entonces se podría decir que usar Lisp fue un experimento. Nuestra hipótesis era que si escribiéramos nuestro software en Lisp, podríamos hacer que las funciones se hicieran más rápido que nuestros competidores, y también hacer cosas en nuestro software que ellos no podrían hacer. Y debido a que Lisp era de alto nivel, no necesitaríamos un gran equipo de desarrollo, por lo que nuestros costos serían más bajos. Si esto fuera así, podríamos ofrecer un mejor producto por menos dinero y aún así obtener ganancias. Terminaríamos obteniendo todos los usuarios, y nuestros competidores no obtendrían ninguno, y eventualmente cerrarían. Eso era lo que esperábamos que sucediera, de todos modos.

¿Cuáles fueron los resultados de este experimento? Sorprendentemente, funcionó. Eventualmente tuvimos muchos competidores, del orden de veinte a treinta de ellos, pero ninguno de sus software podía competir con el nuestro. Teníamos un creador de tiendas en línea wysiwyg que se ejecutaba en el servidor y, sin embargo, parecía una aplicación de escritorio. Nuestros competidores tenían guiones cgi. Y siempre estábamos muy por delante de ellos en características. A veces, desesperados, los competidores intentan introducir características que no teníamos. Pero con Lisp, nuestro ciclo de desarrollo fue tan rápido que a veces pudimos duplicar una nueva característica dentro de uno o dos días después de que un competidor lo anunciara en un comunicado de prensa. Para cuando los periodistas que cubren el comunicado de prensa llegaran a llamarnos, también tendríamos la nueva función.

Debe haber parecido a nuestros competidores que teníamos algún tipo de arma secreta, que estábamos decodificando su tráfico Enigma o algo así. De hecho, teníamos un arma secreta, pero era más simple de lo que pensaban. Nadie nos estaba filtrando noticias de sus características. Solo pudimos desarrollar software más rápido de lo que cualquiera creía posible ...


8
"... Paul Graham originalmente escribió reddit, en ceceo, en el dorso de una servilleta mientras esperaba un café. Era tan poderoso que tuvo que reescribirse en Python para que las computadoras comunes pudieran entenderlo. Porque fue escrito en lisp, casi no fue un esfuerzo reescribir todo, y la reescritura se completó entre dos ciclos de procesador. El mismo Paul Graham fue escrito completamente en lisp, por una versión anterior de sí mismo, también escrita en lisp, por un versión anterior de lisp. Es lisp, paul graham, lisp, paul graham, todo el camino ".
John Cartwright

5

Dónde: Emacs es una aplicación del mundo real que usa LISP.

Por qué: fue una excelente manera de expresar el mapeo entre la pulsación de tecla y la acción. Se interpreta y es rápido y está bien definido y es simple.


Me extiendo esta respuesta diciendo por qué era bueno para expresar la asignación entre ketstrokes y acciones
Anto

@Anto: En mi experiencia, Lisp hace que sea realmente fácil crear abstracciones poderosas que puedan representar de manera transparente cualquier acción que puedas hacer en un editor de una manera muy consistente: después de usar Emacs por un momento, puedes adivinar cómo se hace casi cualquier cosa. . Esto hace posible asignar cualquier cosa que pueda hacer en el editor a una pulsación de tecla, con cada encuadernación que se ve muy similar a la otra, lo que facilita la escritura y el mantenimiento.
Tikhon Jelvis

4

Tanto Macsyma como Autocad se basan en un dialecto de Lisp. Los clasificaría como 'mundo real', así como Emacs.


Mathematica no está basado en Lisp.
Rainer Joswig

2
AutoCAD ofrece AutoLISP como API, pero está escrito en código administrado C ++ y .NET.
Bloque CAD

1
@RainerJoswig Macsyma probablemente se refería a Mathematica.
user40989

2

Absolutamente lo consideraría. Especialmente para nuevos trabajos de desarrollo que tenían un potencial informático paralelo. Ese parece ser un punto ideal para este tipo de lenguajes funcionales.


2

Lisp es una de las mejores opciones para implementar compiladores. Y, a medida que aumenta el uso de DSL y eDSL, Lisp se está volviendo más valioso. Estoy usando un dialecto Lisp para todas mis tareas relacionadas con DSL.


0

En este momento estoy tratando de usar newLisp como reemplazo de Php en mi sitio web personal a través del marco Dragonfly . Si puedo descubrir cómo hacer que Apache juegue bien, lo usaré (el servidor web incorporado funciona muy bien, pero preferiría trabajar a través de Apache). Y una vez que eso suceda, usaré newLisp en cualquier lugar donde usaría Php, porque no me gusta Php y me gusta newLisp.

En este momento, Clojure no es una buena opción para las aplicaciones de Android, pero sé que la gente está trabajando en eso. Entonces, si eso se resuelve, ese sería otro lugar para el que usaría un dialecto de Lisp para aplicaciones del mundo real ... pero nuevamente, esto es porque simplemente no me gusta Java.

Pero, sinceramente, prefiero Ruby a Lisp ... pero esto es principalmente una cuestión de comunidad y documentación.


0

Implementé una aplicación comercial patentada en Common Lisp llamada Tankan que se ejecuta en Microsoft Windows como un ejecutable nativo.

Es un programa para entrenarse para memorizar caracteres kanji japoneses.

El programa se ejecuta como un servidor HTTP en segundo plano. La ejecución de este servidor y la navegación a sus páginas está coordinada por una pequeña aplicación de icono del área de notificación del sistema (también conocida como "Bandeja") que desarrollé usando Visual C ++.

La aplicación de icono de bandeja pequeña se inicia, monitorea y detiene el servidor basado en Lisp, y se comunica con él utilizando tuberías Win32 vinculadas a su entrada y salida estándar. A través de una tubería, el servidor Lisp informa a la aplicación del icono de la bandeja de la URL precisa con el número de puerto correcto, y esa aplicación de icono de la bandeja puede iniciar el navegador a través de la API de Shell para explorar esa URL. El usuario solo hace doble clic en el icono para que aparezca la IU.

El programa Lisp mantiene en su memoria un estado de sesión bastante complejo que contiene el historial de entrada del usuario y varias relaciones entre varios objetos. La notación de objetos circulares de Lisp (habilitada por la *print-circle*variable) y cómo funciona a través de print-objectmétodos CLOS personalizados es de gran ayuda para implementar la persistencia: los usuarios pueden guardar el estado en el disco y reanudar donde lo dejaron. Todo se guarda, incluido el estado de la interfaz de usuario. Hay una gran cantidad de subestructura compartida en el gráfico de objetos, así como ciclos. Además, una gran cantidad de información estática que no tiene que ser persistente, como el contenido de los objetos de entrada del diccionario. Con los métodos de objetos de impresión personalizados ANSI Common Lisp, puede crear representaciones impresas condensadas para objetos que, sin embargo, son legibles por máquina,

Casi no se usa JavaScript en la interfaz de usuario web. Incluso los controles para ocultar y mostrar partes de la interfaz de usuario se realizan mediante el envío de formularios y la representación del HTML. Por lo tanto, cada detalle del estado de la IU está en el servidor y persiste cuando el usuario guarda. La regeneración del HTML es muy rápida. Se realiza mediante una expresión de comillas gigantes de Lisp que alimenta una macro generadora de HTML. El código compilado por Clozure Common Lisp (CCL) hace que esto suceda tan rápido que apenas se da cuenta de que cuando hace clic en un botón [+] en la interfaz de usuario para abrir algo, está enviando una solicitud a un servidor que regenera el página completa, y no simplemente ejecutando JavaScript local para cambiar la visibilidad de un elemento de documento local.

El programa fue desarrollado originalmente con CLISP. Gracias a que ANSI CL es un lenguaje estándar, con implementaciones que se ajustan bien y no hay demasiadas trampas engañosas en el lenguaje (comportamiento "indefinido" o "definido por la implementación") se transfirió fácilmente a CCL.

CLISP no ha sido abandonado; todavía se usa para alimentar el back-end de licencias, utilizando gran parte de la misma base de código común.

Desarrollé un sistema de licencia original para el programa, utilizando criptografía de curva elíptica proporcionada por la biblioteca IronClad, que es utilizada por el servidor de licencias para firmar licencias para certificarlas. (Creo recordar que podría haber utilizado el programa de línea de comandos de OpenSSL para generar los parámetros EC para la clave del servidor).

Las licencias se representan como objetos Lisp. Es un tributo a la portabilidad de Lisp que un programa de Windows compilado por Clozure Common Lisp pueda generar una licencia basada en S-expresión, un programa CLISP que se ejecute en un servidor Debian puede completar el campo de firma digital faltante en ese objeto y enviarlo de nuevo a El programa de Windows que puede validar la firma.

En el servidor, además del servicio de licencias basado en CGI, utilizo una API de línea de comandos simple para administrar licencias. Puede enumerar licencias, encontrar licencias específicas y editar sus atributos, como por ejemplo editar la fecha de vencimiento de una licencia temporal para otorgar una excepción a un usuario. El back-end de licencias también genera correos electrónicos. No utilicé ninguna biblioteca para el manejo de CGI en el lado del servidor: solo código Lisp enrollado a mano para tratar con las variables de entorno de Apache y los argumentos de la línea de comandos. (Aunque el código de la biblioteca se utiliza para tratar la codificación de URL y la generación de HTML). No se utiliza ninguna base de datos para el almacenamiento; las licencias se clasifican en un archivo llamado licenses.lispy eso es todo.


-1

Si alguien me pagó, claro.

Sin embargo, probablemente estarían más interesados ​​en pagarle a alguien que conoce el idioma. Solo he jugado con elisp y esquema algunas veces.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.