Diferenças entre TypeScript e Dart [fechado]

85

A Microsoft lançou recentemente o Typescript, uma nova linguagem de programação semelhante ao JavaScript. Há algum tempo, ouvi falar do Dart, uma nova linguagem de programação criada pelo Google para resolver problemas relacionados ao Javascript, como desempenho, escalabilidade etc.

O objetivo dos dois novos idiomas parece o mesmo para mim. O que você acha?

Os propósitos dos idiomas são os mesmos?

Quais são as diferenças reais sobre eles?

margabit
fonte
ver uma discussão aqui: programmers.stackexchange.com/questions/166978/...
diadiora

Respostas:

60

Citando Bob Nystrom :

O TypeScript parece bom se você gosta de semântica JS ou tem uma grande base de código JS em que está investido, mas está tendo problemas de manutenção em grande escala. Seu caminho para o sucesso é muito mais suave, pois é (principalmente?) Compatível com o JS.

Dart está fazendo uma aposta mais arriscada. É mais distante do JS de muitas maneiras, o que é, na minha opinião, bom como programador diário do Dart, mas aumenta a barreira de entrada. Mas em troca dessa barreira mais alta de entrada, você obtém:

  • Árvore tremendo
  • Getters e setters (embora eu presuma que o TypeScript os obtenha eventualmente)
  • Sobrecarga do operador
  • Escopo de bloco real, sem içamento, sem IIFE s
  • Uma VM nativa
  • Semântica da igualdade sã
  • Nenhuma loucura de conversão implícita estranha
  • Lexicamente ligado em this todos os lugares
  • Mixins
  • Anotações
  • Um sistema de importação
  • Operadores de subscrito definido pelo usuário
  • Genéricos, com reificação
  • Espelhos
  • Melhores classes de coleção
  • Uma API DOM mais limpa

Além disso, ele escreve em http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript/c6g37xd :

Estou na equipe de dardo do Google, então, naturalmente, estou olhando para esse ângulo / tendência. Aqui estão algumas coisas aleatórias que chamaram minha atenção, principalmente comparando com Dart. Passei apenas alguns minutos vasculhando, então não leve isso muito a sério ...

Sem genéricos

Eu acho que alguns tipos são melhores do que nenhum, mas é realmente difícil perdê-los. O TypeScript possui tipos de matriz internos e tipos de objeto que abrangem alguns dos casos de uso do tipo "mapa". Mas não poder definir seus próprios tipos genéricos é uma chatice. Os documentos dizem que, quando adicionados, os genéricos funcionarão usando o apagamento de tipo, o que eu esperaria, dado o estilo "compilar com JS leve", mas isso também pode ser uma dor. É bom poder fazer coisas com seus argumentos de tipo em tempo de execução às vezes.

Todos os tipos são anuláveis

Dardo é da mesma maneira. Me deixa triste nos dois casos.

A sintaxe da anotação de tipo é boa

