web-dev-qa-db-ja.com

Appcelerator Titanium Mobileの仕組み

Titanium Mobile 1.0を使用してiPhoneアプリを作成していますが、ネイティブのiPhoneバイナリにコンパイルできることがわかりました。これはどのように作動しますか? JavaScriptコードを分析し、280 NorthのObjective-JやCappuccinoのようなスーパーセット言語を使用せずにObjective-Cに直接翻訳するには、かなり手間がかかるようです。

78
Darrell Brogdon

TitaniumはJavascriptコードを取得し、それを分析してプリプロセスし、アプリケーションのTitanium APIの使用に基づいて解決される一連のシンボルにプリコンパイルします。このシンボル階層から、基になるTitaniumライブラリシンボルにマップするシンボル依存関係マトリックスを構築して、アプリが特に必要とするAPI(および関連する依存関係、フレームワークなど)を理解できます。 Wordシンボルは言語によって少し異なるため、半一般的な方法で使用しています。 iPhoneでは、シンボルは真のCシンボルにマッピングされ、最終的にARM/i386アーキテクチャ用にコンパイルされたコンパイル済み.oファイルにマッピングされます。 Javaの場合、それは多かれ少なかれ.classファイルなどです。フロントエンドが依存関係マトリックスを理解したら、SDKコンパイラーを呼び出します(つまり、GCC for iPhone、Java for Android )その後、アプリケーションを最終的なネイティブバイナリにコンパイルします。

したがって、それを考える簡単な方法は、JSコードがほぼ1対1でネイティブランドの代表的なシンボルにコンパイルされるということです。インタプリタモードで実行されているインタプリタがまだ存在します。そうでない場合、動的コードなどが機能しません。しかし、はるかに高速で、はるかにコンパクトで、取得できるネイティブマッピングにほぼ近いものです。

私たちは明らかにこれを改善する余地がまだ十分にあり、それに取り組んでいます。これまでの最新の1.0テストでは、同じObjective-Cの直接コードとほとんど区別できません(ほとんどの場合、正確にマッピングされているため)。しかし、CompSciの観点からは、GCCコンパイラが今日すでに行っているように、人間が実際に簡単に実行できないことを最適化することができます。

147
jhaynie

Jhaynieが言ったように、アプリケーションはネイティブコードにコンパイルされますが、javascriptを実行するためのインタープリターがまだ存在しているため、アプリケーションを非常に動的にすることができます。

加速器チタン

3
Evan

単純な十分なコードをパッケージ化すると、〜80MBのgzipアーカイブ(元のコード〜1kB)が得られます。パッケージ内-とりわけ-あなたは私のソースhtmlとjsファイルを見つけることができます。パッケージには多くのライブラリ(sslなど)も同梱されています(このフレームワーク内の多くのものに低レベルでアクセスできるため)。

彼らはあなたのコードを受け取り、ある種のインタープリターソフトウェアとライブラリをラップすると思います。私の場合、私のサイトを表示するだけの小さなブラウザの横にhtmlとjsのコードを詰め込むようなものです。

ただし、サポートされているすべてのシステムでコードが同じように機能する限り、それは素晴らしいことです。

1
the-fallen