2010-10-13 15 views
13

Necesito implementar un intérprete para un lenguaje de programación como parte de un proyecto en el que estoy trabajando. No creo que los detalles de este proyecto sean demasiado relevantes, excepto que me exige implementar un intérprete desde cero, no puedo usar un lenguaje de programación existente (los requisitos incluyen el soporte de continuaciones delimitadas portátiles, y el poder escribir un intérprete en Javascript, y también en Java).¿Qué lenguajes de programación tienen los intérpretes implementados más fácilmente?

Obviamente, preferiría evitar inventar un lenguaje de programación completamente nuevo, así que espero que haya algún lenguaje muy simple que pueda copiar, o al menos inspirarme.

Mi primer pensamiento fue Forth o un lenguaje rudimentario tipo Lisp, sin embargo, preferiría que el lenguaje tuviera una sintaxis más cercana a los lenguajes de programación más populares como Java, Python o Ruby. En particular, esto significa soportar operadores de infijo (a + b), y también a = b asignación de variables.

Para decirlo de otra manera, me gustaría que este idioma se sienta razonablemente familiar para las personas que programan en PHP hoy, y no creo que Forth o Lisp cumplan con este criterio.

¿Alguien puede ofrecer alguna sugerencia para ese tipo de lenguaje?

+5

-1 por querer hacer un PHP-igual;) Cortarlo de raíz. – ocodo

+1

No quiero hacer un PHP-igual, solo quiero hacer algo razonablemente familiar para las personas que programan en PHP. – sanity

Respuesta

10

Esto suena como un trabajo para Lua.

  • Es un lenguaje pequeño, diseñado para ser fácil de implementar
  • ya hay varios implementations en Java y por lo menos las obras en curso de Javascript.
  • Su sintaxis cumple con sus requisitos (asignaciones, operadores de infijo).

El trabajo que te queda es implementar continuaciones delimitadas, pero ya lo sabías cuando descartabas Lisp/Scheme.

14

Creo que Lisp y Forth tienen algunos de los intérpretes ingenuos más fáciles.

Puede elegir un lenguaje dinámico simple, y la parte más difícil sería construir el analizador. Por ejemplo, un subconjunto de JavaScript podría funcionar. El intérprete está básicamente atravesando el AST y haciendo las operaciones de cada nodo.

En cualquier caso, investigue los lenguajes de scripting existentes que pueden integrarse en su entorno de desarrollo, y evite que se genere el suyo a toda costa. Implementar compiladores (en un sentido amplio) es muy divertido de hacer, pero puede ser costoso de mantener a largo plazo.

+0

Ya he descartado cecear y desaprovechar desafortunadamente por las razones descritas en mi pregunta. – sanity

+2

¿por qué no hacer un ceceo con sintaxis infija? eso no es realmente difícil. – nickik

3

Brainfuck? Quiero decir que solo tiene 8 comandos que cada mapa a un solo personaje.

+0

Hizo uno de esos hace un par de semanas ... fue divertido.Hay un par de extensiones como pbrain que se suman al proyecto también. Pensé que sería interesante escribir un compilador JIT de optimización para él, pero luego me distrajo con el trabajo ... –

+0

Sí, supongo que no responde completamente la pregunta cuando se considera "intentar diseñar un lenguaje para las personas". para usar realmente "porción;) –

+0

@sanity, no lo es. Está diseñado para permitir el compilador más pequeño posible para un lenguaje de programación completo de Turing. –

2

Cree primero un intérprete LISP, este será relativamente simple.

Obtendrá mucha experiencia en el análisis de lenguaje, sin que se vea obstaculizado por los requisitos de funciones adicionales.

+0

Ya he descartado Lisp por las razones explicadas en mi pregunta. – sanity

+2

Lo sé, sin embargo, aún quiero alentarlo a hacer esto, ya que asumo que este será su intérprete de lengua materna, y creo que se puede obtener mucho más de la construcción de un lenguaje que es relativamente fácil de analizar, en su lugar de un idioma que quiere que otras personas usen. No se preocupe por eso en esta etapa, desarrolle algo de lo que pueda aprender. Sin mencionar que un rápido toque alrededor de Reddit y YCombinator revela que Lisp no es muy impopular en este momento. – ocodo

