Artigo original: https://www.freecodecamp.org/news/whats-the-difference-between-javascript-and-ecmascript-cba48c73a2b5/

Escrito por: Michael Aranda

Tentei colocar no Google "a diferença entre JavaScript e ECMAScript".

No fim, acabei passando por uma infinidade de resultados ambíguos e aparentemente conflitantes:

"ECMAScript é um padrão".

"JavaScript é um padrão".

"ECMAScript é uma especificação".

"JavaScript é uma implementação do padrão do ECMAScript".

"ECMAScript é o JavaScript padronizado".

"ECMAScript é uma linguagem".

"JavaScript é um dialeto do ECMAScript".

“ECMAScript é JavaScript.”

Segurando a vontade de chorar, respirei fundo e decidi me dedicar a uma pesquisa difícil, mas bastante produtiva.

Este artigo representa meu entendimento atual das diferenças entre JavaScript e ECMAScript. Ele é voltado a pessoas com uma familiaridade com o JavaScript, mas que gostariam de ter um entendimento claro de sua relação com o ECMAScript, navegadores da web, Babel e mais. Você também aprenderá sobre linguagens de criação de scripts, engines do JavaScript e tempos de execução do JavaScript (em inglês, runtimes) para poder avaliar.

Vamos começar.

Glossário de JavaScript/ECMAScript

Abaixo está uma lista de definições, projetadas com foco na consistência e clareza. As definições não estão 100% completas. Elas foram criadas de modo a fornecerem uma compreensão de alto nível da conexão e da relação entre JavaScript e ECMAScript.

Vamos, então, ao que interessa.

Ecma International

Uma organização que cria padrões para tecnologias.

9hTL9XKeWeDKV7iP1ozAHfRAZ6sKpKOYFOIZ

Para ilustrar um exemplo de "padrão" (embora não tenha sido criado pela Ecma), pense em todos os teclados que você já usou. A grande maioria tinha letras na mesma ordem, uma barra de espaço, uma tecla Enter, teclas de setas e números exibidos em uma linha na parte superior, certo? Isso ocorre porque a maioria dos fabricantes de teclado baseia seu design de teclado no padrão de layout QWERTY.

ECMA-262

Esse é um padrão publicado pela Ecma International. Ele contém a especificação para uma linguagem de criação de scripts de finalidade genérica.

1EV9EoLmaB-icJYqpu7rYSxeyJAvA-drQQl5

ECMA-262 é um padrão como o QWERTY, mas, em vez de representar uma especificação de layout de teclado, ele representa uma especificação de linguagem de script chamada ECMAScript.

Pense no ECMA-262 como se fosse um número de referência do ECMAScript.

BLfQVsprp9JKHuRPcS0kLp8LFWHTFUfTk9-f
ECMA-260, ECMA-261, ECMA-262. Aí está o ECMAScript.

Linguagem de criação de scripts

Uma linguagem de programação projetada especificamente para atuar em uma entidade ou sistema existente

Para ter uma ideia geral do que torna uma linguagem de programação uma linguagem de criação de scripts, considere os comandos "caminhar", "correr" e "pular". Essas ações exigem algo para realizá-las – talvez uma pessoa, um cachorro ou um personagem de videogame. Sem um ator para executar esses comandos, "andar", "correr" e "pular" não fariam sentido. Esse conjunto de ações é análogo a uma linguagem de criação de scripts, que se concentra na manipulação de uma entidade externa.

ECMAScript

A especificação definida no ECMA-262 para a criação de uma linguagem de criação de scripts de finalidade geral.

Sinônimo: especificação ECMAScript

p-RbJhYkrEKUnojlVs7RoXoVE7Qxz1QXozVQ
Crédito da foto: code.tutsplus.com

Embora ECMA-262 seja o nome do padrão, ele também representa a especificação da linguagem de criação de scripts ECMAScript.

O ECMAScript fornece as regras, detalhes e diretrizes que uma linguagem de criação de scripts deve observar para ser considerada em conformidade com o ECMAScript.

6ZDYS8oka3qX9aep2SaxSaLfFXwIFG-8ljW5
Excerto da especificação da linguagem ECMAScript de 2017 – um documento de apenas 900 páginas, caso você esteja buscando uma leitura leve.

JavaScript

Uma linguagem de criação de scripts de finalidade geral em conformidade com a especificação ECMAScript.

dbnmtPdU02XbZ41M74SLaIPbLUeG3zMJa5UV
Crédito da foto: Udemy

