目次

Dart FAQ

目次 keyboard_arrow_down keyboard_arrow_up
more_horiz

このページでは、コミュニティからの主な質問をいくつかまとめています。

全般

#

Q. Dart の仕様はありますか?

#

はい。EMCA-408 は、Dart プログラミング言語の仕様をカバーしています。

5 つのバージョンが公開されています。最新の進行中のバージョンは、Dart 2.13-dev までをカバーしています。

公開日承認日対象バージョン
6th picture_as_pdf2024 年 1 月 24 日2.13-dev
5th picture_as_pdf2021 年 4 月 9 日2.10
4th picture_as_pdf2015 年 8 月 19 日2015 年 12 月1.11
3rd picture_as_pdf2015 年 4 月 15 日2015 年 6 月1.9
2nd picture_as_pdf2014 年 11 月 21 日2014 年 12 月1.6
1st picture_as_pdf2014 年 3 月 27 日2014 年 6 月1.3

仕様の詳細については、Dart 言語仕様のページをご覧ください。

Q. Dart の変更に関する意見はどのように受け付けていますか?

#

チームはフィードバックに耳を傾け、issues を読み、コントリビューターからのパッチを確認します。実績のあるコントリビューターには、リポジトリへの書き込み権限が付与される場合があります。Google のエンジニアも公開リポジトリで作業し、変更を可視化します。このプロジェクトは多くの外部パッチを受け入れており、分散コミッターを歓迎しています。


言語

#

Q. Dart は Java によく似ていませんか?

#

Dart には Java といくつかの類似点があります。よく知られた構文を使用した簡単な例を確認するには、Dart の概要 のコードサンプルを確認してください。

Q. Dart と Go の関係は?

#

Google は Dart と Go の言語プロジェクトを開始しました。これらの独立したプロジェクトには異なる目標があります。その結果、異なる選択をすることになります。言語の性質は大きく異なりますが、チームメンバーはお互いの仕事から学んでいます。

Q. なぜ Dart は Haskell / Smalltalk / Python / Scala / その他の言語のようではないのですか?

#

比較対象の言語によって異なるさまざまな理由があります。

JavaScript と異なる言語
Dart は効率的な JavaScript にコンパイルする必要があります。JavaScript と大きく異なるソース言語は、ソース言語の動作をエミュレートするために複雑な出力コードを生成する可能性があります。これにより、プログラマーにとってわかりにくい方法でパフォーマンスが変動する可能性があります。
ネイティブコードにコンパイルする言語
Dart はマシンコードへの効率的なコンパイルを優先します。したがって、他のコンパイル言語といくつかの側面を共有しています。
Dart よりも「動的」と見なされる言語
Dart は、より良いパフォーマンスとより生産的なツールを実現するために、この任意のランタイム変更の一部をトレードオフすることを選択します。

Q. なぜ Dart の構文はもっと刺激的ではないのですか?

#

this. コンストラクタ引数や 1 行関数の => など、いくつかの優れた構文機能が存在します。Dart は 刺激 よりも 親しみやすさ を選択します。

Q. Dart にリフレクション機能はありますか?

#
サーバーとコマンドラインスクリプト
はい、Dart は mirrors API からのリフレクションをサポートしています。
Web アプリまたは Flutter アプリ
いいえ、Dart は Web アプリまたは Flutter アプリへの書き込みをサポートしていません。

Q. Dart にタプル、部分評価などを追加できますか?

#

今後のリリースには、必要な機能が含まれる可能性があります。一部の機能は、言語の性質に適合しません。一部の機能は、他の機能とうまく連携しません。シンプルさは、将来のプログラマーに与える最も重要な贈り物です。

誰かがリクエストを提出したかどうかを確認するには、言語ファネル言語 issues リストを確認してください。

  • 問題が存在する場合は、賛成票を追加してください。

  • 問題が存在しない場合は、新しい issue をリクエストしてください。

    機能についてよく考えられた議論をしてください。議論の根拠となる証拠を追加してください。機能がある場合とない場合のサンプルコードや、かなりの規模のコードベースを含めてください。

詳細については、言語進化プロセスを参照してください。

