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.
System.out.println()
Java porque el compilador de Java acepta eso o hay algo más trabajando aquí.Respuestas:
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.
fuente
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.
No. La creación de un lenguaje de programación se realiza creando dos conjuntos de reglas:
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.
fuente
Hay 3 opciones.
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.
fuente
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
fuente