マイクロソフトは最近、JavaScriptに似た新しいプログラミング言語であるTypeScriptを発表しました。少し前に、パフォーマンス、スケーラビリティなどのJavascriptに関連する問題を解決するためにGoogleが作成した新しいプログラミング言語であるDartについて聞いたことがあります。
両方の新しい言語の目的は私には同じようです。どう思いますか?
言語の目的は同じですか?
それらの本当の違いは何ですか?
引用 Bob Nystrom :
TypeScriptは、JSのセマンティクスが好きな場合、または投資した大きなJSコードベースを持っているが、大規模なメンテナンスの問題が発生している場合に適しています。 JSと下位互換性があるため(ほとんどの場合)、成功への道ははるかにスムーズです。
ダートは危険な賭けをしています。それは多くの点でJSから遠いので、ほとんどの場合、毎日のDartプログラマーとしては優れていますが、エントリーの障壁が高くなります。しかし、そのより高い参入障壁の見返りとして、以下が得られます。
- 木の揺れ
- ゲッターとセッター(TypeScriptは最終的にそれらを取得すると思いますが)
- オペレーターの過負荷
- 実際のブロックスコープ、巻き上げなし、なし [〜#〜] iife [〜#〜] s
- ネイティブVM
- 正気平等セマンティクス
- 奇妙な暗黙の変換狂気はありません
- 字句的にバインドされている
this
すべての場所- ミックス
- 注釈
- 輸入制度
- ユーザー定義の添え字演算子
- 具体化 によるジェネリック
- 鏡
- より良いコレクションクラス
- よりクリーンなDOM API
また、彼は http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_TypeScript/c6g37xd :
私はGoogleのダーツチームに所属しているので、自然にその角度/バイアスから見ています。ここに私の目を引いたいくつかのランダムなものがあり、ほとんどがダートと比較されます。スキミングは数分しか行っていないので、あまり真剣に受け止めないでください...
ジェネリックなし
一部のタイプはタイプがないよりも良いと思いますが、それらを失うのは本当に大雑把です。 TypeScriptには組み込みの配列型があり、オブジェクト型は「マップ」型のユースケースの一部をカバーしています。しかし、独自のジェネリック型を定義できないのは、厄介です。ドキュメントを追加すると、ジェネリックスは型消去を使用して機能するようになると言われています。これは、「軽量のJSにコンパイルする」スタイルを想定すると予想されますが、これも面倒な場合があります。実行時に型引数を使って処理できるのは素晴らしいことです。
すべてのタイプはnull可能です
ダーツも同じです。どちらの場合も私を悲しくさせます。
型注釈構文はニースです
オプションの型注釈を持つほとんどすべての言語(ML、Scala、F#、Kotlinなど)は、「:の後にpostfixを付けます。Dartは、Cスタイルの型注釈を使用しようとします。特に関数型の構文:
function takeCallback(callback : (n : number) => number) { ... }
インターフェイスは構造的に型付けされ、クラスは名目上型付けされます
それがJavaScriptであることを考えると理にかなっていますが、それはかなりすっきりしているようです。暗黙的にインターフェースを実装できることは素晴らしいことです。しかし、TypeScriptは他の方法では利用できないようです。クラスを考えると、ブランドの関係で具体的に拡張しないと、互換性のある新しい型を作成することはできません。 Dartでは、暗黙のインターフェースのおかげで、それが可能です。
最も一般的なタイプは失敗する可能性があります
これはタイプエラーであることを意味します。
[1, true]
パラメータシグネチャによってインターフェイスでオーバーロードできます
これは、動的な型切り替えを行う関数呼び出しを介して、より正確な型推論フローを提供する方法を提供するので、本当にすばらしいです。例えば:
interface Doubler { double(s : string) : string; double(n : number) : number; }
これにより、コンパイラはdoubleの呼び出しを検出すると、推定された引数の型に基づいて正確な戻り型を正しく提供できます。そのインターフェイスを実装し、型チェッカーを幸せにするクラスを実際に実装する方法がわからない。実際に具象メソッドをオーバーロードすることはできません。動的な型チェックによってそれを満足させる5分間の試みは機能していないようです。
配列型には専用の構文があります
ジェネリックがないので意味があります。ナイスで簡潔なのもいいですが、個人的には、1回限りの特別なケースコレクションよりも汎用のジェネリックを好みます。
暗黙のダウンキャストはありません
Dartのより珍しい型システム機能の1つは、割り当ての互換性が双方向であることです。警告なしにダウンキャストできます。 TypeScriptは、(他の言語では動的)に割り当てたり割り当てたりするという通常の特別な場合を除いて、それを許可しません。アサートと入力する必要があります。個人的には、ここではTypeScriptのアプローチが好きです。
矢印関数と字句this
これは単なる母性であり、Appleパイです。私はそれが好きです(Dartにもあり、これは常に字句的にバインドされています)。
全体的に、それはかなりきれいに見えます。まったく同じJSセマンティクス(良い点と悪い点)が必要で、タイプの分割も必要な場合は、TypeScriptはまともです。 Closure Compilerに似ていますが、構文が優れています。
JSの構文とセマンティクスからさらに積極的なステップが必要な場合、TypeScriptはそうではないようです。
質問は「言語の目的は同じですか?」でしたが、本当の質問は次のとおりです:「どこからWebプログラミングをより良くできるか?」。
どちらのプロジェクトもこれを考慮して
プログラミング言語(TypeScriptは、小さいながらも非常にクリーンなステップを実行します。ダートは、まだ革新的な動きを続けています)
既存のjsコードとの相互運用性(2つのVMが互いに通信するため、jsにコンパイルされるTypeScriptの0遷移、Dartでは複雑)
ソフトウェアエンジニアリングプラクティス(Dartのみ、WebコンポーネントおよびシャドウDOM)
過去3日間で、DartとTypeScriptの両方に飛び込みました。私のCoffeeScriptコードベースは、2000年代のコード行に移行しましたが、素敵でありながらもふわふわしたCoffeeScriptで処理するには多すぎます。私が直面した問題は、CoffeeScriptには、中規模から大規模のプログラミング用に設計された言語に備わっている機能(インターフェース、モジュール、タイプセーフティ)がないことです。しかし、コーヒーとjsでさらに1つのはるかに深刻な問題がありました:js "this pointer"の奇妙さが私の正気に影響し、CoffeeScriptはここでは何の助けにもなりません。
だからここに3日間の評価と使用後の私の結果:
チュートリアルを徹底的に読み、1冊の本を読み、2冊目の本を読み飛ばし、デモを試しました。私は考え、未来のダートを考えました。 次に、アプリをダートに移行しようとしました。それが私の熱意が100から10に下がったときでした。理由は次のとおりです。
Dart EditorがDartをプログラミングする唯一の方法です。 Sublime Textのプラグインは存在しますが、インテリセンス、コード補完などの機能は提供していません(間違っている場合は修正してください)。ただし、ダーツエディターはプレアルファ品質です。 CSSファイルを編集するときにWebページを更新するなど、非常に優れた魔法の機能をサポートしていますが(本当にクールです)、1分間に数回ハングまたはクラッシュします。つまり、5文字入力し、2回入力するまでに2秒または15秒待つ必要があります。そして、私はいくつかのコード行を含むプロジェクトを持っていたので、数千行が入ったときに何が起こるのか待ちたくありませんでした。DartEditor内の1つのフォルダーから別のフォルダーにファイルを移動すると、クラッシュしました。 Dart Editorを使用したデバッグは、一見したところ、私が知っているすべてのjsデバッグツールより優れています(クロムが私の選択です)が、不足していることが多すぎます:即時ウィンドウなし(これにより、現時点でjsデバッグが大幅に改善されます)、監視なし。
政治と脱出の可能性:Apple、MS、FirefoxがDart VMを決して提供しないと言う人もいます。そうですね、確かではありませんが、少なくともAppleの場合、これは現時点では非常に確実に表示されます。他の人にとってはその逆の可能性が高いです。したがって、問題ありません。DartをJavaScriptに変換できます。 。この統合の仕組みは非常に優れており、DartはjsコードをDartエディターに接続したままにするjsスタブを維持しているため、print()
ステートメントがDartエディターに引き続き表示されます。そのような変換されたコードのフットプリントは高いです(150kB程度(縮小前))正確なサイズをあまり掘り下げなかったので、これに固執しないでください。
言語の成熟度。 Dart Editorが1分間に3回顔に突き刺さるというあまりにも深刻な問題のほかに、見つけたDartコードに関するすべてのソースが異なるDartを使用していることも受け入れられません。言語は毎日変わります。 5週間前の投稿を見つけましたか?時代遅れです。 Googleチュートリアルのサンプルを試しますか? APIが変更されたため、少なくとも1つのサンプルがコンパイルされません。イベントをDOM要素にアタッチするなどのありふれたもの 順調に進んでいます 。
既存のjsライブラリとの統合は少し複雑です。 2つのVMはここで通信する必要があります。
結論として、今日の時点でDartを真剣に使用することはできません。1と3のため、Dartに飛び込むことはそれほど楽しいことではありません。どちらのポイントも時間の経過とともに消えます。 2ポイントについて、Googleは数日前にパフォーマンスベンチマークを公開し、コンパイルされたjsが手書きのjsよりも優れていることを実証しました。お世辞、素晴らしい仕事。前述のフットプリントの問題により、読み込み時間がまだ遅れている可能性があります。ただし、フットプリントコードが多くの多くのサイトで使用されている場合は、キャッシュに入れて使用できる可能性があるため、消えてしまいます。
だから:私はダートは素晴らしいプロジェクトだと思っています。現時点でそれを使用すると、予測不可能なリスクのかなりの部分が発生し、今年はそれが良好な安定レベルに達するまでにかかります。
TypeScriptの評価は非常に簡単で、1〜2時間かかり、すべてを知っています。 言語仕様ドキュメント と短い本(TypeScriptが明らかにされた)を読んで、私はすべてを知ってプログラミングを始めました。 次に、JavaScriptへのTypeScriptの追加が、クライアントプログラミングを強化する必要があるすべての深刻なニーズを満たすだけであることに驚いた。ここでのハイライト:
インターフェイス。カプセル化とインターフェイスにより、コードを簡単に構成できます。パーフェクト!
クラスの状態。。 TypeScriptを使用すると、クラスのインスタンスが明示的に運ぶ状態、またはそれを強制する状態を表現できます。これは、jsやコーヒーに比べて大きなステップです。
this
呼び出しクレイジーを緩和しました。矢印関数の内部では、TypeScriptはthis
ポインターを通常の動作をする市民のように作成します。
エディター、Intellisense。 TypeScriptには、C#のプログラミング時にVisual Studioから使用されるマイクロまたはミリ秒の範囲で反応する100%最高のインテリセンスが付属しています。 TypeScriptヘッダー すべての重要なjsライブラリが存在する場合 。すごい。
経験とリスク。 TypeScriptを使用してもリスクはゼロであり、言語は明確に定義されており、完全に安定しています。砂糖を含むjsであり、予測できないことはありません。
実際、これらの機能強化により、必要なすべてが得られます。将来見たいのは、ジェネリックコレクションだけです。しかし、それはピーナッツです。
では、パフォーマンスについてはどうでしょうか?私はパフォーマンスの変人だと思いますが、ここではパフォーマンスに基づいてテクノロジーを選択するプロジェクトはないと思います。どちらもjs ligaにあります。
Webプログラミングの将来に興味がある場合は、両方とも大変な努力です。TypeScriptはより実用的で現在使用可能です。Dartは非常に興味深いラボプロジェクトであり、成熟したエディターとデバッガーが利用可能になり、プロジェクトの範囲がそれは政治に依存します。
いずれにせよ、3日間の評価はほとんど楽しいものでした。多くのことを学びました。時間を見つけた場合、Dartが1日、TypeScriptがあなた自身の意見を述べるのに2時間かかります。それを試してみてください。
久しぶりで、TypeScriptが安全で安定したルートであるという仮定は正しかったようです。 TypeScript、Dart、Closureについて(非常に)目立つステートメントを見つけました。
かなり前から、大規模なWebプログラミングの課題に興味を持っていました。 Google Closureは今でも大規模なJavaScript/Web開発に最適なオプションだと思いますが、最終的には冗長性の低いものに置き換えられます。 Dartはかなりの期待を示していますが、それでも、Dartが生成するJavaScriptのサイズには驚かされます。比較すると、TypeScriptを、Closure Compilerの拡張モードを使用してコンパイルできるJavaScriptに直接変換できる場合、冗長性なしでClosureから最適化されたJavaScriptのすべての利点を得ることができます。さらに、TypeScriptはJavaScriptのスーパーセットであるため、その構文拡張機能がECMAScript標準になる可能性があると信じていますが、Dartがすべての主要なブラウザーでネイティブにサポートされる可能性はかなり低いと思います
http://blog.bolinfest.com/2013/01/generating-google-closure-javascript.html
Michael Bolinは長い間(ex)google(ex)fbフロントエンドのヒーローであり、Googleのクロージャにも関与しています(クロージャに関する彼の本を入手してください)。
今日ECMAスクリプト6を実行するGoogleのアプローチは、そのTraceurプロジェクトです https://github.com/google/traceur-compiler
TypeScriptと比較して、ツールのサポートはおそらく今日のところはるかに遅れています。ただし、イテレータや内包表記など、非常にクールな将来のjs言語拡張機能を採用する方が、much速くなります。
typeScriptと同様の機能を提供します。
「これらのさまざまなJavaScript型チェックソリューションの内容とそれに対する対処法について疑問に思うかもしれません。MicrosoftのJonathan Turner氏によると、Microsoft、Facebook、およびGoogleがこれらに協力しているといいます:
TypeScriptチームは、FlowチームとAtScriptチームの両方と協力して、JavaScriptタイピングコミュニティによって既に作成されているリソースをこれらのツール全体で確実に使用できるように支援しています。これらのプロジェクトは互いに学ぶことができることがたくさんあります。私たちは、一緒に作業を進め、JavaScriptコミュニティのためにできる最高のツールを作成することを楽しみにしています。長期的には、これらのツールの最高の機能をJavaScriptの標準であるECMAScriptに組み込むことにも取り組んでいきます。 "
スコット・ハンセルマンの引用:
TypeScriptはDartと比較されています。それはリンゴとキャブレターを比較している。 TypeScriptはJavaScript上に構築されるため、JSの相互運用性の問題はありません。 Dartは、ゼロから作成されたネイティブ仮想マシンです。 DartはJavaScriptと相互運用しますが、それはJSではありません。たとえば、JavaScriptの数値タイプも使用しません。
最近、私自身の発見と一緒にこの議論にチャイムを打たなければなりませんでした。
1番目:TypeScript
MSは、TSやJSに簡単に出入りできるという点で素晴らしいアプローチをとっています。私たちは主にAngularJSを開発に使用しており、AngularをTypeScriptに変換するためのドキュメントはほとんどありませんが、TypeScriptをDevワークフローに組み込むことはすばらしい追加です。
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以外のものを使用することはほとんどありません。