VSCodeでRPGコーディングやってみた

IBMiにおける伝統的なRPG用エディタであるSEUと、Visual Studio Code（以下、VSCode）それぞれでRPG IIIをコーディングし、機能の比較をおこないました。

この記事はIBMi Rizing 2024チームV-Eの成果報告です。

## 環境情報

* OS
  * Windows 10, 11（エディションによる違いはありません）
* 言語
  * RPG III

## エディタ機能の比較

プログラミングで必要な機能の内、メンバーから希望のあった以下の機能について、SEUとVSCodeを比較しました。

* コピー＆ペースト
* 構文チェック
* 置換
* コンパイル手順の比較
* 実行結果の確認方法

### コピー＆ペースト

#### VSCode

VSCodeでは、以下の順序で操作することにより、コピー操作とペースト操作を実行することができます。

1. `Shift + C`を押しながら矢印キーで対象範囲を選択
1. `Ctrl + C`を押下（コピー）
1. `Ctrl + V`を押下（ペースト）

![2024-10-09-18-29-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/520373e1-90d3-29d0-5739-415155cd0123.png)


VSCodeは、Windows標準のメモ帳と同じ要領で操作することが可能。
SEUにはできないテキストの部分選択も可能。

#### SEU

SEUでは、以下の順序で操作することにより、コピー操作とペースト操作を実行できる。

1. 対象行の先頭に`C`（Copy）と入力
1. 追加する場所に`B`（Before）または`A`（After）を入力
1. 実行キーを押下

![2024-10-09-18-19-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/a260e77a-5580-0009-061b-982869f07d46.png)

また、`C`を2回入力することにより、入力行の間にある行もまとめて複数行コピーすることができます。

![2024-10-09-18-20-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/2147c8bf-0903-d48b-32e3-5ece0ffd205d.png)


SEUでは行ごとのコピーのみ可能であり、テキストの部分選択によるコピーはできません。

### 構文チェック

#### VSCode

以下のコードには一箇所誤りがあります。分かりますか？

![2024-10-09-18-36-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/b305b90e-cbf9-dea2-f6c2-10573fcfcd3d.png)


27行目の`READ`命令の後にファイル名の指定がないことが誤りです。

![2024-10-09-18-41-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/8aee09b7-7a67-5658-9efc-fe4ec9958b36.png)


VSCodeでは、コンパイル時エラーとして構文ミスが表示されます。
構文チェック（=コンパイル）は、以下の手順でおこないます。

1. `IFS BROWSER`でチェック対象のソースを右クリックし、`Run Action`をクリック。
    * ![2024-10-09-18-50-06-edited.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/539e2f89-2223-c94a-8b3a-11716895b4b1.png)
1. `Create Bound RPG Program (CRTBNDRPG)`コマンドを実行。
    * ![2024-10-09-18-50-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/92520b3c-c9b1-4f07-9065-f3281912b6a5.png)

1. エラー箇所が波線で表示される。
    * ![2024-10-09-18-51-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/71e59423-431c-a732-dea0-4769bff11df9.png)

#### SEU

SEUでは、コーディング中に実行キーを押下することで、現在入力中の行の構文チェックを実行することができます。
構文エラーがあると、行の背景色が反転し、間違いのあることが通知されます。

![2024-10-09-18-53-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/9d9e460b-d2dd-165f-9e26-f2246ccd76bb.png)


### 置換

#### VSCode

VSCodeでは、一般的な`Ctrl + H`による置換もできますが、ここでは変更結果を確認しながら置換できる方法を紹介します。

1. 置換対象の文字列を選択し、`すべての出現箇所を変更`をクリックします。
    * ![2024-10-10-08-58-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/bc45c197-3cde-e1bc-531e-a825d810c7c0.png)
1. 対象の文字列が同時選択状態となるので、変更します。
    * ![2024-10-10-09-00-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/626b08e7-f641-2d8a-2f6a-6f0144ab833c.png)


#### SEU

SEUでは、メニュー画面を開くことで置換が可能です。

1. `Shift + F2`を押し、`検索／変更オプション`メニューを開きます。`Find`（検索文字列）と`Change`（置換文字列）を入力し、実行キーを押します。
    * ![2024-10-10-08-57-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/dabf1913-d423-1851-93ee-4a42d9924790.png)
1. `Shift + F5`を押すたび、対象の文字列が置換されていきます。
    * ![2024-10-10-08-58-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/acae079d-3758-14e6-e765-f6909812e323.png)

また、`Occurrences to process`（処理する対象）にて`２=ALL`を指定すると、SEUでも一括置換が可能です。

![2024-10-10-09-18-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/c8994f0c-6026-1ab1-5cd7-5a5442e7ce4f.png)

## コンパイル手順

### VSCode

VSCodeのコンパイル手順は、構文チェック時と同じです。

