📟

Claude CodeでRPGを書いてみた ― 意外と書けた話

に公開1

エンジニア歴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 のように短くする必要があります。


感想・考察

なぜうまくいったのか?

おそらく以下の理由が考えられます:

  1. シンプルな処理に絞った

    • DB操作、ファイル処理、画面設計などは未検証
  2. 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万人以上が利用している実績あるサービスなので、安心して使えます。


参考リンク

株式会社kozokaAI 開発チーム

Discussion

もつじもつじ

私もむかし開発をやってましたね!