Cuando alguien escribe un nuevo lenguaje de programación, ¿en qué lo escriben?

StackOverflow https://stackoverflow.com/questions/1629513

  •  06-07-2019
  •  | 
  •  

Pregunta

Por favor, disculpe mi ignorancia. Estoy incursionando en PHP y mojándome los pies navegando SO, y me siento obligado a hacer una pregunta que me he estado preguntando durante años:

Cuando escribes un lenguaje de programación completamente nuevo, ¿qué lo escribes in?

Esto probablemente suene realmente tonto para todos los programadores, por quienes tengo un gran respeto, pero es un desconcertante pollo & amp; cosa de huevo para mí. ¿Qué haces? Dígase a sí mismo ¡Hoy voy a inventar un nuevo idioma! y luego dispare ... ¿Bloc de notas? ¿Todos los compiladores están construidos en lenguajes previamente existentes, de modo que uno podría molestar a uno y podría trazar todos los lenguajes de programación diseñados en un árbol de ramificación monstruoso que eventualmente se convirtió en ... No sé, algo viejo?

Con mi débil intelecto, encuentro esto fascinante ... ¡Por favor, infórmame!

¿Fue útil?

Solución

No es una pregunta estúpida. Es una excelente pregunta.

Como ya se respondió, la respuesta corta es: "Otro idioma".

Bueno, eso lleva a algunas preguntas interesantes? ¿Qué pasa si es el primer idioma escrito para  su pieza de hardware en particular? Un problema muy real para las personas que trabajan en dispositivos integrados. Como ya respondió "un idioma en otra computadora". De hecho, algunos dispositivos integrados nunca obtendrán un compilador, sus programas siempre se compilarán en una computadora diferente.

Pero puedes retroceder aún más. ¿Qué pasa con los primeros programas escritos?

Bueno, los primeros compiladores para "idiomas de alto nivel" habría sido escrito en lo que se llama "lenguaje ensamblador". El lenguaje ensamblador es un lenguaje en el que cada instrucción en el idioma corresponde a una sola instrucción para la CPU. Su lenguaje de muy bajo nivel y extremadamente detallado y muy laborioso para escribir.

Pero incluso escribir lenguaje ensamblador requiere un programa llamado ensamblador para convertir el lenguaje ensamblador en lenguaje de máquina. Volvemos más lejos. Los primeros ensambladores se escribieron en "código de máquina". Un programa que consiste completamente en números binarios que son una correspondencia directa uno a uno con el lenguaje en bruto de la computadora misma.

Pero aún no termina. Incluso un archivo con solo números en bruto still necesita traducción. Aún necesita obtener esos números en bruto en un archivo en la computadora.

Bueno, lo creas o no, las primeras computadoras tenían una fila de interruptores en la parte delantera. Volteó los interruptores hasta que representaban un número binario, luego presionó otro interruptor y ese cargó ese único número en la memoria de la computadora. Luego siguió moviendo el interruptor hasta que cargó un programa de computadora mínimo que podía leer programas de archivos de disco o tarjetas perforadas. Presionó otro interruptor y comenzó a ejecutar el programa. Cuando fui a la universidad en los años 80, vi computadoras que tenían esa capacidad pero nunca se les dio la tarea de cargar un programa con los interruptores.

E incluso antes de eso, los programas de computadora tenían que estar cableados con placas de conexión !

Otros consejos

La respuesta más común es C . La mayoría de los lenguajes se implementan en C o en un híbrido de C con devoluciones de llamada y un "lexer". como Flex y el generador de analizadores sintácticos como YACC . Estos son idiomas que se usan para un propósito: describir la sintaxis de otro idioma. A veces, cuando se trata de lenguajes compilados, primero se implementan en C. Luego, la primera versión del lenguaje se usa para crear una nueva versión, y así sucesivamente. (Como Haskell .)

Muchos idiomas son bootstrapped, es decir, escrito en sí mismos . En cuanto a por qué querrías hacer esto, a menudo es una buena idea comer tu propio alimento para perros .

