Alternativas ao JavaScript

144

No momento, o único idioma totalmente suportado e o padrão de fato para manipulação de árvore DOM no navegador é o JavaScript. Parece que ele tem problemas profundos de design que o tornam um campo minado de bugs e falhas de segurança para iniciantes.

Você conhece alguma iniciativa existente ou planejada para introduzir uma linguagem melhor (redesenhada) de qualquer tipo (não apenas javascript) para manipulação de árvore DOM e solicitações HTTP em navegadores da próxima geração? Se sim, qual é o roteiro para sua integração no Firefox, por exemplo, e se não, por quais razões (além da interoperabilidade) o JavaScript deve ser o único idioma suportado na plataforma do navegador?

Eu já usei o jQuery e também li "javascript: the good parts". De fato, as sugestões são boas, mas o que não consigo entender é: por que apenas javascript? No lado do servidor (sua plataforma OS favorita), podemos manipular uma árvore DOM com todos os idiomas, até o fortran. Por que o lado do cliente (a plataforma do navegador) suporta apenas javascript?

Stefano Borini
fonte
4
Google Dart, Script #, CoffeeScript, JSX (ambos implementação diferente de JS), JavaScript Harmony etc. Veja este link para mais github.com/jashkenas/coffee-script/wiki/...
Nawfal
25
Boa pergunta. A linguagem desenvolvida em 10 dias ainda está conosco em 2013. wtfjs.com
Den
2
"por que apenas javascript? No lado do servidor (sua plataforma OS favorita), podemos manipular uma árvore DOM com todos os idiomas, até fortran. Por que o lado do cliente (plataforma do navegador) suporta apenas javascript?" no lado do servidor, você pode instalar o que quiser, mas não posso forçar seus clientes a instalar plugins / addons adicionais, também se tivermos tantos bugs e problemas de segurança com javascript, adivinhe quantos bugs e problemas de segurança teríamos se nós adicionamos mais alguns?
Peter
6
@ Peter Não sei dizer se seu argumento é sério ou é uma piada. É trivialmente fácil para as pessoas instalarem plataformas, se quiserem. Se uma alternativa ao Javascript estivesse disponível e funcionasse bem, os fornecedores comerciais exigiriam que os usuários fizessem o download do necessário para executá-lo - como sempre fizeram com o Flash e por um tempo com o Silverlight. De todas as razões pelas quais talvez não surjam alternativas no lado do cliente, a dificuldade de garantir que seus usuários tenham sua plataforma não é significativa.
Ely
1
@ely: E acabou bem? Instantâneo? Applets Java? Luz cinza? Eu nem sequer tinha uma instância do Silverlight instalada.
Sebastian Mach

Respostas:

41

O problema com o javascript não é a linguagem em si - é uma linguagem dinâmica e com bom protótipo. Se você é oriundo de OO, existe uma curva de aprendizado, mas a culpa não é do idioma.

A maioria das pessoas assume que o Javascript é como Java porque tem sintaxe e nome semelhantes, mas na verdade é muito mais parecido com o lisp. Na verdade, é bastante adequado para manipulação de DOM.

O verdadeiro problema é que ele é compilado pelo navegador e isso significa que ele funciona de uma maneira muito diferente, dependendo do cliente.

Não apenas o DOM real é diferente dependendo do navegador, mas há uma enorme diferença no desempenho e no layout.


Editar os seguintes esclarecimentos em questão

Suponha que vários idiomas interpretados sejam suportados - você ainda tem os mesmos problemas. Os vários navegadores ainda teriam erros e teriam diferentes DOMs.

Além disso, você precisaria ter um intérprete embutido no navegador ou de alguma forma instalado como um plug-in (que você pode verificar antes de exibir a página) para cada idioma. Demorou séculos para obter o Javascript consistente.

Você não pode usar linguagens compiladas da mesma maneira - então você está introduzindo um executável que não pode ser facilmente examinado pelo que faz. Muitos usuários optam por não deixá-lo funcionar.

