S-JIS[2005-01-16/2007-12-28] 変更履歴

プログラミング言語比較

サブルーチン・関数

サブルーチンとは:ひとまとまりの処理を行う。
関数とは:渡した値(引数(ひきすう))を使って演算を行い、結果を返す。

  • MSX-BASIC [2005-01-16/2006-07-26]
  • VisualBasic for Application [2005-01-16/2007-08-25]
  • VBScript [2007-04-06]
  • VB.NET [2006-04-15/2007-03-22]
  • PASCAL [2005-02-10]
  • PL/I [2005-01-16]
  • Perl [2005-03-12/2006-07-11]
  • C言語(gcc, WIN32) [2005-01-16/2007-08-25]
  • Visual C++(MFC) [2005-01-16/2007-08-25]
  • Java [2005-01-16/2007-08-25]
  • JavaScript [2006-01-08/2006-07-02]
  • C# [2006-03-04/2007-03-22]
  • SQL(Oracle[2005-02-07/2006-07-08]
  • PL/SQL(Oracle) [2005-02-27/2007-12-28]
  • Common Lisp [2005-04-04]
 
サブルーチン定義 なし
普通にプログラムを書き、GOSUBで呼ばれてRETURNで終わればサブルーチン扱い。したがって、引数やローカル変数などという概念もない
Sub 名前()

End Sub
Sub 名前()

End Sub
Sub 名前()

End Sub
procedure 名前;
begin

end;
名前: PROC;

END;
sub 名前
{
 〜
}
void 名前(void){

}
void 名前(){

}
void 名前(){

}
function 名前(){

}
void 名前(){

}
CREATE OR REPLACE PROCEDURE 名前
IS
 〜
BEGIN
 〜PL/SQL〜
END;
/
SHOW ERR
CREATE OR REPLACE PROCEDURE 名前
IS
 〜
BEGIN
 〜PL/SQL〜
END;
/
SHOW ERR
なし
Sub 名前(引数 As 型,…)

End Sub
Sub 名前(引数,…)

End Sub
Sub 名前(引数 As 型,…)

End Sub
procedure 名前(引数,引数:型; 引数:型);
ローカル変数等宣言;
begin

end;
procedureの中にprocedureを宣言することも可
名前: PROC(引数,…);
DCL 引数 型;…

END;
sub 名前
{
 〜
}
引数は特殊配列@_を使用
void 名前(型 引数,…){

}
void 名前(型 引数,…){

}
void 名前(型 引数,…){

}
function 名前(引数,…){

}
void 名前(型 引数,…){

}
CREATE OR REPLACE PROCEDURE 名前(引数 IN 型,…)
IS BEGIN
 〜PL/SQL〜
END;
/
SHOW ERR
IN,OUT,INOUTが使用可能
CREATE OR REPLACE PROCEDURE 名前(引数 IN 型,…)
IS
 〜
BEGIN
 〜PL/SQL〜
END;
/
SHOW ERR
IN,OUT,INOUTが使用可能
RETURN Exit Sub       RETURN; return; return; return; return; return; return;    
サブルーチン呼び出し GOSUB 行番号
サブルーチンとしてその行を実行する。RETURNが無ければ、単なるGOTOと同じ。スタックは無駄に使うだろうけど
Call 名前     名前   名前;
&名前;
名前(); 名前(); 名前(); 名前(); 名前(); EXEC 名前
EXEC 名前()
sql*plus
名前;
名前();
なし
Call 名前(引数,…)
名前 引数,…

この2つの構文の違いは「引数の計算をどこでやるか」だったと思うが、詳細は忘れた
Call 名前(引数,…)
名前 引数,…
  名前(引数,…) CALL 名前(引数,…); 名前(引数,…);
&名前(引数,…);
名前(引数,…); 名前(引数,…); 名前(引数,…); 名前(引数,…); 名前(引数,…); EXEC 名前(引数,…)
CALL 名前(引数,…);
sql*plus
名前(引数,…);
名前(引数名=>値,…);
名前 引数名:=値,…
引数名を明示することで、順序を好きに変えられる
関数定義 なし Function 名前(引数 As 型,…) As 戻り型

End Function
Function 名前(引数,…)

End Function
Function 名前(引数 As 型,…) As 戻り型

End Function
function 名前(引数,引数:型; 引数:型):戻り型;
宣言部;
begin

end;
  sub 名前{
 〜
}
戻り型 名前(型 引数,…){

}
戻り型 名前(型 引数,…){

}
戻り型 名前(型 引数,…){

}
function 名前(引数,…){

}
戻り型 名前(型 引数,…){

}
CREATE OR REPLACE FUNCTION 名前(引数 IN 型,…)
RETURN 型
IS
 〜
BEGIN
 〜PL/SQL〜
END;
/
SHOW ERR
INのみ使用可能
CREATE OR REPLACE FUNCTION 名前(引数 IN 型,…)
RETURN 型
IS
 〜
BEGIN
 〜PL/SQL〜
END;
/
SHOW ERR
INのみ使用可能
(defun 名前 (引数 …) 本体〜)

暗黙の(block 名前 〜)が作られるので、return-fromが使える
なし 名前=戻り値
Exit Function
名前=戻り値
Exit Function
Return 値
VBAと同じ返し方も可
名前:=戻り値   return 戻り値;
又は関数の最後に値だけの行を置く
return 戻り値; return 戻り値; return 戻り値; return 戻り値; return 戻り値; RETURN 戻り値; RETURN 戻り値; (return-from 名前 戻り値)
関数呼び出し なし 名前(引数,…)
名前(引数,…,引数名:=値,…)
名前(引数,…)   名前(引数,…)
引数がない場合は、名前のみ
  名前(引数,…)
&名前(引数,…)
名前(引数,…) 名前(引数,…) 名前(引数,…) 名前(引数,…) 名前(引数,…) 名前(引数,…)
CALL 名前(引数,…) INTO :バインド変数;
sql*plus
名前(引数,…)
名前(引数名=>値,…)
(名前 引数 …)
(apply #'名前 引数 …)
(funcall 名前 引数 …)
引数の既定値   Function 名前 (Optional ByVal 引数 As Variant = 省略時値)

End Function

引数の型がVariantで省略時値を指定しない場合は、IsMissing(引数)で 呼び出し時に省略されたかどうかを判断できる
  Function 名前 (Optional ByVal 引数 As 型 = 省略時値)

End Function
      なし 戻り型 名前(型 必須引数,…,引数=既定値){

}
なし なし     CREATE OR REPLACE FUNCTION 名前(必須引数,…,引数:=既定値) 〜 (defun 名前 (必須引数 … &optional (引数 既定値)) 本体)
可変引数 なし           そもそもが可変引数しか無い 戻り型 名前(型 先頭引数,...){
va_list ap;
va_start(ap,先頭引数);
va_arg(ap,型)で使用
va_end();
}
戻り型 名前(型 先頭引数,...){
va_list ap;
va_start(ap,先頭引数);
va_arg(ap,型)で使用
va_end();
}
戻り型 名前(型 先頭引数,型... 変数){
 変数が配列として扱える
}
function 名前(引数,〜){
 argumentsを使用
}
戻り型 名前(〜, params 型[] 変数)
{
 〜
}

paramsを付けた最後の変数だけ可変引数になる
    (defun 名前 (引数 … &rest リスト変数) 本体)
 
静的初期化       Shared Sub New()

End Sub
          static{

}
         
コンストラクタ       Sub New(引数…)
 MyBase.New(引数…)
 〜
End Sub
    sub new {
 my $class = shift;
 my $self = {〜};
 〜
 return bless $self, $class;
}
  クラス名(引数…) : 上位クラス名(引数), …{
 〜
}
クラス名(引数…){
 super(引数…);
 〜
}
         
デストラクタ             sub DESTROY {
 my $self = shift;
 〜
}
  ~クラス名()
{
 〜
}
なし          
ファイナライザー       Sub Finalize()
 〜
End Sub
          protected void finalize(){
 〜
}
  ~クラス名()
{
 〜
}
     
最初に呼ばれるPG RUN→最も若い行番号から実行
RUN 行番号→その行から実行
イベントや、指定したマクロが実行される ソースの先頭   programの本体 OPTIONS(MAIN)が指定されているPROC ソースの先頭 main関数 (C++はmain関数だがMFCでは隠蔽されている) javaコマンドで指定したクラスのmain関数 ソースの先頭       ソースの一番外側の関数
終了命令 END   WScript.Quit Environment.Exit(値)
Application.Exit()…ウィンドウアプリの終了
    die; exit(値);   System.exit(値);   Environment.Exit(値);
Application.Exit();…ウィンドウアプリの終了
EXIT戻り値〕 〔COMMIT | ROLLBACK    
 
エラー(例外)処理定義 ON ERROR GOTO 行番号
エラーが起きたらその行へ飛べ、という宣言。
ON ERROR GOTO 0
→エラー処理へ飛ぶのを無効にする。(0は行番号のようにも見えるが、通常のプログラムは最も若い行番号から実行されるので、行番号0がエラー処理であるのはおかしいとの考えにより0は特別扱い)
On Error GoTo ラベル
On Error GoTo 0
On Error Resume Next
On Error GoTo 0
Try

Catch e As 型

Finally

End Try
  ON エラー種類名 BEGIN;

END;

→PL/Iに用意されているエラーに対して1つずつハンドラを作れる
  なし try{

}catch(型 e){

}

型は、intであろうがchar*であろうが何でもよい
try{

}catch(例外クラス e){

}finally{

}

この例外クラスはThrowableから派生している必要がある
try{

}catch(e){

}finally{

}
try{

}catch(例外クラス名 e){

}finally{

}

catchは色々省略可能
catch(例外クラス名){〜}
catch{〜}
WHENEVER OSERROR EXIT OS.SQLCODE ROLLBACK;

WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;
DECLARE
 例外名 EXCEPTION;
BEGIN
 〜
EXCEPTION
 WHEN 例外名 OR 例外名… THEN 〜;
 WHEN OTHERS THEN 〜;
END;

例外を宣言しておき、例外処理部に処理を列挙する。
(catch 'タグ 〜)
ERR→エラー番号が入っている Err.Number→エラー番号が入っている
Err.Description→エラーメッセージ
Err.Source
Err.Number
Err.Description
 
            e.getCause()→原因となった例外を取得
e.getMessage()→エラーメッセージを取得
eがErrorクラスの場合、
e.name
→名前
(e.number>>16)&0x1fff→機能識別符号
e.number&0xffff→エラーコード
e.description→description
e.message→descriptionと同じっぽい
  SQLCODE→エラー番号が入っている
SQLERRM→エラーメッセージが入っている
SQLERRM(エラーコード)→コードに該当するエラーメッセージを取得
 
RESUME NEXT
→エラーが起きた次の命令へ戻る
RESUME 行番号
→エラーを無かったことにして、その行へ飛ぶ
RESUME 0
→エラーが起きた命令を再実行
Resume Next
→エラーが起きた次の命令へ戻る
Resume ラベル
→エラーを無かったことにして、そのラベルへ飛ぶ
Resume
→エラーが起きた命令を再実行
  Throw e           throw e;
→上位ルーチンへ例外を渡す
throw e;
→上位ルーチンへ例外を渡す
throw e;
→上位ルーチンへ例外を渡す
throw;
→上位ルーチンへcatchした例外を渡す
  catchの戻り値は、throwの値
エラー(例外)発生 ERROR エラー番号 Error エラー番号
Err.Raise エラー番号,,"エラーメッセージ"
Err.Raise エラー番号         なし throw 値;
catchの型に合致する値であれば何でもよい。return文と同様
throw 例外;
例外クラスのインスタンス「new 例外クラス名()」等
throw 文字列;
throw new Error((機能識別符号<<16)+エラーコード, メッセージ文字列);
throw 例外;   RAISE 例外名;
RAISE_APPLICATION_EXCEPTION(番号, 'メッセージ');
…番号は-20000〜-20999の範囲。SQLCODEは1(ユーザー定義例外)になる
(throw 'タグ 値)

(error "メッセージ")
(cerror "継続メッセージ" "エラーメッセージ")
アサート   Debug.Assert 正常条件   Debug.Assert(正常条件)
Debug.Assert(正常条件,  "メッセージ", "詳細")
          assert 正常条件 式:メッセージ;         (assert 条件 "メッセージ")
 
外部プログラム実行   Dim p As Double
p = Shell("実行PG", vbNomralFocus)

pはタスクID
          pid_t pid = fork();
if (pid < 0) {
 //fork失敗
 return -1;
} else if (pid == 0) {
 //子プロセス
 execl("実行PG", "arg0(実行PG)", "arg1"…, NULL);
 または execv("実行PG", 引数の配列);
 //exec系は、ここに来たらエラー
 perror("exec");
 return -2;
}
//親プロセスは、子プロセスの終了を待つ
int status;
wait(pid, &status, 0);

system("シェルコマンド名 引数…");
ShellExecute Process p = Runtime.getRuntime().exec("実行PG arg1…");
p.waitFor(); //子プロセスの終了待ち
int r = p.exitValue(); //プロセスが終了していないと例外が発生する
         

組み込み関数


言語比較全般へ戻る / 参考文献 / プログラム記号比較 / 技術メモへ戻る
メールの送信先:ひしだま