DartãœãŒã¹ã³ãŒããå®è¡ããããŸã§ã®æ§é ãçè§£ãã
CHANGELOG
- 2025.02.21
- Flutter Wiki ãç§»è¡ããããšã«ãããªã³ã¯åãã®ä¿®æ£
èæ¯
ããŸã㟠React/React Native ã«ã€ããŠå°ã調ã¹ãæ©äŒãããããã®æŽŸçã§ React Native ãš Flutter ã®éãã調ã¹ãŠãããã¡ã«ãæ®æ®µæžããŠãã Flutter/Dart ã®ãœãŒã¹ã³ãŒãã iOS/Android ãªã©ãã€ãã£ããã©ãããã©ãŒã äžã§å®è¡ããããŸã§äœãè¡ãããŠããã®ãããæ°ã«ãªããåšèŸºæ å ±ã調æ»ããŠããŸããããããŸã§ãäœãšãªãå šäœåã¯ã€ã¡ãŒãžããŠãããã®ã®ææ§ã§ãæ¹ããŠèª¿ã¹ãå 容ãèªåãªãã«ãŸãšããŠã¿ãåå¿é²ã«è¿ãå 容ãšãªã£ãŠãããŸãã
åæ©ã¯ Flutter ã§ããã調ã¹ãŠãããã¡ã« Dart ã Dart VM ãæã£ãŠãã£ã圢ã«ãªã£ãŠãããããããŸã Flutter ã®è©±ïŒEngine çïŒã¯åºãŠããŸããããã ãFlutter ãš Dart ã§å€å°ç°ãªãéšåã¯ãããšæãã€ã€ãå®è¡ã« Dart VM ã䜿ã£ãŠããä»¥äžæ ¹æ¬ã¯å€ãããªããšæããŸãã®ã§å€å°åèã«ãªããããããŸããã
â»æ¬èšäºã¯ã¢ããªã±ãŒã·ã§ã³ã®éçºã¹ãã«åäžã«çŽæ¥å¯äžãããããªå
容ã§ã¯ãããŸããïŒ= ç¥ããªããšãæ®éã«ã¢ããªã¯äœããïŒç¹ãã容赊ãã ããã
æŠèŠ
æ¬èšäºã§ã®èŠç¹ã¯äžèšã§ããFlutter â Dart â Dart VM ã®é ã«ã³ã³ãã€ã«ãäžå¿ã«å®è¡ãŸã§ã®æµããèŠãŠãããŸãã
- Dart VM ã«ã¯ JIT&AOT ã®ãã€ãã©ã€ã³ããã
- Dart ã³ãŒãïŒã¢ããªã±ãŒã·ã§ã³ã³ãŒãããã³ Flutter Framework ãå«ãïŒã¯ãJIT/AOT ãããã Kernel AST ãšåŒã°ããäžé衚çŸãä»ããŠæ©æ¢°èªïŒãã€ãã£ãã³ãŒãïŒã«å€æãããŠãã
- äŸïŒARM, x86_64
- Dart ã³ãŒããå®è¡ããã«ã¯ãœãŒã¹ã³ãŒãããã³ã³ãã€ã«ããæ¹æ³ãšã¹ãããã·ã§ããããäœæããæ¹æ³ã®2çš®é¡ããã
- Flutter ã®ãªãªãŒã¹ã¢ãŒãïŒAOT ã³ã³ãã€ã«ïŒã«ãããŠã Dart VM ã¯ã©ã³ã¿ã€ã ã«çµã£ã軜éãªåœ¢ã§å©çšãããŠãã
- ãããã°ã¢ãŒãã®ã¿ Dart VM ãå©çšãããŠããããã§ã¯ãªã
Flutter 芳ç¹ã§ã®å®è¡
Flutter ã® 3 å±€ã¬ã€ã€ãŒã®ãããã
åæç¥èãšããŠãFlutter Engine ã«ã€ããŠè»œãããããããŸãã
Flutter ã«ã¯ Flutter Framework ãš Flutter Engine ãååšããŠããã®ã¯æåãªè©±ã§ããïŒFlutter ã«é¢ãããªããžããªã¯ ãã¡ã ã«äžèЧåãããŠããŸãïŒãFramework ã¯æ®æ®µç§ãã¡ã Widgetã¯éçºãã Flutter ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããã®ç°å¢ã§ãã
ãã® Flutter Engine ã¯äžèšã§ãããšãFlutter ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããã®ããŒã¿ãã«ãªã©ã³ã¿ã€ã ãã§ããã¢ãã¡ãŒã·ã§ã³ãã°ã©ãã£ãã¯ãDart ã©ã³ã¿ã€ã ãªããŸããŸãª Flutter ã³ã¢ã©ã€ãã©ãªãå®è£
ãããŠããŸããæåã©ããã ãšã2D ã°ã©ãã£ãã¯ã©ã€ãã©ãªã® SkiaïŒè¿ãå°æ¥ãæ°ããã¬ã³ããªã³ã°ã¬ã€ã€ã® Impeller ã«çœ®ãæããã¯ãïŒã iOS ã Android ãªã©ã®ãã©ãããã©ãŒã ããã€ã¹ã®äžã§ Engine ããã¹ãã§ãã Dart VMïŒåŸè¿°ïŒãªã©ããããŸããæ¬èšäºã§ã¯ Dart VM ãäžå¿ã«ãã®æ§é ãèšèŒããŠããŸãã
äžå¿ãå
¬åŒããã¥ã¡ã³ãèšèŒã®èŠæ
£ããå³ãåæ²ããŠãããŸãã

