5 puntos por darjeeling 2026-02-05 | 1 comentarios | Compartir por WhatsApp

Resumen:

  • Trata el proceso de reemplazar por completo pycparser, el parser del lenguaje C que durante casi 20 años funcionó sobre PLY (Python Lex-Yacc), por un parser Recursive Descent escrito manualmente con ayuda de un agente de codificación LLM (Codex).
  • Se lograron la eliminación de una dependencia externa (PLY), una menor dificultad de mantenimiento y una mejora de rendimiento del 30%, lo que demuestra la utilidad práctica de los LLM en la refactorización de grandes bases de código heredadas.
  • Se enfatiza la importancia de la revisión iterativa por parte de desarrolladores humanos y de la ingeniería de prompts para resolver problemas de calidad en el código generado por el LLM (legibilidad, complejidad, etc.).

Resumen detallado:

  1. Antecedentes y motivación
    pycparser es un importante proyecto open source que registra alrededor de 20 millones de descargas diarias. Antes procesaba la gramática C99 usando la biblioteca PLY, pero con el tiempo se fueron acumulando varios problemas:
  • Problema de dependencias: la biblioteca PLY dejó de mantenerse (Archived), lo que generó riesgos de seguridad y mantenimiento.
  • Complejidad de la gramática: al dar soporte a estándares recientes como C11 y C23, además de extensiones gramaticales, los conflictos reduce-reduce típicos de YACC se volvieron frecuentes y dificultaron la expansión.
  • Cambio filosófico: con el paso del tiempo, el autor llegó a la convicción de que un parser Recursive Descent escrito directamente ofrece ventajas en comprensión y mantenimiento frente a un Parser Generator.
  1. Proceso de colaboración con el LLM (Codex)
    El autor decidió delegar esta tarea al LLM, ya que estimaba que hacerlo solo tomaría más de una semana. La sólida suite de pruebas de más de 2,500 líneas que tiene pycparser actuó como un "guardrail" para validar los resultados del LLM.
  • Port inicial: ante el prompt "deja el lexer intacto y cambia solo el parser a Recursive Descent", Codex trabajó durante más de una hora y produjo un prototipo que pasaba las pruebas.
  • Mejora iterativa: el código inicial era funcionalmente perfecto, pero tenía problemas de calidad, como baja legibilidad y abuso del manejo de excepciones para controlar el flujo. El autor aprovechó activamente las ramas de Git y fue puliendo el código a lo largo de decenas de commits.
  1. Resultados y lecciones
  • Mejora de rendimiento: el parser escrito manualmente mostró un rendimiento aproximadamente 30% superior al basado en YACC.
  • Calidad del código y mantenimiento: los LLM tienden a escribir código perezoso o complejo, pero respondieron eficazmente cuando el desarrollador daba instrucciones claras (por ejemplo, "cambia X por Y", "agrega comentarios").
  • Importancia del tipado estático: más adelante, al agregar Type Annotation de Python, aumentó la precisión de las sugerencias del LLM. El autor predijo que en el futuro los agentes de codificación rendirán aún mejor en lenguajes fuertemente tipados como Rust o TypeScript.
  1. Conclusión
    A través de este proyecto, el autor confirmó que los LLM no son simples juguetes, sino herramientas capaces de multiplicar la productividad real por más de 10. Un trabajo que habría tomado unas 30 a 40 horas se completó en apenas 4 a 5 horas, y el autor valoró mucho a los LLM como catalizadores para entrar en estado de flujo (Flow) al desarrollar.

1 comentarios

 
ng0301 2026-02-05

Desde el principio, solo pensar que iba a hacer ese trabajo en 30~40 horas ya es cosa de veteranos...