compiler construction - ¿Cómo se puede escribir CoffeeScript en CoffeeScript?
compiler-construction interpreter (2)
Entonces, como un nuevo programador web (el fondo es mayormente en C, C ++ y Python) sin experiencia en javascript (o deseo de experimentarlo, según lo que he visto) he estado haciendo una investigación previa sobre CoffeeScript y realmente me está gustando lo que Veo. Un pequeño matiz que noté fue que CoffeeScript fue escrito en CoffeeScript, lo cual es genial ... pero realmente no entiendo cómo es posible. Desafortunadamente, opté por tomar Network Security en lugar de compiladores durante mis últimos cursos de nivel superior de informática.
He oído hablar de personas que escriben idiomas en el idioma de destino para interpretar el uso de compiladores existentes para ese idioma, pero no puedo desenterrar ninguna información sobre cómo podría funcionar esto, ya que esta es la primera implementación.
Supongo que es un script de shell incorporado que podría ocuparse de establecer parte del marco inicial para construir un lenguaje autorreferencial ( ¿este término describe correctamente este comportamiento?)
Esto no es nada nuevo. Los compiladores de C se han escrito en C. Python se ha escrito en Python .
Es posible usar un compilador para Language X
para compilar una versión más nueva de sí mismo, con más características. Se llama bootstrapping .
- Bootstrapping a language
- Escribiendo un compilador en su propio idioma.
- ¿Cómo se escribe un compilador para un idioma en ese idioma?
- Arrancando un compilador: ¿por qué?
Por cierto, si quieres aprender más sobre los compiladores, a pesar de haberte perdido en la universidad, echa un vistazo a Aprender a escribir un compilador , específicamente, el Libro del Dragón .
La respuesta de Matt es excelente. Permítanme elaborar con información específica de CoffeeScript:
La versión original del compilador de CoffeeScript se escribió en Ruby, pero se hizo la transición a CoffeeScript para v0.5.0, el 21 de febrero de 2010.
Como cuestión práctica, el compilador bootstrapped puede dificultar las cosas con un lenguaje siempre cambiante, ya que el compilador debe reescribirse para adaptarse a esos cambios. Este párrafo de los documentos oficiales le da una idea de los desafíos involucrados:
git checkout lib && bin/cake build:full
es un buen comando para ejecutar cuando estás trabajando en el lenguaje principal. Actualizará el directoriolib
(en caso de que rompa algo), compile su compilador modificado, úselo para reconstruirse (una buena prueba de cordura) y luego ejecute todas las pruebas. Si pasan, es muy probable que hayas realizado un cambio exitoso.
El directorio lib
contiene el JavaScript compilado del compilador de CoffeeScript (¿entendido?), Lo que proporciona un intermediario útil en el proceso de arranque. Dado que el código CoffeeScript del compilador nunca se ejecuta directamente sobre sí mismo, eso hace que sea más fácil hacer cambios de última hora en el lenguaje.