OK, e quanto a algum tipo de sandbox para o código compilado? Parece Java Applets para mim. Ou ActionScript no Flash. Ou c # no Silverlight.

E algum tipo de padrão de IL? Isso tem mais potencial. Desenvolva no idioma que desejar e, em seguida, compile-o para IL, que o navegador então JITs.

Exceto que o Javascript já é o tipo de IL - basta olhar para o GWT . Permite escrever programas em Java, mas distribuí-los como HTML e JS.


Editar após mais esclarecimentos em questão

Javascript não é, ou melhor, não era, o único idioma suportado pelos navegadores: na era das trevas do Internet Explorer, era possível escolher entre Javascript ou VBScript para rodar no IE. Tecnicamente, o IE nem executava Javascript - ele executava JScript (principalmente para evitar ter que pagar à Sun pela palavra java , a Oracle ainda é dona do nome Javascript ).

O problema era que o VBScript era proprietário da Microsoft, mas também não era muito bom. Enquanto o Javascript estava adicionando funcionalidade e obtendo ferramentas de depuração de alto nível em outros navegadores (como FireBug), o VBScript permaneceu apenas no IE e praticamente não pode ser depurado (as ferramentas de desenvolvimento no IE4 / 5/6 não existiam). Enquanto isso, o VBScript também se expandiu para se tornar uma ferramenta de script bastante poderosa no sistema operacional, mas nenhum desses recursos estava disponível no navegador (e quando estavam se tornaram enormes falhas de segurança).

Ainda existem alguns aplicativos internos corporativos por aí que usam VBScript (e alguns dependem dessas falhas de segurança) e ainda estão executando o IE7 (eles apenas pararam o IE6 porque a Microsoft finalmente o eliminou).

Obter o Javascript no estado atual tem sido um pesadelo e levou 20 anos. Ele ainda não possui suporte consistente, com os recursos de idioma (especificados em 1999) ainda faltando em alguns navegadores e muitos shims sendo necessários.

A adição de um idioma alternativo para interpretação nos navegadores enfrenta dois grandes problemas:

  • Conseguir que todos os fornecedores de navegadores implementem o novo padrão de idioma - algo que eles ainda não gerenciam para Javascript há 20 anos.

  • Uma segunda linguagem potencialmente dilui o suporte que você já possui, permitindo (por exemplo) o IE ter suporte a Javascript de segunda taxa, mas ótimo VBScript (novamente). Eu realmente não quero escrever código em diferentes idiomas para diferentes navegadores.

Deve-se notar que o Javascript não está 'concluído' - ainda está evoluindo para se tornar melhor em novos navegadores. A versão mais recente está anos à frente das implementações dos navegadores e eles estão trabalhando na próxima.

Keith
fonte
5
Eu diria que é "interpretado", não "compilado" pelo navegador.
Flavius Stef
19
Navegadores mais recentes fazem a compilação JIT no JavaScript.
Nosredna
4
Também pesquisei no Google jit e, como se vê, o Firefox 3.1 terá o suporte incorporado. Confira andreasgal.com/2008/08/22/tracing-the-web ou people.mozilla.com/~schrep/ tm-image-Adjustment.swf
Flavius ​​Stef
2
O mecanismo JavaScript V8 (chrome) é compilado diretamente.
3011 Dave W. Smith
3
Discordo totalmente da sua primeira resposta "o problema do JavaScript não é a linguagem em si". Eu acho que é sintaticamente uma linguagem muito feia e carece de recursos que você obtém da maioria das outras línguas. Recursos que, pelo menos eu, ainda precisam em aplicativos grandes (dependências de carregamento, princípios de OO legíveis ). Se tivéssemos que fazê-lo (internet) o tempo todo, acho que o JavaScript não seria a melhor opção para um idioma.
SirLenz0rlot
28

Compilar para Javascript

Por enquanto, o uso de uma linguagem que compila para Javascript parece ser a única maneira realista de alcançar todas as plataformas enquanto escreve um código mais inteligente, e isso provavelmente continuará sendo o caso por um longo tempo. Com qualquer nova oferta, sempre haverá algumas razões pelas quais um ou mais fornecedores não se apressam em enviá-la.

