プログラミング・パラダイム
DESCRIPTION
TRANSCRIPT
プログラミング・ パラダイム
WITH 3+ LANGUAGES
自己紹介
松下祐介、高校一年生。
Kinokkory ― topcoder, etc.
@shiatsumat ― twitter
初代まっつん
情報オリンピック2011&2012 ファイナリスト。
最近は様々なプログラミング言語の勉強にはまっている。
C++ が開発の主流言語。
プログラミングの海へ出よう
あなたは何を作りたいだろうか?
幸いなことに何を作るにしてもあなたにはたくさんのツールが用意されている。
しかし何よりまず船がなければならない。
― それがプログラミング言語だ。
あなたは多すぎる選択肢を目の前にして路頭に迷うかもしれない。そこでプログラミング・パラダイムという観点からプログラミング言語を比較していこう。
プログラミング・パラダイムとは?
世界の物の見方であり、世界を記述する哲学。
これまで様々なパラダイムを持つ言語が生まれてきた。
今回紹介するパラダイム
手続き型 Procedural
オブジェクト指向 Object Oriented
関数型 Functional
FIZZBUZZ
比較のために、どのパラダイムでも共通して
FizzBuzzというプログラムを書いていく。
3の倍数でFizz、5の倍数でBuzz と表示するだけの簡単なプログラム。
(今回のものは数の上限を指定できる。)
たとえば20と入力すると
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13,
14, FizzBuzz, 16, 17, Fizz, 19, Buzz
手続き型
PROCEDURAL
手続き=実行すべき一連の計算ステップ
手続きには引数を渡せる。戻り値を返す場合もある。
処理を手続きという形で独立させてモジュール化(部品化)
させた。
アセンブリ言語を含め、昔からの言語はたいてい手続き型。
原始的ではあるが、機械語に近い形で記述できるので高速であり、組み込みの現場では特に活躍している。
BASIC, COBOL, Pascal, C言語
FIZZBUZZ IN C
#include <stdio.h>
/*数字を変換して表示する*/
void printFizzBuzz(int n)
{
int flag=0;
if(n%3==0){flag=1;printf("Fizz");}
if(n%5==0){flag=1;printf("Buzz");}
if(!flag) printf("%d",n);
}
/*エントリポイント*/
int main(char args[]) {
int n,i;
scanf("%d", &n);
for(i=1; i<=n; ++i){
printFizzBuzz(i);
if(i<n) printf(", ");
}
return 0;
}
関数定義
関数呼び出し
オブジェクト指向
OBJECT ORIENTED
オブジェクト=メッセージを送り合うカプセル化された「もの」
クラス=オブジェクトの設計図 (データ、処理など)
クラスベース Java, C++, C#, Ruby
プロトタイプ=オブジェクトの種となるオブジェクト
プロトタイプベース JavaScript, Perl, Lua
継承、Mixin、多態、カプセル化、デザインパターン......
今の主流のパラダイム。手続き型にスピードは劣るが、大規模な開発には今や欠かせないものとなっている。
かなり複雑な発展を遂げていて、一言では語れない。
FIZZBUZZ IN JAVA 1
import java.io.*;
class Fizzer{
boolean print(int n){
if(n%3==0){System.out.print("Fizz");return true;}
return false;
}
}
class FizzBuzzer extends Fizzer{
boolean print(int n){
boolean flag = super.print(n);
if(n%5==0){System.out.print("Buzz");return true;}
return flag;
}
}
継承
オーバーライド
クラス宣言
FIZZBUZZ IN JAVA 2
class Main{
public static void main(String args[]){
FizzBuzzer f = new FizzBuzzer();
int n;
try{
n = Integer.parseInt(new BufferedReader(
new InputStreamReader(System.in)).readLine());
}catch(Exception e){ n = 0; }
for(int i=1; i<=n; ++i){
if(!f.print(i)) System.out.print(i);
if(i<n) System.out.print(", ");
}
}
}
オブジェクトの作成
関数型
FUNCTIONAL
関数=数学的な「関数」 (普通のデータと同じように扱える)
参照透明性=同じ条件を与えれば必ず同じ結果が得られ、 他のいかなる機能の結果にも影響を与えない
純粋関数型言語(参照透明性が常に守られる) Haskell, Miranda
非純粋関数型言語 Lisp, Erlang, OCaml, Scala, F#
遅延評価=実際の計算を値が必要になるまで行わない
将来が楽しみなパラダイム。
数学的な扱いが容易であり、状態の変化がほとんどないため、バグが少なくなる。遅延評価によって計算量を最適化できる。
FIZZBUZZ IN HASKELL
convert :: Int -> String convert n = (if fizz then "Fizz" else []) ++ (if buzz then "Buzz" else []) ++ (if not(fizz||buzz) then show n else []) where fizz = n `mod` 3 == 0 buzz = n `mod` 5 == 0 fizzbuzz :: [Int] -> String fizzbuzz (n:ns) | ns==[] = convert n | otherwise = convert n ++ ", " ++ fizzbuzz ns fizzbuzz [] = "error“ main = do n <- readLn putStr $ fizzbuzz [1..n]
リストを用いた
再帰
入出力の
副作用がない
その他のパラダイム
OTHER PARADIGMS
論理 Logic
述語論理を利用する。Prolog, Concurrent Prolog, Coq
制約 Constraint
変数間の関係を制約という形で記述。Ciao, Claire, Oz
アスペクト指向 Aspect Oriented
アスペクト(クラス間を横断する機能)を利用。AspectJ, AspectC++
実は僕はどれも使ったことがないです(笑)
そして、どれを選ぶか
プログラミング言語はたくさんある。
廃れていく言語もあるが、新たに生まれる言語も多い。
最後に、開発言語を選ぶポイントを挙げていこう!
1. 有名か?
2. ライブラリが豊富か?
3. 開発環境が強力か?
4. どのプラットフォームで動かせるか?
5. 十分な速度やメモリ効率を出せるか?
6. パラダイムが適しているか?
7. 萌えるか?
ご清聴 ありがとうございました