Essa pergunta é inspirada no debate nos comentários desta questão do Stack Overflow . A documentação do Google Closure Compiler declara o seguinte (ênfase adicionada):
O Closure Compiler é uma ferramenta para tornar o download e a execução do JavaScript mais rápidos. É um verdadeiro compilador para JavaScript. Em vez de compilar de um idioma de origem para o código da máquina, ele compila do JavaScript para melhorar o JavaScript.
No entanto, a Wikipedia fornece a seguinte definição de "compilador":
Um compilador é um programa de computador (ou conjunto de programas) que transforma o código-fonte escrito em uma linguagem de programação (o idioma de origem) em outro idioma de computador ... Um reescritor de idiomas geralmente é um programa que traduz a forma de expressões sem alterar a língua.
Com base nisso, eu diria que o Google Closure não é um compilador. Mas o fato de o Google declarar explicitamente que é de fato um "verdadeiro compilador" me faz pensar se há mais. O Google Closure é realmente um compilador JavaScript?
fonte
Respostas:
O Closure Compiler é um minificador , um otimizador e um validador all-in-one. Isso o coloca em sua própria categoria, porque você está certo de que um compilador deve pegar pelo menos algo que não será executado em sua forma atual e transformá-lo em algo que será ( use TypeScript para um exemplo baseado em ECMAScript).
Mas você culpa o Google por esticar a terminologia? Como mais eles chamariam isso? Google Minifier? Não, é mais do que isso, e existem centenas deles por aí. Google Optimizer? É muito mais que isso. Google Validator? Não, é muito mais do que isso também.
Então a escolha é
Ele faz tudo o que você esperaria que um compilador fizesse, apenas com uma diferença semântica. E, no final, todas as palavras são definidas pelo seu uso, até certo ponto. Portanto, se o Google pode convencer as pessoas a chamar isso de compilador, a definição de compilador muda um pouco. Certamente não de qualquer maneira que possa causar um problema.
Ou, voltando ao exemplo anterior, você pode encontrar algo significativo sobre o TypeScript que permita que ele seja chamado de "verdadeiro compilador", enquanto o Google Closure Compiler deve ser restrito a "quase um compilador"?
fonte
Minoptival
. Parece um dinossauro. Todo mundo gosta de dinossauros, certo?Bem, sim ... mas isso pressupõe que a Wikipedia seja autorizada neste ponto.
E, como contrário à definição da Wikipedia, considere algumas definições de dicionário (em http://www.thefreedictionary.com/compiler ):
É verdade que essas definições são um pouco antiquadas, mas ilustra que não existe "um único significado verdadeiro" ... e, de fato, significados de termos como "compilador" mudam com o tempo. (E, na IMO, tudo bem, porque realmente não precisamos de uma definição precisa para este caso.)
Debater se o compilador Closure é um "compilador verdadeiro" ou não (IMO) não é uma atividade proveitosa. Seria mais útil entender o que o pessoal do Google quer dizer com "verdadeiro compilador" ... nesse contexto.
fonte
Eu acho que a razão pela qual ele pode ser chamado de "um compilador real" é porque ele cria um AST completo (árvore semântica abstrata) dos seus programas e o usa para gerar um novo texto.
O fato de os textos original e resultante serem válidos JavaScript é mera coincidência.
Isso é importante porque existem muitas ferramentas que apenas manipulam o texto do código (minifiers, prettifiers, etc), mas não fazem o manuseio do AST, muito menos a recriação do código. Mesmo que essas ferramentas sejam cada vez mais poderosas, elas não são o mesmo tipo de software e as limitações são diferentes.
fonte
É semântica na minha opinião. No sentido tradicional, não é um compilador. No entanto, no mesmo link da Wikipedia, ele diz
O fechamento realiza algumas ou todas essas operações.
Um pouco mais abaixo no artigo da Wikipedia
Dito isto, meu palpite é que era mais fácil chamá-lo de " Closure Compiler " em vez de "Closure Optimizer", porque na verdade ele está apenas otimizando o JavaScript para navegadores, não sendo necessário traduzi-lo para outro idioma ou código de código.
O Closure Compiler como um substantivo é um non-sequitur .
fonte
Primeiro, vamos tirar isso do caminho do compilador de origem para origem. Você não pode dizer que algo não é um compilador porque o resultado final não é um código de nível inferior.
Embora seja correto que o Closure Compiler gere AST e tenha frase de geração de código, muitos minimizadores de Javascript já fazem isso e eu provavelmente não os chamaria de compiladores.
O que realmente diferencia o Closure Compiler é a aplicação de muitas técnicas bem conhecidas de compilador na detecção e otimização de erros. aqui estão alguns exemplos:
Digite sistema:
O compilador de fechamento define um sistema de tipo anotado. Ele utiliza técnicas de inferência de tipo que muitos compiladores usam para verificar se há erros no seu programa.
Otimizações interprocedurais
O Closure Compiler cria gráficos de chamada para renomear e remover o código morto em todo o nível do programa.
Otimizações intraprocedimento
O Closure Compiler otimiza o Javascript aplicando diferentes análises de controle de fluxo e análises de fluxo de dados. Técnicas clássicas de compilador, como: Inlining, Register Allocation, Live Variable Analysis ... e muitas outras são utilizadas para extrair o último byte do Javascript de saída.
Sistema de módulos
Uma parte menos conhecida do Closure Compiler que pode ser usada para dividir seu código em download separado para um tempo de inicialização mais rápido. Também utiliza muitos algoritmos gráficos. Algo também é muito comum em compiladores "tradicionais".
Todas essas técnicas de compilação e análise estática são o que diferencia o Closure Compiler de outro minimizador de Javascript. Tirando o fato de que o idioma de entrada e saída direcionado é o mesmo, não vejo por que não é classificado como um "verdadeiro compilador".
fonte