ChatGPTを使って実験的なCコンパイラを作るという面白いプロジェクトを紹介します。このプロジェクトでは、CコードをChatGPTに渡して、直接x86アセンブリコードを生成するという、少し変わった(ちょっと危険な)ことをしています。
はじめに:なぜAIコンパイラなのか?
通常、プログラミング言語のコンパイラは、ソースコードを解析し、中間表現を経て、最終的にマシンコードを生成する複雑なプログラムです。今回紹介するプロジェクトは、この過程をAIに任せてしまおうという大胆な試みです。
技術的な仕組み
このプロジェクトは、以下の要素で構成されています:
- シェルスクリプト(chatgcc.sh)
- OpenAI API
- GNUアセンブラ(as)とリンカ(ld)
主要なコンポーネント
# プロジェクトの基本構成
chatgcc.sh # メインスクリプト
test.c # 入力となるCソースコード
test.asm # 生成されるアセンブリコード
test # 最終的な実行ファイル
動作の流れ
- Cソースコードの読み込み
- ChatGPTへのプロンプト生成
- APIを通じたアセンブリコードの生成
- 生成されたコードのアセンブルとリンク
以下が主要な処理を行うシェルスクリプトの概要です:
# 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"
使い方
- 事前準備:OpenAI APIキーの設定
export OPENAI_API_KEY="sk-..."
- コンパイルの実行
./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
注意点と制限事項
このプロジェクトには以下のような注意点があります:
-
生成の不確実性
- ChatGPTの出力は毎回異なる可能性があります
- 複雑なコードでは正しく動作しない場合があります
-
セキュリティ上の考慮
- 生成されたコードは検証が必要です
- 重要なシステムでの使用は避けるべきです
-
パフォーマンス
- 生成されるアセンブリコードは最適化されていません
- APIコールのオーバーヘッドがあります
まとめ
このプロジェクトは、AIを活用した実験的な開発の一例です。実用的なツールというよりは、学習とアイデア検証のためのプロジェクトだと思いますが、おもしろいですね