(Mas eu realmente não acho que isso seja um problema. O Javascript já foi bastante otimizado. O código da máquina também não é seguro se for escrito à mão, mas funciona bem como um destino de compilação e linguagem de execução.)

Tantas opções

Existe um conjunto crescente de idiomas que são compilados para Javascript. Uma lista bastante abrangente pode ser encontrada aqui:

Notável

Mencionarei alguns que considero dignos de nota (embora sem dúvida negligencie algumas jóias que não conheço):

  • Spider apareceu em 2016. Ele afirma ter as melhores idéias de Go, Swift, Python, C # e CoffeeScript. Não é seguro, mas possui alguns recursos de segurança menores .

  • Elm : Haskell pode ser a linguagem mais inteligente de todas, e Elm é uma variante do Haskell para Javascript. É altamente sensível ao tipo e conciso, e oferece Programação Reativa Funcional como uma alternativa interessante para modelos reativos ou espaguete MVC. Mas pode ser um choque para programadores de procedimentos .

  • O Google's Go visa concisão, simplicidade e segurança. O código Go pode ser compilado em Javascript por GopherJS .

  • Dart foi a tentativa posterior do Google de substituir o Javascript. Oferece interfaces e classes abstratas por meio de uma sintaxe semelhante a C / Java com digitação opcional.

  • O Haxe é como o ActionScript do Flash, mas pode segmentar várias linguagens para que seu código possa ser reutilizado nos programas Java, C, Flash, PHP e Javascript. Oferece objetos dinâmicos e seguros para o tipo.

  • O Opalang adiciona açúcar sintático ao Javascript para fornecer acesso direto ao banco de dados , continuações inteligentes, verificação de tipo e auxiliar na separação cliente / servidor. (Vinculado ao NodeJS e MongoDB.)

  • GorillaScript , "uma linguagem de compilação para JavaScript projetada para capacitar o usuário enquanto tenta evitar alguns erros comuns". é semelhante ao Coffeescript, mas mais abrangente, fornecendo vários recursos extras para aumentar a segurança e reduzir os padrões repetitivos do padrão.

  • O LiteScript fica em algum lugar entre o Coffeescript e o GorillaScript. Oferece sintaxe async / yield para retornos de chamada "em linha" e verificação de erros de digitação variáveis.

  • O TypeScript da Microsoft é um pequeno superconjunto de Javascript que permite colocar restrições de tipo nos argumentos das funções, o que pode causar alguns bugs. Da mesma forma, o BetterJS permite aplicar restrições, mas em Javascript puro, adicionando chamadas extras ou especificando tipos nos comentários JSDoc. E agora o Facebook ofereceu o Flow, que também realiza inferência de tipos.

  • O LiveScript é um spin-off do Coffeescript que era popular por sua brevidade, mas não me parece muito legível. Provavelmente não é o melhor para as equipes.

Como escolher?

Ao escolher um idioma alternativo, existem alguns fatores a serem considerados :

  • Se outros desenvolvedores ingressarem no seu projeto no futuro, quanto tempo levará para eles se atualizarem e aprenderem esse idioma ou quais são as chances de eles já saberem?

  • O idioma possui poucos recursos (o código ainda estará cheio de clichê) ou muitos recursos (levará muito tempo para dominar e até então algum código válido pode ser indecifrável)?

  • Possui os recursos necessários para o seu projeto? (Seu projeto precisa de verificação de tipo e interfaces? Precisa de continuações inteligentes para evitar o inferno de retorno de chamada aninhado? Existe muita reatividade? Pode ser necessário direcionar outros ambientes no futuro?)

O futuro...

Jeff Walker escreveu uma série instigante de posts sobre "o problema do Javascript", incluindo o motivo pelo qual ele acha que nem o TypeScript , nem o Dart nem o Coffeescript oferecem soluções adequadas. Ele sugere algumas características desejáveis ​​para uma linguagem aprimorada na conclusão .

