¿Creamos un lenguaje de programación escribiendo un compilador?

8

Digamos que quería crear mi propio lenguaje de programación. Suponiendo que he tomado todas las decisiones sobre cómo quiero que se vea y actúe, ¿solo necesito escribir un compilador para ello?

Por ejemplo, ¿el código Java de alto nivel no es solo texto y este texto está en el formato correcto para que el compilador lo acepte y lo convierta en otra cosa?

Mi pregunta es, ¿la creación de un lenguaje de programación se realiza a través de un compilador? De alto nivel está bien.

Haych
fuente
¿Es su pregunta acerca de hacer precisa la definición del lenguaje de programación ?
Anton Trunov
Realmente no. Es más, ¿podría teóricamente inventar mi único idioma simplemente haciendo un compilador que analice algún texto? Donde este texto es mi lenguaje inventado en mi sintaxis. Por ejemplo, es System.out.println()Java porque el compilador de Java acepta eso o hay algo más trabajando aquí.
Haych
3
¿Qué quiere decir con "la creación de un lenguaje de programación"? ¿Qué quieres decir con "hecho a través"? Es difícil para mí decir exactamente lo que estás preguntando. Dice que ya ha tomado todas las decisiones sobre cómo desea que se vea y actúe el idioma; ¿Qué más hay para la creación de un lenguaje de programación, desde su perspectiva? Si intenta elaborar lo que está tratando de lograr, probablemente será posible darle respuestas más útiles sobre cómo se puede lograr eso. En este momento parece que tenemos que adivinar lo que podrías estar preguntando.
DW

Respuestas:

10

La respuesta corta es no .

Puede pensar en un lenguaje de programación como un formalismo matemático utilizado para expresar la computación. Un compilador / intérprete es solo una pieza de un software real que lleva a cabo ese cálculo, y no debe servir como la especificación del lenguaje.

Dicho esto, además de la especificación léxica y sintáctica de un idioma, también debe definir la especificación semántica, es decir, qué significa realmente un programa (sintácticamente correcto) escrito en su idioma. La semántica obvia para comenzar es la semántica operativa , donde el significado de un programa se da en términos de cómo se ejecuta realmente el programa. Es decir, (matemáticamente) define con precisión cómo se ejecutan los programas. Además de esta semántica, debe crear un compilador / intérprete real con optimizaciones, etc.

La especificación de la semántica operativa completa de su idioma le proporcionará una documentación formal del idioma y le hará comprender su idioma hasta el más mínimo detalle. Además, le permitirá razonar formalmente sobre algunos aspectos del lenguaje. Escribir la semántica operativa es realmente un buen hábito.

También hay otras semánticas útiles, como la semántica axiomática , denotacional y de juegos . Sin embargo, son más avanzados y generalmente no llegan a un compilador / intérprete.

Bellpeace
fuente
3
Esto está mal. Un lenguaje de programación sin una especificación formal sigue siendo un lenguaje de programación.
reinierpost
3
@reinierpost Entonces, su respuesta a la pregunta "¿la creación de un lenguaje de programación se realiza a través de un compilador" es sí? Si es así, creo que deberías escribirlo como respuesta.
bellpeace
44
@reinierpost: una casa que no fue diseñada por un arquitecto sigue siendo una casa. ¿Pero en qué tipo de casa preferirías vivir?
Andrej Bauer
1
La pregunta como se dijo es ambigua. ¿Se puede crear un lenguaje de programación creando un compilador para él? Seguro. ¿Es esta la forma de crear un lenguaje de programación? No, es solo una forma posible.
reinierpost
2
@johan Un lenguaje de programación es de gran importancia práctica y teórica para dejarlo como un concepto que no está definido con precisión. Por ejemplo, ¿cómo explicarías con precisión a alguien qué es C o cómo funciona exactamente? ¿Al darle un compilador de C? ¡Pero hay tantos y son diferentes! Además, en muchos casos ni siquiera sabemos qué hará el compilador de C (sugerencias: concurrencia, modelos de memoria). En sentido estricto, un compilador / intepreter `` induce" un lenguaje de programación, pero el pensamiento de un lenguaje de programación como una mera aplicación plantea más problemas de los que resuelve.
bellpeace
5

