O Google Closure é um verdadeiro compilador?


19

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?


2
Aposto que o JS gerado é um subconjunto adequado de todos os JS legais; nesse sentido, seu idioma de saída é "outro" idioma.
AakashM

Respostas:


23

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 é

  • Chame-o Google Closure Foogle e introduza uma nova palavra totalmente sem sentido no léxico.
  • Chame-o Minoptivalidator do Google Closure, que é mais claro na intenção, mas mais difícil de lembrar.
  • Chame-o Google Closure Compiler, que é bem próximo da verdade.

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"?


O objetivo da pergunta era apenas ver realmente o que as pessoas veem como um "compilador". Como afirmado por 0A0D, é apenas semântica, mas me perguntei por que o Google sentiu a necessidade de esclarecer que era um "verdadeiro compilador". +1 para "Minoptivalidator"!
James Allardice

@ JamesAllardice: Novamente, porque se você pode convencer as pessoas de que é um compilador, a definição de compilador se estende para incluí-lo. E é realmente justo que deva, neste caso. Se você definir uma nova palavra que a separa do compilador por uma linha somática, seu produto será classificado como "quase, mas não completamente".
Pd #

1
Eu não sei, eu meio que estou gostando do "Google Foogle" :-)
GrandmasterB

9
Eu voto a favor Minoptival. Parece um dinossauro. Todo mundo gosta de dinossauros, certo?
Izkata

2
@ Izkata: Se há uma coisa que a história da evolução nos ensinou, é que o Javascript não estará contido. O Javascript se liberta, se expande para novos territórios e atravessa barreiras dolorosamente, talvez até perigosamente.
Pd #

9

Com base nisso, eu diria que o Google Closure não é um compilador.

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 ):

2) (Ciência da computação) - Um programa que traduz outro programa escrito em um idioma de alto nível em linguagem de máquina para que possa ser executado.

2) (Eletrônica e ciência da computação / ciência da computação), um programa de computador pelo qual uma linguagem de programação de alto nível, como COBOL ou FORTRAN, é convertida em linguagem de máquina que pode ser usada por um computador.

Um programa de computador associado a certas linguagens de programação que converte as instruções escritas nessas linguagens em código de máquina que pode ser posteriormente executado diretamente por um computador.

É 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.


2
+1, ironicamente, JS é 'linguagem de máquina' para a web e 'linguagem de programação de alto nível'.
K.Steff

3
+1 e mais outro para 'assume que a Wikipedia é autoritária neste ponto'. Muitas pessoas aceitam cegamente o que quer que seja escrito lá.
Marjan Venema

6

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.


1
Obrigado, esta é uma resposta interessante. Acho que sua explicação pode oferecer uma melhor definição de "compilador" do que a Wikipedia e os vários dicionários citados por outros.
James Allardice

Bem, eu gosto desta resposta e votei nela em algum momento, mas gostaria de observar que é perfeitamente possível compilar (no sentido tradicional da linguagem de alto nível para a máquina) sem nunca criar um AST. Veja Vamos construir um compilador, por exemplo. Agora é certamente verdade que o compilador do tutorial de Crenshaw é bastante grosseiro, mas não acredito que alguém o tenha acusado de não ser um compilador.
precisa saber é

Não li essa referência, mas concordo que um AST explícito não é estritamente necessário para a compilação. Ainda assim, na maioria dos casos, existe uma estrutura equivalente, explícita nos dados ou implícita na execução (talvez a pilha de chamadas (ou sua evolução no tempo) reflita a análise de sintaxe). Meu ponto principal é que compilar não é manipulação de texto, mas gerar código a partir de uma análise de algum código-fonte.
Javier

4

É semântica na minha opinião. No sentido tradicional, não é um compilador. No entanto, no mesmo link da Wikipedia, ele diz

É provável que um compilador execute muitas ou todas as seguintes operações: análise lexical, pré-processamento, análise, análise semântica (tradução direcionada por sintaxe), geração de código e otimização de código.

O fechamento realiza algumas ou todas essas operações.

Um pouco mais abaixo no artigo da Wikipedia

No entanto, na prática, raramente existe algo sobre um idioma que exija que ele seja compilado ou interpretado exclusivamente, embora seja possível projetar idiomas que dependam de reinterpretação em tempo de execução.

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 .


É apenas semântica, você está certo. O objetivo da pergunta era realmente apenas ver como as pessoas veem um "compilador". Ainda não acho que o Closure Compiler seja um "verdadeiro compilador", mas executa muitas ações semelhantes.
James Allardice

3

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".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.