6

実行時にObjectiveCスクリプトをロードし、現在のiPhoneアプリのクラス/メソッド/オブジェクト/関数に対して実行する方法はありますか?

主な注意:これを実行したい主な理由は、アプリケーションのラピッドプロトタイピングを可能にし、主要なプロトタイピングフェーズが完了した後、作成したスクリプトをビルド時にコンパイルするためです。私は、ObjectiveCインタープリターを含むアプリを出荷する予定はありません。

私が尋ねる理由は、iPhoneアプリに埋め込むことができるluaインタープリターであるiPhoneワックスをいじってみたからです。これは、Objectiveで公開されているオブジェクト/メソッド/機能という意味で非常にうまく機能します。 Cコードは自動的にブリッジされ、luaで利用できます。

これにより、アプリのコアをユーザーのドキュメントディレクトリにあるluaファイルにするだけで、アプリケーションのプロトタイプをすばやく作成できます。アプリをリロードするだけで、XCodeでアプリを再構築しなくても、luaファイルへの変更をテストできます。これは大幅な時間の節約になります。

しかし、Appleの最近の3.1.3 SDKのものでは、このタイプの迅速なプロトタイプ作成を行うための最も安全なアプローチは、解釈されたコードとしてObjective Cを使用できるかどうかだと思いました...そうすれば、最悪のシナリオでは、代わりに、リリース前にアプリにコンパイルするだけです。luaソースをバイトコードにコンパイルし、ビルド時にリンクできると聞きましたが、スクリプト化されたソースがluaではなくObjective cにある場合、最終的に安全なことになると思います。そうすれば、ソースは、関係なく、常にObjectiveCにあります。

これは、iPhoneアプリにObjective Cインタープリターを埋め込む方法の例があるかどうか疑問に思います(私は検索しましたが、何も思いつきませんでした)。これにより、バイナリに組み込まれている現在のクラスに対してアプリのプロトタイプをすばやく作成できます。アプリをデプロイしようとしているときに、アプリ内インタープリターを介してクラスを実行する代わりに、それらをコンパイルします。

iPadとOS4を使用すると、Bluetoothと仮想キーボードをiPhoneとiPadで使用できます。これにより、このタイプのラピッドプロトタイピングは、少なくとも開発期間中は、はるかに便利になります。たとえば、アプリにインタープリターが組み込まれていて、それをiPadにインストールしている場合、XCodeを使用せずに、外出中にインタープリターに対してコーディングできます。そして私にとって、ソースを「アップル承認済み」の状態に戻すための最も便利な方法は、スクリプトがObjectiveCである場合です。

4

8 に答える 8

3

Objective-Cは、実際にはランタイムといくつかの構文糖衣を備えた単なるCです。これは本質的にコンパイルされた言語です(私は間違っているかもしれませんが、C用のプロダクション対応のインタープリターはないと思います)。

Xcodeには、コンパイル時間を短縮するためのZeroLinkという機能がありましたが、バグが多すぎるため、Xcode3で削除されました。

于 2010-04-27T17:05:26.173 に答える
3

それは完全に不可能というわけではありませんが、それだけの価値があるほど簡単ではありません。Objective-Cは通常インタプリタ言語ではありません。これは克服できないものではありません—ほとんどの場合、インタープリターとコンパイルは単なる実装の選択です。たとえば、Rubyは伝統的にインタプリタスクリプト言語と見なされていますが、MacRubyはObjective-Cが生成するのと同じようにそれをコードにコンパイルします。したがって、Objective-Cのインタプリタを作成することは可能ですが、誰もこれを行っていません。あなたはそれを自分で書かなければならないでしょう。

また、ルールはAppleのJavascriptインタープリター以外のインタープリターを禁止しています。これまでのところ、これは誰にも強制されていませんが、非常にまっすぐな矢印にしようとしている場合は、残念ながら、解釈されたコードも出ています。

于 2010-04-27T17:12:50.103 に答える
2

さて、提起する価値のあるポイントがいくつかあります。

  1. コンパイルできるのに、なぜObjective-Cコードを解釈するのですか?私は「ラピッドプロトタイピング」のアイデアを理解していますが、たとえばLuaでそれを行う理由の一部は、LuaがObjective-Cよりもはるかに簡潔な言語であるためです。Objective-Cの通訳に同じくらいのボーナスがあるかどうかはわかりません。
  2. NSBundleアプリにプラグインまたは動的にロード可能なモジュールが必要な場合は、または同様のメカニズムを使用して、いつでもそれらを個別のバンドルとしてコンパイルしてロードできます。
  3. とはいえ、Objective-Cの通訳者は知りません。あなたはおそらくあなた自身を書かなければならないでしょう。それがAppleのガイドラインに違反するかどうかはわかりません。それでもObjective-Cコードであると思いますが、解釈されたコードに対するルールもあると思いました。(ただし、 Objective-Cが解釈される架空のシナリオを想定したことはなかったと思います。)
于 2010-04-27T17:08:46.107 に答える
1

Chは商用のC/C++インタプリタです。SoftIntegrationという会社によって作られています。

于 2011-04-14T15:44:54.287 に答える
1

iPhoneではなく、シミュレーターで、
動的コードインジェクションツール
http://dyci.github.com/を使用してこれを行うことができます

少し異なる方法で動作するが、同じ機能を許可する別のツールもあります
http://injectionforxcode.com/

于 2012-12-05T18:22:07.553 に答える
1

基本的なObjective-Cインタープリターがあります。

投稿をチェックしてください:

Mac用のObjective-Cインタープリターはありますか?

また:

http://forrst.com/posts/Beginnings_of_a_Objective_C_Interpreter-Tdl

于 2012-12-07T05:23:41.143 に答える
1

cycriptを見てください。アプリに接続したり、メソッドをその場で置き換えたり、変数を変更したりできます。これは、Objective-CとJavaScriptのハイブリッド言語です。iDeviceをインストールするには、iDeviceをジェイルブレイクする必要があります。

于 2013-04-30T10:07:14.167 に答える
0

Objective-Cランタイムリファレンスのドキュメントobjc_msgSend()とその他の部分をご覧ください。基本的に、テキストを解析してランタイムに送信できます。

于 2010-04-27T17:31:17.313 に答える