○○型言語と呼ばれるために備えるべき最低限の条件についての検討
DESCRIPTION
○○型言語と呼ばれるために備えるべき最低限の条件はなんだろう?というのを検討してみました。TRANSCRIPT
○○型言語と呼ばれるために備えるべき最低限の条件
についての検討@tsuda_ahr
たとえば、こんな単語がございまして。
• 構造化言語
• オブジェクト指向言語
• 関数型言語
免責
• 最低限、なにがあれば「○○型言語」と言えるのかを検討してみまし
た。
• 私見に基づいており、根拠などはあまりありません。
• なお、 ○○型言語についての最低要件は何か、を検討してみたので
あって、 ○○指向プログラミングや○○指向設計とかとはまるで関
連がありませんので、その点も注意してください。
1.構造化言語であるための条件
構造化言語の条件
• IF がブロック文で書けること。
以上。
____________________________
ちなみに if のブロック文とはこんなやつ
if (条件) {
処理
} 註)FOR と WHILE は非構造化BASIC でもブロック文なので、条件から排除
BASIC(構造化対応以前)の場合
10 A = 100
20 IF A > 0 THEN GOTO 30 ELSE GOTO 50
30 A = 200
40 GOTO 60
50 A = 300
60 PRINT A
70 END
構造化BASICの場合
10 A = 100
20 IF A > 0 THEN
30 A = 200
40 ELSE
50 A = 300
51 ENDIF
60 PRINT A
70 END
ここでいう「構造化」とは何か
構造化定理(だいくすとら)に従ってプログラムが書けること。
構造化定理とは、以下の3要素でプログラムは書けるというアレ。
• 順次
• 反復
• 分岐
GOTO論争の元ネタ。
→ 分岐のために GOTO を使わなくていい = 構造化プログラミング言語
以下はおまけ機能
① 変数のスコープ (ローカルスコープ)
② 引数 / 戻値
③ 閉じたサブルーチン(=C言語的な関数)
④ 去勢された GOTO (exit for とか)
閉じたサブルーチン?
BASIC ではこんな記述が可能だった
10 PRINT "AAA"
20 GOSUB 50
30 PRINT "CCC"
40 END
50 PRINT "BBB“
60 RETURN
61 GOTO 30 ←RETURN の代わりにこう書いてもエラーにならない
# エラーにはなりませんが、メモリリークします。# 最近の Visual Basic とかでは不可です。
ルーチンの境界
2.オブジェクト指向言語であるための条件
オブジェクト指向言語の条件
• new ができること
(this が使えること)
以上。
以下はおまけ機能
① 継承
② 多態性
③ コンストラクタ
④ メッセージパッシング
⑤ カプセル化
⑥ スコープ (private / protected 等)
⑦ 名前空間
⑧ テンプレート (ジェネリック)
⑨ 例外機構
Cの場合 (new がない場合)
Cの場合、こう書くと ゲーム盤はプログラムで 1枚しか持てない。
enum FACE {NONE, DARK, LIGHT
};
void main() {piece_put(3,3,DARK);piece_put(4,4,DARK);piece_put(3,4,LIGHT);piece_put(4,3,LIGHT);
}
int _board[8][8]; // ゲーム盤
void piece_put(int x,int y,int face) {
_board[x][y] = face;
// 反転処理}
main.c board.c
なので、複数のゲーム盤を持たせたい場合は、piece_put(*board, x, y, face)
みたいな感じで、呼び出し側が操作するゲーム盤を指定します。
結局のところ オブジェクト指向って。
• 構造化プログラミング言語 (Cとか)
board b; // 構造体
piece_put(&b, x, y, face);
• オブジェクト指向プログラミング言語
var b = new board();
b.piece_put(x, y, face);
移動しただけ
3.関数型言語 (函数型言語?) であるための条件
関数型言語の条件
今回の条件は2つ
1) 関数を変数に代入できる
2) 制御構文も文ではなく式 ( 具体的には IF が値を戻す )
変数?代入?
せんせー。(純粋)関数言語には、変数や代入がないと聞きました!
↓
やかましい! 却下!!
気になる人は「束縛」とか「破壊的代入」とか「シャドーイング」とかを調べてみてください。
文と式
• 文(STATEMENT)
値の戻らない命令文のこと。
if / for / return など。
• 式(EXPRESSION)
値を戻す式や関数のこと。
• 条件式 a == b
• 論理式 a & b
• 算術式 a + b * c
• 関数 sin(a)
でも関数型言語でないと、これらは不可なのか?
実はそうでもない。 _| ̄|○
1) 関数を変数に代入できる
→ Javascript / C# などでもできる。
2) 制御構文も文ではなく式
→ Ruby の If は値を戻す。
関数が変数に代入できる
function test(){return function(x)
{return x * 2
}}
var a = test()alert( a(10) )
Javascript
戻り値に引数を渡して実行できる。
関数で戻せる。
if が式
Ruby F# (関数型言語)
a = 100
b = if (a >= 100) a = 200
else a = 300
end
printf "%d¥n",a
結果: 200 結果: 100
let a = 100
let b = if (a >= 100) then let a = 200()
else let a = 300()
printf "%d¥n" a;;
関数型の式の特徴
• 閉じている。
• 式の外のデータは参照できるが、式の外のデータを操作することができない
(基本的には)
関数型の場合、正しくはこんな感じで書きますF# (関数型言語)
結果: 200
let a = 100;;
let a = if (a >= 100) then 200
else 300
printf "%d¥n" a;;
以下はおまけ機能
• 参照透過性
• 副作用がない
• カリー化
• メモ化
• 部分適用
• 関数合成
• 並列動作に強い
まとめ
オブジェクト指向とか関数型とか言っても怖くないよ!ってことで。
(意味不明)
ご清聴ありがとうございました