Pergunta

Eu estive olhando em como linguagens de programação de trabalho, e alguns deles têm um chamado máquinas virtuais. Eu entendo que isso é algum tipo de emulação da linguagem de programação dentro de outra linguagem de programação, e que funciona como como uma linguagem compilada seria executado, com uma pilha. Será que eu obter esse direito?

Com a condição de que eu fiz, o que me bamboozles é que muitas línguas não-compilados permitem variáveis ??com sistemas de tipo "liberais". Em Python, por exemplo, eu posso escrever isto:

x = "Hello world!"
x = 2**1000

Cordas e grandes inteiros são completamente independentes e ocupam diferentes quantidades de espaço na memória, assim como pode este código ainda ser representado em um ambiente baseado em pilha? O que exatamente acontece aqui? É x apontou para um novo lugar na pilha e os dados antigos de corda deixou unreferenced? Será que essas línguas não usar uma pilha? Se não, como é que eles representam variáveis ??internamente?

Foi útil?

Solução

Provavelmente, sua pergunta deve ser intitulado como "Como linguagens dinâmicas trabalho ?."

que é simples, eles armazenam as informações de tipo variável junto com ele na memória. E isso não é feito apenas em linguagens interpretadas ou JIT compilados mas também linguagens como Objective-C nativamente-compilados.

Outras dicas

Na maioria das linguagens de VM, as variáveis ??podem ser conceituada como ponteiros (ou referências) para a memória na pilha, mesmo se a variável em si é na pilha. Para idiomas que têm tipos primitivos (int e bool em Java, por exemplo) aqueles pode ser armazenado na pilha também, mas eles não podem ser atribuídos novos tipos dinamicamente.

Ignorando tipos primitivos, todas as variáveis ??que existem na pilha têm seus valores reais armazenados no heap. Assim, se você reatribuir dinamicamente um valor para eles, o valor original é abandonada (e a memória limpa através de algum algoritmo de coleta de lixo), eo novo valor é alocado em um novo bit de memória.

A VM não tem nada a ver com a língua. Qualquer idioma pode ser executado em cima de uma VM (Java VM tem centenas de línguas já).

A VM permite que um tipo diferente de "linguagem assembly" para ser executado, que é mais apto a adaptar um compilador. Tudo feito em uma máquina virtual poderia ser feito em uma CPU, então pense da VM como uma CPU. (Alguns realmente são implementadas em hardware).

É extremamente baixo nível, e em muitos casos fortemente pilha de base -. Em vez de registros, matemática em nível de máquina é tudo relativo às posições em relação ao ponteiro de pilha atual

Com linguagens compiladas normais, são necessárias muitas instruções para uma única etapa. a + pode parecer "Pegue o item a partir de um ponto em relação ao ponteiro de pilha em reg um, pegar outro para reg b. adicionar reg a e b. colocar reg um em um lugar em relação ao ponteiro de pilha.

O VM faz tudo isso com uma única instrução, curto, possivelmente, um ou dois bytes, em vez de 4 ou 8 bytes por instrução em linguagem de máquina (dependendo de 32 ou 64 arquitetura bits), que (supondo) deve significar cerca de 16 ou 32 bytes de 1-2 x 86 de bytes de código máquina. (Eu posso estar errado, meu último codificação x86 foi na era 80286).

Microsoft usado (provavelmente ainda usa) VMs em seus produtos de escritório para reduzir a quantidade de código.

O procedimento para criar o código VM é o mesmo que criar a linguagem de máquina, apenas um tipo de processador diferente, essencialmente.

VMs também podem implementar seus próprios mecanismos de segurança, recuperação de erros e de memória que são muito bem relacionados com a língua.

Alguns dos minha descrição aqui é resumo e da memória. Se você quiser explorar a definição bytecode mesmo, que é meio divertido:

http://java.sun.com /docs/books/jvms/second_edition/html/Instructions2.doc.html

A chave para muitos dos 'como VMs variáveis ??punho como isto ou aquilo' realmente se resume a metadados ... A meta informação armazenada e depois atualizadas dá a VM um melhor controle tanto sobre como alocar e, em seguida, fazer o coisa certa com variáveis.

Em muitos casos, este é o tipo de sobrecarga que pode realmente ficar no caminho de performance. No entanto, as implementações modernas, etc têm percorreu um longo caminho em fazer a coisa certa.

Quanto a suas perguntas específicas - variáveis ??que tratam como objetos de baunilha / etc ... se resume a reatribuição / reavaliando meta informação sobre novas atribuições - é por isso que x pode olhar para um lado e depois o próximo.

Para atender uma parte das suas perguntas, eu recomendo um google tecnologia conversa sobre python , onde algumas de suas perguntas sobre linguagens dinâmicas são respondidas; por exemplo, que é uma variável (não é um ponteiro, nem uma referência, mas em caso de python uma etiqueta).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top