joeytwiddle
fonte
O ES6 estende o Javascript com vários recursos que permitem que as classes sejam especificadas mais claramente e "assíncrono em linha" por meio de geradores. Ainda digitado dinamicamente!
joeytwiddle
A abordagem de Elm é semelhante ao nitrogênio ou ao N2O (estruturas erlang), é por isso que eu gosto.
DenisKolodin
Atualmente, temos um pouco do açúcar sintático do CoffeeScript no ES8 e no TypeScript, além de aguardar assincronia. O TypeScript evitou muitos bugs no meu local de trabalho, embora ainda haja algumas oportunidades para surpresas!
Joeytwiddle 9/09/19
Há também o Wasm agora, que permite que vários outros idiomas sejam executados no navegador. No entanto, a comunicação com o DOM ainda está passando por JavaScript.
joeytwiddle
22

JavaScript deve ser o único idioma suportado na plataforma do navegador?

Sim e não. Existe uma alternativa chamada Dart, do Google, que compila com JavaScript e, assim como o jQuery, tenta facilitar um pouco a manipulação do DOM. Pode ser divertido experimentar, confira.

Veja também

Alex Nolasco
fonte
15

É verdade que o Javascript era notoriamente difícil de lidar, mas a comunidade de desenvolvimento da Web percorreu um longo caminho desde então. Em vez disso, eu encorajo você a dar uma olhada no jQuery . É fácil e abstrai todos os vários problemas.

E realmente não existem alternativas que funcionem de maneira geral. O Flash vem à mente, mas esse também é o script ECMA e provavelmente está acabando com a maioria das coisas.

aleemb
fonte
1
ou MooTools, Prototype e Dojo. jqueryvsmootools.com é uma ótima comparação entre mootools e jquery.
21919 Ryan Florence
Não há / não havia nada de errado com o Javascript. É provável que você esteja se referindo a problemas no JScript do IE e problemas e inconsistências gerais de renderização com vários navegadores.
Gavin
7

Em curto prazo, usaria coisas como o jQuery para ocultar as incompatibilidades do navegador. A longo prazo, tecnologias como Silverlight ou Adobe AIR podem tornar esse campo minado muito diferente (mas ainda um campo minado) no futuro.

Marc Gravell
fonte
1
+1 por usar o jQuery para ocultar incompatibilidades do navegador. Li um livro explicando como alguns desses mecanismos funcionam e acredito em mim quando digo que o jQuery está poupando dores de cabeça aos programadores neste departamento.
Vivian River
1
olhar para as respostas tecnológicas em retrospectiva é sempre uma visão estranha. agora sabemos que a web venceu: silverlight, flash e air estão todos mortos, e o vencedor remanescente é javascript em todos os seus encantamentos estranhos e maravilhosos.
Oligofren
6

Doug Crockford falou com o Google detalhando as partes ruins e boas do JavaScript e seu futuro. Na verdade, ele não mudou muito desde 1999 - o que pode ser considerado uma coisa boa (praticamente todos os navegadores podem executar o mesmo código, desde que você esteja ciente de suas limitações) e Doug mostra onde as partes boas eram principalmente mal-entendidos que acabam sendo muito poderosos.

Para manipulação do DOM, observe o JQuery como uma biblioteca do lado do cliente que substitui a maior parte da terrível API do DOM por operações difíceis de escrever em pedaços de código bastante elegantes e fáceis de escrever.

sj2009
fonte
5

Se você está pensando que o JavaScript tem problemas profundos, recomendo o livro de Doug Crockford, JavaScript: The Good Parts . (Ou no Google, para "Crockford JavaScript", para encontrar várias apresentações em vídeo que ele fez.) Crockford esboça um subconjunto e conjunto de práticas seguros e lista especificamente algumas partes do idioma a serem evitadas.

Tenho conhecimento de planos para substituir JavaScript como os de facto meios de manipular o DOM. Portanto, é melhor aprender a usá-lo com segurança e bem.

