SlideShare a Scribd company logo
プログラミング・
パラダイム
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. 萌えるか?
ご清聴
ありがとうございました

More Related Content

PDF
JavaScript経験者のためのGo言語入門
PPT
ユニットテスト 1日目
PDF
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
PDF
Groovyで学ぶプロセス代数 #jjug
PDF
Goにおける静的解析と製品開発への応用
PDF
Closures and methodMissing are real
ODP
Can A Python Go Beyond The Python
PDF
Go静的解析ハンズオン
JavaScript経験者のためのGo言語入門
ユニットテスト 1日目
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Groovyで学ぶプロセス代数 #jjug
Goにおける静的解析と製品開発への応用
Closures and methodMissing are real
Can A Python Go Beyond The Python
Go静的解析ハンズオン

What's hot (19)

ODP
Scoped BASIC Presentation1
ODP
Ruby紹介
PDF
名前付け入門
PPT
Fizz buzz publish
 
PPTX
復習と型 Jyoken
PDF
03 var array_flow_func
ODP
こんにちはGroovy
PDF
テンプレートメタプログラミング as 式
PDF
ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)
PDF
Hubotで遊ぶ
PPTX
コードで感じるKotlin入門
PPT
第1部「一時間で覚えるruby」
PDF
Go入門
PDF
C++の黒魔術
PPTX
そんな装備で大丈夫か?
PDF
条件式評価器の実装による管理ツールの抽象化
PPT
メタプログラミングって何だろう
PDF
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
PDF
みんなのPython勉強会#62
Scoped BASIC Presentation1
Ruby紹介
名前付け入門
Fizz buzz publish
 
復習と型 Jyoken
03 var array_flow_func
こんにちはGroovy
テンプレートメタプログラミング as 式
ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)
Hubotで遊ぶ
コードで感じるKotlin入門
第1部「一時間で覚えるruby」
Go入門
C++の黒魔術
そんな装備で大丈夫か?
条件式評価器の実装による管理ツールの抽象化
メタプログラミングって何だろう
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
みんなのPython勉強会#62
Ad

Viewers also liked (11)

PPTX
Elixirについて私が知ってる二、三の事柄
PDF
Social Change〜エンジニアが経営者になるまでと、これからの戦略
PDF
NumPy闇入門
PPTX
地獄のElixir(目黒スタートアップ勉強会)
PDF
数式をnumpyに落としこむコツ
PDF
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
PDF
「管理」をなくせばうまくいく
PDF
「Python言語」はじめの一歩 / First step of Python
PDF
Python 機械学習プログラミング データ分析ライブラリー解説編
PDF
カークマンの女学生問題と有限幾何
PPTX
Elixirハンズオン-2017-03-11
Elixirについて私が知ってる二、三の事柄
Social Change〜エンジニアが経営者になるまでと、これからの戦略
NumPy闇入門
地獄のElixir(目黒スタートアップ勉強会)
数式をnumpyに落としこむコツ
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
「管理」をなくせばうまくいく
「Python言語」はじめの一歩 / First step of Python
Python 機械学習プログラミング データ分析ライブラリー解説編
カークマンの女学生問題と有限幾何
Elixirハンズオン-2017-03-11
Ad

Similar to プログラミング・パラダイム (20)

PDF
wakuwaku Scala ~Scala入門勉強会~ 資料
ODP
Introduction of Python
PPTX
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
PPTX
函数プログラミングの エッセンスと考え方
PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
ODP
Lt会01_uetch
PPTX
関数型言語&形式的手法セミナー(3)
ODP
Vim scriptとJavaとHaskell
PDF
プログラミング
PDF
Object-Funcational Analysis and design
PPTX
F#のすすめ
PDF
プログラミングスキルの獲得について考えてみた
PDF
Scalaで萌える関数型プログラミング[完全版]
PDF
JavaWorld Day 2009 Scala
PDF
関数プログラミング入門
PDF
第2回関数型言語勉強会 大阪
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
PDF
Scalaで萌える関数型プログラミング[1.1.RC1]
PDF
磯野ー!関数型言語やろうぜー!
PDF
Ruby で学ぶプログラミング入門
wakuwaku Scala ~Scala入門勉強会~ 資料
Introduction of Python
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
函数プログラミングの エッセンスと考え方
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Lt会01_uetch
関数型言語&形式的手法セミナー(3)
Vim scriptとJavaとHaskell
プログラミング
Object-Funcational Analysis and design
F#のすすめ
プログラミングスキルの獲得について考えてみた
Scalaで萌える関数型プログラミング[完全版]
JavaWorld Day 2009 Scala
関数プログラミング入門
第2回関数型言語勉強会 大阪
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Scalaで萌える関数型プログラミング[1.1.RC1]
磯野ー!関数型言語やろうぜー!
Ruby で学ぶプログラミング入門

More from Yusuke Matsushita (11)

PDF
NPC April Fool's Contest 2014 累乗数
PDF
Haskell Lecture 2
PDF
Haskell Lecture 1
PDF
ドロネー三角形分割
PDF
関数型プログラミングのすゝめ
PDF
型理論 なんて自分には関係ないと思っているあなたへ
PDF
C#への招待
PDF
Modeling Concurrent Computing
PDF
Programmers, be a Wikipedian
PPTX
OpenMPI入門
PDF
確率解析計算
NPC April Fool's Contest 2014 累乗数
Haskell Lecture 2
Haskell Lecture 1
ドロネー三角形分割
関数型プログラミングのすゝめ
型理論 なんて自分には関係ないと思っているあなたへ
C#への招待
Modeling Concurrent Computing
Programmers, be a Wikipedian
OpenMPI入門
確率解析計算

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