Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
○○型言語と呼ばれるために備えるべき最低限の条件についての検討
Search
tsuda.a
May 03, 2014
Programming
0
19
○○型言語と呼ばれるために備えるべき最低限の条件についての検討
○○型言語と呼ばれるために備えるべき最低限の条件はなんだろう?というのを検討してみました。
tsuda.a
May 03, 2014
Tweet
Share
More Decks by tsuda.a
See All by tsuda.a
マジカルインクリメントと指数表記
tsudaahr
0
150
バックアップしていますか?
tsudaahr
0
100
RDB以前のファイル設計の話でもしようか(ぇ
tsudaahr
0
110
NPUわからん
tsudaahr
0
160
計算量オーダーの話
tsudaahr
1
370
クラウド初学者が抱える不安について
tsudaahr
0
230
キューとは何か
tsudaahr
0
210
等幅は死んだ(ぇ
tsudaahr
0
83
いくら眺めてもエラーの理由がわからないコードについて
tsudaahr
0
170
Other Decks in Programming
See All in Programming
コード書くの好きな人向けAIコーディング活用tips #orestudy
77web
3
270
ReadMoreTextView
fornewid
0
250
型付きアクターモデルがもたらす分散シミュレーションの未来
piyo7
0
730
Prism.parseで 300本以上あるエンドポイントに 接続できる権限の一覧表を作ってみた
hatsu38
1
110
Go Modules: From Basics to Beyond / Go Modulesの基本とその先へ
kuro_kurorrr
0
110
List Unfolding - 'unfold' as the Computational Dual of 'fold', and how 'unfold' relates to 'iterate'"
philipschwarz
PRO
0
180
コードに語らせよう――自己ドキュメント化が内包する楽しさについて / Let the Code Speak
nrslib
6
1.4k
ワンバイナリWebサービスのススメ
mackee
10
7.7k
生成AIで日々のエラー調査を進めたい
yuyaabo
0
480
Parallel::Pipesの紹介
skaji
2
900
GoのGenericsによるslice操作との付き合い方
syumai
0
150
Webからモバイルへ Vue.js × Capacitor 活用事例
naokihaba
0
470
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
349
20k
Designing for Performance
lara
609
69k
Why Our Code Smells
bkeepers
PRO
337
57k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
5.9k
For a Future-Friendly Web
brad_frost
179
9.8k
The Invisible Side of Design
smashingmag
299
50k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
The Cult of Friendly URLs
andyhume
79
6.4k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
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 ;;
以下はおまけ機能 • 参照透過性 • 副作用がない • カリー化 • メモ化 •
部分適用 • 関数合成 • 並列動作に強い
まとめ オブジェクト指向とか関数型とか言っても怖くないよ!ってことで。 (意味不明)
ご清聴ありがとうございました