Cita:
Empezado por brakaman
Yo por lo que he entendido cuando un lenguaje o compilador esta hecho en si mismo, normalmente se hace un pequeño kernel en lenguaje C
|
Es un camino comun. Pero no es INDISPENSABLE. El que
parezca serlo es ppalmente que las comunidad de hacedores de lenguaje es muy pequeña ( y esos hacedores son muy conservadores en su uso de herramientas), y solo en los ultimos años se ha extendido y se hace mas popular la idea de hacer lenguajes.
Se hace en C por inercia, y acceso a ecosistema. Pero puedes arrancar con CUALQUIER lenguaje. El punto es que la implicacion de la imagen no es correcta (aunque se puede argumentar que historicamente fue la sequencia que nos toco. Pero perfectamente pudo haber sido diferente: Lisp pudo haber sido el "c" para hacer lenguajes).
Ahora, para *interpretes* si es mas cierto. Se pueden hacer interpretes metacirculares, en su propio lenguaje, y en un lenguaje mas "arriba", pero para hacerlos eficientes, necesitas hacer un bytecode y tener un lenguaje con la maquinaria de operar eficiente en eso ( y para especificar la estructuras y manipulacion memoria). Si tiene GC, este interfiere con el tema, porque los GC estan ajustados a su lenguaje, asi que si te desvias mucho termina afecto negativamente.
Ahora, esto es puramente por eficiencia. Se puede totalmente hacer un interprete de C en Java y con bytecode, no ser tan lento en su generalidad (solo sufrir en manipulacion intensiva).
P.D: Llevo como 3 años ya leyendo del tema y prototipando lenguajes en varios entornos.
P.D: Si hablamos de que *realmente* hace un lenguaje bueno para hacer lenguajes, tenemos que estas son sus familas/versiones:
Todos los lenguajes con Homoiconicidad (
https://es.wikipedia.org/wiki/Homoiconicidad):
- Derivados Lisp, por su enorme facilidad de metaprogramacion
- Forth y derivados, trivial de hacer bootstraping
- ML y derivados: Uso de tipos algebraicos hacen para lenguajes tipados lo que lisp para no tipados: Trivial de operar en AST
Y lenguajes con capacidad de operar en estructuras de "bajo" nivel. C, C+, Pascal, Delphi... pero se puede en C#, Java con extenciones y soportes como
https://github.com/dotnet/roslyn
que operan al nivel del
AST y no del lenguaje de alto nivel como tal.
Osea, lo que hace a un lenguaje bueno pa hacer lenguajes? Que permita manipular AST de forma eficiente y natural.