TypeScriptとDartの違い[終了]


85

マイクロソフトは最近、JavaScriptに似た新しいプログラミング言語であるTypescriptを発表しました。少し前に、パフォーマンス、スケーラビリティなどのJavascriptに関連する問題を解決するためにGoogleが作成した新しいプログラミング言語であるDartについて聞きました。

両方の新しい言語の目的は私には同じように見えます。

言語の目的は同じですか?

それらの本当の違いは何ですか?


こちらのディスカッションをご覧ください: Programmers.stackexchange.com/questions/166978/…–
diadiora

回答:


60

Bob Nystromの引用:

TypeScriptは、JSセマンティクスが好きな場合や、投資対象の大きなJSコードベースを持っているが、大規模なメンテナンスの問題がある場合に便利です。JSと後方互換性があるため(大抵の場合?)、成功への道はずっとスムーズです。

Dartはより危険な賭けをしています。多くの点でJSから遠く離れていますが、これは日常のDartプログラマーとしてはたいてい良いと思いますが、参入の障壁が高くなります。しかし、エントリのそのより高い障壁の見返りに、あなたは得る:

  • 木の揺れ
  • ゲッターとセッター(TypeScriptは最終的にそれらを取得すると思いますが)
  • 演算子のオーバーロード
  • 実際のブロックスコープ、無巻き上げ、無生命維持用
  • ネイティブVM
  • 健全な平等セマンティクス
  • 奇妙な暗黙の変換狂気はありません
  • thisどこでも字句的にバインド
  • ミックスイン
  • 注釈
  • インポートシステム
  • ユーザー定義の添字演算子
  • 具象化されたジェネリック
  • より良いコレクションクラス
  • よりクリーンなDOM API

また、彼はhttp://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript/c6g37xdに次のように書いています

私はGoogleのDartチームに所属しているため、その角度/バイアスから自然に見ています。ここに私の目を引いたいくつかのランダムなものがあり、主にそれをDartと比較しています。私はスキミングに数分しか費やしていないので、これをあまり真剣に受け取らないでください...

ジェネリックなし

一部のタイプは、まったくタイプがないよりも優れていると思いますが、それらを失うのは非常に困難です。TypeScriptには組み込みの配列型があり、オブジェクト型は「マップ」型のユースケースの一部をカバーしています。しかし、独自のジェネリック型を定義できないのはドラッグです。ドキュメントは、追加されたときにジェネリックが型消去を使用して機能すると言います。これは、「軽量JSにコンパイルする」スタイルであると考えられますが、それも苦痛です。実行時に型引数を使用できることがあると便利です。

すべてのタイプはヌル可能です

Dartも同じです。どちらの場合も悲しくなります。

型注釈の構文は素晴らしい

