Différences entre TypeScript et Dart [fermé]

85

Microsoft a récemment dévoilé Dactylographe, un nouveau langage de programmation de type JavaScript. Il y a quelque temps, j'ai entendu parler de Dart, un nouveau langage de programmation créé par Google pour résoudre des problèmes liés à Javascript tels que les performances, l'évolutivité, etc.

Le but des deux nouvelles langues me semble identique. Qu'en pensez-vous?

Les objectifs des langues sont-ils les mêmes?

Quelles sont les vraies différences à leur sujet?

margabit
la source
Voir une discussion ici: programmers.stackexchange.com/questions/166978/…
diadiora

Réponses:

60

Citant Bob Nystrom :

TypeScript semble bien si vous aimez la sémantique JS ou si vous avez une grande base de code JS dans laquelle vous investissez, mais que vous rencontrez des problèmes de maintenance à grande échelle. Son chemin vers le succès est beaucoup plus fluide puisqu'il est (généralement?) Compatible avec JS.

Dart prend un pari plus risqué. Cela ressemble beaucoup à JS, ce qui, à mon avis, convient principalement au programmeur de Dart au jour le jour, mais la barrière d’entrée est encore plus grande. Mais en contrepartie de cette barrière d’entrée plus élevée, vous obtenez:

  • Arbre secouant
  • Getters and setters (bien que je suppose que TypeScript les obtiendra éventuellement)
  • Surcharge de l'opérateur
  • La portée réelle d' un bloc, sans levage, pas Ia vie s
  • Une machine virtuelle native
  • Sémantique d'égalité
  • Pas de folie de conversion implicite
  • Lexicalement lié this partout
  • Mixins
  • Annotations
  • Un système d'importation
  • Opérateurs d'indice définis par l'utilisateur
  • Génériques, avec réification
  • Miroirs
  • Meilleures classes de collecte
  • Une API DOM plus propre

En outre, il écrit dans http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript/c6g37xd :

Je fais partie de l'équipe Dart de Google, je la regarde donc naturellement sous cet angle / parti pris. Voici quelques trucs aléatoires qui ont attiré mon attention, en les comparant principalement à Dart. Je n'ai passé que quelques minutes à écumer, alors ne prenez pas cela au sérieux ...

Pas de génériques

Je suppose que certains types valent mieux que pas de types du tout, mais c'est vraiment difficile de les perdre. TypeScript possède des types de tableaux intégrés et les types d'objet couvrent certains cas d'utilisation de type "map". Mais ne pas être en mesure de définir vos propres types génériques est un problème. La documentation précise que, une fois ajoutés, les génériques fonctionneront à l'aide de l'effacement de type, ce à quoi je m'attendrais étant donné son style "compiler sur JS léger", mais cela peut être pénible également. C'est bien de pouvoir faire des trucs avec vos arguments de type au moment de l'exécution.

Tous les types sont nullables

Dart, c'est pareil. Cela me rend triste dans les deux cas.

La syntaxe d'annotation de type est agréable