ãã€ãã£ãã¢ããªãšããŠå®è¡ããããŸã§
iOS/Android ã§ã©ã®ããã«ã³ãŒããå®è¡ãããã®ããã«ã€ããŠã¯å ¬åŒããã¥ã¡ã³ãã® FAQ ã«ãã How does Flutter run my code on XXX ? ã§èšèŒãããŠããŸããäŸãšã㊠iOS ã®ãªã³ã¯ã貌ã£ãŠãããŸãã誰ãã«è³ªåããããšãã¯ããã®å 容ãäŒããããã°ãŸãåé¡ãªãã§ãããã
å 容ã以äžã«èšèŒããŸãããå šäœçã«ã©ã€ããªæžãã¶ããšãªã£ãŠããŸãïŒFAQ ãªã®ã§ïŒã
ãªãªãŒã¹ã¢ãŒã
1ãã©ã°ã©ãç®ã¯ãªãªãŒã¹ã¢ãŒãã®è©±ãšãªã£ãŠããŸãã
ãŸããDart ã³ãŒãïŒã¢ããªã±ãŒã·ã§ã³ã³ãŒããš SDK äž¡æ¹ïŒã¯æ©æ¢°èªïŒARMïŒã« AOT ã³ã³ãã€ã«ãããŸããã³ã³ãã€ã«ããããã€ããªã¯ iOS ãããžã§ã¯ãã®ãRunnerãã«å«ãŸãã.ipa ãã¡ã€ã«ãšããŠãã«ããããŸããã¡ãªã¿ã«ã¢ããªã±ãŒã·ã§ã³ã³ãŒã㯠Frameworks/App.framework ãšããŠã³ã³ãã€ã«ãããŠããŸãããããŠã¢ããªãèµ·åãããšåæã«ãFlutter ã©ã€ãã©ãªãèªã¿èŸŒã¿ãŸããã¬ã³ããªã³ã°ããŠãŒã¶ãŒã«ããã€ã³ãããæäœãã€ãã³ããã³ããªã³ã°ãªã©ã¯ãã¹ãŠãã³ã³ãã€ã«ããã Flutter ã¢ããªã«å«ãŸããŠããŸããUnity ãªã©ã®ã²ãŒã ãšã³ãžã³ãšåããããªæåã«ãªããŸãã
äžèšããŸãšãããšä»¥äžã®å³ã®ãããªã€ã¡ãŒãžã ãšæããŸãã