El artículo de Wikipedia al que me refiero discute el pollo y el huevo problema. Creo que lo encontrarás bastante interesante.

Prácticamente cualquier lenguaje, aunque usar uno adecuado para trabajar con gráficos y otras estructuras de datos complejas facilitará muchas cosas. Los compiladores de producción a menudo se escriben en C o C ++ por razones de rendimiento, pero los lenguajes como OCaml, SML, Prolog y Lisp son posiblemente mejores para la creación de prototipos del lenguaje.

También hay varios '' pequeños idiomas '' utilizado en el diseño del lenguaje. Lex y yacc se utilizan para especificar la sintaxis y las gramáticas, por ejemplo, y se compilan en C. (Existen puertos para otros idiomas, como ocamllex / ocamlyacc y muchas otras herramientas similares).

Como un caso especial, los nuevos dialectos de Lisp a menudo se basan en implementaciones de Lisp existentes, ya que pueden aprovechar la mayor parte de la misma infraestructura. Escribir un intérprete de Scheme se puede hacer en Scheme en una página de código, momento en el cual se pueden agregar fácilmente nuevas funciones.

Fundamentalmente, los compiladores son solo programas que leen algo y lo traducen a otra cosa: convertir la fuente LaTeX a DVI, convertir el código C a ensamblado y luego a lenguaje de máquina, convertir una especificación gramatical a código C para un analizador, etc. Su diseñador especifica la estructura del formato de origen (análisis), qué significan esas estructuras, cómo simplificar los datos (optimización) y el tipo de salida a generar. Los intérpretes leen la fuente y la ejecutan directamente. (Los intérpretes suelen ser más simples de escribir, pero mucho más lentos).

En realidad, puedes escribir en casi cualquier idioma que desees. No hay nada que te impida escribir un compilador de C en Ruby. " Todos " lo que debe hacer es analizar el programa y emitir el código de máquina correspondiente. Si puede leer / escribir archivos, su lenguaje de programación probablemente será suficiente.

Si está comenzando desde cero en una nueva plataforma, puede hacer una compilación cruzada: escriba un compilador para su nueva plataforma, que se ejecute en Java o de forma nativa en x86. Desarrolle en su PC y luego transfiera el programa a su nueva plataforma de destino.

Los compiladores más básicos son probablemente Assembler y C.

" Escribir un nuevo lenguaje de programación " técnicamente no implica ningún código. Acaba de llegar a una especificación de cómo se ve su idioma y cómo funciona. Una vez que tenga una idea de cómo es su idioma, puede escribir traductores e intérpretes para que su idioma "funcione".

Un traductor ingresa un programa en un idioma y emite un programa equivalente en otro idioma. Un intérprete ingresa un programa en algún idioma y lo ejecuta.

Por ejemplo, un compilador de C generalmente traduce el código fuente de C (el lenguaje de entrada) a un programa de lenguaje ensamblador (el lenguaje de salida). El ensamblador luego toma el programa de lenguaje ensamblador y produce lenguaje de máquina. Una vez que tenga su salida, no necesita los traductores para ejecutar su programa. Como ahora tiene un programa de lenguaje de máquina, la CPU actúa como intérprete.

Muchos idiomas se implementan de manera diferente. Por ejemplo, javac es un traductor que convierte el código fuente de Java a JVM bytecode. El JVM es un intérprete [1] que ejecuta el código de bytes de Java. Después de ejecutar javac y obtener bytecode, ya no necesita javac . Sin embargo, cada vez que desee ejecutar su programa, necesitará la JVM.

El hecho de que los traductores no necesiten ser mantenidos para ejecutar un programa es lo que hace posible "arrancar". su idioma sin que termine ejecutándose '' encima de '' capas y capas de otros idiomas.

[1] La mayoría de las JVM traducen detrás de escena, pero en realidad no son traductores, ya que la interfaz de la JVM no es "lenguaje de entrada - > lenguaje de salida " ;.

Generalmente puedes usar casi cualquier idioma que desees. PHP fue escrito en C, por ejemplo. Si no tiene acceso a ningún compilador, tendrá que recurrir a escribir lenguaje ensamblador y compilarlo en código máquina a mano.

