- Crafting Interpreters es un libro diseñado para que quienes quieran crear su propio lenguaje puedan seguir de principio a fin la implementación completa de un lenguaje de scripting
- Cubre en un solo recorrido desde conceptos de diseño de lenguajes, como parsing y semántica, hasta la implementación en ejecución, como representación en bytecode y garbage collection
- El lector empieza desde
main()e implementa directamente un lenguaje con tipado dinámico, alcance léxico, funciones de primera clase, closures, clases y herencia - Propone escribir personalmente todo el código, limpio y rápido, de unos pocos miles de líneas, con foco en entender el funcionamiento interno más que en el resultado final
- Está disponible en formato impreso, eBook, PDF y web; en la web se pueden leer gratis todos los capítulos, artículos complementarios e ilustraciones
Alcance de implementación del libro
- Crafting Interpreters está dirigido a lectores que quieren crear su propio lenguaje de programación o entender cómo se diseñan e implementan los lenguajes
- El libro cubre en conjunto los temas clave necesarios para implementar un lenguaje de scripting con todas sus funciones
- Parsing
- Semántica
- Representación en bytecode
- Garbage collection
- La implementación empieza en
main()y finalmente se expande hasta convertirse en un lenguaje con las siguientes capacidades- Sintaxis rica
- Tipado dinámico
- Alcance léxico
- Funciones de primera clase
- Closures
- Clases
- Herencia
Forma de lectura y resultado
- En lugar de solo mirar código de ejemplo, el lector escribe cada línea y va siguiendo la estructura interna del procesador del lenguaje
- El código final tiene una escala de unos pocos miles de líneas y está organizado con el objetivo de lograr una implementación limpia y rápida
- En vez de explicar por separado los conceptos de alto nivel y la implementación de bajo nivel, está diseñado para que se entiendan juntos durante el proceso de completar un lenguaje
Formatos disponibles
-
Edición impresa
- Es una edición impresa de 640 páginas, con ilustraciones dibujadas a mano en alta resolución y tipografía maquetada directamente por el autor
- Amazon.com
- Barnes and Noble
- Download Sample PDF
-
eBook
- Ofrece CSS adaptado a lectores electrónicos y tamaños de pantalla, resaltado de sintaxis a todo color e hipervínculos activos
- Kindle Amazon.com
- Apple Books
- Play Books Google
- Nook B&N
- EPUB Smashwords
-
PDF
- Se ofrece en un formato fácil de llevar, manteniendo la maquetación manual de la edición impresa y las ilustraciones nítidas
- Buy from Payhip
- Download Free Sample
-
Web
- Se ofrece con diseño responsivo, desde escritorio hasta teléfonos, y permite leer gratis todos los capítulos, artículos complementarios e ilustraciones
- Read Now
1 comentarios
Opiniones de Hacker News
Soy el autor. Ver una reacción positiva a mi libro realmente me llena de calidez. Le dediqué mucho tiempo y cariño, y ver que tuvo el efecto que esperaba me resulta muy gratificante.
Gracias a este material gané muchísima confianza, y todavía recuerdo ese proyecto como uno de los trabajos que más disfruté.
También me da curiosidad si has pensado en escribir un libro posterior sobre un compilador o un JIT para Lox. Y el lexical analygator es lo máximo: apareció varias veces, con la fuente citada, en presentaciones internas de la empresa, e incluso durante un tiempo hubo fan art en una pizarra.
A veces parece que algunos autores sienten que tienen que fingir que todo este campo es magia negra, aunque quizá simplemente yo no daba la talla para entender los patrones de diseño de GoF.
Leí Crafting Interpreters mientras creaba Crumb(https://github.com/liam-ilan/crumb), y en particular las partes sobre alcance y variables locales fueron esenciales.
Tiene un buen equilibrio entre implementación técnica e intuición conceptual, así que también ayuda mucho cuando uno intenta salirse del camino establecido por el libro. Este tipo de escritura técnica es material de tan alto nivel que sirve como referencia a la cual aspirar.
La documentación también está buena y el proyecto es genial.
Lo que más me gustó de este libro es que te guía para escribir dos intérpretes distintos para el mismo lenguaje.
Gracias a eso se pueden entender mejor las partes más complejas y sutiles del proceso de crear un lenguaje de programación. En la primera mitad del libro te encuentras primero con las grandes ideas y te familiarizas con ellas; luego, al volver a verlas en el segundo intérprete, puedes absorber bien las partes interesantes. Es un libro realmente sorprendente.
Ya que se están mencionando otros recursos sobre compiladores, aunque todavía no lo vi completo, también me pareció bueno el video de Immo Landwerth donde crea un compilador en C# y genera IL, símbolos de depuración, etc.
Es material de hace unos 5 años, así que no usa la sintaxis más reciente de C# y parece ser de la época de .NET Core 3, pero no debería haber mayores problemas para la mayoría del trabajo. Eso sí, pueden aparecer muchas advertencias relacionadas con nulabilidad de tipos.
https://www.youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu...
Siento que la mayoría de los programadores deberían seguir este libro completo alguna vez. Al hacerlo, llegué a entender mucho mejor qué ocurre realmente dentro de los compiladores o las herramientas de lenguaje.
Es una de las guías técnicas mejor escritas que he seguido hasta ahora, y me ayudó muchísimo a apropiarme de los conceptos. Esos conceptos son útiles no solo en compiladores, sino también en muchos otros lugares.
Una ventaja secundaria de este libro, pero quizá igual de importante, es que enseña claridad.
El texto, el código, la estructura y el ritmo son claros y van al punto. La palabra “Crafting” le queda perfecta: se siente como un libro escrito por un artesano para otros artesanos.
Creo que este libro debería ser el segundo o tercer paso en el recorrido de los compiladores de lenguajes de programación.
El primer paso es escribir por tu cuenta un intérprete para un lenguaje simple creado por ti, sin saber nada de intérpretes ni de diseño de lenguajes. El segundo paso es reescribirlo cometiendo menos errores.
Si no haces eso, es difícil apreciar bien las sutilezas del tema, y terminas pasando por alto conceptos que no parecen importantes.
No pasa nada si no reinventas todas las técnicas desde cero por tu cuenta. Pararse sobre hombros de gigantes es algo natural.
Si no hubiera leído primero algo como CI, ni siquiera habría intentado escribir un intérprete por mi cuenta, y no habría llegado al tercer paso.
No había recursión; lo hacía metiendo y sacando cosas de una pila manualmente. El problema fue que no entendía bien el parseo, así que implementé la mayor parte del lenguaje con string.split y string.replace, y, como era de esperarse, aparecieron conceptos que no se podían anidar. Lamento no haber conservado el código fuente.
A los pocos días me topé con tantos bugs que adopté una actitud un poco más académica y empecé a leer libros. Aun así, fue un primer paso excelente, porque sin ese intento quizá ni siquiera habría sabido que esto era un tema que daba para un libro entero.
Realmente admiro a las personas con ese nivel de dedicación y a todos los que mantienen la infraestructura de desarrollo, pero siento alivio de que mi etapa de “quiero crear un lenguaje” haya terminado como un interés pasajero
La cantidad de trabajo es realmente enorme
Me pregunto si alguien conoce buenos recursos para crear un lenguaje de tipado estático con cosas como polimorfismo paramétrico e inferencia básica de tipos
En Crafting Interpreters sentí que podía crear un lenguaje pequeño y autocontenido que incluyera casi todos los conceptos que quería enseñar: alcance de variables, funciones, closures, clases y despacho dinámico, flujo de control, etc.
En cambio, en los sistemas de tipos hay demasiadas bifurcaciones en el espacio de diseño y no existe una ruta “mejor” clara. Todas estas decisiones son puntos de bifurcación: si hay subtipado, si los genéricos se borran o se reifican, si el código genérico se especializa en tiempo de compilación, si la inferencia de tipos es local o Hindley-Milner
Sea cual sea la elección, se dejan fuera aspectos importantes de las ramas no elegidas y se puede decepcionar a lectores que esperaban otro camino. Tal vez encaje mejor un libro panorámico más amplio, como Types and Programming Languages, pero entonces se pierde la diversión de construir una sola cosa coherente
También hay versiones en C y Java del mismo libro, pero las considero inferiores. Creo que conviene usarlo junto con la versión en ML
Vi que la implementación de https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... tenía un estilo muy antiguo, así que la modernicé y la limpié hasta llegar a https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459.... Después “rompí” adrede varias partes para ver cómo se quebraba el algoritmo
Recomiendo mucho intentar, de una forma accesible, una tarea de ciencias de la computación que uno pensaba que solo podían hacer los magos. Después de completar una o dos, te das cuenta de que, aunque es difícil, en general se trata de avanzar a fuerza de insistir, y eso te da mucha confianza. Quien quiera seguir este camino puede contactarme en zellyn@(most things)
Acabo de terminar la parte 2 y es un libro realmente bueno. Hacer por cuenta propia una o dos de las tareas sugeridas en cada capítulo ayuda muchísimo a entender el contenido