Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,973 views

Published on

Published in: Technology
  • Be the first to comment

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

  1. 1. プログラミング・パラダイムWITH 3+ LANGUAGES
  2. 2. 自己紹介松下祐介、高校一年生。 Kinokkory ― topcoder, etc. @shiatsumat ― twitter 初代まっつん情報オリンピック2011&2012 ファイナリスト。最近は様々なプログラミング言語の勉強にはまっている。 C++ が開発の主流言語。
  3. 3. プログラミングの海へ出ようあなたは何を作りたいだろうか?幸いなことに何を作るにしてもあなたにはたくさんのツールが用意されている。しかし何よりまず船がなければならない。― それがプログラミング言語だ。あなたは多すぎる選択肢を目の前にして路頭に迷うかもしれない。そこでプログラミング・パラダイムという観点からプログラミング言語を比較していこう。
  4. 4. プログラミング・パラダイムとは?世界の物の見方であり、世界を記述する哲学。これまで様々なパラダイムを持つ言語が生まれてきた。今回紹介するパラダイム 手続き型 Procedural オブジェクト指向 Object Oriented 関数型 Functional
  5. 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
  6. 6. 手続き型PROCEDURAL手続き=実行すべき一連の計算ステップ手続きには引数を渡せる。戻り値を返す場合もある。処理を手続きという形で独立させてモジュール化(部品化)させた。アセンブリ言語を含め、昔からの言語はたいてい手続き型。原始的ではあるが、機械語に近い形で記述できるので高速であり、組み込みの現場では特に活躍している。BASIC, COBOL, Pascal, C言語
  7. 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; }
  8. 8. オブジェクト指向OBJECT ORIENTEDオブジェクト=メッセージを送り合うカプセル化された「もの」クラス=オブジェクトの設計図 (データ、処理など) クラスベース Java, C++, C#, Rubyプロトタイプ=オブジェクトの種となるオブジェクト プロトタイプベース JavaScript, Perl, Lua継承、Mixin、多態、カプセル化、デザインパターン......今の主流のパラダイム。手続き型にスピードは劣るが、大規模な開発には今や欠かせないものとなっている。かなり複雑な発展を遂げていて、一言では語れない。
  9. 9. FIZZBUZZ IN JAVA 1import 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; }}
  10. 10. FIZZBUZZ IN JAVA 2class 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(", "); } }}
  11. 11. 関数型FUNCTIONAL関数=数学的な「関数」 (普通のデータと同じように扱える)参照透明性=同じ条件を与えれば必ず同じ結果が得られ、 他のいかなる機能の結果にも影響を与えない純粋関数型言語(参照透明性が常に守られる) Haskell, Miranda非純粋関数型言語 Lisp, Erlang, OCaml, Scala, F#遅延評価=実際の計算を値が必要になるまで行わない将来が楽しみなパラダイム。数学的な扱いが容易であり、状態の変化がほとんどないため、バグが少なくなる。遅延評価によって計算量を最適化できる。
  12. 12. FIZZBUZZ IN HASKELLconvert :: Int -> Stringconvert 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 nsfizzbuzz [] = "error“main = do n <- readLn 入出力の putStr $ fizzbuzz [1..n] 副作用がない
  13. 13. その他のパラダイムOTHER PARADIGMS論理 Logic 述語論理を利用する。Prolog, Concurrent Prolog, Coq制約 Constraint 変数間の関係を制約という形で記述。Ciao, Claire, Ozアスペクト指向 Aspect Oriented アスペクト(クラス間を横断する機能)を利用。AspectJ, AspectC++実は僕はどれも使ったことがないです(笑)
  14. 14. そして、どれを選ぶかプログラミング言語はたくさんある。廃れていく言語もあるが、新たに生まれる言語も多い。最後に、開発言語を選ぶポイントを挙げていこう!1. 有名か?2. ライブラリが豊富か?3. 開発環境が強力か?4. どのプラットフォームで動かせるか?5. 十分な速度やメモリ効率を出せるか?6. パラダイムが適しているか?
  15. 15. 7. 萌えるか?
  16. 16. ご清聴ありがとうございました

×