プログラミング・パラダイム

16
プログラミング・ パラダイム WITH 3+ LANGUAGES

Upload: yusuke-matsushita

Post on 01-Nov-2014

3 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: プログラミング・パラダイム

プログラミング・ パラダイム

WITH 3+ LANGUAGES

Page 2: プログラミング・パラダイム

自己紹介

松下祐介、高校一年生。

Kinokkory ― topcoder, etc.

@shiatsumat ― twitter

初代まっつん

情報オリンピック2011&2012 ファイナリスト。

最近は様々なプログラミング言語の勉強にはまっている。

C++ が開発の主流言語。

Page 3: プログラミング・パラダイム

プログラミングの海へ出よう

あなたは何を作りたいだろうか?

幸いなことに何を作るにしてもあなたにはたくさんのツールが用意されている。

しかし何よりまず船がなければならない。

― それがプログラミング言語だ。

あなたは多すぎる選択肢を目の前にして路頭に迷うかもしれない。そこでプログラミング・パラダイムという観点からプログラミング言語を比較していこう。

Page 4: プログラミング・パラダイム

プログラミング・パラダイムとは?

世界の物の見方であり、世界を記述する哲学。

これまで様々なパラダイムを持つ言語が生まれてきた。

今回紹介するパラダイム

手続き型 Procedural

オブジェクト指向 Object Oriented

関数型 Functional

Page 5: プログラミング・パラダイム

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

Page 6: プログラミング・パラダイム

手続き型

PROCEDURAL

手続き=実行すべき一連の計算ステップ

手続きには引数を渡せる。戻り値を返す場合もある。

処理を手続きという形で独立させてモジュール化(部品化)

させた。

アセンブリ言語を含め、昔からの言語はたいてい手続き型。

原始的ではあるが、機械語に近い形で記述できるので高速であり、組み込みの現場では特に活躍している。

BASIC, COBOL, Pascal, C言語

Page 7: プログラミング・パラダイム

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;

}

関数定義

関数呼び出し

Page 8: プログラミング・パラダイム

オブジェクト指向

OBJECT ORIENTED

オブジェクト=メッセージを送り合うカプセル化された「もの」

クラス=オブジェクトの設計図 (データ、処理など)

クラスベース Java, C++, C#, Ruby

プロトタイプ=オブジェクトの種となるオブジェクト

プロトタイプベース JavaScript, Perl, Lua

継承、Mixin、多態、カプセル化、デザインパターン......

今の主流のパラダイム。手続き型にスピードは劣るが、大規模な開発には今や欠かせないものとなっている。

かなり複雑な発展を遂げていて、一言では語れない。

Page 9: プログラミング・パラダイム

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;

}

}

継承

オーバーライド

クラス宣言

Page 10: プログラミング・パラダイム

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(", ");

}

}

}

オブジェクトの作成

Page 11: プログラミング・パラダイム

関数型

FUNCTIONAL

関数=数学的な「関数」 (普通のデータと同じように扱える)

参照透明性=同じ条件を与えれば必ず同じ結果が得られ、 他のいかなる機能の結果にも影響を与えない

純粋関数型言語(参照透明性が常に守られる) Haskell, Miranda

非純粋関数型言語 Lisp, Erlang, OCaml, Scala, F#

遅延評価=実際の計算を値が必要になるまで行わない

将来が楽しみなパラダイム。

数学的な扱いが容易であり、状態の変化がほとんどないため、バグが少なくなる。遅延評価によって計算量を最適化できる。

Page 12: プログラミング・パラダイム

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]

リストを用いた

再帰

入出力の

副作用がない

Page 13: プログラミング・パラダイム

その他のパラダイム

OTHER PARADIGMS

論理 Logic

述語論理を利用する。Prolog, Concurrent Prolog, Coq

制約 Constraint

変数間の関係を制約という形で記述。Ciao, Claire, Oz

アスペクト指向 Aspect Oriented

アスペクト(クラス間を横断する機能)を利用。AspectJ, AspectC++

実は僕はどれも使ったことがないです(笑)

Page 14: プログラミング・パラダイム

そして、どれを選ぶか

プログラミング言語はたくさんある。

廃れていく言語もあるが、新たに生まれる言語も多い。

最後に、開発言語を選ぶポイントを挙げていこう!

1. 有名か?

2. ライブラリが豊富か?

3. 開発環境が強力か?

4. どのプラットフォームで動かせるか?

5. 十分な速度やメモリ効率を出せるか?

6. パラダイムが適しているか?

Page 15: プログラミング・パラダイム

7. 萌えるか?

Page 16: プログラミング・パラダイム

ご清聴 ありがとうございました