Claude CodeでRPGを書いてみた ― 意外と書けた話
エンジニア歴8年ほどになりますが、転職後に初めてIBM i (AS/400)に関わることになり、RPGというプログラミング言語の存在を知りました。
今でも世界中の基幹システムで現役バリバリで動いていて、銀行、保険、製造業など、止まったら困るシステムの多くがRPGで動いているとのこと。そしてRPGを書ける人がどんどん減っているという課題も。
そこでRPGの勉強も兼ねてClaude CodeにRPGを書かせてみました。
この記事の対象読者
- IBM i / AS/400 に関わることになった人
- AIコード生成ツールの可能性に興味がある人
- RPGという言語に興味がある人
- 「古い言語もAIで書けるの?」と疑問を持っている人
RPGってどんな言語?
- IBM i (旧AS/400)専用のプログラミング言語
- 1959年誕生、今も進化中
- 銀行、保険、製造業などの基幹システムで使われている
- 書ける人が減っている → AIに期待がかかっている
固定形式とフリーフォーマット
RPGには「固定形式」と「フリーフォーマット」があります。
固定形式(レガシー):
C EVAL RESULT = A + B
C DSPLY RESULT
↑ 列の位置に意味がある。パンチカード時代の名残。
フリーフォーマット(モダン):
**FREE
result = a + b;
dsply result;
↑ 普通のプログラミング言語っぽい。2013年以降推奨。
今回はフリーフォーマットで検証します。
検証の背景:RPG向けAIアシスタントの登場
IBMは「watsonx Code Assistant for i」というRPG向けAIアシスタントを開発し、2025年10月には「Project Bob」という統合AIアシスタントに進化させました。
Project Bobの特徴:
- Claude、Granite、Llamaなど複数のLLMを使用
- RPG、COBOL、CL、SQL、Java、Pythonをサポート
- IBM社内6,000人が使用、生産性45%向上を報告
Project Bobは複数のLLM(Granite、Claude、Llama、Mistralなど)を組み合わせて使用しており、その中にはClaudeも含まれています。この記事では専用チューニングなしの素のClaude Codeでどこまで書けるのか? 試してみました。
検証環境
| 項目 | 内容 |
|---|---|
| AIツール | Claude Code v2.1.19 |
| モデル | Claude Opus 4.5 |
| IBM i | 自社環境(SSH経由) |
| エディタ | VS Code + Code for IBM i |
| コンパイル | CRTBNDRPG / CRTRPGMOD |
テストケース
シンプルなものから少し複雑なものまで、5つのテストを実施しました。
| # | 難易度 | 内容 |
|---|---|---|
| 1 | 初級 | Hello World |
| 2 | 中級 | サービスプログラム(消費税計算) |
| 3 | 中級 | 文字列処理(%TRIM, %SCAN, %SUBST) |
| 4 | 中級 | 配列とデータ構造(バブルソート) |
| 5 | 上級 | 再帰処理(階乗計算) |
検証結果
テスト1: Hello World
プロンプト:
画面に「Hello World」と表示するRPGプログラムを作成してください。
IBM i (AS/400)で動作するILE RPGのフリーフォーマットで書いてください。
生成されたコード:
**free
ctl-opt main(main);
ctl-opt dftactgrp(*no);
dcl-proc main;
dcl-s message varchar(50);
message = 'Hello World';
dsply message;
*inlr = *on;
return;
end-proc;
結果:
RNI5334 00 情報 DSPLY Hello World
| 評価項目 | 結果 |
|---|---|
| コンパイル | ○ 成功 |
| **FREE形式 | ○ |
| 実行 | ○ 成功 |
所見: 一発でコンパイル・実行成功。シンプルなプログラムなら問題なし。
テスト2: サービスプログラム(消費税計算)
プロンプト:
消費税を計算するサービスプログラムを作成してください。
- サービスプログラム: TAXSRV(CalcTaxプロシージャ)
- メインプログラム: TAXMAIN(TAXSRVを呼び出す)
- 金額1000円、税率10%で計算結果を表示
生成されたコード(サービスプログラム):
**FREE
CTL-OPT NOMAIN;
DCL-PR CalcTax PACKED(11:2);
p_Amount PACKED(9:0) CONST;
p_TaxRate PACKED(3:2) CONST;
END-PR;
DCL-PROC CalcTax EXPORT;
DCL-PI *N PACKED(11:2);
p_Amount PACKED(9:0) CONST;
p_TaxRate PACKED(3:2) CONST;
END-PI;
DCL-S w_TaxAmount PACKED(11:2);
w_TaxAmount = p_Amount * p_TaxRate;
RETURN w_TaxAmount;
END-PROC;
生成されたコード(メインプログラム):
**FREE
CTL-OPT DFTACTGRP(*NO) ACTGRP(*NEW) BNDDIR('TAXBND');
DCL-PR CalcTax PACKED(11:2) EXTPROC('CALCTAX');
p_Amount PACKED(9:0) CONST;
p_TaxRate PACKED(3:2) CONST;
END-PR;
DCL-S w_Amount PACKED(9:0);
DCL-S w_TaxRate PACKED(3:2);
DCL-S w_TaxAmount PACKED(11:2);
DCL-S w_Message CHAR(50);
w_Amount = 1000;
w_TaxRate = 0.10;
w_TaxAmount = CalcTax(w_Amount : w_TaxRate);
w_Message = 'Amount: ' + %CHAR(w_Amount) +
' Rate: ' + %CHAR(w_TaxRate) +
' Tax: ' + %CHAR(w_TaxAmount);
DSPLY w_Message;
*INLR = *ON;
RETURN;
結果:
RNI5334 00 情報 DSPLY Amount: 1000 Rate: .10 Tax: 100.00
| 評価項目 | 結果 |
|---|---|
| コンパイル | ○ 成功(4工程すべて) |
| **FREE形式 | ○ |
| NOMAIN指定 | ○ |
| EXPORT/EXTPROC | ○ 正しく設定 |
| バインドディレクトリ | ○ |
テスト3: 文字列処理
プロンプト:
文字列処理プログラムを作成してください。
- 入力: ' Hello, World! '
- %TRIMで空白除去
- %SCANRPLで'World'を'RPG'に置換
- %SCANでカンマ位置を検索
- %SUBSTでカンマ前を抽出
結果:
DSPLY TRIM Result: Hello, World!
DSPLY Replace Result: Hello, RPG!
DSPLY Comma Position: 6
DSPLY Extract Result: Hello
| 評価項目 | 結果 |
|---|---|
| コンパイル | ○ 成功 |
| %TRIM | ○ |
| %SCANRPL | ○ |
| %SCAN | ○ |
| %SUBST | ○ |
テスト4: 配列とデータ構造(バブルソート)
プロンプト:
5人分の社員データ(社員番号、名前、年齢)を持つデータ構造配列を定義し、
年齢順にバブルソートするプログラムを作成してください。
結果:
DSPLY Before Sort:
DSPLY E001 Tanaka 35
DSPLY E002 Suzuki 28
DSPLY E003 Yamada 42
DSPLY E004 Sato 31
DSPLY E005 Ito 25
DSPLY After Sort (Age Asc):
DSPLY E005 Ito 25
DSPLY E002 Suzuki 28
DSPLY E004 Sato 31
DSPLY E001 Tanaka 35
DSPLY E003 Yamada 42
| 評価項目 | 結果 |
|---|---|
| コンパイル | ○ 成功 |
| データ構造配列 | ○ LIKEDS + DIM |
| バブルソート | ○ 正しく実装 |
| 早期終了最適化 | ○ swappedフラグあり |
テスト5: 再帰処理(階乗計算)
プロンプト:
再帰処理で階乗を計算するプログラムを作成してください。
- 5! と 10! を計算
- 負の数はエラー処理
- オーバーフロー対策(MONITOR/ON-ERROR)
結果:
DSPLY 5! = 120
DSPLY 10! = 3628800
DSPLY Error: Cannot calculate negative number
| 評価項目 | 結果 |
|---|---|
| コンパイル | ○ 成功 |
| 再帰呼び出し | ○ |
| 負数エラー処理 | ○ |
| MONITOR/ON-ERROR | ○ |
結果まとめ
| テスト | 内容 | コンパイル | 実行 | 評価 |
|---|---|---|---|---|
| test1 | Hello World | ○ | ○ | 完璧 |
| test2 | サービスプログラム | ○ | ○ | 完璧 |
| test3 | 文字列処理 | ○ | ○ | 完璧 |
| test4 | 配列・ソート | ○ | ○ | 完璧 |
| test5 | 再帰処理 | ○ | ○ | 完璧 |
5テストすべて一発成功。
基本的な構文、組み込み関数、配列・データ構造、サービスプログラム連携、再帰処理といった幅広い機能について、Claude Codeが正しくRPGコードを生成できることがわかりました。
ハマったポイント(Claude Codeの問題ではない)
検証中にいくつかハマったポイントがありましたが、これはClaude Codeの問題ではなく、IBM i 環境特有の問題でした。
1. CCSID問題
Claude Codeが生成するファイルはUTF-8(CCSID 1208)ですが、RPGコンパイラは読めないことがあります。
解決策:
setccsid 819 /path/to/file.rpgle
2. オブジェクト名の制限
IBM i では、コンパイルして生成されるプログラム(*PGM)やサービスプログラム(*SRVPGM)などを「オブジェクト」と呼びます。このオブジェクト名は最大10文字という制限があります。
そのため、ソースファイル名が test1_helloworld.rpgle でも、コンパイル時のプログラム名は HELLO のように短くする必要があります。
感想・考察
なぜうまくいったのか?
おそらく以下の理由が考えられます:
-
シンプルな処理に絞った
- DB操作、ファイル処理、画面設計などは未検証
-
Claude Opus 4.5の知識が十分だった
- RPGの学習データが一定量あったと思われる
まとめ
「RPGはサンプルが他に比べて少なそうだからAIには難しいかもしれない」と思っていましたが、シンプルなプログラムなら問題なく生成できることがわかりました。
もちろん、実務で使うような複雑なプログラム(DB連携、画面設計、バッチ処理など)はまだ検証が必要です。でも、学習用のサンプルコードを生成させる程度なら十分実用的です。
RPGを学び始めた人が「こういう処理ってどう書くの?」という疑問をClaude Codeにぶつけて、サンプルコードを生成してもらう ― そんな使い方は今すぐできそうです。
「サンプルが少ない言語だからAIには難しい」という先入観は捨てていいかもしれません。
試してみたい方へ
今回の検証は、以下の環境で行いました:
- VS Code + Code for IBM i (拡張機能)
- SSHでIBM i に接続
- Claude Codeでコード生成
IBM i 環境さえあれば、特別な準備なしで試せます。Code for IBM i はオープンソースで無料、Claude Codeも手軽に使えます。
「RPGってどんな言語?」と興味を持った方は、ぜひ試してみてください。Hello Worldを動かすだけなら、思ったより簡単です。
IBM i 環境がない方へ
IBM i 環境がなくても、PUB400.com という無料の公開サーバーでRPGを試すことができます。アカウント登録するだけで、RPG、COBOL、CLなどのプログラミングが可能です。
VS Code + Code for IBM i での接続もできるので、今回紹介した検証と同じ環境を無料で構築できます。4万人以上が利用している実績あるサービスなので、安心して使えます。
参考リンク
- Code for IBM i - VS Code拡張
- PUB400.com - 無料の公開IBM i サーバー
- Project Bob(IBM AI Code Assistant)
Discussion
私もむかし開発をやってましたね!