Digamos que quería crear mi propio lenguaje de programación. Suponiendo que he tomado todas las decisiones sobre cómo quiero que se vea y actúe, ¿solo necesito escribir un compilador para ello?

No. Tomar todas las decisiones sobre cómo desea que se vea y actúe el lenguaje es crear su propio lenguaje de programación. No necesita un compilador o un intérprete para crear un lenguaje de programación. No necesita un compilador o un intérprete para escribir programas en su lenguaje de programación.

Solo necesita un compilador o un intérprete si realmente desea ejecutar los programas que escribe.

Mi pregunta es, ¿la creación de un lenguaje de programación se realiza a través de un compilador? De alto nivel está bien.

No. La creación de un lenguaje de programación se realiza creando dos conjuntos de reglas:

  1. cómo se ve un programa legal (sintaxis)
  2. Qué hace un programa legal (semántica)

Eso es.

Hay lenguajes de programación que no tienen implementación. O que no tuvo implementación durante mucho tiempo.

Por ejemplo, Konrad Zuse creó Plankalkül a mediados de la década de 1940, pero debido a la guerra nunca pudo implementarlo. Se implementó por primera vez como parte de una disertación en 1975. Pero ciertamente existió en las décadas de 1950 y 1960.

LISP fue diseñado originalmente como una alternativa más manejable al cálculo λ para estudiar computación. Fue implementado por Steve Russell, un estudiante de John McCarthy. ¡McCarthy incluso dudó de que LISP pudiera implementarse en absoluto!

APL fue diseñado originalmente como una notación para la enseñanza de las matemáticas. Más tarde se amplió para servir como lenguaje de especificación para IBM System / 360. Las implementaciones llegaron más tarde, después de que el lenguaje ya había sido utilizado.

PLANNER era un lenguaje muy influyente, que en realidad solo se implementó después de que ya había influido en otros idiomas; Fue diseñado en 1969 e implementado en 1973, momento en el que ya había influido en Smalltalk y Prolog (ambos en 1972).

Estructura e interpretación de la mecánica clásica es un libro de texto de física que utiliza Scheme en lugar de matemáticas para describir sistemas dinámicos; El hecho de que Scheme tenga intérpretes y compiladores no es esencial para el libro, se usa como un lenguaje para transmitir pensamientos, no para ejecutar programas.

Como puede ver, los lenguajes de programación pueden ser útiles incluso sin implementaciones. "Los programas deben estar escritos para que los humanos los lean, y solo de manera incidental para que las computadoras los ejecuten" es una famosa cita de Estructura e interpretación de programas de computadora. Los lenguajes de programación son lenguajes formales para describir inequívocamente procesos complejos. El hecho de que si describe un proceso con la precisión suficiente para que un humano lo entienda, también es ejecutable por una máquina es un efecto secundario. Es un efecto secundario muy deseable, útil, poderoso, pero es un efecto secundario.

Los primeros "lenguajes de programación", cálculo λ, cálculo SKI, máquinas de Turing, funciones recursivas μ, no fueron creados para la ejecución. Fueron creados para comprender cuestiones fundamentales de lógica y matemáticas.

Jörg W Mittag
fuente
0

¿La creación de un lenguaje de programación se realiza a través de un compilador?

Hay 3 opciones.

  • Un ensamblador
  • Un interprete
  • Un compilador


El código fuente del ensamblador escrito por un humano se traduce 1 a 1 en el código de máquina consumido por la CPU.

El intérprete
Un programa lee cada línea de código, sigue las instrucciones y las ejecuta en orden.