Dave W. Smith
fonte
1
Leia de novo. É claro que ele editou sua pergunta depois de ler as respostas.
Dave W. Smith
4

Em termos de cliente, o Javascript é a única maneira de manipular o DOM. Em termos de servidor, existem várias maneiras.

Ben Shelock
fonte
4

O Internet Explorer suporta linguagens de script conectáveis, embora o único incluído de maneira confiável no IE, além do JScript, seja o VBScript.

Até onde eu vi, parece haver um tipo geral de viés em relação às linguagens dinâmicas no navegador, e o JavaScript parece preencher essa necessidade de maneira adequada o suficiente para que os efeitos de rede tornem qualquer outra linguagem um não iniciador. A linguagem é realmente bastante poderosa, embora sua implementação nos navegadores deixe muito a desejar.

Jeffrey Hantin
fonte
1
Não use VBScript no IE - é uma variante horrível do VB que o grande MS pensou que decolaria, mas não o fez. Na verdade, ele não funciona como VB ou VBScript normal, e é mais lento que o Javascript.
301 Keith
1
O que está faltando, por exemplo, nas implementações de JavaScript / ECMAScript do WebKit ou Gecko, disponíveis em implementações que não são de navegador? Esse comentário é totalmente confuso para mim.
Eyelidlessness
4

Se você deseja restringir seus clientes / visitantes a navegadores específicos e, possivelmente, exigir que eles instalem um plug-in, consulte o MS Silverlight - uma visão geral legível está na wikipedia . Com o Silverlight 2, você pode executar, no lado do cliente, o código que você escreveu em C #, IronPython, IronRuby, VB.NET, etc; o clone Moonlight gratuito do Silverlight, do projeto Mono, promete trazer a mesma funcionalidade para o Linux.

Na prática, a maioria dos desenvolvedores de aplicativos e sites da Web prefere atingir um público-alvo mais amplo do que o Silverlight (e eventualmente o Moonlight) pode oferecer atualmente - o que significa manter o Javascript ou possivelmente o Flash (que usa uma linguagem de programação semelhante, o Actionscript).

Portanto, ganhar participação substancial, adoção e tração para qualquer outra coisa está provando ser uma luta árdua até para a Microsoft, com seus grandes grupos de engenheiros e orçamentos de marketing e um projeto de software livre ao lado (para possivelmente diminuir as preocupações com o aprisionamento proprietário) ) - o que pode ajudar a explicar por que há muito pouco interesse, por exemplo, por parte da Mozilla Foundation, em avançar em direção a esse objetivo. "Além da interoperabilidade", você diz: mas claramente a questão da interoperabilidade é o maior aqui, dado o que observamos pelo progresso do Silverlight ...

Alex Martelli
fonte
3