Dart 言語チームがリクエストを拒否しても驚かないでください。言語機能の削除は、追加するよりも大きな苦痛を伴います。Dart 言語チームは、最も明白な機能を最初に加え、次の段階を後で再検討します。

コミュニティは、1 つの言語だけでは満たすことができないほどの多くの機能を要求するでしょう。Dart 言語チームは、提案と証拠を高く評価しています。この感謝の気持ちは、慎重な設計上の選択とそれらに関する公正なコミュニケーションを通じて明確になるはずです。


#

Q. Dart は静的型付けを使用していますか?

#

はい、Dart は静的型付けを使用します。詳細については、Dart の型システム を参照してください。

静的チェックとランタイムチェックを組み合わせることで、Dart は健全な型システムを備えています。これにより、ある型の式が別の型の値を生成できないことが保証されます。

動的型付けの柔軟性が必要な場合は、任意の変数を dynamic で注釈を付けることができます。この dynamic 型は静的ですが、ランタイム で任意の型を含めることができます。これにより、型安全な言語の多くの利点がその変数から失われます。

Q. なぜジェネリクスは共変なのですか?

#

共変ジェネリクスは、プログラマーが持つ一般的な直感に適合し、ジェネリクスの一般的な「読み取り専用」の使用など、この直感が正しいことがよくあります。この直感は常に正しいとは限りませんが、Dart は共変ジェネリクスを持つことで利便性を優先しています。

他の唯一の合理的なデフォルト分散は不変性です。不変ジェネリクスのみを持つことで、エラーを確実に防ぐことができますが、有効なプログラムを多く妨げたり、「リンゴ」のリストがあり、「果物」が必要な場合に毎回変換が必要になったりします。

私たちは、言語が分散をマークまたは推論しようとするさまざまな方法に精通しています。分散推論システムは、Dart でのメリットに対して複雑すぎると思います。

繰り返しますが、私たちは実用的であろうとしており、結果は合理的であると考えています。


使い方とツール

#

Q. Dart は JSON をサポートしていますか?

#

はい。詳細については、JSON コンバーターを dart:convert ライブラリで参照してください。

Q. Dart はサーバー上で実行できますか?

#

はい。詳細については、サーバーでの Dart を参照してください。

Q. サードパーティのコードを使用したり、コードを共有したりするにはどうすればよいですか?

#

pub.devサイト(DartとFlutterのパッケージホスティングサービス)でパッケージを検索してください。コードをパッケージ化し、サイトにアップロードするには、pubコマンドを使用します。

Q. Dart コードを書くには、特定のエディターまたは IDE を使用する必要がありますか?

#

いいえ。 DartPadでDartコードを試してから、お好みのエディターまたはIDEで開発できます。IntelliJ IDEA、WebStorm、Visual Studio Codeなどの一部のフル機能IDEには、Dartプラグインがあります。オープンソースのDartプラグインも多数のエディターに存在します。詳細については、Dartツールを参照してください。

Q. Dart で Android アプリをビルドできますか?

#

はい! FlutterフレームワークとDart言語を使用してAndroidアプリを構築できます。作成したFlutterアプリは、iOS、Web、デスクトッププラットフォームでも動作します。

Q. Dart の実際の運用環境でのデプロイメントにはどのようなものがありますか?

#

Google Ads、AdSense、AdMob、GoogleアシスタントはDartを使用しています。Googleの収益の大部分はこれらのアプリを通じて流れています。Googleの内部でも外部でも、すべてのFlutterアプリがDartを使用しています。


ネイティブ実行

#

Q. Dart はシングルスレッドですか?

#

いいえ。ネイティブターゲットでは、DartのアイソレートAPIは、必要に応じて複数の実行スレッドを開始できます。Dart VMは、複数のCPUコアを使用してこれらのスレッドを同時に実行します。

Dartの並行処理アーキテクチャは、一般的な共有メモリのスレッド処理における複雑でエラーが発生しやすいコードを抽象化します。これが、Dartがシングルスレッドであるという誤解につながっている可能性があります。

並行処理は、Dart Webアプリでは異なる動作をします。詳細については、DartはWebでシングルスレッドですか?を参照してください。

Q. Dart コードをネイティブコードにコンパイルできますか?

#