ãããã°ã¢ãŒã
FAQ ã®2ãã©ã°ã©ãç®ã¯ãããã°ã¢ãŒãã®è©±ãšãªã£ãŠããŸãã
Dart VM äžã§å®è¡ãããŠãããã銎æã¿ã® Hot ReloadïŒåã³ã³ãã€ã«ç¡ãã§å€æŽãåæ ããç¹åŸŽïŒã玹ä»ãããŠããŸããæ®ãã¯ãããã°ã¢ãŒãã§ã¯ããã©ãŒãã³ã¹ãå£ãããšãæèããŠãã ãããçšåºŠã®æžãã¶ããšãªã£ãŠããŸãã
äžèšãäžå¿ Flutter ç®ç·ã§èšèŒãããŠãããã€ãã£ãã¢ããªå®è¡ãŸã§ã®ããã»ã¹ãšãªããŸããå šäœåãææ¡ã§ãããšããã§æ¬èšäºã§ã®åŸåã§ã¯ãAOT ã³ã³ãã€ã«ã Dart VM ã«ã€ããŠèšåããªããã³ã³ãã€ã«ã®ä»çµã¿ã詳现ã«èŠãŠããããšæããŸãã
ïŒäœè«ïŒReact Native ã®ã³ã³ãã€ã«æ¹æ³ãšã®éã
話ã¯ããè±ç·ããŸãããè¯ãæ¯èŒãããåãã¯ãã¹ãã©ãããã©ãŒã ã§ãã React Native ãšã¯ããã€ãå·®ç°ããããAOT ã³ã³ãã€ã«ã®å¯åŠããã®1ã€ã§ããReact Native ã§ã¯ Flutter ãšã¯ç°ãªãããã€ãã£ãã® UI ã³ã³ããã³ããå©çšããã¢ãããŒãã§ããããããŠãŒã¶ãŒæäœãã€ãã³ããã³ããªã³ã°ã¯Bridge ã䜿ã£ãŠãã€ãã£ããš JavaScript ãè¡ãæ¥ããå¿ èŠããããŸããããã®ç¹ãããŠãŒã¶ãŒã€ã³ã¿ãã§ãŒã¹ããã¹ãŠæ©æ¢°èªã«äºåã³ã³ãã€ã«ãããŠãã Flutter ãšã®å€§ããªéãã§ãå®è¡é床ã®ç¹ã§ãããŸããŸãªè°è«ããããŸãããã
æè¿ã§ã¯ãJSIïŒJavaScript InterfaceïŒã«ãã Bridge ã®è§£æ¶ãã軜éãã€é«é㪠JavaScript ãšã³ãžã³ã§ãã Hermes ã®ç»å Žã«ãããã®èŸºãã®èª²é¡ãè§£æ¶ãã€ã€ããããã§ãã
Dart 芳ç¹ã§ã®å®è¡
ä»åºŠã¯ Dart ã®å
¬åŒããã¥ã¡ã³ãããã³ã³ãã€ã«ã®è©³çްãèŠãŠãããŸããFlutter 芳ç¹ã§ã®æ
å ±ããã詳现ã«èšèŒãããŠããŸãã
ããã¥ã¡ã³ãã«èšèŒããããŸããããããã Dart ãšããèšèªã®ãŽãŒã«ã¯ãã¢ããªçšã®æè»ãªã©ã³ã¿ã€ã ãæŽ»çšãããã«ããã©ãããã©ãŒã éçºã®çç£çãªããã°ã©ãã³ã°èšèªãæäŸããããšããšãªã£ãŠããŸãããã©ã®ãã©ãããã©ãŒã äžã§ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ã§ãããç¹ã匷ã¿ãšããäœçœ®ã¥ãã«ãªã£ãŠããŸããã
Dart is a client-optimized language for developing fast apps on any platform. Its goal is to offer the most productive programming language for multi-platform development, paired with a flexible execution runtime platform for app frameworks.
ãã®ç¹åŸŽã¯ä»¥äžã®å³ããããããéãããã©ãããã©ãŒã ã«åãããŠå®è¡å¯èœãªæ©æ¢°èªã«æè»ã«å€æãããŸãã
- ãã¹ãŠã®ãã©ãããã©ãŒã ã§å®è¡ã§ãã
- ãã©ãããã©ãŒã ã«åãããŠæ©æ¢°èª or JavaScript ã«å€æãã
- éçºçšãšãããã¯ã·ã§ã³çšã®ããŒã«ãã§ã€ã³ãåãããŠãã
- Hot Reload ããããã°ããŒã«ã®æäŸã«ããçç£æ§ UP

