世界を動かす技術を、日本語で。

アセンブリによるHello-World iOSアプリ

概要

このコードは ARM64アセンブリ で記述された iOSアプリの最小起動コード です。 Objective-CランタイムAPI を直接呼び出し、 AppDelegateクラス を動的生成します。 ウィンドウとビューコントローラを作成し、 背景色を黄色 に設定します。 UIApplicationMainを呼び出し、アプリのエントリポイントとなります。 低レベル実装例 として、iOSアプリの起動プロセス理解に役立ちます。

ARM64アセンブリによるiOS最小アプリ起動処理

  • _main関数 でアプリ起動処理の全体を管理
    • autorelease pool の生成・解放
    • UIApplicationMain の呼び出し
    • AppDelegateクラス名 のCFString生成
  • initAppDelegateサブルーチン でAppDelegateクラスを動的生成
    • NSObject を基底クラスとして新しいクラス生成
    • UIApplicationDelegateプロトコル の追加
    • didFinishLaunchingWithOptions:メソッド の追加
    • Objective-CランタイムAPI (objc_allocateClassPair, class_addProtocol, class_addMethod等)利用
    • クラス登録 (objc_registerClassPair)
  • didFinishLaunchingサブルーチン で画面構成要素を生成・設定
    • UIScreen, UIWindow, UIViewController のインスタンス生成
    • UIScreenのbounds取得 し、UIWindowを初期化
    • UIViewControllerの生成・初期化
    • UIColorのyellowColor取得
    • viewの背景色を黄色に設定
    • windowのrootViewControllerにUIViewControllerを設定
    • windowを表示 (makeKeyAndVisible)
    • YES(成功)を返却
  • データセクション で必要なクラス名・セレクタ名・型情報等を定義
    • asciz命令 で文字列リテラルを格納
  • 低レベルAPI活用 により、通常のObjective-Cコードでは見えない 初期化手順の可視化

このコードの意義と特徴

  • Objective-CランタイムAPI を直接呼び出すことで、 クラス生成・プロトコル追加・メソッド実装 を動的に実現
  • iOSアプリの起動プロセス をアセンブリレベルで詳細に理解可能
  • UIKitの標準的な初期化手順 (ウィンドウ生成、ビューコントローラ配置、背景色設定等)を明示的に記述
  • メモリ管理やレジスタ操作 など、CやObjective-Cよりもさらに低レベルな制御
  • 教育・解析・特殊用途 での利用を想定したサンプルコード

各セクションの処理フロー詳細

  • _main
    • レジスタ・スタックの保存・復元
    • autorelease pool生成(_objc_autoreleasePoolPush)
    • AppDelegateの初期化(initAppDelegate呼び出し)
    • CFStringでクラス名生成(_CFStringCreateWithCString)
    • UIApplicationMain呼び出し(_UIApplicationMain)
    • autorelease pool解放(_objc_autoreleasePoolPop)
    • 終了時に戻り値を返却
  • initAppDelegate
    • NSObjectを基底にAppDelegateクラス生成
    • UIApplicationDelegateプロトコル追加
    • application:didFinishLaunchingWithOptions:メソッド追加
    • クラス登録
    • 戻り値でクラスオブジェクト返却
  • didFinishLaunching
    • UIScreenのmainScreenセレクタ取得・呼び出し
    • boundsセレクタで画面サイズ取得
    • UIWindowインスタンス生成・initWithFrameで初期化
    • UIViewController生成・init呼び出し
    • UIColorのyellowColor取得
    • UIViewControllerのviewの背景色を黄色に設定
    • UIWindowのrootViewControllerにUIViewControllerを設定
    • makeKeyAndVisibleでウィンドウ表示
    • YES(0x1)を返却

まとめ

  • ARM64アセンブリ による iOSアプリ起動の最小実装例
  • Objective-CランタイムAPI の直接利用による柔軟なクラス・メソッド操作
  • UIKit初期化手順 の明示的な流れ
  • 低レベルプログラミングiOS内部動作理解 に最適な教材

Hackerたちの意見

超クール!ビルドやデプロイの手順も見てみたいな。

xcrun -sdk iphoneos clang yellow.asmを実行して、IPAにパックして署名するんだ。

自分のコンピュータでこれを試してみた。1. 新しいXcodeのiOSプロジェクトを作って、Info.plist以外のファイルは全部削除 2. Info.plistから全てのキーを削除 3. ビルド設定で「storyboard」を検索して、全てのキーを削除 4. yellow.asmをプロジェクトに追加 5. UIKitとFoundationをリンク これでシミュレーターでビルドして実行できるよ。

