Estou escrevendo minha primeira linguagem de programação orientada a objetos e até agora muito boa em criar uma única 'classe'. Mas, digamos que eu queira ter aulas, digamos ClassA
e ClassB
. Desde que esses dois não tenham nada a ver um com o outro, tudo ficará bem. No entanto, digamos que ClassA
crie um ClassB
- isto coloca duas questões relacionadas:
-Como o compilador saberia ao compilar ClassA
que ClassB
existe e, se existir, como saberá suas propriedades?
Até agora, meus pensamentos foram: em vez de compilar cada classe de cada vez (ou seja, digitalizar, analisar e gerar código) cada arquivo "(não realmente arquivo, por si só, mas uma" classe "), preciso digitalizar + analisar cada primeiro , em seguida, gerar código para todos?
fonte
Os idiomas mais antigos às vezes são mais rigorosos; considere o que é possível em Java:
Eu já vi o antipadrão acima, e é realmente feio (eu o teria proibido). Ambas as unidades de compilação se usam. Mas o Ifc pode ser compilado para codificar sem ter um implemento compilado. O código compilado, .class, comparável a um C .obj, contém "informações de ligação:" uma importação do Implem, chamando um construtor sem parâmetros
Implem()
. A classe Implem pode então ser compilada sem problemas. Em parte, o ClassLoader - executando os dados da classe JVM de inicialização / construção e, em parte, a própria Java Virtual Machine, desempenham um pouco como vinculador , integrando todos.Por exemplo, compilar com uma versão de uma biblioteca específica e executar com outra versão dessa biblioteca reconhecerá erros de tempo de execução.
Portanto, a resposta: A compilação fornece unidades de código de objeto compilado, que é necessário ver como código + dados + API para vinculação.
Posteriormente, o compilador também deve fazer uma compactação e verificar a API de ligação; uma segunda fase.
Isso pode irritar e parecer deselegante, mas as provas matemáticas podem operar da mesma maneira: ao provar toda a exatidão, já é possível considerar uma parte como verdadeira até a verificação.
fonte