JIT ãš AOT
Dart Native ã¯ã¢ãã€ã«ããã¹ã¯ãããããµãŒããªã©ãæããDart Web ã¯ãã©ãŠã¶ãæããŸããåè ãæ©æ¢°èªã«å€æããã®ã«å¯ŸããåŸè 㯠JavaScript ãžã®ãã©ã³ã¹ãã€ã«ãšãªãããç°ãªãã¢ãããŒãã§ã³ã³ãã€ã«ãããŸãããŸãšãããšä»¥äžã®ãããªãã¯ã¹ãšãªããŸãã
| ã³ã³ãã€ã©è¡š | éçºã¢ãŒã | ãããã¯ã·ã§ã³ã¢ãŒã |
|---|---|---|
| Dart Native | JITïŒjust-in-timeïŒ | AOTïŒahead-of-timeïŒ |
| Dart Web | dartdevc | dart2js |
ãåç¥ã®éããFlutter ã§ã®ãã«ãã«ã¯ Debug / Release / Profile ã®3ã€ã®ã¢ãŒãããããŸããããããã«å¯Ÿå¿ãã圢㧠Dart ã®ã¢ãŒããåãæ¿ãã£ãŠå®è¡ãããŠãããDebug/Profile ãã«ãã§ã¯ JIT ã³ã³ãã€ã«ããRelase ãã«ãã§ã¯ AOT ã³ã³ãã€ã«ãããããè¡ãããŠããŸãã
JIT ãš AOT ã®ç¹åŸŽãç°¡åã«ããŒãã«ã«ããŸããã
| é ç® | JIT | AOT |
|---|---|---|
| å®è¡é床 | ãŠã©ãŒã ã¢ãããå¿ èŠã®ããèµ·åãé ãããæéçµéãšãšãã«æå€§ããã©ãŒãã³ã¹ã«éãã | èµ·ååŸããã«ããŒã¯ããã©ãŒãã³ã¹ãžéããïŒæå€§ããã©ãŒãã³ã¹ã¯ JIT ã®æ¹ãé«ãå ŽåãããïŒ |
| ã³ã³ãã€ã«ã®ã¿ã€ãã³ã° | å®è¡æ | å®è¡å |
| ã³ã³ãã€ã«æé | çã | é·ã |
| ç®ç | Hot Reload ãªã©ã®çŽ æ©ãå®å®ãªéçºãããŒãæäŸ | å©çšè ïŒãŠãŒã¶ãŒïŒäœéšãéèŠ |
Dart ã¯ãã®äž¡æ¹ã®ã³ã³ãã€ã«åœ¢åŒããµããŒãããŠãããšããããã§ããã詳现ã¯ãã¡ãã®èšäºãåãããããã§ãã
dart compile
Dart ã®ã³ã³ãã€ã«ãåœç¶æå ã§å®è¡ã§ãããã®æé ã¯å ¬åŒããã¥ã¡ã³ãã«èšèŒãããŠããŸããããªãã·ã³ãã«ã§ãããé©åœã«æå ã§åãããŠã¿ããšã€ã¡ãŒãžããããããšæããŸãã
åçŽã§ããã以äžã®ããªã³ãããã ãã® Dart ãã¡ã€ã«ã§ã³ã³ãã€ã«ããŠã¿ãŸããã
void main() {
print('Hello World!');
}
å®è¡çµæã§ããåºåãããææç©ãç¹åŸŽã«ã€ããŠã¯ã³ã¡ã³ãã§èšèŒããŠããŸãã
⯠dart compile exe hello.dart
Info: Compiling with sound null safety
# output: 4.9MB
# ã¹ã¿ã³ãã¢ããŒã³ãªå®è¡ãã¡ã€ã«
# ã©ã³ã¿ã€ã ãå«ãŸããã®ã§æããµã€ãºã倧ãã
-> hello.exe
⯠dart compile aot-snapshot hello.dart
Info: Compiling with sound null safety
# output: 954KB
# ã©ã³ã¿ã€ã ã¯å«ãŸããæ©æ¢°èªã®ã¿ã®ãããã£ãšã軜é
-> hello.aot
⯠dart compile jit-snapshot hello.dart
Compiling hello.dart to jit-snapshot file hello.jit.
Info: Compiling with sound null safety
Hello World! # JITã³ã³ãã€ã©ã§åæã«å®è¡ãããã
# output: 4.8MB
# å
šãœãŒã¹ã³ãŒãã®äžéè¡šçŸ + JITã³ã³ãã€ã«ã®æé©å
-> hello.jit
ä»åå®è¡ããã³ãã³ãã«ã€ããŠå
¬åŒããã¥ã¡ã³ãã®ããŒãã«ã«åãããããèšèŒãããŠããŸããäž»ã«ãœãŒã¹ã³ãŒããããã®ãŸãŸå®è¡ããã®ã exe ã³ãã³ãã§ãã¹ãããã·ã§ããããçæããŠå®è¡ããã®ã aot-snapshot, jit-snapshot ã§ãããDart ã³ãŒããå®è¡ããã¢ãããŒãã¯å€§ãã2çš®é¡ååšããããšãããããŸããããããã©ããã£ãéããããã®ããã¹ãããã·ã§ããããã€äœ¿ãããã®ãçã«ã€ããŠã¯ãåŸè¿°ã® Introduction to Dart VM ã»ã¯ã·ã§ã³ã«ãŠèšèŒããŸãã
çæç©ã®ç¹åŸŽã¯å
¬åŒããã¥ã¡ã³ãã®ããŒãã«ã«ãèšèŒãããŠããŸãïŒäžéšæç²ïŒã