ここにCで実装されたiOSアプリもあるよ:https://stackoverflow.com/a/10290255/8427

snibbetrackerはC/SDLで作られたiOSアプリの一例だよ。https://apps.apple.com/de/app/snibbetracker/id1065797528

ビルド手順があればもっといいね。

こういうことが実際に中身を学ぶ方法だよね。みんなReact NativeやFlutterで開発してるけど、何かが壊れたときに困るんだよね。そしたら、ググって魔法みたいなことを探さなきゃいけなくなる。アセンブリから始めると、抽象化の本当のコストがわかるよ。

これって本当に低レベルなのかな?UIKitをフックしてるから、ASMに比べるとかなり高レベルだよね。UIKitなしでiOS上にアプリを描画するのを見てみたいな。可能かどうかわからないけど。

実際、アセンブリを使わない理由としては素晴らしい議論だね。

これが教えてくれるのは、パラメータをスタックに置いて、関数に渡して、結果を使う方法だけだね。Cでやることのほぼそのままの翻訳みたいなもんだ。

アセンブリは、壊れるまでは大丈夫だよね。

それでも、Objective-CのランタイムやCoreAnimation、UIKitの抽象化が裏で動いてるからね。

アセンブリとRN/Flutterの間には、かなりの距離があるよ。これらのことを知っておくのは助けになると思うけど、もっと一般的に適用できるようになるには、もっとたくさん学ばないといけないね。

完全にデタラメだね。これはプログラマーのマチズモで、現実から完全に乖離してる。

これは最近見た中で一番HNっぽいコメントだな。ちなみに、ここでの本当の抽象化はLLMを使ったコーディングだよ!!!

すごくクールだけど、実用的じゃないね(アプリストアの承認プロセスを通過するのは難しいだろうし)。ARMアセンブリは、昔使ってた8ビットや16ビットのバージョンよりもずっと複雑だよ。学ぶためには「ベアメタル」から始めるのが好きだけど、最近はそれが長い道のりになってる。子供の頃は、ほんの数ステップだったのに。

将来的には、アプリストアの承認プロセスが必要なくなるかもね。EUがAppleに大きな罰金を科してくれることを願ってるよ。それに、EU各国ごとに法人税がかかるようになるのもいいと思う。企業がここで大金を稼いでるのに、ほとんど税金を払ってないのはおかしいよね。アイルランドだけはパーティーしてるけど。とにかく、ASMはiOSエミュレーターを使って何かをする時には素晴らしいよね。ルート権限もあるし、まあ :)

それがアプリストアの承認にどう影響するんだろう?私の知る限り、彼らはバイナリをレビューするはずだし…

XCodeやAppleのひどい開発者ドキュメントを使うよりは、ずっと理にかなってるね。

1971年か72年の時、コンピュータサイエンスの2年生か3年生の時に、もちろんIBM 360のアセンブラを学んだんだけど、AND、OR、XORゲートを使ってシンプルな2進加算器を設計しなきゃいけなかったんだ。全部紙の上でね。はんだ付けや電子回路は必要なかったけど、それはちょっと残念だったな。入力のビット数は覚えてないけど、たぶん4ビットか6ビットだったと思う。アセンブリプログラミングも結構やってて、チェビシェフ多項式とニュートン法を使った平方根計算のルーチンも作ったよ。

ObjectiveCじゃなくて、Cの同等のものが見たいな…普通のCで。

iOSがCでGUIをサポートしてくれたら最高だね。

こういうことに興味がある人には、アプローチしやすいスタート地点としてこれをおすすめするよ: https://www.goodreads.com/book/show/44882.Code こんな速度最適化を求める実際のアプリケーションが見れたら最高だな。最後に使った重要なアセンブリ言語のプログラムはWriteNowで、約10万行のアセンブリだった。今でもお気に入りのワードプロセッサなんだ(NeXT版ね。Mac版は、v2.0でもDisplay PostScriptやServicesにアクセスできなかったから、比較するとイマイチだった)。folklore.orgにそれについての詳しい記事があればいいのに…残念ながら、ただ一回だけ言及されてるだけだね: https://www.folklore.org/The_Grand_Unified_Model_The_Finder....(NeXTの初期の歴史についての同等のサイトがあればいいのに)

ここでの本当の最適化は、UIKitから離れてGPUともっと直接的にやり取りすることだね。