はじめに
Java C# Ts(TypeScrpt) GoといったC言語を由来とする新旧のプログラミング言語とMind なでしこ DNCLなどの日本語プログラミング言語の制御構文を比較して自作言語Re:Mindの構文を定めます。今回はtry~catch文。いわゆる例外処理に関連する構文です。
自作言語Re:Mindの詳しい利用シーンのイメージはこちらへ。すみません、設計段階です。日本語プログラミング言語で、C言語を由来とする新旧言語へのトランスコンパイラ言語です。
この記事内容の作業目的
今回は各言語のtry~catch文の構文を比較検討します。プログラミング言語によっては、例外処理をサポートしない場合がありますので、トランスパイラ言語としてはこのあたりをどうさばくかが問題となります。ただし、主たるターゲット言語をJavaとC#とすると、ターゲット言語がこれらの場合のみソースコードとしてサポートという線で考えています。
この記事内容の保証
※この記事には実装的な情報が含まれます。各言語で書かれた引用ソースの妥当性は保証されません。また、自作言語は開発中(というよりまだ設計段階)のため、本記事に開示された仕様は予告なく変更される場合があります。
Java C# Ts Goの新旧C言語系の構文イメージ
Java
try{
//todo 例外がスローされる余地のある処理
}catch(Exception e){
//例外の処理 例外型はサンプル
}
Javaは例外処理try~catch文をサポートします。
try{
//todo 例外がスローされる余地のある処理
}catch(Exception e){
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
}finally{
//例外がスローされてもされなくても通過する処理
}
例外がスローされてもされなくても通過する処理finally句もオプショナルに記述できます。
try{
//todo 例外がスローされる余地のある処理
}catch(Exception e){
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
throw new Exception("エラーの意味がわかるメッセージ");
}finally{
//例外がスローされてもされなくても通過する処理
//"エラーの意味がわかるメッセージ"例外がスローされた後も通過します。
}
throw文で新しい例外を投げることができます。
try{
//todo 例外がスローされる余地のある処理
}catch(Exception e){
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
}catch(Exception2 e){
//別の例外型の処理 この例外型はサンプル 例外型変数の持つ関数が使える
}finally{
//例外がスローされてもされなくても通過する処理
}
catch文で補足する例外型を指定して、特定例外だけの処理を記述することができます。
C#
try{
//todo 例外がスローされる余地のある処理
}catch(Exception e){
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
}
C#は例外処理try~catch文をサポートします。
try{
//todo 例外がスローされる余地のある処理
}catch(Exception e){
//例外の処理 例外型はサンプル
}finally{
//例外がスローされてもされなくても通過する処理
}
例外がスローされてもされなくても通過する処理finally句もオプショナルに記述できます。
try{
//todo 例外がスローされる余地のある処理
}catch(Exception e){
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
throw new Exception("エラーの意味がわかるメッセージ");
}finally{
//例外がスローされてもされなくても通過する処理
//"エラーの意味がわかるメッセージ"例外がスローされた後も通過します。
}
throw文で新しい例外を投げることができます。
try{
//todo 例外がスローされる余地のある処理
}catch(Exception e){
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
}catch(Exception2 e){
//別の例外型の処理 この例外型はサンプル 例外型変数の持つ関数が使える
}finally{
//例外がスローされてもされなくても通過する処理
}
catch文で補足する例外型を指定して、特定例外だけの処理を記述することができます。
TypeScript
Tsは例外処理try~catch文をサポートしません。
Go
Goは例外処理try~catch文をサポートしません。
自作言語の構文イメージ
ここで自作言語の構文の開示です。try~catch文は条件分岐構文の雰囲気があるので◇を使用します。日本語トランスコンパイラ言語 Re:Mindは、制御構文の開始シンボルとして、◇、〇、・、□などの全角記号を用い、箇条書きされた日本文としての体裁を日本語ロジック記述言語 Re:Mindの構文とも共有しています。◇は分岐構文、〇はループ構文の開始と終了を表し、冗長な日本語表記がなくてもフロー図の表現に慣れている方が直感的に認識できることを考慮しています。
Re:Mind
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(Exception e)
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
◇ここまで
Re:Mindはターゲット言語が例外処理try~catch文をサポートする場合はサポートします。例外処理try~catch文をサポートしないターゲット言語の場合は構文エラーが出力されるのが望ましい。
◇の直後の「試す」と「捉まえる」は予約語となります。
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(Exception e)
//例外の処理 例外型はサンプル
◇必ず最後に
//例外がスローされてもされなくても通過する処理
◇ここまで
例外がスローされてもされなくても通過する処理「必ず最後に」句もオプショナルに記述できます。
◇の直後の「必ず最後に」は予約語となります。
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(Exception e)
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
投げる new Exception("エラーの意味がわかるメッセージ");
◇必ず最後に
//例外がスローされてもされなくても通過する処理
//"エラーの意味がわかるメッセージ"例外がスローされた後も通過します。
◇ここまで
「投げる」文で新しい例外を投げることができます。
new Exceptionはターゲット言語の構文をそのまま使います。
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(例外型 e)
//例外の処理 この例外型はサンプル 例外型変数の持つ関数が使える
◇ここまで
◇捉まえる()のかっこ内はターゲット言語の例外型をそのまま書いて可とします。多様な例外型の派生型があるため、ここの型名の英語・日本語間の言語的な変換は面倒なので、基本型のExceptionは「例外型」と書いても可。捉まえる()のかっこ内のローカル変数名はムリに日本字にしなくて可。
◇試す
//todo 例外がスローされる余地のある処理
◇捉まえる(Exception e)
//例外の処理 例外型はサンプル
◇捉まえる(Exception2 e)
//別の例外の処理 例外型はサンプル
◇必ず最後に
//例外がスローされてもされなくても通過する処理
◇ここまで
「捉まえる」文で補足する例外型を指定して、特定例外だけの処理を記述することができます。
Mind DNCL の日本語プログラミング言語の構文イメージ
では、続いて日本語プログラミング言語のグループです。
Mind
※todo エラーが発生する余地のある処理(ファイルオープンとか)
エラー?
ならば エラー文字列を 一行表示し
終り
つぎに
Mindは例外処理try~catch文をサポートしません。
しかし、実行文の直後に例外的なエラーが生じているかを検査する単語「エラー?」が用意されています。
「エラー文字列」は Mindのライブラリ内部に確保されている文字列実体変数で、ライブラリ内部で起きたエラー内容が記録されています。
ただし、これは参考情報として記載しています。Re:Mindはターゲット言語がMindの場合は別のエラー構文をサポートする予定です。
DNCL
DNCLは例外処理try~catch文をサポートしません。
英語を基調としたBASIC言語
BASIC言語は日本語ではありませんが、中かっこ「{}」を使って区切ることはなく、構文の表現も自然言語の英語に近いので、こちらの方に寄せました。
VBA(Excel用)
On Error Goto CATCH_ID
'todo エラーが発生する余地のある処理
Goto #FINALLY_ID
CATCH_ID:
'エラーの処理
FINALLY_ID:
'エラーが発生してもしなくても通過する処理
VBAは例外処理try~catch文をサポートしません。(VB.NETはサポート)
上記のように出力すれば疑似的にtry~catch文っぽくすることはできそう。_IDはGOTOラベルを関数ローカル内でユニークにするためのランダムUIDのようなものを想定。
ただし、これは参考情報として記載しています。Re:Mindはターゲット言語がVBAの場合は別のエラー構文をサポートする予定です。
VB.NET
Try
'todo 例外がスローされる余地のある処理
Catch ex As Exception
'例外の処理 この例外型はサンプル
End Try
VB.NETは例外処理try~catch文をサポートします。
Try
'todo 例外がスローされる余地のある処理
Catch ex As Exception
'例外の処理 この例外型はサンプル
Finally
'例外がスローされてもされなくても通過する処理
End Try
例外がスローされてもされなくても通過する処理finally句もオプショナルに記述できます。
Try
'todo 例外がスローされる余地のある処理
Catch ex As Exception
'例外の処理 この例外型はサンプル
Throw New Exception("エラーの意味がわかるメッセージ")
Finally
'例外がスローされてもされなくても通過する処理
End Try
Throw文で新しい例外を投げることができます。
Try
'todo 例外がスローされる余地のある処理
Catch ex As Exception
'例外の処理 この例外型はサンプル
Catch ex As Exception2
'別の例外の処理 例外型はサンプル
Finally
'例外がスローされてもされなくても通過する処理
End Try
Catch文で補足する例外型を指定して、特定例外だけの処理を記述することができます。
プロデル なでしこ 第2世代日本語プログラミング言語の構文イメージ(参考)
あまりと言いますかかなり詳しくはないのですが、参考にわたしの心の中での第2世代日本語プログラミング言語「プロデル」と「なでしこ」の構文も比較してみました。よくわかっていないので、間違っていたらごめんなさい。訂正します。
プロデル
例外監視
//todo 例外がスローされる余地のある処理
発生した場合
//todo メッセージ処理など
エラーのメッセージを表示する
監視終わり
プロデルは例外処理try~catch文に近いをサポートします。
「エラー」特殊変数で(おそらく).NET例外のmessageと(おそらく独自に採番された)エラー番号を参照できるようです。
例外がスローされてもされなくても通過する処理finally句のような構文はなさそう。
例外監視
//todo 例外がスローされる余地のある処理
発生した場合
//todo メッセージ処理など
「エラーの意味がわかるメッセージ」 というエラーを発生させる
監視終わり
「エラーを発生させる」文で新しい例外を投げることができます。
なでしこ
エラー監視
//todo 例外がスローされる余地のある処理
エラーならば
//todo メッセージ処理など
なでしこは例外処理try~catch文に近い構文をサポートします。
例外がスローされてもされなくても通過する処理finally句のような構文はなさそう。
おわりに
日本語トランスコンパイラ言語という企画を実現・設計・実装していくには、スキル上の課題や未獲得の知見など多数あることが予想されます。Qiita様の場をお借りして、獲得したスキルや知見の共有、いたらない点のご支援をいただければと考えています。
参考リンク