Por qué decidí crear mi propio lenguaje de programación y cómo la inteligencia artificial me está ayudando a hacerlo realidad
Protos no nació de la necesidad de resolver un problema concreto en un proyecto de software. Tampoco es un intento de crear otro lenguaje de programación porque sí.
Es una idea que llevaba mucho tiempo en mi cabeza.
Durante años he trabajado con tecnologías muy diferentes y he visto cómo evolucionaban las herramientas, los lenguajes y las plataformas sobre las que construimos software. Cada uno tiene sus virtudes, sus compromisos y una historia que explica muchas de sus decisiones. Pero siempre me ha interesado una pregunta: ¿cómo diseñaría yo un lenguaje de programación si pudiera empezar desde sus fundamentos?
No se trataba de inventar una sintaxis diferente para hacer lo mismo. Me interesaba algo más difícil: encontrar un conjunto pequeño de conceptos que encajaran bien entre sí y que permitieran construir programas sencillos, aplicaciones complejas y sistemas concurrentes sin tener que cambiar continuamente de modelo mental.
Esa idea fue tomando forma con el tiempo, pero convertirla en un lenguaje real era otra cuestión. Diseñar un lenguaje ya es un trabajo considerable. Implementarlo, probarlo, optimizarlo, mantener su documentación y desarrollar herramientas alrededor supone una dedicación enorme, especialmente cuando se trata de un proyecto personal.
Lo que ha cambiado es la inteligencia artificial. Por primera vez siento que puedo abordar un proyecto de esta dimensión sin necesitar un equipo completo trabajando conmigo.
Y así empezó Protos.
El lenguaje que quería construir
La principal motivación de Protos es la coherencia.
Los lenguajes de programación suelen incorporar conceptos a medida que aparecen nuevas necesidades. Es un proceso natural, pero también puede producir sistemas en los que distintas funcionalidades parecen pertenecer a mundos diferentes.
Mi objetivo con Protos es intentar recorrer el camino contrario: partir de unos pocos mecanismos fundamentales y estudiar hasta dónde pueden llegar mediante composición.
Protos es un lenguaje orientado a objetos basado en prototipos. No tiene clases ni jerarquías de clases: los objetos se relacionan mediante delegación. Los objetos contienen slots, se comunican mediante mensajes y utilizan closures como valores ejecutables.
También me interesa que los contextos de ejecución, la concurrencia y la comunicación entre componentes formen parte de un diseño reconocible, en lugar de convertirse en sistemas independientes añadidos unos encima de otros.
Esto no significa que todo deba resolverse con un único mecanismo. Hay diferencias reales entre ejecutar una tarea, aprovechar varios núcleos de CPU o construir un sistema de actores. Ocultarlas bajo una abstracción aparentemente uniforme no las hace desaparecer.
Lo importante es introducir cada concepto cuando resuelve una necesidad real y evitar que los programas más sencillos tengan que pagar el coste conceptual de los más complejos.
Hay una idea que resume bastante bien esta filosofía: empezar pequeño, crecer mediante composición y asumir la complejidad únicamente cuando el problema la requiere.
Protos no busca tener el menor número posible de palabras reservadas. Busca reducir el número de reglas independientes que un programador necesita comprender.
Es una diferencia importante. Un lenguaje puede tener una sintaxis muy breve y, sin embargo, resultar difícil de entender si está lleno de excepciones. Prefiero una regla general bien definida a una colección de casos especiales.
Lo que cambió con la inteligencia artificial
Durante mucho tiempo, el principal obstáculo no fue imaginar el lenguaje, sino disponer de los recursos para construirlo.
Un lenguaje de programación no es simplemente un intérprete que ejecuta unas cuantas expresiones. Hace falta definir una gramática, establecer una semántica precisa, desarrollar un entorno de ejecución, gestionar errores, crear bibliotecas, escribir pruebas y comprobar que cada decisión sigue funcionando cuando se combina con las demás.
Después llegan otros problemas: rendimiento, concurrencia, herramientas de desarrollo, depuración, compatibilidad, distribución y mantenimiento.
Es perfectamente posible dedicar años a un proyecto así y no llegar nunca a tener algo suficientemente completo como para utilizarlo.
La IA no ha eliminado esa complejidad, pero ha cambiado profundamente la forma de afrontarla.
Ahora puedo investigar una alternativa, contrastarla con implementaciones existentes, convertir una decisión en una especificación, preparar una implementación, revisarla y obtener resultados de pruebas en ciclos mucho más cortos.
Esto hace viable explorar caminos que antes, por una simple cuestión de tiempo, probablemente habría dejado aparcados.
Pero hay algo que quiero dejar claro: Protos no es un lenguaje que le haya pedido a una IA que invente por mí.
Las decisiones sobre qué debe ser el lenguaje, qué reglas debe cumplir y qué compromisos estoy dispuesto a aceptar siguen siendo decisiones de diseño. La IA me ayuda a investigar, comparar, implementar y detectar errores. No sustituye la necesidad de tener un criterio sobre el resultado.
En ocasiones, precisamente, lo más importante del trabajo es decirle que no.
Cómo trabajo realmente con la IA
Con el tiempo he ido definiendo un método de trabajo bastante concreto. No consiste en escribir una petición genérica y aceptar el código que aparece.
He separado dos funciones que considero diferentes: pensar el problema e implementar una solución.
Utilizo ChatGPT como interlocutor técnico, principalmente para investigar, discutir alternativas y preparar decisiones. Cuando aparece una cuestión de diseño, puedo estudiar cómo la resuelven otros lenguajes, qué consecuencias tiene cada opción y cómo encajaría en los principios de Protos.
No me interesa copiar una solución únicamente porque exista en un lenguaje conocido. Me interesa comprender por qué funciona allí, qué problema resuelve y si sus supuestos son aplicables a Protos.
En las investigaciones han aparecido referencias a distintos lenguajes, modelos de objetos, sistemas de actores y tecnologías de ejecución. También estudio implementaciones construidas sobre GraalVM y Truffle, especialmente cuando necesito entender cómo resuelven un problema técnico concreto.
Una vez delimitado el problema y tomada una decisión, preparo instrucciones de implementación específicas.
Ahí entra Claude Code, que utilizo como agente de programación dentro de Visual Studio Code.
Su trabajo es actuar sobre el repositorio: localizar los ficheros afectados, modificar el código siguiendo instrucciones concretas y ayudar a resolver los problemas que aparecen durante la implementación.
Esta separación no es casual. Me permite dedicar una parte del proceso a razonar sobre el diseño y otra a materializar decisiones que ya están suficientemente definidas.
El proceso tampoco acaba cuando el código compila.
Las pruebas, los resultados observados, las regresiones y las mediciones de rendimiento forman parte de la conversación. Si algo no funciona, se investiga por qué. Si una optimización mejora el rendimiento pero rompe una regla del lenguaje, hay que identificarlo y decidir conscientemente qué hacer.
Y si una investigación no permite llegar todavía a una conclusión sólida, prefiero dejar la cuestión abierta antes que fingir que está resuelta.
Un proyecto con reglas, no una sucesión de prompts
Una de las lecciones más importantes que he aprendido trabajando con agentes de IA es que hace falta disciplina.
Es muy fácil avanzar deprisa en apariencia. También es fácil acumular código, documentación contradictoria y decisiones que nadie recuerda haber tomado.
Para evitarlo, Protos se organiza mediante especificaciones, cuestiones de diseño, incidencias, tareas de implementación, pruebas y evidencias.
Las especificaciones definen el comportamiento del lenguaje. Las investigaciones reúnen alternativas y argumentos. Las decisiones importantes se aprueban antes de implementarlas. Las pruebas permiten comprobar que el resultado cumple lo esperado.
El repositorio incluye además instrucciones sobre cómo trabajar con el proyecto: qué puede modificarse, cómo debe validarse un cambio y qué diferencia hay entre una investigación y una implementación.
No considero estas reglas una carga burocrática. Son una manera de conservar el control sobre un proyecto que crece a gran velocidad y en el que parte importante del trabajo material lo realizan herramientas de IA.
También obligan a distinguir cosas que a veces se confunden: que una idea parezca buena no significa que esté aprobada; que una implementación exista no significa que esté terminada; y que una prueba pase no garantiza que una decisión arquitectónica sea correcta.
La velocidad solo es útil si podemos confiar en lo que vamos construyendo.
De la idea al lenguaje ejecutable
Protos ha dejado de ser únicamente una colección de ideas.
Hoy cuenta con una implementación de referencia en desarrollo, un intérprete construido sobre GraalVM y Truffle, herramientas de línea de comandos, bibliotecas, pruebas de conformidad y documentación técnica.
El lenguaje incorpora su modelo de objetos y delegación, funciones mediante closures, mecanismos de concurrencia y actores, y un conjunto creciente de capacidades que se van incorporando de manera controlada.
Una parte importante del trabajo consiste en comprobar cómo se comporta todo esto en la práctica. No basta con que una característica resulte elegante en una especificación: tiene que poder implementarse, combinarse con las demás y producir resultados correctos.
Y después está el rendimiento.
Trabajar con Truffle supone investigar cómo se representa y ejecuta el código, qué puede optimizar el compilador y qué costes introduce cada decisión del lenguaje. A veces una diferencia aparentemente pequeña en el diseño acaba teniendo consecuencias enormes en la ejecución.
Por eso comparo comportamientos, inspecciono estructuras internas, ejecuto pruebas y utilizo otros lenguajes como puntos de referencia.
No para convertir Protos en una copia de ellos, sino para aprovechar el conocimiento acumulado en implementaciones que llevan mucho tiempo resolviendo problemas parecidos.
Ese trabajo es una de las partes que más me interesan del proyecto: comprobar hasta qué punto una idea conceptual puede convertirse en un sistema real, eficiente y consistente.
Lo que la IA permite y lo que todavía no resuelve
No quiero presentar esta experiencia como si desarrollar software con inteligencia artificial fuese automático.
No lo es.
Los modelos se equivocan, interpretan mal requisitos, proponen soluciones innecesariamente complejas y pueden introducir regresiones mientras intentan corregir otra cosa. Cuanto mayor es el proyecto, más importante resulta detectar esos problemas.
Además, el coste de utilizar IA también importa. He tenido que experimentar con herramientas, modelos y modalidades de uso hasta encontrar una organización del trabajo que tenga sentido para un proyecto personal.
Mi solución actual consiste en aprovechar ChatGPT para la investigación y el razonamiento, y Claude Code como agente de implementación en mi entorno de desarrollo. Es una división práctica, no una afirmación de que exista una herramienta perfecta para todo.
Los intentos, los límites de uso y los costes que me llevaron hasta aquí los cuento en Lo que me costó aprender a gastar menos en IA.
La IA ha reducido una barrera enorme de tiempo y esfuerzo, pero no ha eliminado la necesidad de conocimiento técnico, criterio, paciencia y verificación.
De hecho, cuanto más capaz es de producir código, más importante resulta saber qué código queremos producir.
Por qué sigo adelante
Protos sigue siendo un lenguaje experimental y su diseño continúa evolucionando. Hay decisiones abiertas, limitaciones conocidas y mucho trabajo por delante.
No pretendo presentar como terminado algo que todavía está en construcción.
Tampoco sé hasta dónde llegará.
Lo que sí sé es que ahora puedo dedicar tiempo a una idea que durante mucho tiempo parecía demasiado grande para abordarla personalmente.
Y eso, para mí, ya supone un cambio extraordinario.
Protos es una oportunidad para explorar cómo creo que debería funcionar un lenguaje de programación, aprender de las decisiones que han tomado otros proyectos y comprobar mis propias hipótesis con código real.
También es una forma de experimentar con una manera de desarrollar software que hace pocos años habría sido difícil de imaginar: una persona que conserva la dirección técnica del proyecto y utiliza la inteligencia artificial para ampliar enormemente su capacidad de investigación e implementación.
Lo más importante no es cuántas funcionalidades consiga añadir ni lo deprisa que avance una versión.
Es conseguir que, cuando Protos crezca, siga siendo reconocible la idea que lo hizo nacer.
Y, después de tanto tiempo dándole vueltas, poder verlo ejecutarse es una motivación difícil de superar.