メインコンテンツにスキップ
目次

Dart FAQ

目次 keyboard_arrow_down keyboard_arrow_up
more_horiz

このページには、コミュニティから寄せられたよくある質問をいくつかまとめています。

全般

#

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

#

はい。 ECMA-408 に Dart プログラミング言語仕様が記載されています。

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

発行日承認バージョンまでカバー
第 6 版 picture_as_pdf2024年1月24日2.13-dev
第 5 版 picture_as_pdf2021年4月9日2.10
第 4 版 picture_as_pdf2015年8月19日2015年12月1.11
第 3 版 picture_as_pdf2015年4月15日2015年6月1.9
第 2 版 picture_as_pdf2014年11月21日2014年12月1.6
第 1 版 picture_as_pdf2014年3月27日2014年6月1.3

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

Q. Dart の変更点について、どのようにフィードバックを受け付けていますか?

#

チームはフィードバックに耳を傾け、issueを読み、コントリビューターからのパッチをレビューしています。良好な実績を持つコントリビューターには、リポジトリへの書き込み権限が付与されることがあります。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 に私が希望する言語機能を追加できますか?

#

将来のリリースには、ご希望の機能が含まれる可能性があります。一部の機能は言語の性質に合わない場合があります。他の機能と良好に連携しない場合もあります。シンプルさは、将来のプログラマーに与える最も重要な贈り物です。

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

  • issue が存在する場合は、👍 を追加してください。

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

    機能のために思慮深い議論をしてください。議論に証拠を追加してください。あなたの機能の有無、または相当規模のコードベースのサンプルコードを含めてください。

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

Dart 言語チームがリクエストを却下しても驚かないでください。言語機能の削除は、追加よりも多くの苦痛を伴います。Dart 言語チームは、最も明白な機能をまず追加し、次に第 2 層を再検討します。

コミュニティは、単一の言語では全体を台無しにすることなく満たすことができる以上の機能を要求するでしょう。Dart 言語チームは、提案と証拠に感謝しています。この感謝は、慎重な設計上の決定とそれらに関する公平なコミュニケーションを通じて明らかになるはずです。


#

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

#

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

静的チェックと実行時チェックを組み合わせることで、Dart はサウンド型システムを持っています。これにより、ある型の式が別の型の値を生成できないことが保証されます。

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

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

#

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

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

言語が分散をマークまたは推論しようとするさまざまな方法に精通しています。分散推論システムは、Dart での利点に対して複雑さが高すぎると考えています。

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


使用方法とツール

#

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

#

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

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

#

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

Q. サードパーティのコードをどのように使用したり、コードを共有したりしますか?

#

Dart と Flutter のパッケージホスティングサービスである pub.dev サイトでパッケージを検索してください。 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 Assistant は Dart を使用しています。Google の収益の大部分はこれらのアプリを通じて流れています。Google の内外で、すべての Flutter アプリが Dart を使用しています。


ネイティブ実行

#

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

#

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

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

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

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

#

はい。デスクトップやモバイルなどのデバイスをターゲットとするアプリをコンパイルする場合、Dart Native には、Dart VM (JIT コンパイラ付き) と、ネイティブコードを生成する Ahead-Of-Time (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 アプリは isolate を使用できません。コードの並行処理を実現するために、Web アプリは Web Worker を使用します。Web Worker は、isolate の容易さと効率性を欠いており、異なる機能と制限があります。詳細については、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 にコンパイルされる際、Dart は整数をどのように扱いますか?

#

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

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

#

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