Escrevemos nossa linguagem de programação, parte 4: Representação de estruturas e classes, geração de alocadores

imagem

Bom dia para quem decidiu ler meu próximo artigo.

Antes de tudo, eu posto links para as partes anteriores:
Parte 1: escrevendo uma VM de idioma
Parte 2: apresentação intermediária de programas
Parte 3: Arquitetura do tradutor. Análise de estruturas de linguagem e expressões matemáticas

Também vale a pena postar links para o repositório e para um pequeno artigo de revisão no qual descrevi brevemente o trabalho realizado na íntegra.

Assim, no último artigo, descrevi a criação de um tradutor de uma linguagem de programação de nível mais ou menos alto para uma representação intermediária e uma montagem adicional do aplicativo.

Agora, somos confrontados com a tarefa de adicionar estruturas e classes à linguagem, para que ela tenha a funcionalidade dos análogos modernos. Este artigo não fornecerá o código descrito
funcionalidade desde é muito, é bastante chato e nem todos estarão interessados ​​em investigar. Apenas teoria. E algumas fotos.

Vamos começar a criar ...


Visualização de classe


Vale a pena começar com o fato de que qualquer estrutura pode ser representada como uma matriz. O índice de um elemento da matriz pode ser associado a uma variável de classe específica ou a seu método.

Considere um exemplo de código simples (naturalmente no Mash):
imagem

Aqui está um exemplo simples de uma classe que armazena cópias dos valores de a e b, que são passados ​​para ela no construtor. Ele também possui um destruidor e uma função summ que retornará a soma de a e b.
Mas na representação intermediária não há OOP, e mais ainda no nível da VM.
Se olharmos um pouco mais fundo para ver o que realmente é o MyClass, veremos a seguinte figura:
imagem

Ótimo. O tradutor, através de simples manipulações e feitiços, transforma nossa estrutura em uma matriz simples.

Digitação dinâmica para classes


Também vale a pena pensar na configuração rápida do tipo dinâmico para as aulas e no trabalho correspondente com elas, porque em idiomas com digitação dinâmica esse é um ponto muito importante.

A solução mais simples e eficaz é uma tabela virtual de componentes de classe. I.e. no tradutor, você pode implementar o processamento de todas as definições de classe e fazer uma lista de nomes e métodos de variáveis ​​de classe. Assim, desde nossas classes são representadas na forma de matrizes - cada nome da lista é comparável a um índice. Ao preencher a lista de nomes, você pode especificar o tamanho da matriz para cada classe, para uma alocação de memória mais econômica.

Alocadores de classe básica


Para poder usar uma classe com uma tabela de método virtual, além de simplesmente alocar memória, você precisa preencher esta tabela com ponteiros para os pontos de entrada dos métodos de classe.

Uma maneira simples e funcional é gerar um alocador para cada classe. Este é um método simples que aloca memória para uma matriz da estrutura da classe, a preenche parcialmente e retorna um ponteiro para a classe.

Alocadores são chamados quando uma instância da classe é criada, ou seja, no exemplo acima, a chamada será feita na 24ª linha - “new MyClass (10, 20)”. Após o alocador, você pode chamar o construtor da classe. No Mash, um construtor é chamado se houver colchetes (...) após o nome da classe na nova construção.

Introspecção


É possível que nem todos estejam familiarizados com essa definição, mas muitos já se depararam.
Introspecção - a definição do tipo de objeto com o qual o trabalho é realizado durante a execução do código. Um exemplo é typeof () no mesmo JavaScript.


Mash tem introspecção completa, ou seja, para tipos de dados simples e para classes.
Sem mais delongas, aqui estão alguns exemplos de código:
imagem

E para a turma:
imagem

A introspecção de classes é implementada adicionando um tipo ao campo de cada classe - um ponteiro para seu tipo.

Conclusão


Tentei explicar em linguagem simples como o trabalho com as aulas é organizado no meu tradutor Mash. Uma tecnologia semelhante também é inerente a muitos outros idiomas com digitação dinâmica.

Espero que você ache este artigo interessante. Obrigado por ler até o fim, se você o fez. No momento, esse talvez fosse meu último artigo sobre a criação da linguagem Mash (desde que eu não domine a compilação JIT). Meus artigos subsequentes considerarão outros aspectos do projeto ou se relacionarão a outros tópicos.

Source: https://habr.com/ru/post/pt436224/


All Articles