Quase todos os idiomas com anotações de tipo opcionais (ML, Scala, F #, Kotlin etc.) seguem "postfix após a:. Dart tenta usar anotações de tipo C, o que causa alguns casos de canto desagradáveis. Gosto do que o TypeScript tem aqui, especialmente a sintaxe para os tipos de função:

function takeCallback(callback : (n : number) => number)
{ ... }

As interfaces são tipificadas estruturalmente, as classes tipicamente

Faz sentido, dado que é JavaScript, mas parece bastante elegante. Ser capaz de implementar implicitamente uma interface é bom. Mas o TypeScript parece não deixar você seguir o caminho inverso: dada uma classe, você não pode criar um novo tipo compatível com ele sem estendê-lo concretamente por causa do material da marca. No Dart, graças a interfaces implícitas, você pode.

O melhor tipo comum pode falhar

Isso significa que este é um erro de tipo:

[1, true]

Você pode sobrecarregar nas interfaces por assinatura de parâmetro

Isso é muito legal porque permite que você tenha um fluxo de inferência de tipo mais preciso através de uma chamada de função que faz alguma troca dinâmica de tipo. Por exemplo:

interface Doubler {
  double(s : string) : string;
  double(n : number) : number;
}

Com isso, quando o compilador vê uma chamada para duplicar, ele pode fornecer corretamente um tipo de retorno preciso com base no tipo de argumento inferido. O que não tenho certeza é como realmente implementar uma classe que implementa essa interface e deixa o verificador de tipos feliz. Você não pode realmente sobrecarregar métodos concretos, e minha tentativa de cinco minutos para fazê-lo feliz pela verificação dinâmica de tipos não pareceu funcionar.

Existe uma sintaxe dedicada para tipos de array

Faz sentido, pois não há genéricos. Também é agradável e conciso, o que é bom, mas eu pessoalmente prefiro os genéricos de uso geral do que coleções únicas de casos especiais.

Não há downcasting implícito

Um dos recursos do sistema de tipo mais incomum da Dart é que a compatibilidade da atribuição é bidirecional: você pode fazer o downcast sem aviso. Além do caso especial típico de atribuir a / de qualquer (dinâmico em outros idiomas), o TypeScript não permite isso. Você precisa digitar assert. Pessoalmente, eu gosto da abordagem do TypeScript aqui.

Funções seta e lexical isso

Isso é apenas maternidade e torta de maçã. Eu gosto disso. (O Dart também tem isso, e isso sempre é lexicamente vinculado.)

No geral, parece bem arrumado. Se você deseja exatamente a mesma semântica JS (boa e ruim), mas também quer um punhado de tipos, o TypeScript parece decente. É como o Closure Compiler, mas com uma sintaxe melhor.

Se você deseja algo mais agressivo, longe da sintaxe e da semântica de JS, parece que o TypeScript não é isso.

Seth Ladd
fonte
17
O que é tremor de árvore?
Citykid
4
Para saber mais sobre a árvore tremer: blog.sethladd.com/2013/01/...
Seth Ladd
19
"As ferramentas Dart suportam agitação de árvore, uma técnica para" sacudir "o código não utilizado, reduzindo assim o tamanho do aplicativo implantado. Posso importar bibliotecas ricas repletas de benefícios úteis para o meu aplicativo, mas apenas as funções que eu realmente usar serão incluídas na minha saída gerada ". thx
citykid
3
Enquanto estiver no estado de visualização, o Typescript está em perfeito estado para uso em projetos profissionais que serão enviados amanhã. O idioma e as ferramentas funcionam sem nenhum problema sério ou quase nenhum problema.
Citykid
4
Como @JustAnotherUserYouMayKnowOrNot observado, o TypeScript adicionou genéricos em 0.9 blogs.msdn.com/b/typescript/archive/2013/06/18/…
Jon Mabe
60

Enquanto a pergunta era "Os objetivos das linguagens são os mesmos?", A verdadeira questão é: "Como podemos melhorar a programação da Web de onde estamos?" .

Ambos os projetos tentam fazer isso considerando

  • linguagem de programação (o TypeScript dá um passo pequeno, mas muito limpo, o Dart faz o movimento mais revolucionário que ainda está em movimento)

  • interoperabilidade com o código js existente (transição 0 no TypeScript que é compilada com js, complicada no Dart, já que 2 VMs conversam entre si)

  • práticas de engenharia de software (somente Dart, componentes da Web e shadow dom)

Nos últimos 3 dias, mergulhei profundamente no Dart e depois no TypeScript. Minha base de código do CoffeeScript foi para as linhas de código dos anos 2000, muito para serem manuseadas com o adorável, mas muito macio CoffeeScript. Os problemas que enfrentei foram o fato de o CoffeeScript não possuir recursos que as linguagens projetadas para programação de médio a grande porte tenham: interfaces, módulos, segurança de tipo. Mas havia uma ainda muito mais grave problema com café e js: Os js "este ponteiro" estranheza afetou minha sanidade e não CoffeeScript não ajuda nada aqui.

Então, aqui estão meus resultados após 3 dias de avaliação e uso:

Dardo

Passou por todo o tutorial, lendo um livro, percorrendo o segundo livro e testando as demos. Eu pensei, Dart, que é o futuro . Depois, tentei migrar meu aplicativo para o Dart. Foi aí que meu entusiasmo caiu de 100 para 10. Aqui está o porquê:

  1. O Dart Editor é a única maneira de programar o Dart. Embora existam plugins para Sublime Text, eles não fornecem recursos como intellisense, conclusão de código (corrija-me se estiver errado). O Dart Editor, no entanto, possui qualidade pré-alfa. Embora ele suporte coisas mágicas super-legais, como atualizar a página da web quando você edita o arquivo CSS (! Muito legal), ele trava ou trava várias vezes por minuto. Então, você digita 5 letras e 2 vezes precisa esperar 2 ou 15 segundos entre a digitação. E eu tinha um projeto com algumas linhas de código, por isso não queria esperar o que acontece quando as linhas de 1000s chegaram. Movi um arquivo de uma pasta para outra dentro do Dart Editor, travar. Depuraçãocom o Dart Editor, à primeira vista, é melhor do que todas as ferramentas de depuração de js que conheço (o cromo é a minha escolha), mas ainda há muitas coisas faltando: nenhuma janela imediata (isso torna a depuração de js muito melhor no momento), sem relógios.

  2. Política e possibilidades de fuga : Alguns dizem que Apple, MS e Firefox nunca fornecerão VMs Dart. Bem, não tenho tanta certeza, mas pelo menos para a Apple isso parece no momento muito certo. Para os outros, é mais provável que o contrário. Portanto, não há problema, podemos converter Dart em JavaScript. A maneira como essa integração funciona é realmente ótima. O Dart mantém um stub js que mantém o código js conectado ao Dart Editor; portanto, uma print()declaração ainda aparece no Dart Editor, legal. Mas aqui vem o mas: a pegada desse código convertido é alta. 150kB ou mais (antes da minificação). Eu não cavei muito no tamanho exato, então não me preste atenção nisso.

  3. Maturidade da linguagem . Além das questões muito sérias com o Dart Editor aparecendo na minha cara três vezes por minuto, também achei inaceitável que todas as fontes do código Dart encontradas usassem um Dart diferente. O idioma muda todos os dias. Você encontrou um post de 5 semanas atrás? Está desatualizado. Você tenta as amostras do tutorial do Google? Pelo menos 1 amostra não é compilada desde que uma API foi alterada. Até coisas mundanas, como anexar um evento a um elemento DOM, estão em boa jogada .

  4. A integração com as bibliotecas js existentes está um pouco envolvida. 2 VMs precisam se comunicar aqui, é complicado.

Como conclusão, você não pode usar seriamente o Dart a partir de hoje, e mergulhar nele não é muito divertido devido a 1 e 3. Ambos os pontos desaparecerão com o tempo. Sobre o ponto 2, o Google publicou benchmarks de desempenho há alguns dias, demonstrando que seus js compilados são melhores que os js manuscritos. Meus cumprimentos, ótimo trabalho. O tempo de carregamento ainda pode estar atrasado devido ao problema de pegada, como dito. No entanto, se o código de pegada for usado por muitos sites, ele poderá estar disponível em cache e pronto, desaparecerá também.

Portanto: considero o Dart um ótimo projeto, usá-lo no momento traz uma boa parte de riscos imprevisíveis e levará este ano para que ele atinja um bom nível estável.

TypeScript

Avaliar o TypeScript é muito fácil, leva 1 ou 2 horas e você sabe tudo. Lendo o documento de especificação da linguagem e um pequeno livro (revelado o TypeScript), eu sabia tudo e comecei a programar. Fiquei surpreso ao descobrir que as adições do TypeScript ao JavaScript preenchem todas as sérias necessidades que eu tive para aprimorar a programação do meu cliente . Aqui estão os destaques:

  1. Interfaces . Encapsulamento e interfaces permitem estruturar meu código facilmente. Perfeito!

  2. Estado da classe. . O TypeScript permite expressar o estado que as instâncias de uma classe carregam explicitamente, ou melhor, ela a impõe. Este é um grande passo melhor em comparação com js ou café.

  3. thischamar loucura atenuada . Dentro das funções das setas, o TypeScript torna o thisponteiro como qualquer cidadão que se comporta normalmente.

  4. Editor, Intellisense . O TypeScript é fornecido com um intellisense 100% superior perfeito que reage na faixa de micro ou milissegundos, conforme usado no Visual Studio ao programar C #. Também existem cabeçalhos TypeScript para todas as bibliotecas js importantes . Ótimo ótimo ótimo.

  5. Experiência e risco . O uso do TypeScript oferece risco zero, a linguagem é claramente definida, perfeitamente estável, apenas com açúcar, nada imprevisível.

Na verdade, essas melhorias me dão tudo o que eu precisava. A única coisa que gostaria de ver no futuro são coleções genéricas. Mas isso é amendoim.

E o desempenho? Embora eu me considere uma aberração no desempenho, não acredito que exista algum projeto que faça a escolha da tecnologia aqui com base no desempenho. Ambos estão na liga js.

Se você está interessado no futuro da programação da Web, ambos são grandes esforços, o TypeScript é muito mais pragmático e utilizável agora, o Dart é um projeto de laboratório muito interessante que será utilizável quando editores e depuradores maduros estiverem disponíveis e o escopo dos projetos possível com isso vai depender da política.

De qualquer forma, os três dias de avaliação foram divertidos e aprendi muito; se você encontrar tempo, leva 1 dia para o Dart e 2 horas para o TypeScript dar sua própria opinião. Tente.

Atualização de outubro de 2014

Já faz um tempo e ex post parece que a suposição de que o Typescript é a rota segura e estável a seguir estava certa. Acabei de encontrar uma declaração (muito) proeminente sobre Typcript, Dart and Closure:

Estou interessado no desafio da programação da Web em geral há bastante tempo. Acredito que o Google Closure ainda seja a melhor opção para o desenvolvimento em larga escala de JavaScript / Web, mas que será substituído por algo menos detalhado. Embora o Dart mostre uma promessa considerável, ainda estou consternado com o tamanho do JavaScript que ele gera. Por comparação, se o TypeScript puder ser traduzido diretamente para JavaScript que pode ser compilado usando o modo avançado do Closure Compiler, então podemos ter todos os benefícios do JavaScript otimizado do Closure sem a verbosidade. Além disso, como o TypeScript é um superconjunto de JavaScript, acredito que suas extensões de sintaxe possam entrar no padrão ECMAScript em algum momento,

http://blog.bolinfest.com/2013/01/generating-google-closure-javascript.html

Michael Bolin é um herói de front end de longa data (ex) google (ex) fb, também envolvido no fechamento do google (adquira seu livro sobre Closure).

Google Traceur

A vontade do Google de viver o ECMA Script 6 hoje é seu projeto Traceur: https://github.com/google/traceur-compiler

Comparado ao Typescript, o suporte a ferramentas está provavelmente muito atrasado a partir de hoje. No entanto, o lado positivo é muito mais rápido na adoção de aprimoramentos futuros demais da linguagem js, como iteradores ou compreensões.

Fluxo do Facebook, Google AtScript

fornecer recursos semelhantes ao TypeScript.

"Podemos nos perguntar o que há com essas diferentes soluções de verificação de tipo JavaScript e o que fazer sobre isso. Uma boa notícia é que Microsoft, Facebook e Google estão colaborando com elas, de acordo com Jonathan Turner, da Microsoft:

A equipe TypeScript está trabalhando com as equipes Flow e AtScript para ajudar a garantir que os recursos que já foram criados pela comunidade de digitação JavaScript possam ser usados ​​nessas ferramentas. Há muito que esses projetos podem aprender um com o outro, e estamos ansiosos para trabalhar juntos daqui para frente e criar as melhores ferramentas possíveis para a comunidade JavaScript. A longo prazo, também trabalharemos para dobrar os melhores recursos dessas ferramentas no ECMAScript, o padrão por trás do JavaScript. "

artigo da infoq sobre fluxo fb

citykid
fonte
Eu esperaria até o Google começar a usar o Dart para a maioria de seus próprios projetos (quando aplicável) - começar a comer comida de cachorro em outras palavras. Além disso, o Dart parece o Silverlight, apenas sem a parte XAML, apenas um idioma, mas melhor integrado ao JS / HTML.
Den
1
Sim, o Dart é algo no laboratório que podemos assistir e esperar no futuro, enquanto o Typescript está pronto para o desenvolvimento profissional agora. Portanto, comparar o Typecript ao Dart é comparar maçãs com mudas de laranja.
Citykid
7
Esta foi uma resposta muito perspicaz. Obrigado por escrever isso.
Darshan Sawardekar
2
não há idéia de como o texto datilografado "corrige" o thiscontexto, pois você ainda precisa vincular as funções de retorno de chamada declaradas dentro dos métodos ao thiscontexto do método para acessar os atributos da classe. Como isso está "consertando" alguma coisa?
Nurettin
1
ponto válido. Embora o vínculo ainda seja às vezes necessário, isso é um alias dentro das funções de seta , portanto o problema é pelo menos atenuado.
Citykid
17

Citando Scott Hanselman:

As pessoas compararam o TypeScript ao Dart. Isso é comparar maçãs com carburadores. O TypeScript se baseia no JavaScript, para que não haja problemas de interoperabilidade de JS. Dart é uma máquina virtual nativa escrita do zero. Dart interage com JavaScript ... mas não é JS. Ele nem usa o tipo de número JavaScript, por exemplo.

De Por que o TypeScript tem a resposta para alguma coisa?

M. Dudley
fonte
8
Estou um pouco confuso honestamente. O TypeScript também não é realmente JS, certo? var x = {}; x.foo = 5; //Doesn't work in typescripte var e = window.event ? window.event : e; //Doesn't work in typescriptO exemplo acima falhará no compilador TypeScript. Estou esquecendo de algo? Não posso simplesmente "soltar" meu JavaScript e usar tipos quando me apetecer. Eu tenho que aprender alguma nova sintaxe e estruturar tudo com tipos.
aikeru
@aikeru Hmmm, você está correto. Parece eliminar algumas das grandezas de JS. Eu usaria essa nova ferramenta, mas agora estou pensando melhor.
quer
3
Discordo. É como comparar maçãs a peras ou carburadores para injetar combustível. Há muitas coisas nesses dois que naturalmente levam muitas pessoas a pensar neles ao mesmo tempo.
Hippietrail
Para constar, isso funciona var x = {}; x['foo'] = 5;e também var y:any = {}; y.foo = 5;, mas fiquei um pouco surpreso ao descobrir que você está certo sobre isso - o tipo de percepção {}é {}mais do que any. Pode ser um problema de inferência de tipo. Publiquei o problema aqui - veremos como eles respondem.
mindplay.dk
3

Ultimamente tive que entrar nessa discussão com minha própria descoberta.

1º: TypeScript

A MS adotou uma abordagem interessante no fato de que você pode entrar e sair facilmente de TS e JS. Usamos principalmente o AngularJS para o nosso desenvolvimento e encontramos, embora não exista muita documentação para converter Angular em TypeScript. Foi uma boa adição incorporar o TypeScript ao nosso fluxo de trabalho do desenvolvedor.

2º: dardo

O dardo é um passo irônico para o Google. Talvez eles não se lembrem do activeX e de todos os pesadelos que tentam fazer com que um aplicativo funcione em qualquer coisa, menos no temido IE 5 ou IE 6 do dia. A EM demorou muitos anos para se recuperar daqueles dias.

O dardo como uma linguagem "conceitualmente" parece tentar combinar alguns recursos interessantes de OOP. Anotações etc são um bom pensamento para Javascript.

O problema, é difícil imaginar largura de banda suficiente para criar um novo editor, nova linguagem, novas vm entre navegadores, plugins para outros IDE, compilador para converter para javascript (sem ter vários meg), converter ou criar novas bibliotecas de dardos para substitua as milhares de bibliotecas js atuais, peça a alguém que decida polímeros ou diretivas, converta o site dartlang para usar dart, é isso que consigo pensar em cima da minha cabeça.

O conceito de tentar usar o Dart em algo que não seja um aplicativo trivial no momento é assustador.

No topo de tudo isso, o ES6 não está longe. O ES6 traz muitos recursos que o Dart está tentando corrigir que existem no ES5. Qual será a proposta de valor quando o ES6 chegar às ruas? Pelo menos neste momento, a única alteração que você deve fazer no TypeScript após a saída do ES6 é talvez escolher uma compilação diferente para o destino.

Apenas para esclarecer que eu sou uma pessoa profissional de MS. A MS produz alguns produtos decentes e fez grandes progressos para corrigir erros do passado com a comunidade OSS. Ainda assim, raramente uso algo diferente do TypeScript da Microsoft.

código
fonte