Un intérprete de Python en solo 1024 bytes de C
Making a Python interpreter in 1024 bytes

Austin Z. Henley, creador de herramientas para desarrolladores, acepta el desafío de escribir un intérprete de Python en 1024 bytes de código C, sin macros ni bibliotecas externas. Su enfoque no es implementar todo el lenguaje, sino un subconjunto que capture la esencia de Python: sintaxis con indentación, variables de una letra, funciones y bucles. El intérprete usa un parser recursivo que ejecuta el código sobre la marcha, aprovechando la pila de llamadas de C para manejar bloques y bucles. Tras varios intentos y técnicas de code golf, logra reducir el código a 1024 bytes, manteniendo características como operaciones aritméticas, comparaciones, condicionales, bucles y funciones, incluso recursivas. El resultado es un intérprete funcional capaz de ejecutar un programa FizzBuzz.
Es bastante hermoso lo que podemos hacer incluso sin una representación intermedia.
- jrdres
El código me hace sonreír, porque es desagradable. Esto no es como C4, un compilador de C diminuto pero completo que hace comprobación de errores en su subconjunto. En cambio, esto es peor que Sector C, que toma todos los atajos y simplemente asume que todo en el código fuente es correcto.
Este "Python" simplemente asume para las palabras clave:
Cualquier "f" es un "for [x] in range[y]" (exactamente eso, no otros for).
Cualquier "w" es un "while".
Cualquier "i" es un "if".
Cualquier "d" es un "def".
Cualquier "p" es un "print("
Desagradable, desagradable.
(También es desagradable que los fragmentos de código en el artículo tienen más comentarios que la copia de GitHub de la versión "legible". Necesitas el artículo para entender lo que está pasando.)
Esto es un poco demasiado simple para un "Tiny Python". Si alguien está dispuesto a permitir unos pocos K más de bytes, me encantaría ver al menos listas y diccionarios aquí--¡Lisp puede hacerlos!
- teddyh
Para aquellos que realmente necesitan algo así en producción, existe Snek: <https://sneklang.org/> "Snek es un lenguaje incrustable diminuto dirigido a procesadores con solo unos pocos kB de flash y RAM."
- marcelo-earth
Leyendo el artículo, no puedo creer que acabo de descubrir que Code Golf es una cosa. He sido programador durante más de una década.
¡Pero sí, proyecto asombroso! Me gusta que sea hecho por humanos :)
- userbinator
Para ser precisos, esto son 1024 bytes de C, que se compila a un binario muchas veces más grande, e implementa un subconjunto muy pequeño de Python.
los bucles funcionan saltando hacia atrás y reanalizando el código fuente en cada iteración
Así es como funciona el procesamiento de .bat de DOS; no estoy seguro de si los shells de estilo Unix son iguales, ya que nunca he tenido la necesidad de explotar esa "característica".
Otro comentario aquí ha mencionado C4, pero otro intérprete extremadamente denso (y ligeramente más grande, ya que no fue deliberadamente(!) "code-golfed") que quizás quieras ver es el J Incunabulum:
https://www.jsoftware.com/ioj/iojATW.htm
Más generalmente, la cultura de programación de arrays parece considerar este nivel de densidad como la norma:
- stevefan1999
Pero siendo honesto, me pregunto cuál es la VM Turing completa más pequeña, interpretable y práctica. Argumentaría que implementar un brainfuck al que reduzcamos el intérprete de Python, o incluso decir como un intérprete de cálculo lambda sin tipos o combinadores SKI sería muy útil, especialmente para el arranque de hardware.
Hablo de cosas como SectorLisp https://justine.lol/sectorlisp/
- jeanmichelselli
Interesante, especialmente cuando sabes que solían enviar un intérprete completo de BASIC en menos de 32 KB en el pasado..
- shmoil
El autor me perdió de inmediato.
>> Empecé con el código más básico que pude pensar: 1 + 2
OK, ¿cómo encajaste eso en 512/1024 bytes??? ¿Probaste print(3 * * 1000)?
- andai
También del autor:
Hagamos un compilador diminuto