Presque toutes les langues avec des annotations de type optionnelles (ML, Scala, F #, Kotlin, etc.) vont avec "postfixe après un:. en particulier la syntaxe pour les types de fonction:

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

Les interfaces sont structurellement typées, les classes sont nominalement typées

Cela a du sens étant donné qu’il s’agit de JavaScript, mais cela semble assez soigné. Pouvoir implémenter implicitement une interface est bien. Mais TypeScript ne semble pas vous laisser faire l'inverse: avec une classe, vous ne pouvez pas créer un nouveau type compatible avec celle-ci sans l'étendre concrètement à cause des éléments de la marque. Dans Dart, grâce aux interfaces implicites, vous pouvez.

Le meilleur type commun peut échouer

Cela signifie que c'est une erreur de type:

[1, true]

Vous pouvez surcharger les interfaces par signature de paramètre

C’est vraiment intéressant, car cela vous permet d’avoir un flux d’inférence de type plus précis grâce à un appel de fonction qui effectue une commutation de type dynamique. Par exemple:

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

Avec cela, lorsque le compilateur voit un appel à doubler, il peut correctement vous donner un type de retour précis basé sur le type d'argument inféré. Ce que je ne sais pas, c'est comment implémenter réellement une classe qui implémente cette interface et rend le vérificateur de type heureux. En réalité, vous ne pouvez pas surcharger des méthodes concrètes, et ma tentative de cinq minutes de le rendre heureux par une vérification de type dynamique ne semble pas fonctionner.

Il y a une syntaxe dédiée pour les types de tableaux

Cela a du sens puisqu'il n'y a pas de génériques. C'est également agréable et concis, ce qui est bien, mais je préfère personnellement les génériques d'usage général aux collections de cas spéciaux uniques.

Il n'y a pas de downcasting implicite

L'une des fonctionnalités plus inhabituelles du système de types de Dart est que la compatibilité des affectations est bidirectionnelle: vous pouvez effectuer un downcast sans avertissement. Mis à part le cas particulier typique de l'affectation à / depuis tout type (dynamique dans d'autres langages), TypeScript ne le permet pas. Vous devez taper assert. Personnellement, j'aime l'approche de TypeScript ici.

Les fonctions fléchées et lexicales

C'est juste la maternité et la tarte aux pommes. Je l'aime. (Dart a cela aussi, et cela est toujours lié lexicalement.)

Globalement, ça a l'air plutôt chouette. Si vous voulez exactement la même sémantique JS (bonne et mauvaise), mais voulez aussi une poignée de types, TypeScript semble correct. C'est comme Closure Compiler mais avec une meilleure syntaxe.

Si vous voulez quelque chose qui soit un pas plus agressif loin de la syntaxe et de la sémantique de JS, il semble alors que TypeScript n'est pas ça.

Seth Ladd
la source
17
Qu'est-ce que l'arbre qui tremble?
citykid
4
Pour en savoir plus sur la gestion des
Seth Ladd
19
"Les outils Dart prennent en charge l’arborescence, une technique permettant de" secouer "le code non utilisé, réduisant ainsi la taille de l’application déployée. Je peux importer des bibliothèques riches dans mon application, mais seules les fonctions que j’utilise réellement seront incluses. dans ma sortie générée. " thx
citykid
3
Bien qu’il soit en mode aperçu, Typescript est parfaitement adapté aux projets professionnels de demain. Language and Tools fonctionne sans problème sérieux, ni même pratiquement aucun problème.
citykid
4
Comme @JustAnotherUserYouMayKnowOrNot l'a noté, TypeScript a ajouté les génériques dans la version 0.9. Blogs.msdn.com/b/typescript/archive/2013/06/18/…
Jon Mabe le
60

Alors que la question était "Les objectifs des langages sont-ils les mêmes?", La vraie question est: "Comment pouvons-nous améliorer la programmation Web à partir de là où nous sommes?" .

Les deux projets tentent de le faire compte tenu

  • langage de programmation (TypeScript fait une étape petite mais très propre, Dart fait le mouvement plus révolutionnaire qui bouge toujours)

  • interopérabilité avec le code js existant (0 transition dans TypeScript qui compile en js, compliquée dans Dart, puisque deux ordinateurs virtuels se parlent)

  • pratiques d'ingénierie logicielle (Dart uniquement, composants Web et shadow shadow)

Au cours des 3 derniers jours, j'ai plongé profondément dans Dart, puis dans TypeScript. Ma base de code CoffeeScript est passée à 2000 lignes de code, trop pour être manipulée avec une belle mais trop moelleuse CoffeeScript. Les problèmes que j’ai rencontrés sont les suivants: manque de fonctionnalités de CoffeeScript dans les langages conçus pour la programmation à moyenne et grande échelle: interfaces, modules, type safety. Mais il y avait un même beaucoup question plus grave avec le café et js: Les js « ce pointeur » bizarreries affecté ma santé mentale et CoffeeScript ne contribue pas à quoi que ce soit ici.

Alors voici mes résultats après 3 jours d’évaluation et d’utilisation:

Dard

Je suis allé à fond dans le tutoriel, en lisant un livre, en parcourant le deuxième livre et en essayant les démos. Je pensais, Dart c'est l'avenir . Ensuite, j'ai essayé de migrer mon application vers Dart. C’est là que mon enthousiasme est passé de 100 à 10. Voici pourquoi:

  1. L' éditeur de fléchettes est le seul moyen de programmer Dart. Bien que les plugins pour Sublime Text existent, ils ne fournissent pas de fonctionnalités telles que intellisense, la complétion de code (corrigez-moi si je me trompe). L'éditeur de fléchettes est toutefois en qualité pré-alpha. Bien qu'il prenne en charge des tâches magiques comme SuperCool, telles que la mise à jour de la page Web lorsque vous modifiez le fichier CSS (! Vraiment cool), il se bloque ou se plante plusieurs fois par minute. Donc, vous tapez 5 lettres et 2 fois vous devez attendre 2 secondes ou 15 secondes entre les saisies. Et j'avais un projet avec quelques lignes de code, donc je ne voulais pas attendre ce qui se passe lorsque des lignes de 1 000 sont dedans. Déplacé un fichier d'un dossier à l'autre dans Dart Editor, crash. Débogageavec l'éditeur de fléchettes, à première vue, c'est mieux que tous les outils de débogage js que je connais (chrome est mon choix), mais il manque encore trop de choses: pas de fenêtre immédiate (cela rend le débogage js bien meilleur pour le moment), pas de surveillance.

  2. Politique et possibilités d'évasion : Certains disent qu'Apple, MS et Firefox ne fourniront jamais de machines virtuelles Dart. Eh bien, je n'en suis pas si sûr, mais au moins pour Apple, cela semble pour le moment très certain. Pour les autres, c'est plus probable que l'inverse. Donc pas de problème, nous pouvons convertir Dart en JavaScript. La façon dont cette intégration fonctionne est vraiment géniale, Dart maintient un stub js qui garde le code js connecté à l'éditeur de fléchettes, de sorte qu'une print()instruction apparaît toujours dans l'éditeur de fléchettes, c'est cool. Mais voici le mais: l'empreinte de ce code converti est grande. 150 Ko ou plus (avant la minification). Je n’ai pas trop creusé dans la taille exacte, alors ne me claque pas là-dessus.

  3. Maturité linguistique . Outre les problèmes trop graves liés à Dart Editor, trois fois par minute, je trouvais inacceptable que toutes les sources de code de Dart que vous trouvez utilisent un autre Dart. La langue change tous les jours. Vous trouvez un post d'il y a 5 semaines? C'est obsolète. Vous essayez les exemples du tutoriel de Google? Au moins 1 exemple ne se compile pas car une API a été modifiée. Même des choses banales, comme attacher un événement à un élément DOM sont en bonne voie .

  4. L'intégration avec les bibliothèques js existantes est un peu compliquée. Deux ordinateurs virtuels doivent communiquer ici, ce qui est délicat.

En conclusion, vous ne pouvez pas utiliser Dart sérieusement à partir d’aujourd’hui, et plonger dedans n’est pas très amusant en raison des points 1 et 3. Les deux points disparaîtront avec le temps. À propos des 2 points, Google a publié il y a quelques jours des tests de performances démontrant que leurs js compilés sont meilleurs que ceux écrits à la main. Mes compliments, excellent travail. Le temps de chargement est peut-être encore en retard à cause du problème d'empreinte, comme dit. Cependant, si le code d'empreinte est utilisé par de nombreux sites, il peut être disponible en cache et le tour est joué, disparaît également.

Donc: je considère Dart comme un projet génial, son utilisation présente pour le moment une bonne part de risque imprévisible et il faudra cette année pour que celui-ci atteigne un bon niveau de stabilité.

Manuscrit

L'évaluation de TypeScript est très facile, prend 1 à 2 heures et vous savez tout. En lisant le document de spécifications linguistiques et un livre court (TypeScript révélé), je savais tout et j'ai commencé à programmer. J'ai ensuite été surpris de constater que les ajouts de JavaScript à TypeScript ne couvrent que tous les besoins sérieux liés à l'amélioration de la programmation de mon client . Voici les faits saillants:

  1. Interfaces . L'encapsulation et les interfaces me permettent de structurer mon code facilement. Parfait!

  2. Etat de classe. . TypeScript permet d’exprimer l’état que les instances d’une classe portent explicitement, ou mieux il l’applique. C'est un grand pas mieux comparé à js ou au café.

  3. thisappelez la folie atténuée . Dans les fonctions de flèche, TypeScript rend le thispointeur semblable à tout citoyen à comportement normal.

  4. Éditeur, Intellisense . TypeScript est livré avec un système intellisense 100% parfait, qui réagit dans la plage des millisecondes ou celle utilisée par Visual Studio lors de la programmation en C #. Les en-têtes TypeScript de toutes les bibliothèques js importantes existent également . Génial super génial

  5. Expérience et risque . Utiliser TypeScript ne comporte aucun risque, le langage est clairement défini, parfaitement stable, c’est juste du JS avec du sucre, rien d’imprévisible.

En fait, ces améliorations me donnent tout ce dont j'avais besoin. La seule chose que j'aimerais voir à l'avenir, ce sont les collections génériques. Mais ce sont des cacahuètes.

Alors qu'en est-il de la performance? Bien que je me considère comme un maniaque de la performance, je ne pense pas qu’il existe un projet qui ferait le choix de la technologie en fonction de la performance. Les deux sont dans la ligue js.

Si vous êtes intéressés par l'avenir de la programmation Web, les deux sont de grands efforts, TypeScript est beaucoup plus pragmatique et utilisable maintenant, Dart est un projet de laboratoire très intéressant qui sera utilisable une fois que des éditeurs matures et des débogueurs seront disponibles et que la portée des projets sera réalisable avec. cela dépendra de la politique.

Dans tous les cas, les 3 jours d'évaluation étaient pour la plupart amusants et j'ai beaucoup appris. Si vous trouvez le temps, il vous faudra 1 jour pour Dart et 2 heures pour que TypeScript vous donne votre propre opinion. Essayez-le

Mise à jour d'octobre 2014

Cela fait longtemps et ex post, il semble que l'hypothèse voulant que Typescript soit la voie la plus sûre et la plus stable était tout à fait juste. Je viens de trouver une déclaration (très) importante sur Typescript, Dart et Closure:

Le défi de la programmation Web dans les grandes entreprises m'intéresse depuis un certain temps. Je pense que Google Closure est toujours la meilleure option pour le développement JavaScript / Web à grande échelle, mais qu'il sera finalement remplacé par quelque chose de moins explicite. Bien que Dart soit très prometteur, je suis toujours consterné par la taille du code JavaScript généré. Par comparaison, si TypeScript peut être traduit directement en JavaScript et compilable à l'aide du mode avancé du compilateur Closure, nous pouvons bénéficier de tous les avantages d'un code JavaScript optimisé à partir de Closure, sans la verbosité. De plus, étant donné que TypeScript est un sur-ensemble de JavaScript, je suis convaincu que ses extensions de syntaxe ont la possibilité de devenir un jour un standard ECMAScript.

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

Michael Bolin est un héro de front-office de google (ex) de longue date (ex), également impliqué dans la fermeture de Google (téléchargez son livre sur la fermeture).

Google Traceur

L'approche de Google pour vivre ECMA Script 6 aujourd'hui est son projet Traceur: https://github.com/google/traceur-compiler

Comparé à Typescript, le support d’outillage est vraisemblablement loin derrière. En revanche, il est beaucoup plus rapide d’adopter des modifications de langage js trop futures, telles que des itérateurs ou des compréhensions.

Flux Facebook, Google AtScript

fournir des fonctionnalités similaires à TypeScript.

"On peut se demander ce qui se passe avec ces différentes solutions de vérification de type JavaScript et ce qu'il faut faire. Une bonne nouvelle est que Microsoft, Facebook et Google collaborent sur ces solutions, selon Jonathan Turner, de Microsoft:

L’équipe TypeScript collabore avec les équipes Flow et AtScript afin de s’assurer que les ressources déjà créées par la communauté de typage JavaScript peuvent être utilisées avec ces outils. Beaucoup de projets peuvent apprendre les uns des autres, et nous sommes impatients de travailler ensemble pour créer les meilleurs outils possibles pour la communauté JavaScript. À long terme, nous travaillerons également à incorporer les meilleures fonctionnalités de ces outils dans ECMAScript, la norme derrière JavaScript. "

article infoq sur le flux fb

citykid
la source
J'attendrais que Google commence à utiliser Dart pour la majorité de ses propres projets (le cas échéant) - commence à manger sa nourriture pour chien en d'autres termes. De plus, Dart ressemble à Silverlight, mais sans la partie XAML, un seul langage, mais une meilleure intégration avec JS / HTML.
Den
1
Oui, Dart est quelque chose du laboratoire que nous pouvons surveiller et attendre dans le futur, alors que Typescript est prêt pour le développement professionnel maintenant. Donc, comparer Typescript à Dart, c'est comparer des pommes à des plants d'orange.
citykid
7
Ce fut une réponse très perspicace. Merci de l'avoir écrit.
Darshan Sawardekar
2
aucune idée de la manière dont le script dactylographique "corrige" le thiscontexte, car il vous reste à lier les fonctions de rappel déclarées à l'intérieur des méthodes au thiscontexte de la méthode afin d'accéder aux attributs de classe. Comment est-ce que "réparer" quelque chose?
nurettin
1
point valide. alors que la liaison est encore parfois nécessaire, elle contient un alias dans les fonctions de flèche , de sorte que le problème est au moins atténué.
citykid
17

Citant Scott Hanselman:

Les gens ont comparé TypeScript à Dart. C'est comparer des pommes à des carburateurs. TypeScript s'appuie sur JavaScript pour éviter les problèmes d'interopérabilité JS. Dart est une machine virtuelle native écrite à partir de zéro. Dart interops avec JavaScript ... mais ce n'est pas JS. Il n'utilise même pas le type de numéro JavaScript par exemple.

De Pourquoi TypeScript a-t-il été la réponse à quelque chose?

M. Dudley
la source
8
Je suis un peu confus honnêtement. TypeScript n'est pas vraiment JS non plus, non? var x = {}; x.foo = 5; //Doesn't work in typescriptet var e = window.event ? window.event : e; //Doesn't work in typescriptL'exemple ci-dessus va échouer le compilateur TypeScript. Est-ce que je manque quelque chose? Je ne peux pas simplement "déposer" mon code JavaScript et utiliser des types lorsque j'en ai envie. Je dois apprendre une nouvelle syntaxe et tout structurer avec des types.
aikeru
@aikeru Hmmm, vous avez raison. Il semble éliminer une partie de la grandeur de JS. J'allais utiliser ce nouvel outil, mais je réfléchis maintenant.
Chev
3
Être en désaccord. C'est comme comparer des pommes à des poires ou des carburateurs à une injection de carburant. Il y a beaucoup de choses à propos de ces deux choses qui amènent naturellement beaucoup de gens à y penser en même temps.
hippietrail
Pour mémoire, ça marche var x = {}; x['foo'] = 5;et ça marche aussi var y:any = {}; y.foo = 5;, mais j'ai été un peu surpris de constater que vous avez raison à ce sujet - le type de perçu {}est {}plutôt que any. Peut-être un problème d'inférence de type. J'ai posté le problème ici - nous verrons comment ils réagiront.
mindplay.dk
3

J'ai dû participer à cette discussion avec mes propres conclusions ces derniers temps.

1er: TypeScript

MS a adopté une approche intéressante dans le fait que vous pouvez facilement entrer et sortir de TS et JS. Nous utilisons principalement AngularJS pour notre développement et avons trouvé peu de documentation pour convertir Angular en TypeScript. L’intégration de TypeScript dans notre flux de développement a été un ajout précieux.

2ème: fléchette

Dart est une étape ironique pour Google. Peut-être ne se souviennent-ils pas d’activeX et de tous les cauchemars qui ont été tentés pour faire en sorte qu’une application fonctionne dans quoi que ce soit autre que le redoutable IE 5 ou IE 6 du jour. Il a fallu plusieurs années à la SP pour se remettre de ces jours.

Dart en tant que langage "conceptuellement" semble essayer de combiner certaines fonctionnalités intéressantes de la programmation orientée objet. Les annotations, etc. sont une bonne idée pour Javascript.

Le problème, il est difficile d’imaginer assez de bande passante pour créer un nouvel éditeur, un nouveau langage, de nouveaux serveurs virtuels sur plusieurs navigateurs, des plugins pour d’autres IDE, un compilateur pour convertir en javascript (sans avoir plusieurs Mo), pour convertir ou créer de nouvelles bibliothèques de dart en remplacer les milliers de bibliothèques js actuelles, demander à quelqu'un de choisir des polymères ou des directives, convertir le site dartlang pour utiliser dart, voilà ce que je peux penser par cœur.

Le concept d'essayer d'utiliser Dart dans n'importe quoi mais une application triviale en ce moment est effrayant.

En plus de tout cela, l'ES6 n'est pas loin. ES6 apporte de nombreuses fonctionnalités que Dart tente de corriger et qui existent dans ES5. Quelle sera la proposition de valeur une fois que l'ES6 sera dans les rues? Au moins pour le moment, le seul changement à faire dans TypeScript une fois que ES6 sera disponible est peut-être de choisir une compilation différente à cibler.

Juste pour éclaircir quoi que ce soit que je sois un pro de la SP. MS fabrique des produits décents et a fait de grands progrès pour corriger les erreurs du passé avec la communauté des logiciels libres. Je varie toujours utiliser rarement autre chose que TypeScript de MS.

code
la source