Note: You donât need to compile Dart programs before running them. Instead, you can use the dart run command, which uses the Dart VMâs JIT (just-in-time) compilerâa feature thatâs especially useful during development. For more information on AOT and JIT compilation, see the platforms discussion.
ãŸããæ®æ®µç§ãã¡ã¯ã³ã³ãã€ã«ãããŸãæèããããšã¯ãªã dart run ã³ãã³ãã䜿çšããŠããæããŸãããããã¯ã³ãã³ãå®è¡æã«å
éšçã«ã¯ Dart VM ã® JIT ã³ã³ãã€ã©ã䜿ã£ãŠãããšæèšãããŠããŸããã
ããã¥ã¡ã³ãã«ã床ã ã§ãŠããŸãããããã JIT & AOT ã³ã³ãã€ã©ã¯ Dart VM ã«ãŠå®è¡ãããŠããŸããæ¬¡ã®ã»ã¯ã·ã§ã³ã§ã¯ãã® Dart VM ã«ã€ããŠèŠãŠãããŸãã
Introduction to Dart VM
Vyacheslav EgorovïŒ@mralephïŒãããšãã Google ã®äžã®äººãäžå¿ã« Dart VM ããŒã ãæžããŠãã Dart VM ã®è©³çްãèšèŒãããŠããããã¥ã¡ã³ãã§ããçŸåš WIP ãšããäœçœ®ã¥ãã§ãããã®ã®ããªã詳ããèšèŒãããŠããŸããæ¬èšäºã§ã¯èŠæã®ã¿ãæç²ããŠèšèŒããŠãããŸãã®ã§ã詳现ãå šå®¹ã¯èšäºãèŠãŠããã ããã°ãšæããŸãã
VM ãšããæ··ä¹±ãæãåç§°
The name "Dart VM" is historical.
ãã®èšèŒã®éãããã®åç§°ã¯æŽå²çãªãã®ã§ãVMããšããåç§°ã§ã¯ãããŸãããå®è¡ç°å¢ã ãã§ã¯ãªã AOT ãã€ãã©ã€ã³ãååšãããªã©ããã®æå³ã¯åºçŸ©ã§ããããšãç¥ã£ãŠãããšãã®åŸã®çè§£ãé²ã¿ãŸãã
ç§ãæååéãããŠããç¹ã§ããDart VMããšèšèŒããããšäžè¬ã« JVM ã®ãããªå®è¡ç°å¢ãšããŠã®ã¿ã®åœ¹å²ãã€ã¡ãŒãžããŠããŸããŸãããDart VM ã®å Žåã¯å°ãç°ãªããŸããDart VM ã¯ããŒãã£ã«ãã·ã³ã§ãããã®ã§ããããã¯åã«1ã€ã®èŠçŽ ã§ãããåžžã« JIT ã³ã³ãã€ã«ããããããã§ã¯æããŸããã
ãªãªãŒã¹ã¢ãŒãå®è¡æã«ã¯ AOT ã³ã³ãã€ã«ãè¡ãããŸãããããã Dart VM ã® AOT ãã€ãã©ã€ã³ ã®äžã§è¡ãããŸããã³ã³ãã€ã«ãããæ©æ¢°èªã¯ãprecompiled runtime ãšåŒã°ãã軜éãªïŒJIT ãã€ãã©ã€ã³ã®ãµãã»ããïŒDart VM äžã®ã©ã³ã¿ã€ã äžã§å®è¡ãããŸããã€ãŸããVM ã«çãŸããªã倿§ãªæ©èœã Dart VM ã¯æäŸããŠããããšã«ãªããŸãã
Dart VM ã®ç¹åŸŽ
- Dart ã©ã³ã¿ã€ã ã®æäŸ
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã¡ã¢ãªç®¡çãIsolate 管çãªã©ãè¡ã
- Dart ã³ã¢ã©ã€ãã©ãªã®ãã€ãã£ãã¡ãœãããæäŸ
- åªããéçºè
äœéšã®æäŸ
- ãããã°ããŒã«
- ããããªããŒãïŒãããã°/ãããã¡ã€ã«æã®ã¿ïŒ
- JIT & AOT ã³ã³ãã€ã©ã®äž¡æ¹ã®ãã€ãã©ã€ã³ãæäŸ
ã¡ãªã¿ã«ãDart VM ã®ãã£ã¬ã¯ããªã¯ãã¡ãã§ãã
Dart VM ãã³ãŒããå®è¡ããä»çµã¿
åã»ã¯ã·ã§ã³ã®ãdart compileãã§ãèšèŒããŸããããDart ã³ãŒãã®å®è¡ã«ã¯äžèšã®2ãã¿ãŒã³ããããŸãããããã®å€§ããªéã㯠ãœãŒã¹ã³ãŒãããã€ã©ã®ããã«å®è¡å¯èœãªã³ãŒãã«å€æããã ã§ãããã©ã³ã¿ã€ã ç°å¢ã¯åãã§ãã
- ãœãŒã¹ã³ãŒããã JIT ã§å®è¡ããæ¹æ³
- ã¹ãããã·ã§ããïŒAOT/JIT ã¹ãããã·ã§ããïŒããå®è¡ããæ¹æ³
åè¿°ãã dart compile ã®ã³ãã³ããšå¯Ÿå¿ããããšäžèšãšãªããŸãã
1.ãœãŒã¹ã³ãŒãããå®è¡
- JIT: $ dart run
2.ã¹ãããã·ã§ããããå®è¡
- JIT: $ dart compile jit-snapshot
- AOT: $ dart compile aot-snapshot & dartaotruntime
1. ãœãŒã¹ã³ãŒããã JIT ã§å®è¡ããã¹ããã
以äžã®ãããªã³ãã³ãã©ã€ã³ãã Dart ã³ãŒããå®è¡ããéã«ãäœãèµ·ãã£ãŠããã®ãã«ã€ããŠèšèŒããŸãã
$ dart hello.dart
-> Hello World!
Dart VM 㯠Dart ã³ãŒãããã®ãŸãŸå®è¡ããŠããããã§ã¯ãªã
åœåãJIT ã³ã³ãã€ã©ã§ã¯ Dart ã®ãœãŒã¹ã³ãŒãããã®ãŸãŸå®è¡ããŠããã®ããšæã£ãŠããã®ã§ãããDart VM ã§ããã¯ã§ããŸããã代ããã«ãKernel ASTs ïŒ.dillïŒãšåŒã°ããäžé衚çŸïŒæœè±¡æ§ææšã®ãã€ããªïŒã«äžåºŠå€æããããã VM äžã§å®è¡ããŸããå¹³ããèšããš Kernel AST ã¯ããDart VM äžã§å®è¡ããããã®ãã€ããªããšããããšã«ãªããŸãã
â»AST: Abstruct Syntax Tree

