Estou projetando uma linguagem de programação OO simples.
É estaticamente digitado, compilado e executado por uma VM - semelhante ao Java.
A diferença é que eu não quero ter uma ênfase tão forte no POO. O código em si se assemelhará principalmente ao C ++ (classes, funções e variáveis permitidas no escopo do arquivo).
Uma das coisas que eu preciso ter é um sistema de módulos. Eu tenho o seguinte descoberto:
- Todo arquivo é um módulo (uma vez compilado) - como Python
- Os programadores devem importar um módulo com a
import
palavra - chave, o que faz com que o compilador procure por módulos nos diretórios padrão e no diretório de arquivos (a VM também precisa fazer isso em tempo de execução)
E agora não tenho idéia de como devo introduzir o conceito de submódulos e hierarquia de módulos.
Uma opção, por exemplo, é depender da hierarquia de diretórios, de modo que import engine.graphics.renderer
seria de esperar encontrar um diretório chamado "engine" no diretório de trabalho e dentro de um diretório chamado "graphics", com um módulo chamado "renderer".
Quais são as desvantagens desse projeto? Estou faltando alguma coisa?
foo.bar
Nesse caso, existe uma ambiguidade entre ser foo / bar.file ou algum módulofoo
com o membro (também um módulo)bar
. Tudo a considerar@annotations
para incorporar essas informações.Respostas:
Veja a hierarquia / organização de pacotes / módulos do Python e, principalmente no aspecto histórico, as principais adições ao longo dos anos, principalmente as mais recentes. Provavelmente, não faz sentido inventar a roda.
Não sei até onde você quer ir com o seu idioma, por exemplo
Eu acho que Java pode ser outro exemplo interessante. Também é possível aprender coisas da maneira de Erlang (por exemplo, /programming/2968914/code-hot-swapping-in-erlang ).
Existem muitos problemas de design (alguns mencionados acima) se você planeja ver sua linguagem de programação mainstream um dia. Felizmente, existem ótimos exemplos por aí.
Algumas instruções de design do módulo de linguagem de programação / pacote / biblioteca devem abordar:
fonte
Primeiro, vamos supor que você mapeie seu modelo de namespace para outro namespace, como o sistema de arquivos, conforme sugerido. Segundo, estou assumindo que os módulos podem importar outros módulos. Em outras palavras,
engine.graphics.renderer
poderia muito bem conter uma linha comoimport circle.arc
. Isso levanta duas questões:Onde a VM procuraria
circle.arc
? De acordo com o mappimg do sistema de arquivos mencionado, deve haver um diretório como/etc/mylang/modules/circle/arc
(/etc/mylang/modules
sendo a raiz da estrutura do seu módulo) .Como uma aplicação faria referência
circle.arc
: porimport
ingcircle.arc
ouengine.graphics.render.circle.arc
? O primeiro "estragaria" (se não arruinaria) a hierarquia, porquecircle.arc
é claramente um submódulo deengine.graphics.renderer
, e o segundo implicaria que deveria haver um/etc/mylang/modules/engine/graphics/renderer/circle/arc
no seu sistema de arquivos, colocando-ocircle.arc
em dois locais simultaneamente.Dito isto, e se você decidir seguir a abordagem de namespace, o mapeamento para o sistema de arquivos parece muito restritivo para mim. Eu acho que os módulos podem residir em todos os tipos de lugares (até arquivos zip, como já mencionado, até URLs). A VM começaria pesquisando uma entrada em algum tipo de índice (talvez um arquivo de configuração) que mapeie o espaço de nome para os locais reais do módulo.
fonte