O JavaScript é a linguagem com sabor de café na qual eu amo programar. O ECMAScript é a especificação em que ela se baseia. Ao ler a especificação do ECMAScript (texto em inglês), você aprenderá como criar uma linguagem de criação de scripts. Ao ler a documentação do JavaScript, você aprenderá como usar uma linguagem de criação de scripts.

Quando as pessoas chamam o JavaScript de um "dialeto da linguagem ECMAScript", isso quer dizer o mesmo que ao falar dialetos do inglês, francês ou do chinês. Um dialeto retira a maior parte do seu léxico e de sua sintaxe de sua linguagem de origem, desviando-se apenas o suficiente para merecer uma distinção.

O JavaScript em grande parte implementa a especificação do ECMAScript conforme descrito no padrão ECMA-262, mas existem algumas diferenças.

wZx36dAL-wYWFA8weITyQfErv8YzkjQDNuVl
Imagem de 3 de setembro de 2017. Uma lista de recursos experimentais do JavaScript que, na época, não faziam parte do ECMAScript.

Uma engine do JavaScript

Um programa ou interpretador que entende e executa o código do JavaScript.

Sinônimos: interpretador do JavaScript, implementação do JavaScript

suYku9Y4XZ-DMt1b9eGxv39vil2OA3wmAlHg
Crédito da foto: translatemedia.com

As engines do JavaScript são comumente encontradas em navegadores da web, incluindo a V8 no Chrome, a SpiderMonkey no Firefox e a Chakra no Edge. Cada mecanismo é como um módulo de linguagem para sua aplicação, permitindo que ela suporte um determinado subconjunto da linguagem JavaScript.

Uma engine do JavaScript para um navegador é como a compreensão de linguagem para uma pessoa. Se revisitarmos nosso exemplo das ações "caminhar", "correr", "pular", uma engine do JavaScript é a parte de uma "entidade" que realmente entende o que essas ações significam.

Essa analogia ajuda a explicar algumas coisas sobre os navegadores:

bOGBPwrH1u-nqxgkgh37q61h9rj8vduA0tUZ
Crédito da foto: datavizcatalogue.com

Diferenças no desempenho dos navegadores

Duas pessoas podem reconhecer o comando "saltar", mas uma pode reagir ao comando mais rápido porque a pessoa pode entender e processar o comando mais rápido do que outra pessoa. Do mesmo modo, dois navegadores podem entender o código JavaScript, mas um o executa mais rápido porque seu mecanismo JavaScript é implementado de maneira mais eficiente.

a2oywyaVJoD4vLyas60zOd8CYnwKyqlnltqS
Crédito da foto: vcsolutions.com

Diferenças no suporte dos navegadores

Considere as diferenças que existem entre pessoas que falam o mesmo idioma. Mesmo que muitas pessoas falem português, algumas podem conhecer algumas palavras, expressões e regras de sintaxe que outras não conhecem e vice-versa. Os navegadores são assim. Mesmo que as engines do JavaScript dos navegadores entendam JavaScript, alguns navegadores têm uma compreensão maior da linguagem do que outros. Há diferenças no modo como os navegadores dão suporte à linguagem.

Com relação ao suporte ao navegador, as pessoas geralmente falam sobre "compatibilidade do ECMAScript" em vez de "compatibilidade do JavaScript", mesmo que as engines do JavaScript analisem e executem... bem, JavaScript. Isso pode ser um pouco confuso, mas há uma explicação.

YbOZFdJwH-qPCcnnDyKD6mzlQdEw0NcN8EsB
Esta tabela é parte de uma tabela de suporte de navegadores na página do ECMAScript da Wikipédia em inglês. As versões do JavaScript não são mencionadas aqui.

Se você se lembrar, o ECMAScript é uma especificação de como uma linguagem de criação de scripts pode parecer. Lançar uma nova edição do ECMAScript não significa que todas as engines do JavaScript existentes, de repente, tenham esses novos recursos. Cabe aos grupos ou organizações responsáveis pelas engines do JavaScript estarem atualizados sobre a especificação do ECMAScript mais recente e adotar suas alterações.

Portanto, os desenvolvedores tendem a fazer perguntas como: "Qual versão do ECMAScript esse navegador suporta?" ou "Quais recursos do ECMAScript esse navegador suporta?" Eles querem saber se Google, Mozilla e Microsoft conseguiram atualizar as engines do JavaScript de seus navegadores — por exemplo, a V8, a SpiderMonkey e a Chakra, respectivamente — com os recursos descritos no ECMAScript mais recente.

A tabela de compatibilidade do ECMAScript é um bom recurso para responder a essas perguntas.

Se uma nova edição do ECMAScript for lançada, as engines do JavaScript não integrarão toda a atualização de uma só vez. Elas incorporam os novos recursos do ECMAScript de modo incremental, como visto neste trecho do changelog de JavaScript do Firefox:

