He visto muchos currículos de CS y sugerencias de aprendizaje para nuevos programadores que requieren que el aspirante a programador estudie un intérprete de lisp que está específicamente escrito en lisp. Todos estos sitios dicen cosas similares a "es una revelación intelectual", "es una experiencia de iluminación que todo programador serio debería tener" o "muestra relaciones hardware / software" y otras declaraciones vagas, particularmente de este artículo tomado de este reputado cómo hacerlo .
El sentimiento general de mi pregunta es, ¿cómo logra lisp los objetivos anteriores y por qué lisp? ¿Por qué no otro idioma?
Estoy preguntando esto porque acabo de terminar de escribir un intérprete de esquema en esquema (tomado de SICP http://mitpress.mit.edu/sicp/ ) y ahora estoy escribiendo un intérprete de Python en esquema y estoy luchando por tener esta legendaria epifanía se supone que proviene específicamente del primero. Estoy buscando detalles técnicos específicos entre los dos idiomas que pueda explotar en sus intérpretes de esquemas para comprender cómo funcionan los programas.
Más específicamente:
¿Por qué es tan enfatizado el estudio de un intérprete que está escrito en el idioma que interpreta? ¿Es simplemente un gran ejercicio mental para mantener el lenguaje original y el lenguaje correcto o existen problemas específicos cuyas soluciones solo se pueden encontrar en la naturaleza del lenguaje? ¿idioma original?
¿Cómo demuestran los intérpretes lisp buenos conceptos de arquitectura para el diseño de software futuro?
¿Qué extrañaría si hiciera este ejercicio en un lenguaje diferente como C ++ o Java?
¿Cuál es la comida para llevar o "herramienta mental" más utilizada en este ejercicio? ** **
** he seleccionado la respuesta que hice porque he notado que he obtenido de este ejercicio más habilidad en el diseño de herramientas de análisis sintáctico en mi cabeza que cualquier otra herramienta única y me gustaría encontrar diferentes métodos de análisis que pueden funcionar mejor para el esquema intérprete que el intérprete de python.
Respuestas:
A riesgo de dar una respuesta "yo también", si lo intentas verás ...
Si estudias idiomas de computadora, es probable que tengas la impresión de que se trata al menos la mitad del análisis. Si aprende Lisp, se dará cuenta de que analizar la sintaxis de la superficie no es más que una conveniencia para las personas (como la mayoría de nosotros) a quienes no les gustan muchos paréntesis irritantes.
Entonces podría darse cuenta de que se pagó un gran precio por esa comodidad. En Lisp es trivial para un programa construir otro programa y ejecutarlo. En otros idiomas es una técnica avanzada, como hacer multiplicaciones en números romanos.
Por supuesto, casi todos preguntarían "¿quién necesita hacer eso?" Bueno, podrías ver muy bien que abre una vista completa de cosas que nunca antes te habías dado cuenta que no podías hacer antes. Puedes hacerlo en otros idiomas, pero no tan fácilmente.
INSERTADO para responder el comentario de Izkata:
... son solo unos pocos ...
Entonces te das cuenta de que algunas cosas que hoy se consideran "modernas" han sido anticuadas en Lisp durante 40 años. Como la programación funcional. Como la recolección de basura. Como cierres.
Eso no quiere decir que los idiomas modernos no tengan nuevas buenas ideas, como OOP, etc. Pero si aprende Lisp, ampliará su perspectiva.
fuente
You can do it in other languages, but not nearly so easily.
- ¿Me gusta? (La pregunta para mí parece ser porque a menudo se hacen declaraciones como estas, pero casi nunca se vuelven más específicas)La respuesta simple a su pregunta es probar Lisp, preferiblemente junto con SICP . Entonces serás iluminado.
Dicho eso ...
El código es datos
La mayoría de los idiomas hacen una distinción clara entre código y datos; Lisp no lo hace. Esto hace posible, por ejemplo, escribir trivialmente un analizador Lisp en Lisp y manipular el código Lisp dentro de Lisp. La mejor descripción de esta iluminación que he encontrado es La naturaleza de Lisp .
Esto es cierto en parte porque la sintaxis para el lenguaje es muy simple. Hace posibles cosas en Lisp (como la metaprogramación) que no son prácticas en otros idiomas porque la sintaxis se interpone en el camino.
Lecturas adicionales
Batir los promedios
fuente
En general, estudiar a un intérprete le da una idea de su lenguaje y características. En general, estudiar código en un lenguaje de programación es como practicar un lenguaje hablado escuchando y leyendo: te familiariza con lo que ese lenguaje puede hacer, cómo se usa y los "modismos" comunes. Más específicamente, Lisp es un lenguaje homoicónico, lo que significa que su sintaxis para expresiones es la misma que su sintaxis para datos. Escribir código en Lisp se ve terriblemente como si estuvieras escribiendo una lista, y viceversa. Por lo tanto, interpretar el código Lisp con el código Lisp es tan simple como ejecutar listas con
car
ycdr
.Piense en cómo se interpretaría el intérprete: en muchas implementaciones de intérpretes meta-circulares (donde un lenguaje homoicónico se interpreta a sí mismo) puede simplemente "pasar" por la función. Por ejemplo, para implementar
car
, simplemente tomecar
el argumento. Esto quita el énfasis de los mecanismos de almacenamiento de datos y se centra en la funcionalidad.Los intérpretes pueden ser muy complicados, lo que fomenta una buena arquitectura al diseñarlos. Con eso en mente, este depende más del intérprete individual.
Estos lenguajes no son homoicónicos, por lo que no se benefician de la gracia y la simplicidad de un intérprete meta-circular de Lisp. Esto hace que el ejercicio sea más difícil y quizás menos común, pero no diría que sea realmente menos beneficioso.
No estoy seguro de tener una buena respuesta para esta; simplemente que ayuda a ver cómo funciona el intérprete y, lo que es más importante, jugar con él para ver cómo se pueden implementar fácilmente cambios menores en el idioma.
fuente
LISP está estructurado de una manera que lo hace extremadamente fácil de analizar. Si intenta escribir un compilador, notará que es mucho más fácil si todo en su idioma es una expresión y tiene un bajo nivel de ambigüedad. LISP fuerza los paréntesis en todas partes para eliminar la ambigüedad y no tiene declaraciones, solo expresiones.
El hecho mismo de que LISP es muy fácil de analizar anima a los usuarios a analizar su propio código fuente y hacer trucos de magia con él. La línea entre los datos y el código se vuelve borrosa y puede hacer cosas que normalmente requieren bastante esfuerzo, como reflexión, reescritura dinámica de código, complementos y serialización.
Esa es la esencia de esto. El ejercicio probablemente tiene la intención de darle una idea de lo que es posible cuando el código es fácilmente analizable por sí mismo.
fuente
No estoy seguro de que sea realmente importante para todos. Puede ser un desarrollador exitoso sin saber cómo funciona un intérprete Lisp. Sin embargo, al estudiar Ciencias de la Computación, las ideas básicas de Lisp deben aprenderse.
Los intérpretes de Lisp son importantes para los programadores de Lisp. Necesitan entender cómo funciona un intérprete ([y compilador] 1 ), para comprender completamente cómo usar el lenguaje.
Un intérprete Lisp se usa a menudo como una herramienta en informática para enseñar a los estudiantes algunas cosas:
entendiendo una definición de lenguaje compacta y mínima a través de una implementación: Alan Kay la llamó las ecuaciones de software de Maxwell .
comprender la programación a nivel de lenguaje , cambiando y ampliando el intérprete
Comprender la programación a nivel meta y los efectos que tiene sobre el diseño y el uso de un lenguaje de programación. Por ejemplo, comprender qué significa "citar" y por qué es necesario
Comprender la interpretación del lenguaje de programación Lisp y su conexión con el cálculo Lambda
Como dispositivo de enseñanza, un intérprete Lisp es útil, ya que se puede aprender y comprender en poco tiempo. Dado que pocos estudiantes ya saben acerca de Lisp, los estudiantes están en un campo nivelado cuando se trata de aprender sobre los conceptos.
fuente