パラダイムとは何か - 第2土曜会ホームぺージ

パラダイムとは何か
脇本佑紀@第二土曜会
2013 年 10 月 9 日
1 問題提起
我々はパラダイムに支配されている。「何をするか」、その問いに対する発想の限界はほぼ常に「どうやる
か」によって既定されている。“ほぼ常”、それを逸脱する瞬間、それがまさにパラダイムシフトの瞬間であ
る。一方現在はマルチパラダイムの時代であると言える。教養のある人々は物事に対する姿勢を選択すること
ができる。「自殺の是非」という問題に対して、物質科学の観点から取り組むのか、経済学から取り組むのか。
心理学か、法学か、はたまた宗教—原始仏教、大乗、禅、あるいはユダヤ教、キリスト教—カトリックまたは
プロテスタント—イスラム教—なのか。または数多の思想たちか。言い換えれば種々の分類はパラダイムの
分類であると言える。パラダイムの違いを認識しなければあらゆる紛争は解決しない。特定のパラダイムを極
める時代は終焉を迎えつつある。これまでになく多様性が立ちはだかる昨今においては、パラダイムを掌握す
る者が社会を支配するのである。この発表ではパラダイムというキーワードを根本に据え、プログラミングの
世界における具体例を挙げることで議論の種としたい。
1.1 歴史と定義
ギリシャ語からパラダイム παράδιγµα なる言葉を拾い出し世界に投げかけたのはアメリカの科学哲学者、
Thomas S. Kuhn であった。1962 年に刊行された「The Structure of Scientific Revolutions」で Kuhn は
次のように述べている。翻訳は中山茂氏のものである。
この「パラダイム」とは、一般に認められた科学的業績で、一時期の間、専門家に対して問い方や答
え方のモデルを与えるもの、と私はしている。
この一文から Kuhn 自身はパラダイムという用語を非常に限定された範囲で定義していることが見て取れる。
しかし Kuhn の手を離れその後の様々な “誤訳” や “誤用” を経て用語が広大な定義域を持つに至ったことは
我々の辞書と照らし合わせれば明白であろう。新明解国語辞典第五版では双方に配慮された説明が掲載されて
いる。
〔おもに科学史で〕その時代・社会において、一つの分野に属する学者のほぼ全員が共通の大前提と
して認めている、研究の基本的手法や問題意識(の手本)。〔事物を認識する基本的態度や問題の選択・
設定・取扱い・解決の方法など理論体系の枠組みを包括的に指す用語。広義では、その分野における思
考の枠組みや 4 学問(芸術)の方法論、共通の基準の意にも用いられる〕
1
ここでは “誤用”、すなわち上引用文で述べているところの「事物を認識する基本的態度」や「思考の枠組み」
といった意味でパラダイムなる言葉を用いることにする。
1.2 言語とパラダイム、身近な例として
言語パラダイムとはある意味文章の中で翻訳されない、あるいはしえない部分として定義することができる
かもしれない。それは言語の形式であり基本的発想、思考法である。我々は感じることができる。そして表現
をする。しかしその表現は言語パラダイムによって制限される。それのみならず、何を感じるか、それすら
もまた言語パラダイムによって制限され得るのである。西田幾多郎による次の文章がこれを顕著に表現して
いる。
短詩の形式によって人生を表現するということは、単に人生を短詩の形式によって表現するというこ
とではなく、人生には唯、短詩の形式によってのみ掴み得る人生の意義というものがあることを意味す
るのである。短詩の形式によって人生を掴むということは、人生を現在の中心から掴むということでな
ければならぬ。刹那の一点から見るということでなければならぬ。(「短歌について」『西田幾太郎随筆
集』『西田幾太郎歌集』岩波文庫)
短詩の形式とはひとつの言語パラダイムであり、それによってのみ感得しうるものがあると言っているのであ
る。これは一見逆説である——思考を表現する言語、という立場からは。しかし私はその立場がすべてではな
いことを主張したい。Saussure は記号が概念を分節すると言ったが、記号の用法、形式もまた何か見る対象
を分節しうるのである。名文として挙げられることの多い川端康成の『雪国』の冒頭もまた日本語特有の言語
パラダイムを有している。
国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。信号所に汽車が止まった。
この主語を持たない文章はトンネルの出口から覗く雪の世界を豊かに描き出しているが、主語を有せねばなら
ぬ言語においては私、や列車、といったキーワードがその趣きを損なうであろう。この主体なき描写の技法に
より表現される世界観はまさに日本人の「やりかた」や「ありかた」を反映してはいないだろうか。言語と使
用者の性質の相関もまた相互的であると思われる。
逆に Shakespeare の Hamlet における次の台詞は日本語にはない言語パラダイムに立脚したものといえ
よう。
To be, or not to be—that is question.
be は難しい。”Let it be” も直訳しづらい文章である。それは単語のレベルではなく言語パラダイムのレベル
で生じる問題だと言える。この文章に出会った日本人は、いかに我々のパラダイムで表現するか、外国人が
『雪国』を翻訳するときのそれと同様の苦しみに直面することになるのである。その意味で Google が翻訳の
際に使用する統計的手法は本質的である。言語パラダイムを異にする言語間で機械翻訳を適応することはほ
ぼ不可能であるから、同一現象をそれぞれのパラダイムで記したものを蓄積し対応させるしかないのである。
Google の翻訳技術については http://translate.google.co.jp/about/intl/ja_ALL/ 参照。
2
1.3 一般化、そしてプログラミング言語へ
前節では言語に注目しパラダイムについて論じたが、これは種々の学問や分野に当てはまる議論である。描
画にまつわるパラダイムは写真によって大きく変化したし、コンピューターによって更なる革新を遂げた。だ
がそれによって人間の描く “写真のような” 絵が価値を失ったというわけではない。心ない人間は時間の無駄
だと言うが、これらの写実的な絵に対して抱く一種の感動を否定することはできないであろう。どうやるか、
は何かをするか、に先立ちうる。筆では思い描くこともままならぬ情景がペンタブレットを手にする者によっ
て生み出されることもあれば、色鉛筆によってのみ獲得しうる世界もあろう。スマートフォンはまさに新たな
パラダイムによってネットワークのあり方を変革したし、数学に先立ち物理学が提供した数学的概念を取って
みれば枚挙に暇ない。数学を創造するという立場からは必ずしも数学というパラダイムがふさわしいとは限ら
ないのである。
このような例の中で産業的にも議論される価値のあるパラダイムがある。それがプログラミングパラダイム
である。プログラミングの世界はすべて人の手で生み出されたもので閉じる。それゆえに豊かで端的な例に恵
まれており議論のモデルとしては恰好の材料である。また問題の解決——何をするか——以上に作業効率や
再利用性、保守性の観点——どうやるか——が重要視される恰好の例でもある。以下では三つのプログラミ
ング言語による同一の問題に対するスクリプトを掲載し紹介する。
前書き
※これは以前高校生向けに描こうとしたものの名残りです。
プログラミングをするためにはまずプログラミング言語を選択しなければなりません。では、プログラミング言語を選
択すればプログラミングは始まるのでしょうか。そうではありません。プログラミング言語の選択とは別にしなければな
らないことがあります。それはプログラミングパラダイムを選択することです。首尾一貫した思想は問題をより捉え易く
し、そしてプログラムし易くしてくれます。プログラミングパラダイムとは物事のとらえ方であり、思想です。思想なき
プログラムは恐らく使い捨てで終わるでしょう。残るものはありません。しかししかるべき思想にしたがって打鍵された
プログラムは、あなたに成長を齎し、より進んだ領域へと押し上げることでしょう。ぜひ、プログラミング言語を学ぶと
きには、その背景にある思想、パラダイムを強く意識して欲しいと思います。
題の「こだわりやな言語たち」とは、一貫したパラダイムに従った言語たちです。C 言語以外は本屋においては「その
他のプログラミング言語」にカテゴライズされるようなマイナーなものでしょう。どれもとっつきにくいことは確かです
が、現役で活用されている、パワフルな言語たちでもあります……そのパラダイムを感得しさえすれば!この文書がそれ
らのパラダイムを修得するきっかけとなり、より楽しげなプログラミングライフへとつながれば幸いです。
Smalltalk については初めてのプログラムなのでまったくこなれていません。ご容赦ください!
2 FizzBuzz 問題
与えられた数列のうち 3 の倍数なら Fizz を、5 の倍数なら Buzz を、双方の倍数ならば FizzBuzz を返すプ
ログラムを作れ。
3
2.1 C 言語
FizzBuzz.c
#include <stdio.h>
#include <stdbool.h>
int main() {
int i ;
bool mod3zero, mod5zero ;
for (i = 0 ; i < 100 ; i++) {
mod3zero = ( i % 3 == 0 ) ;
mod5zero = ( i % 5 == 0 ) ;
if (mod3zero && mod5zero) {
printf("FizzBuzz ") ;
}else if(mod3zero && !mod5zero) {
printf("Fizz ") ;
}else if(!mod3zero && mod5zero) {
printf("Buzz ") ;
}else {
printf("%d ", i) ;
}
}
return 0 ;
}
4
図 1 FizzBuzz.C のイメージ
C 言語はメモリを管理するための言語と言っても過言ではなかろう。したがってプログラムはメモリに格納
された情報を制御するという観点で書かれることになる。int i ; はメモリの適当な箇所&i に整数を格納で
きるだけの容量を確保しその整数を i と表すということを意味している。この i を書き換え表示させるとい
う発想でプログラミングは行われている。
5
2.2 Scheme
FizzBuzz.scm
#!/usr/bin/gosh
(use srfi-1)
(display
(map
(lambda (n)
(let ((mod3-zero (zero? (modulo n 3)))
(mod5-zero (zero? (modulo n 5))))
(cond ((and mod3-zero mod5-zero) "FizzBuzz")
((and mod3-zero (not mod5-zero)) "Fizz")
((and (not mod3-zero) mod5-zero) "Buzz")
(else n))))
(iota 100)))
図 2 FizzBuzz.scm のイメージ
Lisp はジョン・マッカーシーによって考案され 1958 年に登場した古参の関数型プログラミング言語で、
Scheme はその一つの方言で比較的シンプルな者である。Lisp においてはすべてはリストで表現され、すべて
の問題はリストの変換に帰着されるといっても過言ではない。FizzBuzz 問題もまたリストの変換として捉え
られ、リストの変換に帰着された。
6
2.3 Smalltalk
FizzBuzz.st
#!/usr/bin/gst -f
Object subclass: ArrayHeader [
| array head |
ArrayHeader class >> new: ary [
^ self new init: ary ]
init: ary [ head := 1 . array := ary ]
now [ ^ array at: head ]
next [ head := head + 1 .
( head > array size ) ifTrue: [ ^’end’ ] ifFalse: [ ^ self now ]]].
FizzBuzzproc := [ :i |
| mod3zero mod5zero |
mod3zero := ( i \\ 3 = 0 ) .
mod5zero := ( i \\ 5 = 0 ) .
mod3zero & mod5zero ifTrue: [ ’FizzBuzz ’ display ]
ifFalse: [ ( mod3zero & ( mod5zero not ) )
ifTrue: [ ’Fizz ’ display ]
ifFalse: [ (( mod3zero not ) & mod5zero )
ifTrue: [ ’Buzz ’ display ]
ifFalse: [ i display . ’ ’ display ]]]].
Object subclass: FizzBuzz [
| aryhed prc |
FizzBuzz class >> max: max proc: proc [
^ self new max: max ; proc: proc]
max: max [ | ary |
ary := Array new: max .
1 to: max do: [:n | ary at: n put: n - 1 ] .
aryhed := ArrayHeader new: ary .
]
proc: proc [ prc := proc ]
on [ prc value: aryhed now . ( aryhed next = ’end’ ) ifFalse: [ ^self on ]]].
FB := FizzBuzz max: 100 proc: FizzBuzzproc .
FB on
7
図3
FizzBuzz.st のイメージ
Smalltalk はアラン・ケイによって発案されれ、1980 年に公開された。Smalltalk はオブジェクト指向プロ
グラミング言語の祖であり、アラン・ケイ自身その命名者でもある。ただ、現在使用されている「オブジェク
ト指向」なる言葉はその後 1983 年にビャーネ・ストロヴストルップによって公開された C++ のパラダイム
を示す言葉としても使用されたため、両者の語義が混在する形になっているので注意が必要である。ここでは
アラン・ケイ流オブジェクト指向について述べる。オブジェクト指向とは特定のパラダイムを示す単語として
はもっとも有名なものであろう。
Smalltalk においてはすべてがオブジェクトであり、オブジェクトに向けたメッセージである。例えば
Smalltalk にとって、1+1 とは、整数クラスのインスタンスであるオブジェクト 1 に + というメッセージを
送信する手続きを表す。+ なるメッセージは引数を取ることができて、今はそれが 1 である。オブジェクト 1
は +1 なるメッセージを受けとると 1+1 の計算の結果 2 を返す。メッセージを受け取って結果を返す役割を
担うものをメソッドと呼ぶ。*1 1 が display なるメッセージを受けとると、画面に 1 を表示する
上のプログラムは FizzBuzz を中心としたオブジェクト群がメッセージをやりとりしながら協働して結果を
返すものとなっている。
*1
ビャーネ・ストロヴストルップ流オブジェクト指向においては、メッセージ送信という概念はなく、直接オブジェクトに登録され
た関数 ≡ メソッドを呼び出す。
8