å³äžã«ããããŸãããDart ãœãŒã¹ã³ãŒãã® Kernel AST ãžã®å€æã¯ common front-end (CFE) ãšåŒã°ãã Dart ã§æžãããäœã¬ãã« API ã§è¡ãããŠããŸããCommon ãšããåç§°ã¯ãDart Native(VM)ãš Dart Web(dart2js, dartdevc)ã§å ±éå©çšãããŠããããã ãšæãããŸãã
ã¡ãªã¿ã«ãäžèšã®ããã«æå ã§ Dart ã³ãŒãã Kernel AST ã«å€æã§ããŸãã
⯠dart compile kernel hello.dart
Compiling hello.dart to kernel file hello.dill.
Info: Compiling with sound null safety
# output
-> hello.dill
å®è¡çµæã¯ãã®ããã«ãªããŸãã.dill ãã¡ã€ã«ã¯æœè±¡æ§ææšã®ãã€ããªãªã®ã§èŠãŠãäžèº«ã¯è¯ãããããŸããããããã Kernel AST ãã®ãã®ã§ãã

Flutter ã§ã® Kernel AST ã®åŠç
å
·äœçãªã€ã¡ãŒãžãã§ããããã«ãFlutter ã®ã±ãŒã¹ã§ Kernel AST ã®åããèŠãŠã¿ãŸããFlutter ã§ã¯ Dart å®è¡ãšç°ãªããäžèšã®éãã«ãŒãã«ãžã®ã³ã³ãã€ã«ãšå®è¡ã¯ããããå¥ã®å Žæã§è¡ãããŸããHOST ãšæžãããŠããéšåãããã«ãããç§ãã¡ã®ãã·ã³ã CI/CD ç°å¢ãæããDEVIVE 㯠iOS/Android ãªã©ã®å®è¡ãããã©ãããã©ãŒã ãæããŠããŸãããã®éã® Kernel AST ã®ç§»å㯠flutter_tool ã«ãã£ãŠè¡ãããŠããŸãã

