Depende de qué tipo de lenguaje.
Por ejemplo, el (una vez aclamado, ahora odiado) CoffeeScript, que llegó años antes del ES6 ahora aclamado con la mayoría de sus características actuales, fue escrito por un rubyista, en Ruby, Jeremy Ashkenas. La leyenda dice (o al menos como lo recuerdo) que no tenía una formación sólida en informática o, específicamente, en diseño de lenguaje y compiladores.
Estudió este pequeño libro “Cómo crear su propio lenguaje de programación” y, como lo dice Wikipedia:
El 13 de diciembre de 2009, Jeremy Ashkenas hizo el primer Git commit de CoffeeScript con el comentario: “commit inicial del lenguaje misterioso”.
- ¿Cuáles son algunas fuentes para aprender el aprendizaje automático?
- ¿Cuál es la mejor manera de comenzar a aprender sobre el diagnóstico de fallas de automóviles: un libro, un curso o videos de Youtube?
- ¿Puedo aprender a boxear yo mismo? ¿Cuáles son las mejores formas y fuentes para hacerlo y cómo me preparo para ello?
- ¿Qué es lo más sorprendente de ti que alguien te dijo?
- ¿Qué queremos aprender de la vida?
El compilador fue escrito en ruby. El 24 de diciembre, realizó el primer lanzamiento etiquetado y documentado, 0.1.0. El 21 de febrero de 2010, se comprometió a la versión 0.5, que reemplazó el compilador Ruby con una versión de hospedaje automático en CoffeeScript puro. Para ese momento, el proyecto había atraído a otros colaboradores en GitHub, y estaba recibiendo más de 300 páginas por día.
Entonces, aproximadamente, en menos de 6 meses, armó la versión 1.0 de CoffeeScript y el resto, como dicen, es historia.
En las disciplinas clásicas de la informática, uno tendría que pasar por el legendario libro del Dragón, los compiladores – Principios, técnicas y herramientas. Luego aprenderá todos los detalles aburridos y sangrientos del análisis léxico, análisis de sintaxis, BNF, herramientas como lex, flex, yacc, bison y otros.
Si tienes la inclinación, el tiempo y la dedicación, te recomiendo que estudies esto. Hay varios casos prácticos que requieren pensamiento a nivel de compilador. Un ejemplo, nuevamente en el mundo de Ruby, fue el componente del enrutador de Ruby on Rails. En ese marco utilizamos lo que se llama un lenguaje específico del dominio (un DSL, otra opción para escribir su propio idioma). Es complicado y puedes recorrerlo con un montón de frases “ifs” y “case” (que es lo que realmente es un compilador, en términos de principiante). Pero rápidamente se vuelve engorroso, complicado, propenso a errores y súper lento.
Los “compiladores” tienen un conjunto de patrones y herramientas que automatizan este tipo de cosas y esto es con lo que los enrutadores Rails terminaron siendo reimplementados con: un analizador adecuado que se parece a yacc (racc) y una gramática adecuada. ¿Quién hubiera pensado que un marco web requeriría una comprensión a nivel de compilador?
No subestimes el tema. Es muy fácil hacer un lenguaje simple y lento.
Primero, ¿qué tipo de diseño de lenguaje? ¿Qué tipo de paradigmas del lenguaje? ¿Todo procesal? Todo funcional? Todo imperativo? ¿Toda lógica? Todo orientado a objetos? Todo orientado a patrones? Y sí, hay un montón de paradigmas, no solo OOP o funcional o de procedimiento. Entonces si estás mezclando, ¿hasta qué punto? ¿Cómo equilibrarlo?
Entonces, tienes que aprender sobre la teoría de tipos y esta es otra disciplina en sí misma y puede llevarte a ocultar los lugares de Haskell hasta eludir a los “indefinidos” por todas partes.
Entonces tienes que pensar en cómo funciona realmente el hardware subyacente. Procesadores, registros, cachés, transferencia de datos, cuellos de botella, etc. El diseño más elegante puede ser un dolor de cabeza para compilar hasta un binario nativo rápido.
Entonces tiene diferentes tipos de binarios para diferentes tipos de arquitecturas de procesadores. Desde una CPU Intel complicada hasta la arquitectura ARM que se encuentra en la mayoría de los teléfonos inteligentes o incluso en arquitecturas totalmente diferentes, como las GPU, para las que puedes encontrar API como CUDA.
O, puede abstraer completamente el hardware y confiar en una máquina virtual existente como JVM o CLR o BEAM (Erlang VM) y crear lenguajes como JRuby, Scala, Clojure que aprovechan la JVM de Java o lenguajes como F #, C # , VB .NET que aprovecha la CRL o el núcleo .NET propios de Microsoft. O Elixir que generó código compatible con Erlang BEAM.
O bien, es posible que aún desee compilar en binarios nativos sin una máquina virtual intermediaria: realice todo el proceso AOT, compilación anticipada, en lugar de JIT’ing, compilación justo a tiempo. Luego, puede tomar prestado de LLVM de Apple de la misma forma en que pueden compilar tanto Objective-C como Swift en binarios de MacOS / Intel o iOS / ARM.
Esto es lo que hacen lenguajes como Rust y Crystal o Clang (el que quiere reemplazar el clásico GCC C).
LLVM es el mejor marco para estudiar ahora desde una perspectiva práctica. Diseñar un idioma no es solo traducir la sintaxis al código de máquina. Tienes que preocuparte por la optimización adecuada de la máquina. El código elegante, legible por humanos, a menudo es horrible para la ejecución de la máquina si se traduce directamente en código de máquina. A las máquinas no les importan las abstracciones y los patrones de programación adecuados, les gusta el código altamente lineal y de procedimiento. Por lo tanto, el compilador debe ser lo suficientemente inteligente como para encontrar piezas de código que pueda juntar, reemplazar o cortar completamente del binario final. De lo contrario, será muy lento.
Esto es lo que está haciendo un intérprete como el V8 para hacer que el Javascript históricamente de mierda se ejecute rápidamente en los navegadores: empleando una tonelada de teoría de compilación basada en la ciencia informática detrás de él. Hablando de lo que ahora existe la iniciativa de ensamblaje web, para formalizar lo que ya tenemos con ASM.js, que es un subconjunto de Javascript, un subconjunto más sensato, que un compilador puede realmente optimizar al código de máquina rápido.
Volviendo al principio. Entonces, ¿cuánto tiempo se tarda en desarrollar un nuevo lenguaje? Depende. Puedes escribir un simple DSL en un par de horas. Un lenguaje simple como CoffeeScript, que compila a otro idioma, Javascript, por lo que es un transpiler en lugar de un compilador completo – en cuestión de semanas. Puede escribir un lenguaje como Clojure aprovechando la JVM en un par de meses. Puede escribir un lenguaje como Rust o Crystal aprovechando toda la informática empaquetada en LLVM en algunos meses más.
Y en cualquier caso, pasará el próximo par de años optimizando el infierno porque todas sus suposiciones iniciales sobre el idioma serán diferentes una vez que ponga la versión 1.0 en el mercado. Espere que un lenguaje exitoso tome un lugar en el estadio de béisbol de 4 a 5 años para realmente ponerse al día, y su esfuerzo continuo para optimizarlo todo el camino.
Eso es lo que tarda.