はい。デスクトップやモバイルなどのデバイスをターゲットとするアプリをコンパイルする場合、Dart Nativeには、ジャストインタイム(JIT)コンパイラーを備えたDart VMと、ネイティブコードを生成する事前(AOT)コンパイラーの両方が含まれています。

Flutterフレームワークは、Dartのネイティブコンパイル機能を使用して高速なネイティブアプリを生成します。

Q. ターミナルで実行するための Dart プログラムをコンパイルできますか?

#

はい。Dartプログラムは、macOSターミナル、Windowsコマンドプロンプト、またはLinuxシェルで実行するためにネイティブコードにコンパイルできます。

dart compileドキュメントを参照してください。

Q. AOT コンパイルコードと JIT コンパイルコードのどちらが速いですか?

#

場合によります。Dartがコードをコンパイルする方法によって、パフォーマンス特性が異なるアプリが生成されます。

  • AOTコンパイルされたコードは、初期実行中に遅延がなく、一貫したランタイムパフォーマンスで高速に起動します。

  • JITコンパイルされたコードは、起動は遅くなりますが、ランタイム最適化を適用するのに十分な時間が経過すると、ピークパフォーマンスに達します。


Web 実行

#

Q. JavaScript コンパイルターゲットとしてサポートしているブラウザは何ですか?

#

本番Webコンパイラーは、次のブラウザーの最新2つのメジャーリリースをサポートしています。

  • Google Chrome
  • Microsoft Edge
  • Firefox
  • Apple Safari

開発JavaScriptコンパイラーは、デバッグ用にChromeのみをサポートしています。

Q. Web 上では Dart はシングルスレッドですか?

#

ある程度は。Dart Webアプリはアイソレートを使用できません。コードの並行処理を実現するために、WebアプリはWebワーカーを使用します。Webワーカーは、アイソレートの容易さと効率性を持たず、異なる機能と制限があります。詳細については、Webでの並行処理を参照してください。

Q. 有効な Dart コードはすべて JavaScript にコンパイルされますか?

#

有効なDartコードはすべてJavaScriptにコンパイルされるはずです。一部のライブラリは、サーバー上またはFlutterでのみ実行されます。dart:ioライブラリを検討してください。これは、ブラウザーでは利用できないAPIを使用して、オペレーティングシステムのファイルとディレクトリへのアクセスを提供します。

Q. なぜ Dart には JavaScript にコンパイルする 2 つの方法があるのですか?

#

どちらの方法でも、webdevコマンドを使用します。webdev buildコマンドは、本番用に最適化された最小化されたJavaScriptを生成します。webdev serveコマンドは、デバッグ用に最適化されたモジュール化されたJavaScriptを生成します。

詳細については、Dart JavaScriptコンパイラーリファレンスを参照してください。

Q. JavaScript にコンパイルされるとき、浮動小数点数はどのように処理されますか?

#

JavaScriptには、1つの数値表現しかありません。IEEE-754倍精度浮動小数点数です。つまり、整数でも浮動小数点数でも、すべての数値は倍精度数として表されます。JavaScriptには型付きデータ配列があり、ネイティブDart型付きリストからJavaScript型付き配列へのマッピングは簡単です。

Q. JavaScript にコンパイルされるとき、整数はどのように処理されますか?

#

JavaScriptは、すべての数値を倍精度数として保存します。これにより、整数は-253から253までの値を持つ53ビットの精度に制限されます。JavaScriptはこの範囲内で整数を精度を損なわずに保存できます。JavaScript VMが数値の内部表現を操作するときは、小さい整数(SMI)の範囲内にとどまってください。JavaScriptでは、その範囲は-231から231(0を含む-2,147,483,647から2,147,483,648)の間になります。

Q. JavaScript にコンパイルされるとき、型付きリストはどのように処理されますか?

#

JavaScriptは、Dartの型付きリストと互換性のある32ビットの型付き配列を提供します。これは、Float32ListFloat32Arrayになるようにマッピングされます。本番JavaScriptコンパイラーは、64ビット整数をサポートしていません:Int64ListまたはUint64List。これらのリストのいずれかを使用してDartコードをコンパイルすると、ランタイム例外が発生します。