1. `IFS BROWSER`でコンパイル対象のソースを右クリックし、`Run Action`をクリックします。
    * ![2024-10-10-09-22-39-edtied.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/8c5eff72-5635-e279-37d6-63886ef8d065.png)
1. `Create Bound RPG Program (CRTBNDRPG)`コマンドを実行します。
    * ![2024-10-10-09-23-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/4872f8f8-1990-ade3-7d4a-b873910a0cc4.png)

### SEU

SEU自体にコンパイル機能はありませんが、PDMを利用することにより、対話的に（=コンパイルコマンドを入力することなく）コンパイルを実行することが可能です。

1. `EDTLIBL`を実行し、ソースの保存先をライブラリーリストへ追加します。
    * ![2024-10-10-09-24-55-edited.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/4dd0c0c1-da5f-e8a1-cae0-8634c7f5c747.png)
1. コンパイル対象ソースのオプションに`14`（コンパイル）を入力し実行キーを押します。
    * ![2024-10-10-09-25-24-edited.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/637d1fb0-7d3c-e2dc-9acb-df858c9c2e8e.png)
1. オプションを確認し、実行キーを押すとコンパイル完了です。
    * ![2024-10-10-09-25-24-edited.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/5cd7d848-d58d-5d18-a82b-233937e2f839.png)
    * 


## 実行結果の確認方法

### VSCode

VSCode上で、コンパイルしたオブジェクトの実行を試みました。
が、エラーが発生し実行することができませんでした。

1. `OBJECT BROWSER`にて実行対象のオブジェクトを右クリックし、`Run Action`をクリックします。
    * ![2024-10-10-09-41-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/cdfde22e-9752-0783-a905-3fa495f9728c.png)
1. `Call program` をクリックします。
    * ![2024-10-10-09-41-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/ba394ce3-5cab-7d43-af00-db01e1eaa218.png)
1. しかし、実行に失敗
    * ![2024-10-10-09-41-46-edited.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/29c8fc6c-5ec3-1e50-06ce-5311db3311ea.png)


### SEU

コンパイルと同様、SEUにオブジェクトを実行する機能はありません。
IBMi上のコンソールにてプログラムを実行するには、以下の順で操作をおこないます。

1. `EDTLIBL`を実行し、オブジェクトの保存先をライブラリーリストへ追加します。
    * ![2024-10-10-09-51-55-edited.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/514e499e-2360-d61a-4e46-f39d841ef26a.png)
1. オブジェクトをコールして実行します。
    *![2024-10-11-00-00-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/06e2d8e8-7990-6bd4-8173-3b37ddaf9630.png)
1. 実行結果を確認します。今回は`QUERY`を利用しました。
    * ![2024-10-10-09-52-35-edited.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907037/e91b1054-6aef-6fe2-c0b0-8e08429a291a.png)

## SEUとVS Codeそれぞれの利点と欠点

VSCodeとSEUのそれぞれでのコーディングをおこなった結果見えてきた、それぞれでRPGをコーディングする際の利点と欠点を整理しました。

### 利点

#### SEU

* キーボードのみで操作が完結
* コーディング中の構文チェック機能
* 汎用性が高い→ほぼすべてのIBM i開発環境でも使用可能

#### VSCode

* 1度に表示できる行数が多い
* 操作の習得にかかる時間が少ない
* 検索、置換機能が強力→正規表現によるパターンマッチが利用できる

### 欠点

#### SEU

* 操作の習得にある程度時間がかかる
* 補完機能がない→命令を覚えなければならない
* 今後、機能追加の予定がない→2008年に開発が終了

#### VSCode

* 仕様書のフォーマットの違いに対応できていない
* 補完機能がない
* IBM i OSのバージョンや設定によっては使用できない

### それぞれの使い所

#### SEU

* 新規のコーディング→入力プロンプトや構文チェックのサポートが受けられる
* RPGの学習用→準備の手間が少ない。操作のノウハウが蓄積されている
* 緊急のメンテナンス→サーバにログインするだけで使用可能

#### VS Code

* 既存コードの保守→検索や置換、ソースの比較が容易
* RPG以外のプログラマとの共同作業→IFS上でRPGソースとドキュメントを一括管理し、VS Codeで閲覧

## まとめ

* SEUもVS Codeも、それぞれに良いところ、悪いところがある。VS Codeに変えたからといって、特別効率がよくなる訳ではない。→慣れているエディタの方がコーディング時間が短い。
  * SEU…45分
  * VS Code…1時間10分
* VS Codeは機能が豊富だが、日本語環境での動作はまだ不安定。→ノウハウがまだまだ少ない。
* VS Codeを使用することで、RPG以外（=IBM iを知らない）メンバーと設定を共有し、コーディング環境を揃えられる点は魅力。→今後はRPG（IBM i）単一ではなく、外部と連携した開発の機会が増えるはず。→SEUキーマップモードの実装…？

## 参考リンク

* [Code for IBM i | Code for IBM i Docs](https://codefori.github.io/docs/)