オプションの型注釈(ML、Scala、F#、Kotlinなど)を使用するほとんどすべての言語は、「:の後の接尾辞」を使用します。特に関数型の構文:

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

インターフェイスは構造的に型付けされ、クラスは通常型付けされます

JavaScriptであることを考えると理にかなっていますが、かなりきれいに見えます。インターフェイスを暗黙的に実装できるのは素晴らしいことです。しかし、TypeScriptを使用すると、他の方法を使用することはできません。クラスを指定すると、ブランドなどの理由で具体的に拡張しないと、クラスと互換性のある新しい型を作成できません。Dartでは、暗黙的なインターフェイスのおかげで、できます。

最も一般的なタイプは失敗する可能性があります

これは型エラーであることを意味します。

[1, true]

パラメーターシグネチャによってインターフェイスをオーバーロードできます

これは、動的な型の切り替えを行う関数呼び出しを介して、より正確な型推論フローを実現する方法を提供するため、非常に便利です。例えば:

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

これにより、コンパイラがdoubleの呼び出しを検出すると、推測された引数の型に基づいて正確な戻り値の型を正しく提供できます。私が確信していないのは、そのインターフェースを実装し、型チェッカーを幸せにするクラスを実際に実装する方法です。実際に具体的なメソッドをオーバーロードすることはできません。また、動的な型チェックによってそれを幸せにする5分間の試みは機能しなかったようです。

配列型専用の構文があります

ジェネリックがないので理にかなっています。それはまた素晴らしく簡潔であり、それは良いことですが、私は個人的には一回限りの特別なケースのコレクションよりも汎用ジェネリックを好みます。

暗黙のダウンキャストはありません

Dartのより珍しいタイプシステム機能の1つは、割り当ての互換性が双方向であることです。警告なしでダウンキャストできます。(他の言語では動的に)割り当て/割り当てを行うという典型的な特別な場合を除き、TypeScriptはそれを許可しません。assertと入力する必要があります。個人的には、ここでTypeScriptのアプローチが好きです。

矢印関数とレキシカルthis

これは単なる母性とアップルパイです。私はそれが好きです。(Dartにもこれがあり、これは常に字句的にバインドされています。)

全体的に、かなりきれいに見えます。まったく同じJSセマンティクス(良い面と悪い面)が必要であるが、型の分散も必要な場合、TypeScriptは適切なようです。Closure Compilerに似ていますが、構文は改善されています。

JSの構文とセマンティクスからより積極的な一歩を踏み出したものが必要な場合、TypeScriptはそうではないようです。


17
木の揺れとは何ですか?
citykid

4
:揺れツリーの詳細についてはblog.sethladd.com/2013/01/...
セス・ラッド

19
「ダーツツールは未使用のコードを「シェイク」する手法であるツリーシェークをサポートするため、デプロイされたアプリケーションのサイズが縮小されます。生成された出力で。」thx
citykid

3
プレビュー状態では、Typescriptは明日出荷されるプロのプロジェクトでの使用に最適な形になっています。言語とツールは、深刻な問題もなく、またはまったく問題なく動作します。
citykid

4
@JustAnotherUserYouMayKnowOrNotが指摘したように、TypeScriptは0.9blogs.msdn.com/b/typescript/archive/2013/06/18/…にジェネリックを追加しました
Jon

60

質問は「言語の目的は同じですか?」でしたが、本当の質問は次のとおりです。

両方のプロジェクトは、これを考慮してこれを実行しようとします

  • プログラミング言語(TypeScriptは小さくても非常にクリーンなステップを実行し、Dartはまだ革新的な動きをします)

  • 既存のjsコードとの相互運用性(jsにコンパイルされるTypeScriptの0遷移、2つのVMが相互に通信するためDartで複雑)

  • ソフトウェアエンジニアリングの実践(ダーツのみ、Webコンポーネント、シャドウdom)

過去3日間、私はDartに深く入り込み、次にTypeScriptに飛び込みました。私のCoffeeScriptコードベースは2000年代のコード行に行きましたが、あまりにも美しいCoffeeScriptで処理するには多すぎます。私が直面した問題は、CoffeeScriptには、中規模から大規模のプログラミング用に設計された言語が持つ機能、インターフェース、モジュール、型安全性が欠けているということでした。しかし、コーヒーとjsにはさらに深刻な問題が1つありました。jsの「このポインター」の奇妙さは私の健全性に影響を与え、CoffeeScriptはここでは何も助けません。

だからここで3日間の評価と使用後の私の結果:

ダーツ

1冊の本を読み、2冊目の本をざっと読んで、デモを試して、チュートリアルを徹底的に行った。私は、将来のあるダートを考えました次に、アプリをDart に移行しようとしました。それが私の熱意が100から10に下がったことです。

  1. ダートエディタはダートをプログラムするための唯一の方法です。Sublime Textのプラグインは存在しますが、インテリセンス、コード補完(間違っている場合は修正してください)などの機能は提供しません。ただし、Dart Editorはプレアルファ品質です。CSSファイルを編集するときにWebページを更新するなどの超クールな魔法をサポートしていますが(!とてもクール)、1分間に数回ハングまたはクラッシュします。したがって、5文字を入力し、2回入力するまでに2秒または15秒待つ必要があります。そして、私はコードのいくつかの行でプロジェクトを持っていたので、1000行が入っているときに何が起こるかを待ちたくありませんでした。デバッグDart Editorを使用すると、私が知っているすべてのjsデバッグツールよりも一見優れています(クロームが選択です)。

  2. 政治と脱出の可能性:Apple、MS、FirefoxがDart VMを提供することは決してないと言う人もいます。さて、私はあまり確信していませんが、少なくともAppleにとっては、現時点では非常に確実です。他の人にとっては反対よりも可能性が高い。だから問題ありません、DartをJavaScriptに変換できます。この統合の仕組みは本当に素晴らしいです。Dartは、jsコードをDart Editorに接続したままにするjsスタブを維持しているので、Dart Editorにprint()ステートメントが表示されます。しかし、ここに来ますが、そのような変換されたコードのフットプリントは高いです。150kB程度(縮小前)。私は正確なサイズをあまり掘り下げていなかったので、これに気をつけないでください。

  3. 言語の成熟度。Dart Editorが1分間に3回顔を出すという深刻すぎる問題に加えて、見つけたDartコードに関するすべてのソースが異なるDartを使用していることも受け入れられないことがわかりました。言語は毎日変わります。5週間前の投稿を見つけましたか?時代遅れです。Googleチュートリアルのサンプルをお試しですか?APIが変更されたため、少なくとも1つのサンプルはコンパイルされません。DOM要素へのイベントの添付などのありふれたものでさえ、順調に進んでいます。

  4. 既存のjsライブラリとの統合は少し複雑です。2つのVMがここで通信する必要があるため、注意が必要です。

結論として、今日の時点でDartを真剣に使用することはできません。1と3のため、Dartに飛び込むことはあまり面白くありません。両方のポイントは時間が経つと消えます。2点について、Googleは数日前にコンパイルされたjsが手書きjsよりも優れていることを示すパフォーマンスベンチマークを公開しました。私の賛辞、素晴らしい仕事。前述のように、フットプリントの問題により、ロード時間はまだ遅れている可能性があります。ただし、フットプリントコードが多くの多くのサイトで使用されると、キャッシュされて利用可能になる可能性があり、消えます。

だから、私はDartを素晴らしいプロジェクトだと考えています。現時点でそれを使用することは予測不可能なリスクのかなりの部分を伴います。

TypeScript

TypeScriptの評価は非常に簡単で、1〜2時間かかり、すべてを知っています。言語仕様のドキュメントとTypeBookが明らかにした短い本を読んで、すべてを知ってプログラミングを始めました。TypeScriptがJavaScriptに追加されたことで、クライアントプログラミングを強化するために必要なすべての深刻なニーズが満たされたことに驚きました。ここでのハイライト:

  1. インタフェース。カプセル化とインターフェイスにより、コードを簡単に構築できます。パーフェクト!

  2. クラス状態。。TypeScriptを使用すると、クラスのインスタンスが明示的に保持する状態を表現できます。これは、jsやコーヒーに比べて大きなステップです。

  3. this狂気を軽減します。矢印関数の内部では、TypeScriptはthis通常動作する市民のようにポインターを作成します。

  4. 編集者、インテリセンス。TypeScriptには、C#のプログラミング時にVisual Studioで使用されるマイクロ秒またはミリ秒の範囲で反応する100%最高の完全なインテリセンスが付属しています。すべての重要なjsライブラリの TypeScriptヘッダーも存在します。すごいすごい。

  5. 経験とリスク。TypeScriptを使用するとリスクがゼロになり、言語が明確に定義され、完全に安定します。それは単なる糖のjsであり、予測不可能なことは何もありません。

実際、これらの機能強化により、必要なものはすべて提供されます。私が将来見たいのは、ジェネリックコレクションだけです。しかし、それはピーナッツです。

それでは、パフォーマンスはどうですか?私は自分自身をパフォーマンスがおかしいと考えていますが、ここではパフォーマンスに基づいてテクノロジーを選択するプロジェクトがあるとは考えていません。両方ともjsリガにあります。

Webプログラミングの将来に興味がある場合は、両方とも多大な労力を費やします。TypeScriptはより実用的で使いやすく、Dartは非常に興味深いラボプロジェクトであり、成熟したエディターとデバッガーが利用可能になり、それは政治に依存します。

いずれにせよ、3日間の評価はおもしろく、私は多くのことを学びました。時間を見つければ、Dartで1日、TypeScriptで自分の意見を述べるのに2時間かかります。それを試してみてください。

2014年10月に更新

しばらくして、事後的には、Typescriptが安全で安定したルートであるという仮定は非常に正しかったようです。Typescript、Dart、およびClosureに関する(非常に)顕著なステートメントを見つけました。

大規模なWebプログラミングの課題にかなり長い間興味を持っています。Google Closureは現在でも大規模なJavaScript / Web開発の最良の選択肢であると考えていますが、最終的には冗長性の低いものに置き換えられるでしょう。Dartにはかなりの見込みがありますが、生成されるJavaScriptのサイズにはまだがっかりします。比較により、TypeScriptをClosure Compilerの拡張モードを使用してコンパイルできるJavaScriptに直接変換できる場合、冗長性なしにClosureから最適化されたJavaScriptのすべての利点を得ることができます。さらに、TypeScriptはJavaScriptのスーパーセットであるため、その構文拡張機能はある時点でECMAScript標準に準拠する可能性があると考えています。

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

Michael Bolinは長い間(ex)google(ex)fbのフロントエンドヒーローであり、Googleの閉鎖にも関与しています(閉鎖に関する本を入手してください)。

Google Traceur

今日のライブECMA Script 6に対するGoogleの評価は、Traceurプロジェクトです:https : //github.com/google/traceur-compiler

Typescriptと比較して、ツールのサポートは今日の時点でおそらくはるかに遅れています。しかし、良い面としては、イテレーターや内包表記などの非常にクールな将来のjs言語拡張機能を採用する方がはるかに高速です。

Facebook Flow、Google AtScript

TypeScriptと同様の機能を提供します。

「これらの異なるJavaScriptタイプチェックソリューションには何があるのか​​、それについて何をすべきか疑問に思われるかもしれません。

TypeScriptチームは、FlowタイピングチームとAtScriptチームの両方と協力して、JavaScriptタイピングコミュニティによって既に作成されたリソースをこれらのツールで使用できるようにします。これらのプロジェクトは互いに学ぶことができますが、今後一緒に仕事をし、JavaScriptコミュニティに最適なツールを作成することを楽しみにしています。長期的には、これらのツールの最高の機能をJavaScriptの標準であるECMAScriptに組み込むことにも取り組んでいます。

fbフローに関するinfoqの記事


Googleが自身のプロジェクトの大部分(該当する場合)でDartの使用を開始するまで待ちます-つまり、ドッグフードを食べ始めます。また、DartはSilverlightのように聞こえますが、XAML部分はなく、たった1つの言語ですが、JS / HTMLとより良く統合されています。
デン

1
はい、Dartはラボ内で将来見ることができるものであり、Typescriptは現在、専門的な開発の準備ができています。したがって、TypescriptとDartを比較することは、リンゴとオレンジの実生を比較することです。
citykid

7
これは非常に洞察に満ちた答えでした。書いてくれてありがとう。
ダーシャンサワルデカール

2
クラス属性にアクセスするにthisは、メソッド内で宣言されたコールバック関数をメソッドのthisコンテキストにバインドする必要があるため、typescriptがコンテキストをどのように「修正」するかわかりません。それはどのように何かを「修正」していますか?
nurettin

1
有効なポイント。一方で、バインドが まだ時々必要とされ、 これがエイリアスされ、矢印関数内なので、問題が少なくとも緩和されます。
citykid 14

17

スコット・ヘンゼルマンの引用:

人々はTypeScriptをDartと比較しています。それはリンゴとキャブレターを比較している。TypeScriptはJavaScript上に構築されるため、JS相互運用の問題はありません。Dartは、ゼロから作成されたネイティブ仮想マシンです。DartはJavaScriptと相互運用しますが、JSではありません。たとえば、JavaScriptの数値型さえ使用しません。

なぜ活字体は何の答えも持っていますか?


8
私は正直に少し混乱しています。TypeScriptもJSではありませんよね?var x = {}; x.foo = 5; //Doesn't work in typescriptそして、var e = window.event ? window.event : e; //Doesn't work in typescript上記の例はTypeScriptコンパイラに失敗します。何か不足していますか?JavaScriptを「ドロップイン」して、好きなときに型を使用することはできません。新しい構文を学び、すべてを型で構成する必要があります。
アイケル

@aikeruうーん、あなたは正しいです。JSの偉大さの一部を排除するように見えます。この新しいツールを使用するつもりでしたが、今は考え直しています。
CHEV

3
同意しない。リンゴと梨、キャブレターと燃料噴射を比較するようなものです。これら2つについては、多くの人が自然に同時にそれらについて考えるようになる多くのことがあります。
ヒッピートレール

記録のために、この作品var x = {}; x['foo'] = 5;、これはあまりにも行いますvar y:any = {}; y.foo = 5;が、私はあなたがこのことについて正しいを見つけるには少し驚いた-の知覚種類が{}ある{}のではなくany。型推論の問題である可能性があります。私はここに問題を投稿しました -彼らがどのように反応するか見てみましょう。
mindplay.dk

3

最近、私自身の発見でこの議論をチャイムしなければならなかった。

1番目:TypeScript

MSは、TSおよびJSに簡単に出入りできるという点で優れたアプローチを採用しています。私たちは主に開発にAngularJSを使用していますが、AngularをTypeScriptに変換するためのドキュメントはほとんどありませんでした。TypeScriptを開発ワークフローに組み込むことは素晴らしい追加でした。

2位:ダーツ

Dartは、Googleにとって少し皮肉なステップです。たぶん、彼らはactiveXと、その日の恐ろしいIE 5またはIE 6以外でアプリケーションを動作させようとする悪夢のすべてを覚えていないかもしれません。MSがその日から回復するのに何年もかかりました。

「概念的に」言語としてのDartは、いくつかの素晴らしいOOP機能を組み合わせようとしているようです。注釈などは、Javascriptにとって良い考えです。

問題は、新しいエディター、新しい言語、ブラウザー間での新しいvm、他のIDEのプラグイン、javascriptに変換するコンパイラー(サイズを複数メガにすることなく)、新しいdartライブラリーを作成または作成するのに十分な帯域幅を想像するのが難しいことです現在の数千のjsライブラリを置き換え、誰かにポリマーまたはディレクティブを決定させ、dartlangサイトをdartを使用するように変換します。これは頭の中で思いつくことです。

現時点では、些細なアプリ以外でDartを使用しようとするという概念は怖いです。

このすべての上に、ES6は遠くありません。ES6には、ES5に存在するDartが修正しようとしている多くの機能が搭載されています。ES6が発売されると、価値提案はどうなりますか?少なくとも現時点では、ES6がリリースされた後にTypeScriptで行う必要がある唯一の変更は、ターゲットに別のコンパイルを選択することです。

ただ私がプロのMSパーソンであることを明確にするためです。MSはまともな製品を製造し、OSSコミュニティとの過去の過ちを修正するために大きな進歩を遂げました。MSのTypeScript以外を使用することはめったにありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.