`appinventor`というweb上で、好きなパーツをはめていくだけで  
手軽にAndroidアプリが作れるものがあります。

<http://www.atmarkit.co.jp/ait/articles/1103/15/news087.html>

手軽でびっくりしたのですが、  
androidアプリとして動く(apkファイルを作成する)までの流れが理解しきれず困っております。

```

    GUIで操作及び、ブロックのロジックを設定する
    ↓
    ブラウザベースのサービスなので、
    そのロジックをもとに、javascriptでjavaのスクリプトに変換（翻訳？）する
    ↓
    GUIの部分はどういうプロセスを踏んでかは不明だが、xmlファイルに変換し、ボタンなどの位置を記憶する
    ↓
    apkファイル生成
    
```

といった漠然としたイメージは持っております。

特にわからないのは、どうして、ブラウザ上で作成したロジックがandroidアプリで動くようになているのかという点です。

前述のとおり、何かしらの方法で翻訳しているのだと思うのですが、  
ただ翻訳するだけでなく、javaのファイルとして生成しなければいけないと思います。

その部分が私の今の理解度では追いついておらず、ブラックボックス化しております。

ソースコードを呼んだり、ググったりしていたのですが、よくわからず、質問させていただきました。  
<https://github.com/mit-cml/appinventor-sources>

興味本位の質問ではありますが、すごく面白いないようなので、車輪の開発にはなりますが、  
自分でも同じようなことができるようになりたいと思っております。

そのために何が必要なのかも差支えがなければ教えていただけると幸いです。

拙い知識ではありますが

  * 構文解析器
  * コンパイル

などが肝になるのかなと思っております。

また、少し話がそれますが、  
`rubymotion`という、rubyの文法で、iOS と Android のモバイルアプリが開発できる言語？  
があります。

こういうのも今回の質問内容に類似しており、気になるところではあります。

rubyの文法で書いたロジックを何かしらの形で翻訳し、javaやobjective-
cに変換するのだと思うのですが、ここでいうところのその変換方法が何なのかがわかりませんでした。

不足事項などは都度追記させていただきます。  
何卒よろしくお願いします。
CC BY-SA 3.0
2016-03-27T13:30:33.293
23506
2016-03-28T16:07:22.470
13175
question
android java ruby objective-c xcode
GUIでの操作だけでアプリが開発できるサービスがあるのですが、その理由がわかりません。（構文解析などが関係しうるのかもしれませんが）
RubyMotion の場合は、JavaやObjective Cへの変換は行わずに直接バイナリ (より正確に言えば、LLVMのバイトコード)
を出力します。つまり、Rubyコンパイラとして動作します。
CC BY-SA 3.0
2016-03-27T13:47:12.177
23508
2016-03-27T13:47:12.177
76
23506
answer
まず、ブラウザ上のJavascriptではUIのレイアウトとブロックの配置を行うエディタ、そしてXMLや後述するYAIL言語への変換を行います。このスクリプトは単純なJavascriptの他に、Javaで書かれたプログラムを[GWT](https://ja.wikipedia.org/wiki/Google_Web_Toolkit)というツールで変換したものも含まれています。

プロジェクトをエクスポートする際はXMLを固めたzipになっていますが、デバッグやビルドの際に使われるのはもうひとつの[YAIL](https://github.com/mit-
cml/appinventor-
sources/blob/master/appinventor/blocklyeditor/src/generators/yail.js)（Young
Android Intermediate
Language）という言語です。これはAppInventor独自の[Scheme](https://ja.wikipedia.org/wiki/Scheme)風のプログラミング言語で、UIもブロックもこの言語に変換され、Android端末で動かしたYAILインタプリタで動作します。このインタプリタは、Java上のScheme実装である[Kawa](https://ja.wikipedia.org/wiki/Kawa)で実装されています。

apkファイルをダウンロードする時には、YAILコードとリソースをビルドサーバーに送り、それらとYAILインタプリタを合体してapkにします。ビルド処理の実装は[このあたりに](https://github.com/mit-
cml/appinventor-
sources/blob/master/appinventor/buildserver/src/com/google/appinventor/buildserver/Compiler.java)。

というわけで、Javaのソースコードやバイトコードを自ら生成しているわけではありません。

一般にAndroid向けにコンパイルするというとJavaバイトコードを生成するわけですが、Java以外の言語でAndroidアプリを作る方法を考えると、

  * Javaでインタプリタを実装する
  * Javaのソースコードに変換する
  * Javaバイトコードへのコンパイラを実装する（Kawaとか）
  * Javaバイトコードへのコンパイルができる、別の言語を経由する（Kawaを経由するYAIL）
  * バイトコードではなく、ネイティブコードを生成する（Rubymotionなど）  
といってもLLVM使えば機械語を直接がりがり書く必要はないとかそういう

と、結構色んなパターンがあります。できることやパフォーマンス、難易度に大きく差があります。

ちなみにこれはどう出力するかの話です。変換元となるプログラムを読み取る処理は別途考える必要がありますが、そこで出てくるのか構文解析などのプロセスです。

参考

  * [App Inventor Developer Overview](https://docs.google.com/a/6lab.org/document/d/1hIvAtbNx-eiIJcTA2LLPQOawctiGIpnnt0AvfgnKBok/pub)
  * [what computer programming language is the app builder? - Google グループ](https://groups.google.com/forum/#!topic/mitappinventortest/cMkhyGqvFFA)
CC BY-SA 3.0
2016-03-27T16:56:38.330
23516
2016-03-27T16:56:38.330
8000
23506
answer