2010-09-28 20 views
26

Duplicar posibles:
Learning to write a compiler¿Cómo hacer tu propio lenguaje de programación?

Miré a mi alrededor tratando de encontrar más información sobre el desarrollo del lenguaje de programación, pero no pude encontrar mucho en línea. He encontrado algunos videos tutoriales, pero no mucho para guías de texto, preguntas frecuentes, consejos, etc. Tengo mucha curiosidad sobre cómo construir mi propio lenguaje de programación. Se me lleva a preguntar SO:

cómo se puede ir sobre la fabricación de su propio lenguaje de programación?

Me gustaría construir un lenguaje muy básico. No planeo tener un lenguaje muy bueno, ni creo que lo use nadie. Simplemente quiero crear mi propio idioma para aprender más sobre los sistemas operativos, la programación y ser mejor en todo.

¿Dónde comienza uno? ¿Construyendo la sintaxis? ¿Construyendo un compilador? ¿Qué habilidades se necesitan? Un montón de montaje y comprensión del sistema operativo? ¿En qué idiomas están integrados la mayoría de los compiladores y los lenguajes? Asumo C.

+0

No estoy seguro de que va a aprender mucho acerca de los sistemas operativos escribiendo un compilador ... Gracias –

+0

no vi la otra pregunta, no aparecer en Google o en SO cuando busqué. ¡Muchas buenas respuestas! –

+0

Creé un lenguaje de programación sin tocar ensamblar o binario. http://github.com/struixLang – sbrm1

Respuesta

29

Yo diría que antes de comenzar puede que desee echar un vistazo a Dragon Book y/o Programming Language Pragmatics. Eso te pondrá a tierra en la teoría de los lenguajes de programación. Los libros cubren compilación e interpretación, y le permitirán construir todas las herramientas que serían necesarias para hacer un lenguaje de programación básico.

No sé cuánto lenguaje ensamblador que sabes, pero a menos que esté bien cómodo con algún dialecto de programación en lenguaje ensamblador Te aconsejo que no traten de escribir un compilador que compila a código ensamblador, ya que es un gran desafío Usted mencionó anteriormente que está familiarizado con C y C++, por lo que quizás pueda escribir un compilador que compile hasta C o C++ y luego use gcc/g ++ o cualquier otro compilador C/C++ para convertir el código a un ejecutable nativo. Esto es lo que hace el lenguaje de programación Vala (convierte la sintaxis de Vala en código C que usa la biblioteca GObject).

En cuanto a lo que puede usar para escribir el compilador, tiene muchas opciones. Puede escribirlo a mano en C o C++, o para simplificar el desarrollo puede usar un lenguaje de nivel superior para que pueda enfocarse en la escritura del compilador más que las asignaciones de memoria y las que son necesarias para trabajar con cadenas. en C.

Simplemente puede generar las gramáticas y tener Flex y Bison generar el analizador sintáctico y léxico. Esto es realmente útil ya que le permite hacer un desarrollo iterativo para trabajar rápidamente en obtener un compilador que funcione.

Otra opción que tiene es usar ANTLR para generar su analizador, la ventaja de esto es que obtiene muchos idiomas de destino que ANTLR puede compilar. Nunca he usado esto, pero he escuchado mucho al respecto.

Además, si desea una mejor conexión a tierra en los modelos que se utilizan con tanta frecuencia en la construcción del compilador de lenguaje de programación/escáner/analizador, debe obtener un libro sobre los Modelos de Computación. Yo recomendaría Introduction to the Theory of Computation.

Parece que también le interesa comprender los sistemas operativos. Esto diría que es algo que está separado del Diseño del Lenguaje de Programación, y debería buscarse por separado. El libro Principles of Modern Operating Systems es un buen punto de partida para aprender sobre eso. Puede comenzar con pequeños proyectos como crear un shell, o escribir un programa que emule el comando ls, y luego ir a más cosas de bajo nivel, dependiendo de cómo a través de las llamadas al sistema en C.

Espero que le ayuda.

