world tutorial traduccion programacion lenguaje learn hello español compiler common programming-languages lisp

programming-languages - tutorial - lisp traduccion



¿Qué significa que "Lisp se puede escribir en sí mismo?" (5)

Acabo de borrar una respuesta muy larga que probablemente sea inapropiada aquí.

Sin embargo considera que:

  1. LISP no tiene "sintaxis" si te refieres al significado que tiene para lenguajes como C / Java / Pascal ... hay una sintaxis (inicial pero personalizable) para el lector de LISP común , pero eso es otra cosa (LISP que Graham está hablando de no es LISP común , y un (el) lector no es el lenguaje LISP, sino solo un procedimiento). Algo como "(lambda (x) (* x 2))" no es el código LISP, sino el texto que, por ejemplo, el lector estándar de CL puede convertir en código LISP.

  2. LISP no solo se puede escribir en LISP (si te refieres a la capacidad de "arranque") sino que realmente llegó a existir de esa manera . La primera implementación de eval a finales de la década de 1950 se escribió en LISP en papel y luego se convirtió manualmente en lenguaje de máquina (1) : LISP comenzó como una idea puramente teórica que no debía implementarse. No conozco ningún otro lenguaje informático que siguiera ese camino. Por ejemplo, C ++ se concibió como un preprocesador para un compilador de C y se escribió en C, no fue un programa de C ++ que luego se convirtió a C para poder ejecutarlo.

Hay muchos otros aspectos en los que LISP es bastante diferente , y creo que la mejor manera de entenderlo es implementar un intérprete LISP de juguete (es un trabajo más pequeño de lo que uno podría pensar, especialmente si su "lenguaje de máquina" es un lenguaje de alto nivel escrito dinámicamente como Python).

(1) en http://www-formal.stanford.edu/jmc/history/lisp/node3.html puede encontrar cómo McCarthy describe que eval[e, a] se encontró en el papel primero como un resultado teórico interesante (un Implementación de "función universal" más nítida que una máquina de Turing universal) cuando solo se habían diseñado las estructuras de datos y las funciones nativas elementales para el lenguaje Lisp que el grupo estaba construyendo. Esta función escrita a mano fue implementada a mano por SR Russell en código de máquina y comenzó a servirlos como el primer intérprete de Lisp.

Paul Graham escribió que "Lo inusual de Lisp, de hecho, la calidad definitoria de Lisp, es que se puede escribir en sí mismo". Pero eso no me parece para nada inusual o definitivo.

ISTM que un lenguaje de programación se define por dos cosas: su compilador o intérprete, que define la sintaxis y la semántica del lenguaje por fiat, y su biblioteca estándar, que define en gran medida los lenguajes y técnicas que los usuarios expertos utilizarán cuando Escribir código en el idioma.

Con unas pocas excepciones específicas, (las personas que no pertenecen a C # de la familia .NET, por ejemplo,) la mayoría de las bibliotecas estándar de los lenguajes están escritas en ese lenguaje por dos muy buenas razones: porque compartirá el mismo conjunto de definiciones sintácticas, función convenciones de llamada, y el "aspecto y la apariencia" general del lenguaje, y porque las personas que probablemente escriban una biblioteca estándar para un lenguaje de programación son sus usuarios, y en particular sus diseñadores. Así que no hay nada único allí; Eso es bastante estándar.

Y nuevamente, no hay nada único o inusual en que el compilador de un lenguaje se escriba en sí mismo. Los compiladores de C están escritos en C. Los compiladores de Pascal están escritos en Pascal. El compilador de C # de Mono está escrito en C #. Diablos, incluso algunos lenguajes de scripting tienen implementaciones "escritas en sí mismas".

Entonces, ¿qué significa que Lisp es inusual al estar escrito en sí mismo?


Bueno, el enlace que proporcionó continúa diciendo que, si continúa leyendo, él responderá su pregunta en detalle.

Lo inusual de Lisp, de hecho, la calidad definitoria de Lisp, es que se puede escribir en sí mismo. Para entender lo que McCarthy quiso decir con esto, vamos a volver sobre sus pasos, con su notación matemática traducida al código Common Lisp.


La idea principal es que el lenguaje Lisp tiene un núcleo muy pequeño de unas pocas funciones y el mecanismo de evaluación principal se puede escribir en código en una sola página.

Ese es el núcleo de Lisp .

Para comprender el funcionamiento básico del lenguaje, solo es necesario mirar esa única página de código: explica cómo funcionan las variables, cómo funcionan las llamadas de funciones, cómo se pueden crear nuevas funciones, etc.

Solo piense cuánto puede eliminar de una implementación de lenguaje para llegar a lo básico. ¿Cuál es el conjunto mínimo de primitivas y cuál es el motor de ejecución mínimo? Para escribir un Lisp en un Lisp se reduce a casi nada.

Si observa una implementación de PASCAL (como ejemplo), no se implementa en PASCAL, sino en PASCAL + una cantidad mayor de código que proporciona las estructuras de datos necesarias para representar entidades de lenguaje, un analizador, un compilador, un tiempo de ejecución,. .. - fuera de la caja PASCAL no ofrece mucho - uno tiene que construir esto (o usar una biblioteca).

Wirth (el creador de Pascal) ha escrito un libro que explica la implementación de un lenguaje muy pequeño parecido a Pascal: aún debe escribir un código sustancial para implementar ese lenguaje: analizador, generador de código, tiempo de ejecución, cargador, ...

En contraste, en un Lisp, el código fuente de Lisp tiene una representación natural y la rutina central que evalúa el código de Lisp es solo una función de Lisp. Esto puede no ser una implementación real o práctica de Lisp, aún así es diferente de la situación de PASCAL, donde el código fuente no tiene una representación útil (aparte de una cadena o un archivo) y el motor de ejecución es mucho más código.

Así que en Lisp tenemos:

  • Una representación simple para el código fuente (listas de símbolos).

  • Una implementación simple del evaluador en una sola función pequeña.

Más allá de eso, no se necesita nada para implementar un evaluador Lisp en Lisp.


No está diciendo que Lisp pueda usarse para escribir un compilador Lisp. Está diciendo que el lenguaje está compuesto de sus propias estructuras de datos. Entonces, si bien no puede construir una función en C a partir de estructuras de datos en C, puede hacerlo en Lisp. Un programa está formado por listas que se ejecutan en su computadora, y el efecto de esas listas puede ser crear otras listas que luego se ejecutan, y el efecto de esas listas puede ser crear aún más listas para ser ejecutadas. C no tiene esta propiedad. El código C no puede, por ejemplo, manipular su propio AST .


Probablemente, lo que Paul quiere decir es que la representación de la sintaxis de Lisp como un valor de Lisp está estandarizada y generalizada. Es decir, un programa Lisp es solo un tipo especial de expresión-S, y es excepcionalmente fácil escribir código Lisp que manipula el código Lisp. Escribir un intérprete de Lisp en Lisp es un caso especial, y no es tan emocionante como la capacidad general de tener una representación unificada tanto para el código como para los datos.