3 puntos por GN⁺ 2024-07-13 | 1 comentarios | Compartir por WhatsApp
  • 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

1 comentarios

 
GN⁺ 2024-07-13
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.

    • Soy un ingeniero de software autodidacta, y empecé a programar recién a los 21 años. En mi primer trabajo me encargaron crear un lenguaje de consultas simple y su intérprete. No tenía idea de qué era un intérprete, pero en 2017 encontré este libro en línea y en 3 o 4 días pude hacer un prototipo funcional; 1 o 2 semanas después ya había podido crear el producto real.
      Gracias a este material gané muchísima confianza, y todavía recuerdo ese proyecto como uno de los trabajos que más disfruté.
    • Gracias por escribir el libro. Ahora estoy casi terminando la primera parte y lo estoy siguiendo en Haskell simplemente porque tenía ganas de hacerlo, y en cada capítulo me doy cuenta de que el “atajo inteligente” que se me ocurrió no era tan inteligente frente a los requisitos que aparecen después.
      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.
    • Game Programming Patterns también es excelente. En ambos libros se siente un estilo honesto y directo.
      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.
    • Todavía no terminé todo el libro, pero agradezco muchísimo que lo hayas publicado gratis en línea. Compré la edición en papel, el PDF y la versión Kindle, y también recomiendo a otras personas que apoyen al autor de esa forma.
    • Este libro y Writing An Interpreter In Go son libros que definitivamente quiero leer cuando tenga más tiempo. Tengo bastantes ideas para crear un lenguaje básico de composición tipográfica.
  • 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.

    • Dijiste “aspirante a ingeniero”, pero viendo que creaste Crumb, ya hay buenas noticias.
    • Ya se te puede llamar ingeniero. No hace falta ser tan humilde, y no es necesario terminar una carrera de ciencias de la computación para convertirse en ingeniero.
      La documentación también está buena y el proyecto es genial.
    • Se ve interesante. Me da curiosidad cómo decidiste qué tipos de datos incluir.
  • 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.

    • Me da curiosidad en qué otros lugares, además de compiladores, resulta útil. Por ejemplo, podría ser en cosas como parseo de formatos de datos.
  • 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.

    • Para mí, este libro hizo que estos temas dejaran de parecer misteriosos y, al contrario, me permitió empezar el segundo y el tercer paso.
      No pasa nada si no reinventas todas las técnicas desde cero por tu cuenta. Pararse sobre hombros de gigantes es algo natural.
    • No sabía por dónde empezar, y pensaba que un proyecto así era algo mágico que estaba más allá de mis capacidades. Pero después de leer Crafting Interpreters, entendí que mi forma de pensar solo necesitaba un pequeño empujón.
      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.
    • Recuerdo que cuando recién empezaba a aprender Java quería crear mi propio lenguaje. Implementé un algoritmo de precedencia de operadores sin buscarlo, recorriendo la lista de tokens y encontrando cada vez la subexpresión con mayor precedencia.
      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.
    • Yo hice exactamente eso. Como primer paso, creé un lenguaje parecido a TeX e implementé definición y sustitución de macros.
      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

    • No necesariamente tiene que ser una cantidad de trabajo enorme. El Lisp-in-Lisp del libro original SICP o un intérprete de cálculo lambda escrito en Haskell caben incluso en una sola pantalla
  • 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

    • Varias veces me han pedido que escriba un libro así, pero una gran razón por la que todavía no lo he hecho es que es un tema demasiado abierto
      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
    • Existe Modern Compiler Implementation in ML, de A. W. Appel
      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
    • La esencia del polimorfismo paramétrico y la inferencia de tipos, al final, es implementar Algorithm W. Puedes buscar implementaciones de juguete en línea y meterles mano directamente
      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
    • Es un poco más teórico, pero seguir con calma el curso de compiladores de Coursera fue un gran punto de inflexión para mí. Tuve que volver a ver algunos videos varias veces
      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