【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part28 Dartの特徴

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は Dart編 ( part28 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part27 ライブラリと可視性

今回からDartの特徴について学習します。

Dartの特徴

筆者はDartの特徴として以下の項目を挙げています。

・プログラムの実行前にコンパイラしておくAhead-Of-Time(AOT)コンパイルをサポート

・プログラム実行中に実行され、即時コンパイルされるJust-In-Time(JIT)コンパイルをサポート

・シングルスレッド・イベントループ

・非同期処理のサポート

・Isolateはメモリを共有しないため、ほとんどロックを必要としない

・Isolateはチャネルを介してメッセージを渡すことで通信する

・Isolateはそれぞれにイベントループを持つ

DartはAOTとJITをサポート

DartはAOTとJITの両方をサポートしています。
Flutterの開発において、debugはJITコンパイルを行っているそうです!
だからホットリロードなんていうことができるんですね。
releaseモードの際はAOTコンパイルしています。

AOTとJIT

コンピュータでプログラムを実行するには機械語を使います。
なのでDart(プログラム)言語は機械語に変換しなければなりません。
これをコンパイル処理といいます。
コンパイルにはAhead-Of-Time(AOT)とJust-In-Time(JIT)があります。

AOTは事前にプログラム言語をすべて機械語にコンパイルしてコンピュータで実行します。
コンパイル時間がかかる代わりに高速動作します。
C言語やC++はこちらのタイプでしょうか。

対してJITは一括で完全にコンパイルするのではなく、コンパイルする部分と都度実行する部分をわけて行う
コンパイラ言語とインタプリタ型言語の中間のような処理を行うものです。
JavaやC#, VB.NETがこのタイプですね。

シングルスレッド

Dartはシングルスレッドです。
意識したことはなかったのですがJavaScriptもシングルスレッドらしいです😶

なので競合状態やデッドロックという状態がありません。
とてもクリーンな状態ですね。

マルチスレッドとその問題点

Javaや並列処理の技術として「スレッド」という技術を採用しています。
イメージとしては1つのアプリケーションの中に何人も「小人(子スレッド)」がいて「親(メインスレッド)」が指示を出したら指示内容に従って作業を進めてくれる。
親は小人の完了を待つことなく次の処理を進める・・・という感でしょうかね(笑

実際には小人には「動いてよい(とても短い)時間」が設定されていてその時間だけ小人は作業できます。
指定の時間が来ると小人は録画番組のように「一時停止」状態になります。
この時別の小人に「動いてよい時間」が設定され作業します。
これを超高速に繰り返すことで疑似的に「同時に実行」を実現しています。

小人Aが一時停止して小人Bが作業を開始することを「コンテキストスイッチ」と呼んでいます。
小人Aと小人Bが大事なデータである「Hoge_A」を共有しているとして・・・Hoge_Aの値が書き換わると同時にコンテキストスイッチが起こると大変なことになります。
クラッシュや重大なバグが起こり、再現させようとしてもなかなか再現できなくなってしまいます。しかも不定期なので原因を究明することはかなり困難です。

最後に

マルチスレッドはとても便利な技術ですが確かに問題点もあり、私も何度も悩まされました。
例外の記事でも記載しましたがDartではIsolateという技術を使っているのでマルチスレッドの問題も起きないという認識です。

今日はここまで!