Como já foi dito, você tem o Flash (ActionScript, que é uma linguagem derivada do Javascript) e o Silverlight / Moonlight (IronPython, IronRuby, JScript, VBScript, C #) que podem ser executados no navegador por meio de plug-ins (o primeiro é muito mais onipresente) .

Também há outra alternativa, se você gosta de Ruby: HotRuby , é uma implementação de ruby ​​em javascript que será executada no navegador. Ainda não está muito maduro, mas você pode dar uma olhada.

Alcides
fonte
3

Uma coisa que eu não vi mencionada (oh, eu vi Alcides mencionando o HotRuby enquanto eu escrevia e Nosredna mencionou o GWT e o Script #) e gostaria de jogar lá fora, existem várias implementações de [insert language] -on- JavaScript (por exemplo, tradutores que permitem converter Ruby , Python , C # , Java , Obj-J / Cappuccino [semelhante ao Obj-C / Cocoa] ou Processing [for Canvas] em JavaScript no cliente ou antes da implantação [e alguns dos quais também apresentam várias bibliotecas de abstração]). É claro que há uma sobrecarga de desempenho se estiver sendo traduzida no cliente, mas se você estiver mais confortável com outro idioma, isso permitirá uma certa flexibilidade.

Pessoalmente, eu recomendo aprender a amar o JavaScript. É uma linguagem excelente, poderosa e bastante elegante quando você a conhece. Estou enfrentando o dilema oposto, procurando um pouco de solução JavaScript / DOM capaz do servidor que atenda a todas as minhas necessidades. / opinião não solicitada

ausência de pálpebra
fonte
Eu mencionei GWT e Script #. Para aqueles interessados ​​no script #, o link é projects.nikhilk.net/ScriptSharp
Nosredna
Obrigado por me indicar Obj-J / Cappuccino. É incrível para criar aplicativos da Web e eu o abri apenas porque você o mencionou e o nome (e a relação com o cacau) me intrigou.
Timo
2

Não. O JavaScript é esse, mas ele evoluirá. A próxima versão é "JavaScript Harmony" e você pode saber mais se pesquisar no Google.

De vez em quando, alguém sugere colocar um interpretador de código de bytes nos navegadores ao lado do JavaScript. Provavelmente não vai acontecer, pelo menos por um tempo.

Eu amo JavaScript. Mas existem outras soluções, incluindo GWT, que compila Java para JavaScript e Script #, que compila C # para JavaScript.

Nosredna
fonte
2

Jquery (ainda em javascript, mas) realmente ajudará você a ter suporte para quase todos os navegadores e não é tão difícil de aprender :)

Hannoun Yassir
fonte
2

JavaScript é o idioma inglês da web. O inglês se espalhou historicamente porque tinha uma marinha forte conquistando vários países. Isso é comparável às grandes empresas que conquistaram a web com JavaScript. É uma língua que reúne várias fontes européias (grego, latim, idiomas germânicos, francês e até algumas palavras chinesas e indianas). O JavaScript emprestou muitos conceitos ao longo dos anos de outras linguagens (estrutural, OO, funcional). O inglês é falado em lugares diferentes, com pequenas variações de dialeto e sotaque, o que pode dificultar o entendimento. Assim como o JavaScript, diferentes navegadores o interpretam de maneira um pouco diferente.

Embora o inglês seja fácil de aprender inicialmente, ele possui uma pronúncia muito inconsistente e mais exceções do que regras. Assim como o JavaScript, está sempre lá para oferecer uma surpresa.

Apesar dos diferentes sotaques, o JavaScript é a língua franca da web. Assim como você pode não ser inglês e escrever aqui em inglês, todo navegador da web possui um certo grau de compreensão do inglês. O IE6 é como o cara que diz em seu currículo que é fluente, mas só estudou duas semanas em inglês como língua estrangeira.

Houve tentativas de suplantar o inglês como principal idioma do mundo, como o esperanto. Mas todos falharam, porque a maioria das pessoas na terra fala um pouco de inglês. Da mesma forma, será difícil introduzir melhores alternativas ao JavaScript.

CodeMonkey
fonte
1

Eu não acho que o Javascript será substituído tão cedo. Para uma abordagem completamente diferente para clientes ricos, convém investigar o Flex, que é uma tecnologia baseada em Flash.

Flavius ​​Stef
fonte
1

Talvez algo como haxe (consulte haxe.org) possa ajudá-lo. É uma linguagem que parece mais limpa que o JavaScript e pode ser compilada em JavaScript, para que possa ser executada dentro de um navegador.

Sei que essa não é uma resposta direta à sua pergunta, mas achei que poderia ser interessante para você.

Karl Bartel
fonte
1

Muitas pessoas entendem que o Javascript não é a melhor e mais bonita linguagem de todos os tempos. No entanto, atualmente é suportado por navegadores e, portanto, será extremamente difícil introduzir um idioma diferente. Simplesmente não precisamos de outra guerra de navegadores.

Isso explica por que não conheço planos de mudar para um idioma diferente do lado do cliente.

Mas acho que o Javascript não é tão ruim se você começar a pensar no modelo DOM e em como trabalhar com ele. Muitas coisas complicadas com JS são o resultado da maneira como o modelo DOM funciona.

ilya n.
fonte