Içando em Javascript === Compilando?

9

Me deparei com uma perspectiva interessante em uma recente entrevista de emprego.

A elevação em Javascript consiste em mover as declarações de variável e de função na parte superior do script. Podemos chamar essa fase de compilação ?

Estou ciente do fato de que o interpretador Javascript tem 2 passagens sobre o script de entrada, onde na primeira passagem ele é içado e na segunda passagem ele realmente executa o script. Tendo sabido que o Javascript é uma linguagem interpretada, essa pergunta me deixou um pouco confusa.

Rahul Desai
fonte

Respostas:

18

Não. A elevação não é compilação.

O içamento é um conceito criado pelos desenvolvedores para explicar o que acontece durante a compilação quando variáveis ​​e declarações de funções são movidas para o topo do escopo que os contém.

Compilação é o que acontece quando o seu código Javascript é transformado em outra representação (geralmente algum tipo de código executável), a ser executado agora ou mais tarde. O mecanismo Javascript V8 do Chrome, na verdade, possui dois compiladores; um para criar código executável rápido e sujo agora, outro para criar código otimizado posteriormente.

Linguagens de programação não são definidas como linguagens "compiladas" ou "interpretadas". Em vez disso, os idiomas são interpretados ou compilados conforme necessário.

Leitura adicional Como
içar em Javascript
Como o mecanismo V8 funciona

Robert Harvey
fonte
11
O artigo do wikipedia em linguagens interpretadas também é útil na "interpretado" versus "compilado" distinção: en.wikipedia.org/wiki/Interpreted_language
Se estou entendendo isso corretamente, o Hoisting não converte o script em código legível por máquina, portanto não é compilação . Estou certo? :)
Rahul Desai
Leia o segundo parágrafo da minha resposta novamente.
Robert Harvey
11
Em minha recente conversa com esse entrevistador sobre esse tópico, ele me deu a referência ao curso Advanced JS no FrontendMasters.com, onde Kyle Simpson explica que é compilação, no sentido de que se compararmos isso com o script Bash, por exemplo, não saberia o que esperar na linha 4 enquanto estiver na linha 3. No entanto, no caso do compilador JS, ele viu o que está na linha 4 anteriormente durante o passe de elevação. É só que ele não é convertido em código binário, diferente de outros idiomas. Javascript é compilado toda vez que é executado.
Rahul Desai