0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPTで作るCコンパイラ

Posted at

ChatGPTを使って実験的なCコンパイラを作るという面白いプロジェクトを紹介します。このプロジェクトでは、CコードをChatGPTに渡して、直接x86アセンブリコードを生成するという、少し変わった(ちょっと危険な)ことをしています。

はじめに:なぜAIコンパイラなのか?

通常、プログラミング言語のコンパイラは、ソースコードを解析し、中間表現を経て、最終的にマシンコードを生成する複雑なプログラムです。今回紹介するプロジェクトは、この過程をAIに任せてしまおうという大胆な試みです。

技術的な仕組み

このプロジェクトは、以下の要素で構成されています:

  1. シェルスクリプト(chatgcc.sh)
  2. OpenAI API
  3. GNUアセンブラ(as)とリンカ(ld)

主要なコンポーネント

# プロジェクトの基本構成
chatgcc.sh        # メインスクリプト
test.c           # 入力となるCソースコード
test.asm         # 生成されるアセンブリコード
test             # 最終的な実行ファイル

動作の流れ

  1. Cソースコードの読み込み
  2. ChatGPTへのプロンプト生成
  3. APIを通じたアセンブリコードの生成
  4. 生成されたコードのアセンブルとリンク

以下が主要な処理を行うシェルスクリプトの概要です:

# ChatGPTへの指示(プロンプト)
prompt="
You are a C compiler targeting x86_64 assembly. Generate assembly code with the following specifications:
- Make sure you include the _start entry symbol
- Use AT&T/GAS syntax (default GNU assembler syntax)
- Include necessary sections (.text, .data, etc.)
- Include proper function prologue/epilogue
- Handle C standard library functions appropriately
- Include comments explaining key operations
- Target Linux x86_64 platform"

# APIを使用してアセンブリコードを生成
assembly=$(curl https://api.openai.com/v1/... | grep -oP '```assembly\K[^`]*(?=```)')

# アセンブルとリンク
as -o "${filename%.c}.o" "${filename%.c}.asm"
ld -o "${filename%.c}" "${filename%.c}.o"

使い方

  1. 事前準備:OpenAI APIキーの設定
export OPENAI_API_KEY="sk-..."
  1. コンパイルの実行
./chatgcc.sh test.c

これにより、以下の処理が行われます:

  • test.c → ChatGPT → test.asm (アセンブリコード生成)
  • test.asm → as → test.o (オブジェクトファイル生成)
  • test.o → ld → test (実行ファイル生成)

生成されるアセンブリコードの例

簡単な「Hello, World!」プログラムを例に見てみましょう:

// test.c
int main() {
    puts("Hello, World!");
    return 0;
}

ChatGPTが生成する可能性のあるアセンブリコード:

.section .data
    message: .string "Hello, World!\n"

.section .text
    .global _start

_start:
    # 関数プロローグ
    pushq %rbp
    movq  %rsp, %rbp

    # puts("Hello, World!")相当の処理
    movq  $1, %rax          # write syscall
    movq  $1, %rdi          # stdout
    leaq  message(%rip), %rsi  # メッセージのアドレス
    movq  $14, %rdx         # 長さ(\nを含む)
    syscall

    # プログラムの終了
    movq  $60, %rax        # exit syscall
    xorq  %rdi, %rdi       # status = 0
    syscall

注意点と制限事項

このプロジェクトには以下のような注意点があります:

  1. 生成の不確実性

    • ChatGPTの出力は毎回異なる可能性があります
    • 複雑なコードでは正しく動作しない場合があります
  2. セキュリティ上の考慮

    • 生成されたコードは検証が必要です
    • 重要なシステムでの使用は避けるべきです
  3. パフォーマンス

    • 生成されるアセンブリコードは最適化されていません
    • APIコールのオーバーヘッドがあります

まとめ

このプロジェクトは、AIを活用した実験的な開発の一例です。実用的なツールというよりは、学習とアイデア検証のためのプロジェクトだと思いますが、おもしろいですね

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?