2010年9月 8日(水) 17:31 JST

HOME > i am BEST > ILE RPG と C は似ている!?

ILE RPG と C は似ている!?

  • 2010年5月27日(木) 02:16 JST
  • 投稿者:
    hidehi

前回は、今現在の ILE RPG はプログラミングの基礎を学ぶにはとてもいい言語だというお話をしました。

自然と C の知識の入門にもなる、というお話もしました。

Java だって C に似せて作られたように、ある意味現代に生きているプログラミングの基本はすべて C によって確立されたと言っても言い過ぎにならないと思います。
つまり、C を理解できるようになるといろんなプログラミング言語を学ぶうえでとても助けになるわけです。

RPG を書けるようになる、というのは IBM i を扱ううえではとてもチカラになります。
さらに C もわかるようになるための基礎を身につけられる、という特典もついてくる、ということなんですね。

ということで今回は、実際どのくらい、どんなふうに似ているか、をお話したいと思います。



C で簡単に足し算を行うプログラムを書いてみましょう。


     #include   <stdio.h>

     /* プロトタイプ宣言 */
     int plus(int x, int y);

     int main(void)
     {
             /* 変数の定義 */
	     int a, b, sum;

     	     a = 11111;
	     b = 22222;
	
	     sum = plus(x, y);
	
	     printf("%d + %d = %d \n", a, b, sum);
	
     }

     /* 関数の定義 */
     int plus(int x, int y)
     {
	     int z;
	
	     z = x + y;
	     return z;
	
     }

プログラムの内容をごく簡単に要約すると、
整数値を 2つ取って 1つの整数値を戻す plus という関数を使用し、
a と b というそれぞれ整数の変数を渡して計算してもらい、結果を表示する、という処理手順になっています。

使用される plus という関数は同じプログラムの中に定義されています。(今回はふれませんが、別プログラムにして共有することもできます)
2つの整数値を受け取って合計を計算し、その結果を整数値として戻す、ということを行っています。


では、↑ を RPG でそっくり書き直してみましょう。
 ↓ のようになります。

     H DFTACTGRP(*NO) 
      * プロトタイプ宣言 
     D plus            PR            10i 0 
     D x                            10i 0 
     D y                            10i 0 
      * 変数の定義                          
     D a               S             10i 0 
     D b               S             10i 0 
     D sum             S             10i 0 
      *                                    
      /free                                
                                           
          a = 11111 ;                     
          b = 22222 ;     
                                             
          sum = plus(a: b) ;               
                                                                      
          dsply (%char(a) + ' + ' + %char(b) + ' = ' + %char(sum)) ;  
                                                                     
          return ;                                                   
                                                                     
      /end-free                                                     
      *
      * 関数の定義                                                    
     P plus            B                                             
     D plus            PI            10i 0                           
     D x                            10i 0                           
     D y                            10i 0                           
      *                                                             
     D z               S             10i 0                           
      *                                                               
      /free                                                           
                                                                     
          z = x + y ;                                                    
          return z ;                                                
                                                                      
      /end-free                                                       
     P plus            E

最初にプロトタイプ宣言(使用する関数の宣言)、変数の定義、メイン処理、関数の定義と
プログラムの構成/書き方の作法もまったく同じになっていることが見て取れます。


個別に比較してみると、処理のところなんてほぼ同じなのがわかりますね。

[C]
      a = 11111;
      b = 22222;
 
      sum = plus(x, y);
[RPG]
          a = 11111 ;                                                                             
          b = 22222 ;     
                                                                       
          sum = plus(a: b) ;

plus 関数でわたす引数(パラメータ)の区切り文字が C は , で RPG が : になっているくらいです。


変数の定義については、それぞれ ↓ のようになっています。

[C]
      int a, b, sum;
[RPG]
     D a               S             10i 0                                                         
     D b               S             10i 0                                                         
     D sum             S             10i 0                                                         

RPG は桁の位置で定義が決まっています。
必須欄を埋めていくことで、必要な定義をすべて行うことができるようになっています。書きもれ、定義もれがそれによって防がれているわけですね。

最初の D は定義部分であることを示し、S は変数の定義であることを示しています。
10i 0 というのは、10桁の数字で小数点以下が 0桁、あいだの i はデータタイプが整数(Integer)なのを示しています。
多少 RPG の方が冗長ですが、やはりだいたい同じになっていることがわかりますね。


別に関数を定義して、プログラムの中でいろんなところで使い回しをすることができるのですが("モジュール化"の第一歩ですね)、使うためにプロトタイプ宣言というものをあらかじめしておく必要があります。
そのプロトタイプ宣言についてみてみましょう。

[C]
     int plus(int x, int y);
[RPG]
     D plus            PR            10i 0                                                         
     D x                            10i 0                                                         
     D y                            10i 0                                                         

やはりだいたい同じになっていることがわかりますね。

plus は関数名、PR はプロトタイプ宣言であることの定義、その後の 10i 0 は戻り値が 10桁の整数であることをそれぞれ示しています。
続く 2行で引数の数とタイプ(10i 0)を示しています。
10i 0 が 3つあるのは、C のプロトタイプで int が 3つあることに対応しているわけです。それぞれ順番に、戻り値、第一引数、第二引数、ということですね。
 

C との類似性について、なんとなくでもよいので感じていただけましたか?
プログラムの構造も、構文もとてもよく似ていることはわかると思います。

なぜ「C より簡単」なのかは、ちょっと長くなってしまったので次回に続きたいと思います。

 

トラックバック

このエントリのトラックバックURL:
http://www.iforum.ne.jp/trackback.php/20100525011637283
表示形式
コメント投稿

コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。

iForumサポーター

      iFourmの趣旨にご賛同いただき、ご支援いただける企業または個人を募集しています。詳しくは、info@iforum.ne.jp へお願いします。