2011-06-14 22 views
6

Actualmente estoy jugando con los lenguajes de programación. Pasé algún tiempo escribiendo analizadores e intérpretes en lenguajes de alto nivel (sobre todo haXe).Elección de un idioma intermedio

He tenido algunos resultados, creo que en realidad son bastante agradables, pero ahora me gustaría hacerlo rápido.

Mi idea era traducir el idioma de entrada a C.
Mi conocimiento de C se limita a lo que aprende en la universidad. Más allá de algunos ejercicios, nunca he escrito programas reales de C. Pero estoy seguro de que puedo hacerlo funcionar.

Por supuesto, podría intentar escribir una interfaz para LLVM o generar código de bytes MSIL o JVM. Pero siento que eso es demasiado para aprender en este momento, y realmente no veo mucha ganancia.
También C es perfectamente legible, así que si lo arruino, es mucho más fácil entender por qué. Y C es, después de todo, de alto nivel. Realmente puedo traducir conceptos del lenguaje de entrada sin demasiado alucinante. Debería tener algo funcionando y funcionando en un tiempo razonable y luego optimizarlo como mejor me parezca.

Entonces: ¿Hay algún inconveniente en el uso de C? ¿Puedes recomendar una alternativa?
Gracias por su comprensión :)


Editar: algunas aclaraciones

  • La razón por la que quiero ir todo el camino hacia abajo, es decir, que estoy escribiendo un lenguaje de programación orientada a objetos con el apoyo y realmente quiero implementar mi envío de métodos a mano, porque tengo algo muy específico en mente.
  • Un área de uso principal sería escribir servicios HTTP, pero podría crear imágenes añadiendo enlaces a una biblioteca GUI (wxWidgets tal vez) o lo que sea.
+0

¿Cuál es la pregunta? – unwind

+0

@unwind: Acaba de editarse. – back2dos

+3

La mayoría de los compiladores que puedo pensar toman un paso intermedio antes de ir a C nativo, así que, sí, creo que C es una buena opción, especialmente porque eso te da mucha portabilidad. Si su lenguaje está orientado a objetos, es posible que tenga un mejor momento para traducir a C++ o Objective-C; Del mismo modo, si es funcional, es posible que tengas un mejor momento para traducir a Haskell. –

Respuesta

2

C es en realidad una opción bastante buena para un lenguaje de destino para un compilador pequeño o experimental; está ampliamente disponible en muchas plataformas, por lo que su compilador se vuelve inmediatamente útil en muchos entornos. El inconveniente principal es tratar con cosas que no están bien soportadas en C, o que no están bien definidas en la especificación C. Por ejemplo, si desea generar un código dinámico (compilación JIT), C es problemático. Cosas como el desenrollado y la reflexión de la pila son difíciles de hacer en C (aunque setjmp/longjmp y el uso cuidadoso de las estructuras para las que se generan descripciones de diseño pueden hacer mucho). Las cosas como el tamaño de las palabras, el diseño grande o pequeño endian y la precisión aritmética varían entre los compiladores de C, por lo que debes ser consciente de ello, pero esas son cosas con las que debes lidiar si quieres admitir múltiples máquinas de destino de todos modos.

También se pueden usar otros idiomas, la principal ventaja de C es su ubicuidad.

+0

Big/little endian será un problema sin importar el idioma. Por supuesto, los lenguajes que tienen un nivel demasiado alto para incluso hacer cosas en un nivel de bytes no experimentarán ningún problema endian, porque ni siquiera los admiten. – Lundin

6

C es una opción buena y bastante popular para lo que estás tratando de hacer.

Aún así, eche un vistazo al lenguaje intermedio (IR) de LLVM. Es bastante legible y creo que es más limpio y fácil de generar y analizar que C. LLVM viene con una gran colección de herramientas para trabajar con él. Puede generar código nativo para diversas plataformas (como con C pero con un poco más de control sobre la salida) o para máquinas virtuales. La posibilidad de compilación JIT es también un plus.

Consulte The Architecture of Open Source Applications, Chapter 11 para la introducción al enfoque LLVM y algunos fragmentos de IR.


¿Cuál es su entorno objetivo? Esto podría ayudarnos a darle una mejor respuesta.

+0

+1: LLVM IR fue específicamente diseñado para esto. – rubenvb

+0

@rubenvb: Sí, lo era. Es por eso que vale la pena echarle un vistazo, incluso si no lo usará al final. Y es posible que no pueda usarlo directamente (por ejemplo, LLVM es C++, por lo que puede ser difícil de usar en algunos entornos). O podría inspirarlo a hacer algo exactamente opuesto a su plan inicial: use el frontend LLVM para algunos lenguajes existentes (y populares) y proporcione su propio backend personalizado o VM para su aplicación. –

2

Usted podría considerar C--, un lenguaje similar a C destinado a ser un mejor objetivo para la generación de código que C.

+0

Gracias, eso suena muy interesante;) – back2dos

0

C es una buena opción, en mi humilde opinión. A diferencia de muchos lenguajes, C generalmente se considera "elegante" ya que solo tiene 32 palabras clave y construcciones muy básicas (secuencia, selección, iteración), con una colección de tokens y operadores muy simple y consistente.

Como la sintaxis es muy consistente dentro de C (corchetes y llaves, bloques y declaraciones, uso de expresiones), no está marchando hacia un mundo ilimitado de expansión de lenguaje. C es un lenguaje maduro, ha resistido bien el tiempo, y ahora es una "cantidad conocida" (lo cual es muy difícil de decir sobre muchos otros idiomas, incluso los "maduros").

Cuestiones relacionadas