Muchos idiomas se escribieron primero en otro idioma disponible y luego se volvieron a implementar en sí mismos y se iniciaron de esa manera (o simplemente mantuvieron la implementación en el idioma extranjero, como PHP y perl), pero algunos lenguajes, como el primer ensamblador, se compilaron a mano para El código de máquina como el primer compilador C se compiló a mano para ensamblarlo.

He estado interesado en el bootstrapping desde que lo leí. Para obtener más información, intenté hacerlo yo mismo escribiendo mi propio superconjunto de BF, al que llamé EBF , en sí mismo. la primera versión de EBF tenía 3 primitivas adicionales y compilé a mano el primer binario. Encontré un ritmo de dos pasos al hacerlo. Implementé una función en el idioma actual en una versión y tuve una versión dulce donde reescribí el código para utilizar la función implementada. El lenguaje era lo suficientemente expresivo como para usarse para hacer un intérprete de LISP .

Tengo la versión compilada a mano junto con la fuente en el primera etiqueta de lanzamiento y el código es bastante pequeño. La última versión es 12 veces más grande en tamaño y el código y permite un código más compacto, por lo que sería difícil compilar manualmente la versión actual.

Edmund Grimley Evans hizo algo similar con su lenguaje HEX

Una de las cosas interesantes de hacerlo usted mismo es que comprende por qué algunas cosas son como son. Mi código fue producto si pequeños ajustes incrementales y parece que ha evolucionado en lugar de haber sido diseñado desde cero. Recuerdo eso al leer el código hoy, que creo que parece un poco extraño.

Generalmente con un lenguaje de programación de propósito general adecuado para el desarrollo de sistemas, p. C, Haskell, ML, Lisp, etc., pero la lista de opciones es larga. Además, generalmente con algunos lenguajes específicos de dominio para la implementación del lenguaje, es decir, analizadores léxicos y analizadores léxicos, lenguajes intermedios como LLVM , etc. Y probablemente algunos scripts de shell, marcos de prueba y un sistema de configuración de compilación, p. Ej. autoconf.

La mayoría de los compiladores eran wriiten C o ac como programa, si no c, entonces el ensamblado lang es el camino a seguir. Sin embargo, al escribir un nuevo lang desde cero y no tiene una macro lib o código fuente de un prototipo de lenguaje, debe definir sus propias funciones ahora en qué idioma? Simplemente puede escribir un Formulario de código fuente llamado psedocode en la máquina, se ve como una gramática bnf de la especificación lang estructurada orientada a objetos, como el algoritmo básico Fortran. Entonces, la imagen escribe un código cruzado que se asemeja a cualquiera de estas sintaxis de lenguaje. Ese es el código psedo

Incluso más operaciones binarias o de ensamblaje deben traducirse en funciones, es decir, el trabajo de ensambladores / compiladores, luego en objetos, desde datos y funciones, si no tiene un archivo fuente para ver " cómo se debe representar la funcionalidad de estos objetos en la implementación de su lenguaje. Luego, debe reconocer "ver" implementar o definir sus propias funciones, procedimientos y estructuras de datos, lo que requiere mucho conocimiento, debe preguntarse qué es una función. Su mente se convierte en la simulación del lenguaje. Esto separa a un programador maestro del resto.

Yo también tuve esta pregunta hace unos meses. Y leí algunos artículos y vi algunos videos que me ayudaron a comenzar a escribir mi propio idioma llamado soft. Todavía no está completo, pero aprendí muchas cosas de este viaje.

Lo básico que debe saber es cómo funciona el compilador cuando tiene que ejecutar un fragmento de código. El compilador tiene muchas fases como análisis léxico, analizador semántico, AST (Árbol de sintaxis abstracta), etc.

Lo que hice en mi nuevo idioma se puede encontrar aquí: http: / /www.singhajit.com/writing-a-new-programming-language/

Si está escribiendo un idioma por primera vez, todo lo mejor y tiene un largo camino por recorrer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top