React Native実行環境についてメモ
React NativeはJavaScriptで書ける
iOS上とローカルのMacでは実行環境が異なる(2パターンある)
- JavaScriptCore 実機のiOS上で実行する場合は、JavaScriptCoreが使われる JavaScriptCoreはsafariブラウザのJavaScriptエンジンでもある iOSアプリにはiOS上のメモリへの書込みが許可されていないため、JavaScriptCoreはJITコンパイラを使えない。(モバイルのため、そこまでメモリを積んでいない) MobileSafari.appやApple謹製のアプリはJITコンパイラを使っているかも(?)
- V8 開発中に使うシミュレーターはWebソケット経由でGoogleが開発したV8上で実行される。 V8はChromeブラウザのJavaScriptエンジン。Node.jsのエンジンとしても使われている。
コンパイラについての補足メモ
JIT(Just In Time) プログラムの実行時に中間コードを機械語にコンパイルする。JITは最近人気のコンパイラで、有名なプロダクトでは、Javaや.Net等の言語で採用されている。Javaは以前、インタプリタを採用していたが、JITの方が高速にプログラムを実行できるため、置き換えた。 インタプリタも呼ばれた時にコンパイルされるが、毎回コンパイルをする必要があるため、パフォーマンスがよくない。JITは一度コンパイルされたプログラムの塊はキャッシュされるので、初回実行時のみのオーバーヘッドになる。
AOT(Ahead Of Time) JITと反対に、事前にコンパイルするコンパイラにAOT(Ahead Of Time)コンパイラがある。C言語やC++、C#で使われており、iOSとAndroidもAOTを採用している。JITコンパイルは部分的な最適化をするが、AOTコンパイルはどのプラットフォームに対して最適化を行うのか事前にわかっているため、プラットフォームに合わせたコード全体の最適化が可能になる。