flutter_tool 㯠Dart ã³ãŒããããŒã¹ã§ããŸããããKernel AST ãžã®å€æã frontend_server(CFE) ã®ããã»ã¹ãæ°žç¶åã§ããããã«ãã£ãŠ Flutter ã®ã«ãŒãã«å€æãã§ããããã«ãªã£ãŠããŸãã
frontend_server ã®ããã»ã¹ã¯æ°žç¶ããŠããããã¹ããŒããã«ã§ãããååã®ã³ã³ãã€ã«çµæãæã£ãŠããŸããããã«ãã£ãŠéçºè
ãåºãã Hot Reload ã®ãªã¯ãšã¹ããæ€ç¥ããŠãååã®ã³ã³ãã€ã«çµæãåå©çšãå·®åã®ã¿ã®åã³ã³ãã€ã«ãè¡ãããŠããŸãã
ãŸãšãããšãç§ãã¡ã倿Žãã Dart ã³ãŒã㯠frontend_server(CFE)ã«ãã£ãŠåçã«æ€ç¥ããå·®åãã€ããªãçæåŸãVM äžã«å€æŽåãè¡ãæž¡ãããšã§ã倿Žçµæã峿ã«åæ ãããäœéšãã§ããŠããããã§ããã
2. ã¹ãããã·ã§ããããå®è¡ããã¹ããã
ãŸããVM ã«ã¯ãã€ããªã®ã¹ãããã·ã§ãããäœæããæ©èœããããŸããã¹ãããã·ã§ãããäœæããããšã§ãå¥ã® Isolate ã§ VM ãèµ·åããéãã¹ãããã·ã§ãããå ã«é«éãã€åãç¶æ ã§èµ·åã§ããããã«ãªããŸãã
ãã®ã¹ãããã·ã§ããã®æ©èœã䜿ãããšã§ãæ¬æ¥ãŠã©ãŒã ã¢ãããå¿ èŠãª JIT ã³ã³ãã€ã©ã§ãèµ·åæéãççž®ã§ããŸãïŒAppJIT snapshotsïŒã
å°ãã¹ã¿ãããåããŠããŸã£ãã®ãšããã®èŸºãã¯è§£éã«èªä¿¡ããªãã®ã§æ°ã«ãªãæ¹ã¯å èšäºããåç §ãã ãã ðïŒæ¹ããŠè¿œèšãããããããŸããïŒ
- Running from Snapshots | Dart VM
- Running from AppJIT snapshots | Dart VM
- Running from AppAOT snapshots | Dart VM
çµå± Dart VM ã¯ã©ãã§äœ¿ãããŠããã®ãïŒ
AOT ã¢ãŒãã§ãå®è¡æã« Dart VM ãå©çšãããŠããã®ãããå人çã«èºãããã€ã³ãã§ãããJIT ã¢ãŒãã§ã¯ã³ã³ãã€ã«ãšå®è¡ãåãã¿ã€ãã³ã°ã§åãããããã§ãããAOT ã¢ãŒãã«ãããŠãäºåã³ã³ãã€ã«ããæ©æ¢°èªãå®è¡ããããã«ã Dart VM ã¯ã©ã³ã¿ã€ã ã«çµã£ã軜éãªåœ¢ã§å©çšãããŠããããã§ãã
ãã®ç¹ã«ã€ããŠã¯ãåè¿°ã® Introduction to Dart VM ã§ç޹ä»ããèè ã® Vyacheslav Egorov ããã«ããäžèš StackOverflow ã³ã¡ã³ããéåžžã«ããããããã£ãã§ãã
In the JIT mode Dart VM is capable of dynamically loading Dart source, parsing it and compiling it to native machine code on the fly to execute it. This mode is used when you develop your app and provides features such as debugging, hot reload, etc.
JIT ã¢ãŒãã§ã¯ãã«è£ åã® Dart VM ãå©çšãããŠãããããã°ã©ã å®è¡äžã«åçã« Dart ã³ãŒãã®ããŒã¹ãã³ã³ãã€ã«ïŒJIT ã³ã³ãã€ã«ïŒãã§ãã圢ã«ãªã£ãŠããŸããããã«ããããããªããŒãã®æ©æµãåãããªã©ãã¹ã ãŒãºãªéçºç°å¢ãæäŸãããŠããŸãã
JIT ã«é¢ããŠã¯åãããããã§ããã以äžã AOT ã«é¢ããèšè¿°ã§ãã
In the AOT mode Dart VM does not support dynamic loading/parsing/compilation of Dart source code. It only supports loading and executing precompiled machine code. However even precompiled machine code still needs VM to execute, because VM provides runtime system which contains garbage collector, various native methods needed for dart:* libraries to function, runtime type information, dynamic method lookup, etc. This mode is used in your deployed app.
äºåã³ã³ãã€ã«ãããæ©æ¢°èªãåãããã®ç°å¢ãšããŠAOTã¢ãŒãã§ãVMã®ã©ã³ã¿ã€ã ã¯å¿ èŠã§ããçç±ã¯ãã¬ããŒãžã³ã¬ã¯ã¿ã Dart ã©ã€ãã©ãªã®ãã€ãã£ãã¡ãœããã®æäŸãªã©ã§ããããã¯ãããã€ãããã¢ããªã±ãŒã·ã§ã³äžã«ãååšããŸãã
Where does precompiled machine code for the AOT mode comes from? This code is generated by (a special mode of the) VM from your Flutter application when you build your app in the release mode.
æ©æ¢°èªã®äºåã³ã³ãã€ã«ã Dart VMïŒã¹ãã·ã£ã«ã¢ãŒããšè¡šçŸããŠããç®æïŒã®äžã§è¡ãããŠããŸããVM ã¯ã©ã³ã¿ã€ã ã ãã§ã¯ãªããããã°ã©ã å®è¡åã§ãåçŽãªã³ã³ãã€ã©ãšããŠæ©èœããŠãããšããããšã§ããã
ãã®ããã«ãªãªãŒã¹ã¢ãŒãã§ã¯ããããã°ã¢ãŒãã® JIT ã§äœ¿ããã«è£ å Dart VM ã®äžããå®è¡ã«å¿ èŠãªæäœéã®ã©ã³ã¿ã€ã éšåã®ã¿ã䜿çšããæ©æ¢°èªãå®è¡ããŠããŸããJIT ã® VM ã«ã¯ Hot Reload ãªã©ã®éçºã«å¿ èŠãªéšåãå«ãŸããŠããŸãããAOT ã® VM ã«ã¯ãããéçºã«å¿ èŠãªéšåãåã£ããµãã»ããã®ãã㪠VM ãšãªããŸãã
å³ã«ãããšäžèšã®ãããªã€ã¡ãŒãžã§ããããïŒ
JIT ã¢ãŒããã AOT ã¢ãŒããžåããç¢å°ã¯å®éã«ãã®ããã»ã¹ããããšããããã§ã¯ãªããAOT ã¢ãŒãã® VM 㯠JIT ã¢ãŒãã®ãµãã»ããã§ããããšãæå³ããŠããŸããJIT ã¢ãŒãã§ã¯ååšããŠãããéçºã«å¿
èŠãªéšåã AOT ã¢ãŒãã ãšæ¬ èœïŒè¯ãããã¥ã¡ã³ãã§ã¯ stripped ãšè¡šçŸãããŠããŸãïŒããŠããã®ãèŠç¹ã§ãã

