38

Así que como un nuevo programador web (el fondo es más completo en C, C++ y Python) sin experiencia en JavaScript (o deseo experimentarlo, basado en lo que he visto) he estado haciendo una investigación precursora en CoffeeScript y estoy realmente me gusta lo que veo Un pequeño y genial matiz que noté fue que CoffeeScript estaba escrito en CoffeeScript, lo cual es genial ... pero realmente no entiendo cómo es posible. Desafortunadamente, opté por tomar Seguridad en la red en lugar de Compiladores durante mis últimos cursos de informática de nivel superior.¿Cómo se puede escribir CoffeeScript en CoffeeScript?

He oído hablar de personas que escriben idiomas en el idioma de destino para interpretar utilizando compiladores existentes para ese idioma, pero no puedo obtener información sobre cómo podría funcionar, ya que esta es la primera implementación.

Mi conjetura es un shell script incrustado que podrían hacerse cargo de que se establecen algunos del marco inicial para la construcción de una autorreferencial (este término no describe adecuadamente este comportamiento?) idioma?

+4

http: //en.wikipedia.org/wiki/Bootstrapping_ (compiladores) –

+3

tenga en cuenta que * necesita * saber Javascript bien para codificar en CoffeeScript, ya que todos los errores de tiempo de ejecución apuntarán a la fuente compilada. –

+0

Re terminología: Podría decirse que el compilador CoffeeScript fue ** bootstrapped ** de su implementación original de Ruby. También podría decir que el lenguaje CoffeeScript es ** autohospedado **. – Quuxplusone

Respuesta

46

Esto no es nada nuevo. Los compiladores C se han escrito en C. Python has been written in Python.

Es posible utilizar un compilador para Language X para compilar una versión más nueva de sí mismo, con más características. Se llama bootstrapping.

Por cierto, si quieres aprender más sobre compiladores, a pesar de haber perdido en la universidad, echar un vistazo a Learning to write a compiler — específicamente , the Dragon Book.

+0

He escuchado el término Bootstrapped antes, pero no tenía un claro entendimiento de ello. Esto es realmente interesante, gracias por los excelentes enlaces, voy a leer un poco sobre el arranque. También he oído hablar del libro de dragones y leí "Tengo que leer libros de programación", así que tendré que echarle un vistazo – Hortinstein

+1

Estoy de acuerdo con Matt. Pero, si quieres aprender Coffeescript, te sugiero que primero aprendas Javascript. Puede parecer un poco ajeno a las personas de diferentes contextos lingüísticos, pero sus conceptos (como la función y la base de prototipos) son útiles para una variedad de soluciones y marcos de software/aplicaciones. Nuevamente, Coffeescript compila a Javascript. Entonces, obviamente, ocultos debajo de las clases y los conceptos de aspecto diferente en CS, los conceptos de Javascript juegan un gran papel. Y lea The Dragon Book para entender cómo funcionan los compiladores. – NirmalL

42

La respuesta de Matt es excelente. Permítanme elaboro con algo de información CoffeeScript específica:

La versión original del compilador CoffeeScript fue escrito en Ruby, pero fue la transición a CoffeeScript para v0.5.0, el 21 de febrero de 2010.

Como En la práctica, el compilador bootstrapped puede dificultar las cosas con un lenguaje en constante cambio, ya que el compilador debe ser reescrito para acomodar esos cambios. Este párrafo de los documentos oficiales que da una idea de los retos que implica:

git checkout lib && bin/cake build:full es un buen comando a ejecutar cuando se está trabajando en el núcleo del lenguaje. Actualizará el directorio lib (en caso de que haya roto algo), compilará su compilador modificado, lo usará para reconstruirse (una buena prueba de cordura) y luego ejecutará todas las pruebas. Si pasan, es muy probable que haya realizado un cambio exitoso.

El directorio lib contiene el código JavaScript compilado del compilador CoffeeScript (consiguió eso?), Proporcionando un intermediario útil en el proceso de arranque. Dado que el código CoffeeScript del compilador nunca ejecuta directamente en sí mismo, eso hace que sea más fácil hacer cambios bruscos en el lenguaje.

+3

ojalá pudiera votar más esto, gracias por dar detalles del idioma. – Hortinstein