C9trDMdtG4QldUnxltoT9-whAG4gMXkhpkzq
No Firefox 50, partes do ES2015 e do ES2017 foram implementados na engine de JavaScript do Firefox, a SpiderMonkey. Outras partes do ES2015 e do ES2017 foram implementadas anters e continuarão a ser implementadas com o passar do tempo.

Um tempo de execução do JavaScript

O ambiente no qual o código JavaScript é executado e interpretado por uma engine do JavaScript. O tempo de execução fornece os objetos de host nos quais o JavaScript pode operar e trabalhar.

Sinônimos: ambiente de host

5l8SuhHU3K19bMXLUeDUliu8HKvEupgZtNOM
Crédito da foto: emuparadise

O tempo de execução do JavaScript é a "entidade ou sistema existente" mencionado na definição da linguagem de criação de scripts. O código passa pela engine do JavaScript e, uma vez analisado e compreendido, uma entidade ou sistema executa as ações interpretadas. Um cachorro anda, uma pessoa corre, um personagem de videogame pula (ou, no caso da imagem acima, destroça).

As aplicações se tornam disponíveis para scripts do JavaScript fornecendo "objetos de host" em tempo de execução. Para o lado do client, o tempo de execução do JavaScript seria o navegador da web, onde objetos de host, como janelas e documentos HTML, são disponibilizados para manipulação.

Você já trabalhou com objetos de host de janela ou documento? Os objetos window e document não fazem parte da linguagem JavaScript principal. São APIs da web, objetos fornecidos por um navegador que atua como ambiente de host do JavaScript. Para o lado do servidor, o tempo de execução do JavaScript é o Node.js. Os objetos de host relacionados ao servidor, como o sistema de arquivos, os processos e as solicitações, são fornecidos pelo Node.js.

Um ponto interessante: diferentes tempos de execução do JavaScript podem compartilhar a mesma engine do JavaScript. O V8, por exemplo, é a engine do JavaScript usada tanto no Google Chrome quanto no Node.js — dois ambientes muito diferentes.

ECMAScript 6

É a sexta edição do padrão ECMA-262, com alterações significativas e melhorias à especificação do ECMAScript.

Sinônimos: ES6, ES2015 e ECMAScript 2015

wtwD646nQf8w2gV0QDDxpf5zDHOL43j6xWT-

Essa edição do ECMAScript mudou seu nome de ES6 para ES2015 porque, em 2015, a Ecma International decidiu mudar para lançamentos anuais do ECMAScript. Assim, a Ecma International também começou a nomear novas edições da especificação do ECMAScript com base no ano em que são lançadas. Em resumo, ES6 e ES2015 são dois nomes diferentes para a mesma coisa.

Babel

Um transpiler que pode converter o código em ES6 para o código em ES5.

fzmf2hHXlv5dgoQ178bSp-oGPkSISGwiAKLa
Crédito da foto: HTML5Hive.org (site inexistente no momento)

Os desenvolvedores podem usar os novíssimos recursos que vêm com o ES6, mas podem estar preocupados com a compatibilidade entre navegadores para suas aplicações da web. No momento em que este artigo foi escrito, o Edge e o Internet Explorer ainda não dão suporte completo aos recursos da especificação do ES6.

Os desenvolvedores preocupados podem usar o Babel para converter seu código em ES6 para uma versão funcionalmente equivalente que usa apenas recursos do ES5. Todos os principais navegadores suportam totalmente o ES5, para poderem executar o código sem problemas.

Mais uma dica interessante

Espero que você tenha achado essas informações sobre JavaScript e ECMAScript úteis. Antes de encerrarmos, gostaria de compartilhar mais uma informação que precisa ser esclarecida para desenvolvedores para a web iniciantes como eu.

A galinha ou o ovo

Uma parte confusa da história é que o JavaScript foi criado em 1996. Foi então submetido à Ecma International em 1997 para padronização, o que resultou no ECMAScript. Ao mesmo tempo, como o JavaScript está em conformidade com a especificação do ECMAScript, o JavaScript é um exemplo de uma implementação do ECMAScript.

Isso nos deixa com este fato divertido: o ECMAScript é baseado em JavaScript, e o JavaScript é baseado em ECMAScript.

Eu sei. Parece exatamente com o paradoxo da viagem no tempo em que as pessoas são seus próprios pais – um pouco estranho, mas meio divertido de se pensar.

Tudo de bom

Sei que todos nós nos divertimos aqui, mas foi muita informação para digerir. Vou aproveitar para me despedir. Agradeço a você pela leitura!