Estoy diseñando un lenguaje de programación OO simple.
Está estáticamente escrito, compilado y ejecutado por una VM, similar a Java.
La diferencia es que no quiero tener un énfasis tan fuerte en OOP. El código en sí se parecerá principalmente a C ++ (clases, funciones y variables permitidas en el alcance del archivo).
Una de las cosas que necesito tener es un sistema de módulos. Tengo lo siguiente resuelto:
- Cada archivo es un módulo (una vez compilado), como Python
- Los programadores deben importar un módulo con la
import
palabra clave, lo que hace que el compilador busque módulos en directorios estándar y en el directorio de archivos (la VM también tiene que hacer esto en tiempo de ejecución)
Y ahora no tengo idea de cómo debo introducir el concepto de submódulos y jerarquía de módulos.
Una opción, por ejemplo, es depender de la jerarquía del directorio, por lo que import engine.graphics.renderer
esperaría encontrar un directorio llamado "motor" en el directorio de trabajo, y dentro de un directorio llamado "gráficos", con un módulo llamado "renderizador".
¿Cuáles son los inconvenientes de tal diseño? ¿Me estoy perdiendo algo?
foo.bar
ser foo / bar.file o algún módulofoo
con el miembro (también un módulo)bar
. Algo a tener en cuenta@annotations
para incrustar dicha información.Respuestas:
Eche un vistazo a la jerarquía / organización de paquetes / módulos de Python, y especialmente en el aspecto histórico, las principales incorporaciones a lo largo de los años, lo más importante, las últimas. Probablemente, no tiene sentido inventar la rueda.
No sé qué tan lejos quieres llegar con tu idioma, por ej.
Supongo que Java puede ser otro ejemplo interesante. Las cosas también se pueden aprender de la manera de Erlang (por ejemplo, /programming/2968914/code-hot-swapping-in-erlang ).
Hay una gran cantidad de problemas de diseño (algunos mencionados anteriormente) si planea ver su lenguaje de programación convencional algún día. Afortunadamente, hay excelentes ejemplos por ahí.
Algunas direcciones del lenguaje de programación módulo / paquete / diseño del sistema de biblioteca deben abordar:
fuente
En primer lugar, supongamos que asigna su modelo de espacio de nombres a otro espacio de nombres, como el sistema de archivos, como sugirió. En segundo lugar, supongo que los módulos pueden importar otros módulos. En otras palabras, bien
engine.graphics.renderer
podría contener una línea comoimport circle.arc
. Eso plantea dos cuestiones:¿Dónde buscaría la VM
circle.arc
? De acuerdo con el sistema de archivos mappimg mencionado, debería haber un directorio como/etc/mylang/modules/circle/arc
(que/etc/mylang/modules
es la raíz de la estructura de su módulo) .¿Cómo haría referencia una aplicación
circle.arc
:import
ingcircle.arc
oengine.graphics.render.circle.arc
? El primero "estropearía" (si no arruina) la jerarquía, porquecircle.arc
es claramente un submódulo deengine.graphics.renderer
, y el segundo implicaría que debería haber un/etc/mylang/modules/engine/graphics/renderer/circle/arc
en su sistema de archivos, colocándolocircle.arc
en dos ubicaciones simultáneamente.Habiendo dicho eso, y si decides seguir el enfoque del espacio de nombres, mapearlo al sistema de archivos me parece demasiado restrictivo. Creo que los módulos pueden residir en todo tipo de lugares (incluso archivos zip, como ya se mencionó, incluso URL). La VM comenzaría buscando una entrada en algún tipo de índice (tal vez un archivo de configuración) que mapearía el espacio de nombres a las ubicaciones reales del módulo.
fuente