+0

¿Crees que quizás Paul Graham tenga algo que ver con los LISP que se reúnen alrededor de YCombinator? = P –

2

Asumo que esto es tanto un ejercicio para su propia edificación como un deseo de un producto final útil.

En ese caso, debo estar de acuerdo con los demás que han recomendado variantes en lenguajes tipo Lisp, al menos para la primera pasada, especialmente si no lo ha hecho antes.

Lua es un lenguaje de scripting bastante popular para este tipo de cosas que requiere scripts de usuario pequeños, no particularmente efectivos.

También podría considerar si javascript mismo (o un subconjunto) cumple con sus requisitos.

también consultar la lista aquí: http://en.wikipedia.org/wiki/Continuation#Programming_language_support

0

te recomiendo empezar con un subconjunto de Lisp - básicamente coche, CDR, los contras, y cotización.Asegúrese de tener un escáner básico que maneje los caracteres no válidos, y luego los tipos no válidos (como los contras requieren 2 argumentos, el 2º debe ser una lista). Puede hacerlo con conocimiento de las estructuras de datos básicas (las listas vinculadas solo pueden hacerlo, pero las dobles o las circulares son mucho mejores).

8

Tcl. La sintaxis es tan simple como Lisp, y tiene un proceso expr para infix arithmetic. Incluso usa {} para bloques, por lo que si entrecierra los ojos correctamente, puede decirle a la gente que es un lenguaje en forma de C.

No tiene asignación de infijo a=b, pero una vez que empiezas a ir por el camino de la notación infija general, los idiomas se vuelven realmente complejos muy rápido, así que no estoy seguro de cómo es compatible con tus otros requisitos.

+1

Quiero +1 una respuesta TCL, pero escribir un intérprete TCL completo no es realmente tan fácil. Puede obtener un núcleo modesto del lenguaje bastante simple, pero TCL contiene muchos sub idiomas, por ejemplo, el comando expr que menciona. cualquier programa real debe ser compatible con expr, porque aparece en el comando if, por lo que en realidad tiene que implementar un lenguaje tipo C en la parte superior del intérprete de comandos como el lenguaje que es el TCL endekalog – SingleNegationElimination

+0

Bueno, dijo "o al menos dibujar" inspiración de ", y la compatibilidad de Tcl no era un requisito difícil. Además, como 'expr' se parece mucho a cualquier otro proceso, no necesita implementarse completamente de inmediato, como en la mayoría de los lenguajes (más complicados). ¡Creo que incluso podrías escribirlo en Tcl y compartirlo entre los dos intérpretes que necesita para escribir! – Ken

+0

@Token: también agregaré que esos sublenguajes son específicos para los comandos en cuestión. Implementar un analizador/intérprete para el idioma es fácil. Implementando todos los comandos básicos ... menos. Sin embargo, si miras en la wiki, probablemente puedas encontrar implementaciones de muchos de los comandos usando otros comandos más simples. – RHSeeger

4

Logo es un simple lenguaje Lisp sin paréntesis y unos pocos cientos de implementaciones.

Logo information on Wikipedia.

ver este PDF para obtener información sobre las implementaciones: Logo tree.

0

Puede utilizar un subconjunto de Lisp y aún así tener una notación más natural si se utiliza dulces-expresiones, o por lo menos rizado-infija notación:

  • Rizado-infija añade infija , leyendo {a + b} como (+ ab) y admite la notación funcional tradicional como f (x). Ver más en SRFI-105.

  • Sweet-expresiones se basan en la rizado-infija, y añadir la sangría sintácticamente relevantes. Vea más aquí en SRFI-110. Su URL es http://srfi.schemers.org/srfi-110/ (para SRFI-105, simplemente reemplace "110" por "105").

Ambos han sido implementadas por los Legible Lisp S-expresiones Proyecto: http://readable.sourceforge.net/

disfrute!

Cuestiones relacionadas