EDIT: He aprendido mucho desde que escribo esta respuesta. Estaba tomando el online course on programming languages que Brown University estaba ofreciendo cuando vi esta respuesta presentada allí. El profesor señala muy acertadamente que esta respuesta habla mucho sobre los analizadores sintácticos, pero es clara en casi todo lo demás. Realmente te sugiero que revises los videos y ejercicios del curso si deseas obtener una mejor idea sobre cómo crear un lenguaje de programación.

+1

¡Gracias, publicación realmente perspicaz! ¡Definitivamente buscaré todo, excelente publicación! –

+3

Gracias por marcar esta la respuesta correcta. En el momento en que lo escribí todo, la respuesta de otra persona ya se había marcado correctamente. Es la primera respuesta que he publicado en este sitio que fue aceptada. –

+0

(Dado que alguien tiene que hacerlo notar, finalmente, ...) esta respuesta ha alcanzado un cierto nivel de (en?) Famy en https://www.youtube.com/watch?v=3N__tvmZrzc – agam

7

Depende totalmente de cómo va a ser su lenguaje de programación.

  • ¿Definitivamente desea que se compile? Hay lenguajes interpretados, así ... o usted podría aplicar la compilación en tiempo de ejecución

  • ¿Qué desea la plataforma de destino sea? Algunas opciones: (¿qué arquitecturas y sistemas operativos)

    • código nativo
    • JVM
    • .NET regular
    • .NET utilizando el lenguaje de ejecución dinámica (como IronRuby/IronPython)
    • Parrot

Personalmente, yo fuertemente considere apuntar a JVM o .NET, simplemente porque obtiene mucha "seguridad" gratis, así como un gran conjunto de bibliotecas que su lenguaje puede usar. (Obviamente, con código nativo hay un montón de bibliotecas también, pero sospechan que conseguir la interoperabilidad entre ellos derecho puede ser más complicado.)

veo ninguna razón por qué te gustaría particularmente desea escribir un compilador (u otro parte del sistema) en C, especialmente si es solo para fines educativos (por lo que no necesita un compilador de 100 millones de líneas por segundo). ¿En qué idioma es personalmente más productivo?

+1

puedo código en C y C++. Yo prefiero C, sin embargo. Principalmente quiero llegar a un nivel muy bajo, aprender cómo funciona un compilador, ejecutables, código cargado en la memoria y ejecutado. Eventualmente quiero hacer mi propio sistema operativo con mis pequeños programas de sistema/usuario. No tengo la intención de hacer nada a gran escala, pero muy, muy mínimo. Trabajaría principalmente en Linux y me gustaría que el lenguaje se use en la mayoría de los sistemas * nix. –

6

Eche un vistazo a ANTLR. Es un impresionante compilador compilador de las cosas que utilizas para construir un analizador sintáctico para un idioma.

La construcción de un lenguaje consiste básicamente en definir una gramática y agregar reglas de producción a esta gramática. Hacer eso a mano no es trivial, pero un buen compilador de compiladores te ayudará mucho.

También es posible que desee echar un vistazo al clásico "Dragon Book" (un libro sobre compiladores que presenta a un caballero matando a un dragón en la página principal). (Buscalo en Google).

Crear idiomas específicos del dominio es una habilidad útil para dominar. Los lenguajes específicos del dominio no suelen ser lenguaje de programación con todas las funciones, sino reglas comerciales típicas formuladas en un lenguaje personalizado hecho a medida para el proyecto. Echa un vistazo a ese tema también.

+0

Gracias, encontré el libro y ANTLR se ve muy interesante y ahorra tiempo. –

+0

Si desea sumergirse en programas de análisis y/o antlr puedo recomendar el libro de Terence Parr. Él es bastante bueno para hacer comprensible el tema difícil de la escritura de analizador. – Holstebroe

3

Hay varios tutoriales en línea como Write Yourself a Scheme in 48 hrs.

Un punto de partida aunque' podría ser con un 'lenguaje específico de dominio incrustado'(EDSL). Este es un lenguaje que realmente se ejecuta dentro del medio ambiente de otro, pero hay palabras clave creadas, operadores, etc particularmente adecuados para el sujeto (dominio) que desea trabajar.

+0

El primer enlace está roto. – Hemang

Cuestiones relacionadas