videos tutorial programar programacion logica facil entender empezar curso como aprender language-design

language design - tutorial - Cuando alguien escribe un nuevo lenguaje de programación, ¿en qué lo escribe?



tutorial de logica de programacion (12)

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

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

Por ejemplo, un compilador de C normalmente traduce el código fuente C (el idioma de entrada) a un programa de lenguaje ensamblador (el idioma de salida). El ensamblador toma el programa de lenguaje ensamblador y produce el lenguaje de la 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 bytecode de JVM. La JVM es un intérprete [1] que ejecuta el bytecode de Java. Después de ejecutar javac y obtener bytecode, ya no necesita javac . Sin embargo, cuando quiera ejecutar su programa, necesitará la JVM.

El hecho de que los traductores no necesitan mantenerse cerca para ejecutar un programa es lo que hace posible que "arranque" su idioma sin que termine ejecutando "sobre la capa" de capas y capas de otros lenguajes.

[1] La mayoría de las JVM hacen la traducción entre bastidores, pero en realidad no son traductores porque la interfaz de la JVM no es "idioma de entrada -> idioma de salida".

Disculpe mi ignorancia Estoy incursionando en PHP y mojándome los pies mientras navego 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, ¿en qué lo escribes ?

Esto probablemente suene muy tonto para todos los programadores, por quienes tengo un gran respeto, pero es una cosa desconcertante para mí. ¿Qué haces? Dígase a sí mismo ¡ Hoy voy a inventar un nuevo idioma! y luego disparar ... ¿Bloc de notas? ¿Todos los compiladores están basados ​​en lenguajes previamente existentes, de modo que uno se molestó en poder trazar todos los lenguajes de programación jamás ideados en un monstruoso árbol de ramificaciones que eventualmente funcionó en ... No sé, algo viejo?

Con mi débil intelecto, esto me parece fascinante ... ¡Por favor, enséñame!


En general, puede usar casi cualquier idioma que desee. PHP fue escrito en C, por ejemplo. Si no tiene acceso a ningún compilador en absoluto, tendrá que recurrir a escribir el lenguaje ensamblador y compilarlo en código de máquina a mano.


En realidad, puedes escribir en casi cualquier idioma que desees. No hay nada que le impida escribir un compilador de C en Ruby. "Todo" lo que tiene que 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 sea suficiente.

Si está empezando desde cero en una nueva plataforma, puede hacer 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.


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


La mayoría de los compiladores fueron programados en C o en ca como el programa si no c, entonces ensamblar lang es el camino a seguir. Sin embargo, al escribir un nuevo idioma desde cero y no tienes una macro lib o un código fuente de un lenguaje prototipo tienes que definir tus propias funciones Ahora en ¿Qué idioma? Puedes simplemente escribir un Formulario de código fuente denominado psedocode en la máquina, que se parece a una gramática bnf de la especificación de lenguaje estructurada orientada a objetos como Fortran basic algo lisp. Así que escribir un código cruzado que se parezca a cualquiera de estas sintaxis de idioma. Ese es el código psedo


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, el primer compilador C fue compilado a mano para el ensamblaje.

He estado interesado en el arranque desde que lo leí. Para obtener más información intenté hacerlo escribiendo mi propio superconjunto de BF, que llamé EBF , en sí mismo. la primera versión de EBF tenía 3 primitivos adicionales y compilé el primer binario a mano. 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 fue lo suficientemente expresivo como para ser utilizado para hacer un intérprete LISP .

Tengo la versión compilada a mano junto con la fuente en la 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 compilar manualmente la versión actual sería difícil de corregir.

Edmund Grimley Evans hizo algo similar con su lenguaje HEX

Una de las cosas interesantes de hacer esto usted mismo es que comprende por qué algunas cosas son como son. Mi código era producto de pequeños ajustes incrementales y parece más como si hubiera evolucionado en lugar de haber sido diseñado desde cero. Lo recuerdo cuando leo el código hoy, y creo que se ve un poco desagradable.



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

Como ya se respondió, la respuesta breve 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 empujarlo hacia atrás aún más. ¿Y los primeros programas escritos?

Bueno, los primeros compiladores para "lenguajes de alto nivel" se habrían escrito en lo que se llama "lenguaje ensamblador". El lenguaje ensamblador es un idioma en el que cada instrucción en el idioma corresponde a una instrucción única 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 allá. Los primeros ensambladores fueron escritos en "código de máquina". Un programa que consiste completamente en números binarios que son una correspondencia directa de uno a uno con el lenguaje en bruto de la computadora en sí.

Pero todavía no termina. Incluso un archivo con solo números en bruto todavía necesita traducción. Todavía necesita obtener esos números brutos en un archivo en la computadora.

Bueno, créanlo o no, las primeras computadoras tenían una fila de interruptores en el frente de ellos. Cambiaste los interruptores hasta que representaran un número binario, luego pulsaste otro interruptor y eso cargó ese único número en la memoria de la computadora. Luego siguió activando conmutando hasta que había cargado un programa de computadora mínimo que podía leer programas de archivos de disco o tarjetas perforadas. Has pulsado otro interruptor y comenzó a ejecutar el programa. Cuando entré a la universidad en los años 80, vi computadoras que tenían esa capacidad, pero nunca me dieron el trabajo de cargar en un programa con los interruptores.

¡Y aún antes de que los programas de computadora tuvieran que estar cableados con placas de enchufes !


Por lo general, con un lenguaje de programación de propósito general adecuado para el desarrollo de sistemas, por ejemplo, C, Haskell, ML, Lisp, etc., pero la lista de opciones es larga. También, por lo general, con algunos lenguajes específicos de dominio para la implementación de lenguaje, es decir, analizadores de analizador sintáctico y léxico, lenguajes intermedios como LLVM , etc. Y probablemente algunos scripts de shell, marcos de prueba y un sistema de configuración de compilación, por ejemplo, autoconf.


Prácticamente en cualquier idioma, 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 es posible que los lenguajes como OCaml, SML, Prolog y Lisp sean mejores para prototipar el lenguaje.

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

Como un caso especial, los nuevos dialectos Lisp a menudo se basan en implementaciones de Lisp existentes, ya que pueden aprovecharse de la mayoría de la misma infraestructura. Escribir un intérprete Scheme se puede hacer en Scheme en una página de código, en cuyo punto uno puede agregar fácilmente nuevas características.

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


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. Aún 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, entonces todo lo mejor y tiene un largo camino por recorrer.


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 un generador de analizadores como Flex . Estos son idiomas que se usan con 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 .)