Lisp obviamente es una ventaja para las cosas de IA , pero no me parece que Lisp sea más rápido que Java, C # o incluso C. No soy un maestro de Lisp, pero me resulta increíblemente difícil entender la ventaja. uno podría escribir software de negocios en Lisp.
Sin embargo, se considera como el lenguaje de un hacker.
¿Por qué Paul Graham aboga por Lisp? ¿Por qué ITA Software eligió Lisp sobre otros lenguajes de alto nivel? ¿Qué valor tiene sobre estos idiomas?
Respuestas:
Hay algunas razones por las que estoy trabajando para volverme competente con Common Lisp.
Podría decirse que las únicas razones reales para elegir contra Common Lisp es que las bibliotecas estándar están fechadas.
Me arriesgaré y diré que, en el caso general, la sintaxis no debería ser un problema para un trabajador de software profesional.
fuente
Me gusta Lisp por su
La programación es combatir la complejidad. Las abstracciones son la única herramienta efectiva para combatir la complejidad cada vez mayor (con nuestro tamaño de cráneo muy limitado y constante). Manejar abstracciones con Lisp es como tener un genio con n + 1 deseos.
fuente
(+ 1 n)
deseos, o incluso más práctico(incf n)
?Creo que la respuesta correcta de Lisp es más gnómica. Algo así como: "Si tiene que preguntar, no está listo".
Entonces, si alguien pregunta más, la respuesta correcta es "sí" si es una pregunta o / o "No estás listo".
fuente
Creo que la ventaja de Lisp en el campo de la inteligencia artificial (IA) que todos mencionan es un accidente histórico ... Lisp comenzó para / en IA, pero es un lenguaje de propósito general.
Creo que la velocidad de ejecución no es el único aspecto importante de un lenguaje (aunque lo hice una vez). Sin embargo, uno de los aspectos que me gusta de Lisp es que, para mí, combina Python y C en uno. Puedo comenzar a codificar sin declaraciones y prototipos de forma inmediata y muy rápida (el tiempo de ejecución y el REPL son muy importantes para esto). Después de ejecutar algo, agrego declaraciones de tipo y "optimizo" mi código, poco a poco. Es una maravilla presionar una tecla en SLIME y ver el lenguaje de máquina generado para la función que me interesa. En Python, no hay declaraciones de tipo, por lo que no puedo obtener más velocidad, pero en C, hacer algo rápidamente es Mucho más doloroso. Lisp es muy útil en este caso.
Dicho esto, me gusta Lisp principalmente por las macros . Cuando finalmente entiendes lo que las macros pueden lograr, creo que soportas los paréntesis fácilmente. Además, los editores como Emacs administran los paréntesis para que no tenga que hacerlo. Admito, sin embargo, que no encontré paréntesis tan malos al principio, y sé que algunas personas simplemente no pueden soportarlos. Pero como todo el propósito de las macros es generar código en tiempo de compilación, el código en Lisp usa una estructura de datos estándar, y los paréntesis simplemente son una representación del código como listas, lo cual es necesario para que las macros sean fáciles de escribir.
No conozco ningún otro idioma en el que pueda escribir pequeños sublenguajes para describir mejor su problema con la facilidad de Lisp. Esa es la ventaja de la que habla Paul Graham en Beating the Averages . Es extrema modularidad y concisión. En Java tengo que escribir mucho texto sin formato para expresar una sola idea. En Lisp podría escribir algunas macros que generan ese código automáticamente, y luego simplemente usarlas. De todos modos, debes entender algunos ejemplos de esto y luego juzgar por ti mismo. Cuando lo "vi", quedé impresionado, y sigo pensando que Lisp es el mejor idioma solo por esta razón. Siempre busco macros en los idiomas principales para ver si coinciden con el poder de las macros Lisp, pero hasta la fecha no encontré ninguna. Forth es un segundo cercano.
Terminaré con un par de críticas, en relación con el software empresarial:
El software empresarial necesita bibliotecas, y buenas, y Lisp no es bueno en esto. Por lo general, no los necesito, pero cuando lo hago, tengo que elegir entre una pequeña selección de software incompleto que usan algunas personas. Debo contribuir a arreglar esto, supongo ...
El software empresarial generalmente está construido por grandes grupos de personas, y creo que la comunicación puede verse obstaculizada con macros, ya que básicamente cambian el idioma. Muchos programadores se sienten más cómodos detectando ciertos patrones en el código, incluso si el texto del programa es más largo y más repetitivo. Supongo que en ITA tienen algunas reglas con respecto a las macros o tienen una gran biblioteca de macros que facilita la colaboración (o, más simplemente, todos los programadores son expertos de Lisp).
fuente
No me gusta Lisp.
(Me gustan muchos de los conceptos que usa, cómo hace que las poderosas técnicas estén disponibles de forma nativa, etc.
Pero nunca me he convencido de ir a usarlo ((aunque varias personas lo han intentado ) porque los beneficios del lenguaje se pueden lograr con otros lenguajes de programación (algunos directamente, otros indirectamente), por lo que no hay suficientes beneficios para hacerme pasar el tiempo aprendiéndolo y aguantando la sintaxis horrible.)))
Pero sí, por razones que a algunas personas les gusta, revise estas preguntas de desbordamiento de pila:
Probablemente hay algunas más en las preguntas relacionadas para aquellos también.
fuente
Interpretaré "Lisp" como " Lisp común "; No tengo dudas de que otras respuestas dirán " Esquema ". (Sugerencia: Lisp es una familia de idiomas).
¿Qué significa "más rápido"? En términos de tiempo necesario para ejecutar un punto de referencia, no, no es más rápido que C ( pero puede serlo ).
"Rápido" en términos de cuánto tiempo le toma a Joe Random Hacker escribir un programa de trabajo o corregir un error en un sistema de software grande. Casi seguro
En cuanto a este hacker, lo uso porque quiero escribir código, no repetitivo. Quiero escribir algo una vez , y no repetirme continuamente. Y quiero interactuar con el programa mientras lo escribo.
fuente
M-x eval-region
(oeval-buffer
), pero eso es todo.C-j
(que es moralmente equivalente a entrar) y que entrará en vigor de inmediato.Me gusta Lisp porque es un medio excelente para expresar mis pensamientos. El predicado de mi idioma favorito es "Si pudiera elegir cualquier cosa para expresar ideas, ¿cuál sería?". Actualmente es Lisp * ( Esquema para ser específico), hasta el punto de que me encuentro escribiendo notas de programación en él. Como IRL , papel y bolígrafo. Incluso cuando estoy pensando en programas que necesito implementar en PHP o Ruby o Python.
Este no es un truco que me enseñé yo mismo, o algo que hago para la credibilidad de los nerds (de todos modos, nadie puede ver el interior de mi cuaderno); Es solo que Lisp es mucho más natural para mí pensar que cualquiera de las alternativas, y cualquier lenguaje que resuene con usted y que sea profundamente atesorado.
* Sin embargo, solo como una nota al pie, Haskell está cerrando la brecha bastante rápido a medida que aprendo más.
fuente
El problema es el poder. Potencia = Trabajo (funcionalidad del programa) / Tiempo
Trace algún tipo de curva entre C ++ y Java. Continúa, y en algún momento a lo largo de la línea encontrarás a Lisp.
fuente
Paul Graham responde a esta pregunta él mismo en What Made Lisp Different .
Tenga en cuenta que lo usó para su inicio a mediados de la década de 1990, por lo que Python y Ruby no eran realmente maduros en ese momento (o tal vez ni siquiera nacieron).
Lisp básicamente tiene todas las ventajas de los lenguajes dinámicos, y creo que para la mayoría de las aplicaciones web actuales, Python y Ruby son bastante impresionantes, y tienen la ventaja de marcos y documentación y comunidades vibrantes.
La característica asesina es probablemente que todo el programa está hecho de expresiones. Esto significa que puede pasar bloques de código a funciones (o macros ...), porque un bloque de código no es más que una expresión.
Python no tiene exactamente esta característica; tendrías que definir funciones y pasarlas. Ruby parece tener bloques, quizás sea algo limitado en comparación con lo que Lisp puede hacer (no estoy seguro).
fuente
He tenido una reacción instintiva a Scheme en el pasado, pero ahora estoy listo para darle una oportunidad a Lisp ( Clojure , en realidad).
Verá, a lo largo de los años aprendí fragmentos de lenguajes como Java, C #, C ++, Python, y las cosas ya no son un desafío.
Clojure tiene muchas promesas, parece ser muy limpio y puede resolver muchos problemas del mundo real. Un caso sólido para un lenguaje limpio como Clojure es el advenimiento de las computadoras multinúcleo.
Yay LISP!
EDITAR: ITA Software fue fundado por graduados del MIT, y Scheme / Lisp fue el único idioma que muchos de los graduados del MIT aprendieron. Sin embargo, para ser justos, uno puede intercambiar en caliente los algoritmos de Lisp en un sistema de producción en ejecución, lo cual es una gran ventaja.
fuente
INTERCAL
. El desafío no es el único criterio; tiene que ser capaz de resolver problemas reales rápidamente también. Al menos Haskell es usado y amado por muchos.PLEASE
?Lo que me gusta de Lisp es que trasciende los paradigmas. Algunas personas dirán que Lisp es funcional, otras dirán que es declarativo y otras dirán que es multiparadigma. Creo que todos estos pierden el punto. Cuando usa Lisp, el paradigma ya no es una restricción.
¿Quieres objetos? Puedes tenerlos. ¿Quieres programación funcional? Tu puedes tenerlo. ¿Quieres programación lógica al estilo Prolog ? Escribe algunas macros. ¿Quieres programación declarativa estilo SQL? Ve a por ello. ¿Quieres usar algún paradigma que aún no se ha inventado? Estoy seguro de que se puede hacer en Lisp.
Aparte de los idiomas similares a Forth , aún no he visto que otro idioma ofrezca este nivel de flexibilidad.
fuente
"Más rápido" no es algo simple de medir, realmente depende de qué aspecto esté evaluando. Dependiendo de la tarea y la implementación de Lisp, las velocidades pueden acercarse a C. Observe el Gran Shoot-Out de evaluación comparativa para sumergirse en los detalles. La implementación SBCL de Lisp está a la par con Java 6 Server y es significativamente más rápida que Ruby o Python.
Pero, la velocidad pura no es la razón principal para elegir un lenguaje de programación; si lo fuera, todos estaríamos programando en lenguaje ensamblador , ¿verdad? Para mí, la alegría diaria de Lisp es que el código está compilado, pero no tengo que quitar la aplicación, volver a compilar todo y luego comenzar a ejecutarlo desde cero. En cambio, puedo cambiar una sola función y ese cambio tendrá efecto en todas partes, y puedo ver inmediatamente el efecto en mi aplicación. Además, ese enfoque muy rápido de "escribir, probar, escribir más, probar más" hace que sea mucho más fácil probar inmediatamente por adelantado mientras escribe el código (y luego puede convertir esas sondas interactivas en pruebas unitarias más adelante).
Imagine escribir un correo electrónico donde, después de cada línea, debe presionar un botón para compilar la salida de su correo electrónico en la pantalla antes de continuar con su pensamiento. Eso es para mí escribir en Java u otro lenguaje como ese. A veces hay una razón para hacerlo, y me gusta Java, pero Lisp es más receptivo y es más fácil hacer el trabajo.
fuente
Estoy aprendiendo Lisp ( newLisp ) por un par de razones.
Razón número uno: Lisp me hace pensar de manera diferente, lo que me convierte en un mejor programador de Ruby.
Parece muy incómodo hacer ciertas cosas en Lisp, por ejemplo, la iteración anidada para recorrer múltiples listas. Entonces me obliga a usar otras cosas, como
map
. Mi idioma favorito, Ruby, tiene el mismo método de mapa, pero no siempre lo uso, porque no me es familiar: aprendí a hacer cosas con una técnica pobre, y cuando el idioma apoya esa técnica, sigo usándolo.Razón número dos: Lisp es práctico y tiene buenas bibliotecas modernas.
Hay un marco web muy agradable y ligero para newLisp llamado libélula . Esto me permite usar el código newLisp en lugar de PHP para algunas tareas. Realmente no me gusta PHP, y newLisp parece más divertido para esta tarea específica que Ruby.
Razón número tres: Lisp es sintáctica y conceptualmente consistente.
Para mí, esta es la gran diferencia entre Ruby y Python, la consistencia.
fuente
¿Puedes decir "Lealtad a la marca"?
Empecé en Fortran. Me encantó.
Me cambié a Lisp. Al principio lo odiaba. Entonces aprendí a amarlo y a odiar a Fortran.
Más tarde Pascal, C, C ++, varios ensambladores, C #. (En realidad no amo C #.)
¿Supongo que soy voluble?
fuente
Cuando se creó Lisp, comenzaron con las matemáticas, no con la informática (que todavía no existía). Y el equipo de Lisp hizo algunas cosas REALMENTE bien. ¡Lisp tuvo recolección de basura en 1960 más o menos! Realmente hicieron un gran trabajo.
Creo que la canción de The Eternal Flame lo cubre.
fuente
Un gran atractivo es la comunidad. Lisp ha atraído a los desarrolladores más ambiciosos y brillantes desde que se inventó el lenguaje. Dondequiera que los investigadores estén tratando de resolver problemas que nunca se han resuelto, es probable que encuentre Lisp, como en la investigación de inteligencia artificial (IA), visión por computadora, planificación, representación de conocimientos y optimización heurística compleja. El lenguaje se presta para resolver problemas de abajo hacia arriba y de arriba hacia abajo al mismo tiempo, lo que parece ayudar a enfrentar los desafíos más difíciles.
La sintaxis exensible a través de macros significa que rara vez es necesario ampliar la definición del lenguaje. Gran parte de lo que requeriría una extensión de idioma en un idioma más restringido es solo una macro con Lisp. Por lo tanto, los programadores de Lisp son libres de hacer uso de conceptos de lenguaje recién inventados sin un nuevo estándar de idioma y sin necesariamente una penalización de velocidad real. En un nivel básico, las extensiones de código repetitivo son innecesarias por pequeñas extensiones. Ideas completamente nuevas en el flujo de control, como la unificación de estilo Prolog, se implementan de manera eficiente y compacta como extensiones.
El sistema OOP, CLOS , es único en términos de flexibilidad. Es muy difícil volver a la rudimentaria C ++ / Java / C # OOP después de probarlo. Los patrones de diseño de GoF 5 se vuelven innecesarios ya que pueden expresarse de manera simple y directa.
El lenguaje no ha tenido un propietario corporativo único ni una implementación definitiva única, aunque tiene un estándar ANSI con muchas implementaciones conformes. Las principales implementaciones nuevas se presentan cada década y las antiguas todavía están bastante activas. Los expertos pueden planear utilizar sus conocimientos especializados durante mucho tiempo. Esto causa cierta fricción anarquista y fragmentación de la comunidad, pero también significa que no se puede sacar la alfombra y que el lenguaje no puede morirse por razones políticas corporativas o de proyectos. Siempre se están trabajando en múltiples implementaciones comerciales y de código abierto. Los más centrados en el rendimiento comparan regularmente dentro de un factor 2 veces mayor que las implementaciones de lenguaje imperativo más rápidas y fuertemente financiadas.
El talón de Aquiles de la comercialización temprana de Lisp fue la huella de la memoria para acomodar tanto las características de seguridad tipo del lenguaje como los entornos avanzados de desarrollo de software que incluían, con características increíbles como documentación completa en línea que incluye gráficos. Una máquina Symbolics Lisp de 64 MB no era viable en términos de costos en comparación con una estación de trabajo Sun de 8 MB. Hoy en día, los precios de la memoria RAM se han derrumbado y existe un gran interés en los lenguajes Lisp, especialmente teniendo en cuenta que los principales lenguajes Java, C # y PHP de hoy han avanzado solo mínimamente en los últimos 30 años.
Ahora hay idiomas modernos en competencia con Lisp para compartir la mente con desarrolladores inteligentes: Python, Lua , Erlang , Haskell y OCaml . Pero ninguno ofrece la misma combinación de madurez, adaptabilidad, múltiples implementaciones que cumplen con los estándares y velocidad.
fuente
En realidad no hago Lisp. Pero el lugar donde trabajo contiene elementos finitos con millones de líneas principalmente de Fortran. El tipo aquí al que más respeto por las cosas informáticas (códigos de mecánica de fluidos computacional ) cree que la combinación ideal es Lisp en el exterior (principalmente porque evita problemas desordenados con la administración de memoria) y Fortran por los algoritmos de bajo nivel (Fortran es mejor para explotar las capacidades vectoriales de SSE / AVX , y creemos que es poco probable que este cable se cierre).
fuente