El compilador
Un programa analiza las declaraciones a menudo utilizando un Árbol de sintaxis abstracta y lo utiliza para generar código objeto.
El compilador genera alguna forma de código objeto que puede ser consumido por una máquina real o virtual.

Desdibujando las líneas
Aquí hay muchos intermediarios.
Ruby corre de su AST. Java ejecuta el código de bytes para una CPU ficticia.
SQL se interpreta, pero no se ejecuta como está escrito, se traduce en un plan de consulta.

Javascript existe en una extraña zona crepuscular. Se interpreta en su mayor parte, pero las partes críticas se ejecutan a través de un compilador JIT que genera código de byte no estandarizado y también se usa como código objeto para algunos compiladores.
Php solía ser un lenguaje interpretado puro, pero Facebook usa su propio compilador de php.

Mi recomendación
si quieres experimentar escribiendo un lenguaje de programación.
Comience con un intérprete.

Si quieres entender compiladores, ¡estudia AST!
Un lenguaje como Pascal está hecho a medida para un AST, puede pasar del código fuente al código de máquina en una sola pasada y, por lo tanto, es relativamente fácil de implementar en un compilador.
Si insiste en estudiar compiladores y no intérpretes, le recomiendo que estudie los escritos de Wirth sobre el tema.

Johan
fuente
Hay más de las tres opciones. Por ejemplo, una opción es: no hacer nada. Puede crear un lenguaje de programación simplemente estableciendo sus reglas. No necesita implementarlos en absoluto. Plankalkül no se implementó hasta 60 años (?) Después de su creación. Originalmente, LISP y APL no estaban destinados a ser implementados, LISP fue diseñado como una versión más manejable de cálculo λ para estudiar computación, APL fue diseñado como una notación para enseñar matemáticas. El libro Estructura e interpretación de la mecánica clásica utiliza el esquema como una notación para describir los sistemas dinámicos, no como un ...
Jörg W Mittag
lenguaje para escribir programas que realmente se ejecutan.
Jörg W Mittag
0

Todo lo que hace un compilador es asegurarse de que la entrada que proporciona utiliza el lenguaje que el compilador entiende y que lleva la misma estructura semántica que el lenguaje.

El compilador finge la inteligencia haciendo uso de un lexer y un analizador para analizar léxicamente la entrada e intentar analizar los tokens en un orden que tenga el significado deseado sin introducir ambigüedad.

Para responder a su pregunta, PUEDE crear un lenguaje de programación creando el compilador, pero al hacerlo, el lenguaje de programación se crea antes de que se complete el compilador.

Piense en los lenguajes de programación como en cualquier otro idioma: inglés, francés, alemán, etc. El trabajo de un compilador es, dada alguna entrada, asegurarse de que las palabras utilizadas en esa entrada coincidan con las palabras utilizadas en el idioma para el que está construido, hacer Asegúrese de que el orden de las palabras tenga sentido en el idioma para el que está construido y, finalmente, traduzca esa entrada a un idioma que la máquina pueda entender

smac89
fuente
Esto no necesariamente es cierto. Hay muchos ejemplos de lenguajes creados junto con los programas escritos para procesarlos. FORTRAN era el nombre del compilador, no el idioma.
reinierpost
@reinierpost Mi punto es que antes de que un compilador pueda reconocer un conjunto de tokens dentro de su idioma dado, esos tokens deben existir primero ... de ahí que el lenguaje haya existido antes de la finalización del compilador. Un idioma no puede existir sin sus componentes más básicos, que son las palabras / frases dentro de ese idioma. La semántica puede venir después. De la misma manera, un compilador ni siquiera puede comenzar a fingir que compila un idioma si no conoce las palabras que lo componen
smac89
No es necesario que haya un lenguaje 'dado'. El compilador puede procesar la entrada sin ninguna definición específica de lo que constituye una entrada válida para ella. Trate de lograr que una multitud de programadores en C acuerden exactamente qué es y qué no es un programa en C. ¡Buena suerte!
reinierpost