¿Características básicas para un lenguaje básico? Sugerencias DSL?

9

Finalmente comencé a comprender la complejidad detrás de la creación de un intérprete y un compilador. He construido varias versiones de TinyBasic, 1964 (Dartmouth) Basic, y mis propias expansiones en esos idiomas antes de llegar a este punto. El proyecto más reciente es uno que llamo Open Source Basic ... porque no se me ocurren otras características del lenguaje que puedan interesar a las personas. Para poder abrir la fuente del lenguaje y comprender cómo se hacen algunas cosas complejas (cómo se escanea, analiza, interpreta y compila)

Open Source Basic se interpreta primero en un lenguaje basado en pila. Ese lenguaje basado en la pila se interpreta y ejecuta inmediatamente o se convierte en un ejecutable CLR.

Todas mis preguntas se reducen a esto:

  • ¿Cuáles son las características / construcciones básicas de un lenguaje basado en Basic? Ya tengo estas construcciones básicas: Asignaciones, Expresiones, Variables, algunas funciones (Aleatorio, ToUpper, ToLower), Bucle (para y hacer mientras / hasta), If (bloque y una sola línea) Otras decisiones, entrada basada en la consola (Entrada ) y salida (Imprimir), y subrutinas (sin parámetros, todavía).
  • Cuando termine de agregar las construcciones básicas a mi idioma, ¿cómo debo ramificarme? ¿En qué dominio (s)? En otras palabras, ¿qué dirección (s) debe tomar mi lenguaje básico de código abierto una vez que tenga todas las construcciones genéricas funcionando?

Gracias por tu tiempo,

Dominick

Dominick
fuente
3
Siempre quise un idioma que tuviera una funcionalidad AOP incorporada y compatible con la sintaxis.
FrustratedWithFormsDesigner
@Dominick: ¿Qué tal la funcionalidad LINQ?
Depredador
@Frustrated ... AOP - ¿Funcionalidad de programación orientada a aspectos? ¿Podrías dar un ejemplo?
Dominick
55
No debe comenzar a inventar un lenguaje específico de dominio a partir de características básicas imperativas. Formalice su dominio primero, convierta este conocimiento en un idioma y solo luego agregue funciones básicas, si es necesario. Probablemente incluso terminaría con un DSL perfecto que no es completo para Turing, y es una de las mejores propiedades de los DSL.
SK-logic
1
¿Seguramente "goto" es una característica obligatoria de cualquier BASIC?
Perry

Respuestas:

1

Mi experiencia con BASIC temprano en el Commodore [Vic-20, C-64] me dio la impresión de que los números de línea eran una "característica" central de BASIC. Parece que ya no se usan en implementaciones modernas, lo que para mí es algo perjudicial ya que mi visión principal de BASIC es como un lenguaje de aprendizaje desde el cual saltar a otra cosa.

MarkHu
fuente
1

Definitivamente un esfuerzo noble, pero creo que tienes tus prioridades invertidas.

Su primera preocupación debería ser los problemas de "dominio" a los que se dirige su idioma. Es por eso que se llama un "lenguaje específico de dominio" en primer lugar. Un DSL es tolerable solo cuando es pequeño, simple y muy enfocado para resolver un conjunto particular de problemas, como un cuchillo a través de la mantequilla.

Una vez que haya identificado el dominio y cómo funcionará su idioma en el dominio, puede establecer construcciones o características específicas.

Finalmente, puede ser útil considerar si desea un DSL interno o externo .

Angelo
fuente
0

He estado desarrollando un lenguaje de secuencias de comandos para una aplicación CAE / FEA y algunas características que he encontrado útiles para los usuarios finales son: Variables locales y globales Matrices con asignación dinámica y expansión Funciones con argumentos y por referencia que pasan Estructuras (tipos definidos por el usuario) Junto con Para empezar, las características que mencionaste deberían ser un lenguaje bastante poderoso. Luego, se desarrollará de acuerdo con la solicitud del usuario.

Gus
fuente
Es un lenguaje interesante y muy específico del dominio (Ingeniería asistida por computadora / Análisis de elementos finitos). Puedo ver por qué deberías necesitar matrices. Todas sus sugerencias son bastante buenas y las tendré en cuenta. Gracias.
Dominick
0

Hay varias características que se pueden agregar o ampliar si ya existe, pero ...

... Los lenguajes de programación básicos, son muy similares a los lenguajes de script, y una característica que muchos perdieron o incluyeron más tarde, fue el espacio de nombres o los módulos.

C, C ++, PHP, Visual Basic, comenzaron sin módulos / espacios de nombres, y se agregaron más tarde.

Las siguientes podrían ser subrutinas (procedimientos o funciones que no devuelven un valor) y funciones (subrutinas que devuelven un valor especial).

umlcat
fuente
0

Comprender cómo se hacen algunas cosas complejas (cómo escanear, analizar, interpretar y compilar)

Hay una buena pregunta en el sitio Stack Overflow sobre recursos para comprender los compiladores. También puedes echar un vistazo a la página de mi clase de compiladores .

Cuando termine de agregar las construcciones básicas a mi idioma, ¿cómo debo ramificarme?

Dadas las características que ya ha creado, sugiero agregar tres tipos de datos: int, string, boolean. Tendrá que hacer tres cosas, cada una un poco más difícil que la anterior:

  1. Modifique la gramática para que pueda analizar esas palabras clave. Prueba.
  2. Cree (o agregue a su tabla de símbolos existente) para que pueda incluir el tipo de datos junto con el nombre de la variable y otras propiedades. Luego realice un cambio de depuración para que pueda probar esto y ver la tabla de símbolos.
  3. Verifique los tipos compatibles antes de la generación de código para MsIL o durante la interpretación. Pruebe los casos de error y sin error en cada modo de ejecución para todos los tipos.

Si eso va bien, entonces sugiero trabajar en el alcance (local en subrutinas versus global). Avíseme si desea algún consejo al respecto.

Buena suerte. ¡Y disfrutar!

Alan
fuente