ãŸãšã
Dart ãœãŒã¹ã³ãŒããå®è¡ããããŸã§ã¹ãããããŸãšããŸãã
- Dart ãœãŒã¹ã³ãŒã㯠CFE ãšåŒã°ãã front_end ããŒã«ã«ãã£ãŠ Kernel AST ãšåŒã°ããäžé衚çŸïŒæœè±¡æ§ææšïŒã«å€æããã
- Kernel ASTïŒ
.dillïŒã¯æœè±¡æ§ææšã®ãã€ããªè¡šçŸ - AOT ã¢ãŒãã§ã¯ TFA ã«ãã Kernel AST ãæé©åããã
- Dart VM ã«ãŠ Kernel AST ãè§£éãã
- JIT ã®å Žå:
- Hot Reload ã Debug ãè¡ãããã®éçºéšåããã¹ãŠå«ãã ãã«ã® VM ãããã€ã¹ã«æž¡ã
- JIT compiler/interpreter ã«ããå®è¡æã«ããã°ã©ã ãéäžåŠçããã
- AOT ã®å Žå:
- VM ã®äžã® AOT ãã€ãã©ã€ã³ã§æ©æ¢°èªã« pre-compile ããã
- æ©æ¢°èªãå®è¡ããããã®è»œéãªã©ã³ã¿ã€ã ã®ã¿ãå«ãã VM äžã§ããã°ã©ã ãå®è¡ããã
- JIT ã®å Žå:
- ã¹ãããã·ã§ããã«ããèµ·åæéã®ççž®

å®éã¢ããªã±ãŒã·ã§ã³éçºã§æèããããšã¯å°ãªãã§ãããFlutterãDartãDart VM ã®é¢ä¿æ§ãèŠããå®è¡ããã»ã¹ã®è§£å床ãå°ãäžãã£ããšæããŸããå人çã«äœã¬ã€ã€ãŒã®è©±ã¯ããŸãæãããªããè§£é誀ã£ãŠããç®æãªã©ãããŸããããã£ãŒãããã¯ããã ããŸããšå¹žãã§ã ð
åè
- The Engine architecture · flutter/flutter Wiki
- Dart overview | Dart
- FAQ | Flutter
- Dart VM
- Flutter engine operation in AOT Mode · flutter/flutter Wiki
- (1) #5 - Running a Dart Application In-Depth! - Dart VM, Dart Isolates, JIT & AOT Compilation - YouTube
- flutter - Is the Dart VM still used? - Stack Overflow
- Flutter: Donât Fear the Garbage Collector | by Matt Sullivan | Flutter | Medium
- Flutter Dart VM ã®åäœã¢ãŒã - Qiita
- Flutter SDK ã®ä»çµã¿ - Qiita
- DartVM ãå匷ããã¹ã¬
-
ããããªã LLVM å
¥éïŒ - Qiita
-
dart-lang/sdk: The Dart SDK, including the VM, dart2js, core libraries, and more.
- ãFlutterããã«ãã¢ãŒã(Debug, Release, Profile)ã¡ããã£ãšã¡ã¢ïœããã£ã¡ïŒ Flutter å匷äžïœ note
- Dart ã§ãã€ããªé åžå¯èœãª CLI ããŒã«ãäœã | ikuty.com
Discussion
dart2nativeã§äœãããå®è¡ãã¡ã€ã«ã¯VMãšã¯ç¡é¢ä¿ã«åäœããŠããã§ããããïŒ
ã³ã¡ã³ãããããšãããããŸããå®è¡ç°å¢ãå å ããã³ã³ãã€ã«ã§ã¯ãVMãã©ã³ã¿ã€ã ãšãªã£ãŠDartã³ãŒããå®è¡ãããŠããã®ã ãšæããŸãã
è¿ä¿¡ããããšãããããŸãããµã€ãºã倧ããã«ãªãçç±ã¯ããããã€ã³ããœãã§ãã