2009-10-25

"思考の整理学" 外山滋比古 著

ちょっと古い本だが、なぜか目立つように陳列される。宣伝文句には「1986年発売以来の超ロングセラー!」とある。完全に立ち読みしてしまったが、本書は是非我が家の本棚に並べておきたい。ほとんど共感できるからである。酔っ払いは、寂しさを感じながら同調者を求めているのだろうか?文章の流れには文学的な雰囲気さえ漂わせ、なんとなく癒される。いずれ再読するのは間違いないだろう。

知識の整理と思考の整理は違う。思考の整理の方がはるかに難しいように思われる。知識の整理はある程度の体系化が可能であろう。知識は、分類や階層化によって構造的にまとめることができる。現在ではコンピュータを利用すれば検索も容易にできる。だが、思考の整理となると事情は一変する。その有効手段を見つけるのは難しい。どちらも、抽象化の概念は必要であろう。伝統的な学校教育では、知識を教えても思考方法を教えることはない。にもかかわらず、人間はなぜか独自の思考方法を身に付ける。それは試行錯誤の中から会得するのであろう。人間は、幼児期に原始的思考というものを形つくる。思考の論理や法則性には、個人の経験則によって癖のようなものがある。人間の理念は十人十色で、合理性は別人からは不合理性と見なされる。したがって、思考の方法論が個人によって違ってくるのは自然である。思考を整理するのに文章を書いてみるのも有効であろう。書き出してみると、意外と理解していないことに気づかされる。一つの手段として図式化するのも有効であろう。おいらは言葉の関連図を書く癖がある。独自のマインドマップとでも言おうか。独自といっても、なんら難しい法則があるわけではなく、誰でも直感的に伝わるような表現を心掛け、その法則も気まぐれに従う。また、自分の思考を他人に説明しようとすると、いつのまにか自分の思考を整理していることに気づかされる。思考の整理に、プレゼンテーションの重要性を意識している人も多いだろう。
いずれにせよ、思考の整理方法で体系化できる黄金手法など存在しないだろう。そして、思考を洗練するには、ひたすら検証を繰り返すことだと思っている。本書は、こうした感覚を持った人間には惹かれるものがある。タイトルに「思考の整理学」と銘打っているが、そこに例題として用いられている手段はあるにせよ、体系的な技術や方法を伝授しようというものではない。思考の本質に迫ろうとすれば、抽象的にならざるを得ないし、哲学的思考が現れるのも自然であろう。本書は、物事を考えるとはどういうことか?思うことと知ることは違うのか?そうした素朴な疑問をあらためて考えさせられる。アル中ハイマーは、本書がしめくくる、このフレーズにいちころでなのだ。
「人間らしく生きて行くことは、人間にしかできない、という点で、すぐれて創造的、独創的である。コンピュータがあらわれて、これからの人間はどう変化して行くだろうか。それを洞察するのは人間でなくてはならない。これこそまさに創造的思考である。」

さて、今宵も酔っ払いの精神の動きに任せて、能書きを垂れてみるかぁ。

1. グライダー型と飛行機型
世間には、実に多くのハウツウものが氾濫する。その中で参考にできるのは失敗例であって、成功例には偶然性が潜むことを意識しておく必要がある。何々学校というものが大盛況なのも、新たに知識を得るために教師のような存在に頼るのが手っ取り早いからであろう。そして、無条件で教材が提示されれば、教材選びという面倒な作業から解放される。だが、あらかじめ教材が用意されるのと、自分にあった教材を最初から探し出すのとでは、意味が違う。教材の探索には、思考の試行錯誤が繰り返される。おいらは、新たな学問をしたければ、独学が一番心地良いと思う。独学は必然的に読書する。そして、散歩するかのように試行錯誤の中を漂いながら、具体的な手段を模索する。なによりも、誰にも指図されないのがいい。知識は獲得するまでの過程にこそ意義がある。つまり、最初から教材が与えられるということは、学問の醍醐味を省略していることになる。知識に到達するまでの思考を省いては、人生も味気ないものとなろう。そう言いながら、かつて英会話学校へ通ったことがあるのだが...よくセミナーにも参加するし...
いい歳をした大人が、なんでも手軽に教えてもらえると考えるのは、学校教育の弊害と言えよう。学校教育では知識を記憶することに没頭する。しかし、記憶は歳とともに薄れる。あらかじめ教材が用意され、情報探しで思考することを放棄させる。おまけに、重要なポイントが最初から示され、何が重要なのかを思考する過程をも奪う。何が重要なのか個人によっても観点が違うはずだが、学校教育の観点は試験のみである。問題はすべて学校側で用意される。だが、社会では問題は突然わいて出て、おまけに解答を知っている者は誰もいない。この答えの見つからない問題と対峙しながら、妥協という解決が求められる。
国語では解答が一つしかなく、文学作品の作者の意図も一方向に誘導される。歴史では、教師の解釈が強制される。数学では、有効な解法を一つ提示すれば、それに皆が群がる。そして、すべてが暗記科目となる。こうした傾向は社会現象にも見られる。世論は一方向に扇動され、違った解釈を持つものは不安に駆られる。こうした流れは、一時的にエントロピー増大の法則に逆らっているように映る。しかし、事象に対する後の社会的評価や歴史的評価は、時代の経過とともに変化する。社会を生きる上で、紋切り型の知識はあまり役に立たないことは、ほとんどの人が経験によって認識しているだろう。だからといって、知識を蔑むものではない。知識がなければ思考することも難しい。こうした視点を、本書ではグライダー型人間と飛行機型人間の対比で語られる。グライダーも飛行機も空を飛ぶ姿は似たようなものである。むしろグライダーの方が音も静かで優雅である。しかし、グライダーはエンジンが無いので、自ら舞い上がることができない。そして、学校はグライダー型人間の養成所であると皮肉る。グライダー練習上にエンジンのついた飛行機が混じっていては、騒音もうるさく迷惑するというわけだ。勝手な奴は規律違反をし、優等生はグライダーとして優秀となる。従順さの尊重こそ学校というわけか。おまけに、指導する教師もグライダー型である。面倒見が良さそうで親切そうな教師ほど、具体的な参考文献や問題の解釈などを提示してくれる。だが、それは意識の誘導でもある。こうした教師ほど評価される。これは学問にとって良い傾向なのだろうか?個人的には、好きなようにやればいいと助言してくれる方がありがたい。一見冷たく見えるがそうではない。こちらが考えをまとめて、議論に訪れれば話題も盛り上がる。逆に、こちらの思考が浅ければ冷たくあしらわれるだけのこと。人間社会はグライダー人間によって支配される構造的問題を創出しているのかもしれない。

2. 独創性
本書は、知識と思考を独創性や個性といった観点から議論される。ところで、独創性とは何か?独創性とは、どうやって磨くのか?その出発点をどこに求めるかは難しい。子供の行動は、大人の行動を真似ることから始まる。こうした素朴な行動には、独創性の本質が隠されているような気がする。作家ポール・ヴァレリーは、他の作品を養分にすること以上に、独創的なものはないと語った。ヴァレリーによると、偉大な芸術は模倣されることを自然に受け入れるという。優れた作品は、模倣しても、模倣されても、ゆるぎない芸術性を保つというわけだ。日本の小説家で誰だったかは思い出せないが、似たようなことを語っていた。それは、独創性を磨くには、いかに多くの気に入ったフレーズに出会えるかにかかっているといったことである。個性を磨くにしても、いかに個性的な人間に出会えるかにかかっているのかもしれない。ただ、最も重要なことは、自らの精神を解放することであろう。いくら、優れた思考に出会ったところで、それを感じ取る力がなければ意味がない。芸術家は、日常生活の些細な出来事ですら、そこに芸術性や独創性を感じるのだろう。科学の独創性にも、先人たちの苦悩の積み重ねの上に成り立っている。そもそも、最初から独創性を意識したところで、独創的な思考は生まれないだろう。人間の理念が十人十色であれば、おのずと物事の解釈にも個人差が生じるはず。
「デマは見方によれば、自由な解釈にもとづく伝達の花だということにもなる。われわれは、だれでもデマの担い手となる資格をもっている。」
なるほど、ウィキペディアにも間違った情報が紛れ込む。おいらのブログも時々読み返して修正しているが、どれだけ間違いが紛れているかは計り知れない。酔っ払いには知識の整理だけでも難しいのに、思考の整理となると、独創性が絡み限りなく不可能となりそうだ。

3. 思考と閃き
思考していると、思わぬ閃きが突然やってくることがある。アル中ハイマーには、風呂の中か睡眠中に訪れる。アイデアや難題の解決方法が、思考をリセットした時に訪れることはよくある。ただ、困ったことに、こうした場面では即座にメモることができない。こうした現象は、緊張感から解放された時に起こるのだろうか?本書でも、REM睡眠と思考の関係を論じている。
通勤途中の電車に揺られている時にアイデアが浮かぶことある。電車の振動は思考のリズムをつくるのかもしれない。一日中解決できない技術的な問題を、徹夜して取り組むが、一晩寝るとあっさり解決されることもある。そして、昨日の苦労はなんだったんだ!とにやける。将棋の棋士が考慮中に真っ白な空白をつくることを心掛けているといった話を聞いたことがある。思考が枯渇した時、そうしたリフレッシュが大切なのは、経験的に感じる。これが気分転換というやつか。おいらは、よく煙草を吸いに海に出かける。波の動きを眺めたり、波の音を聞いていると、それだけで癒され、思考がなんとなくリフレッシュされるように気がする。そもそも、集中しようと思って意のままになることはない。ある程度の精神誘導は必要だが、焦らず自然に集中することを待つのが肝心!そして、突然フロー状態が現れる。本人は気づかず、心地良い宇宙へと自然に導かれる。無我の境地とでも言おうか。自我は、自由意志によってコントロールできそうで、できない。ただ、神は自我のコントロールが自在にできると信じ込ませるから、やっかいである。「自由」を実践することは難しい。好きなように実行することほど難しいものはない。自我とは、得体の知れないものである。自由意志の存在すら疑わしい。そこがおもしろいのだが。やりたいことを、続けていると、いつのまにかテーマが自然発生する。人間の精神は気まぐれに支配されると考えるしかあるまい。したがって、集中力は向こうからやってくる。それを、美味い酒でも飲みながら待つとしよう。

4. 夜型人間から朝型人間へ
エンジニアの世界には夜型人間が多いようだ。昔から勉強は夜間にやるという習慣があるのだろうか?おいらも、サラリーマン時代に夜型人間だった。そこで、フレックスタイム制はありがたい。しかし、会社を転々としているうちに、いつのまにか朝型人間になっている。ベンチャーと称する企業で働いていた時は、毎日メールを200通から300通処理しなければならなかった。これをやっているだけで一日が終わってしまう。そこで、メール処理のために朝を利用する。そうしないと、自分の仕事をする時間が確保できないからである。すると、朝6時から9時ぐらいに頭の回転が速いことに気づく。今では、朝4時から5時には自然と目が覚める。目覚まし時計が壊れていることにも気づかない。朝からステーキハウスに出かけることも珍しくない。他に客もいないので貸し切りにできるのが気分いい。ちなみに、一番多く食べるのが朝飯で、夕飯が一番軽い。その分、酒が入るが。いつのまにか朝型になっているのを、歳のせいだと言う人がいる。失敬な!そして、昼の3時ともなると飲みたくなる。この時間にバーが開いていないのが残念!個人事業主になると朝4時に散歩する習慣ができた。度々警察官から職務質問を受ける。今では、「ご苦労様です!お気をつけて!」とパトカーから声をかえられる。ちなみに、就寝時間は0時から1時。よって、連続睡眠時間は3時間から4時間ということになる。昔から、睡眠時間は短い方だが、その分、昼寝を1時間するとスッキリする。それも、昼間に眠くなれば自然と寝るだけのことで、無理に寝ようとはしない。仕事のパートナーに、「お前はいつ寝てんだ?」とよく聞かれる。おいらは、眠い時に寝る!腹が減ったら喰う!そこに酒があるから飲む!というのを実践している。すると、自然に規則正しい生活リズムが完成してしまった。動物は、生物学的に規則的に生きるようにできているのかもしれない。

5. 読書の中の思考
読書では、一つ一つの言葉は静止しているのに思考はうごめく。プログラムを書いていても、一つ一つの記述は静止しているのに、全体として振る舞いを持つ。音楽は、一つ一つ音波として存在するが、そこにメロディーが生じる。しかも、そのメロディーを感じることができる人と、感じることができない人がいる。一つ一つの科学現象をスナップショットすると、そこには自然法則を感じる。離散的現象を眺めていると、そこに連続性が現れる。人間の目が持つ残像効果も、こうした現象の一つであろうか。
一つの難解な文章に出会うと、その前後の文章から解釈するという思考が働く。言葉の非連続性から、思考によって連続性を構築する。人間の想像力とは大したものだ。難解な命題を理解するために、喩え話を登場させたりと、人間の感性は、総合的観点から物事を解釈しようとする。中には、部分的にしか解釈できなくて、揚げ足ばかりとる人もいる。これを突っ込みと言う。したがって、突っ込みの感覚には、嫌味となるか優れたジョークになるかの判断ができる微妙な感性が要求される。
おいらは、難解な文章に出会うと、よく後ろから読んでみたり、まん中から読んでみたりする。文章の構成を思考によって立体的に組み換えることによって、ある解釈が生まれることがある。もともと理解力の低い酔っ払いは、読み方も右往左往する。思考も千鳥足というわけだ。だから、一冊を読む時間も長い。それだけ長く楽しめるのがいい。速読なんて手法は、酔っ払いには必要ない。酒を多く飲むことが目的ではない。美味い酒をじっくりと味わうのが目的なのだ。

2009-10-18

"幾何学基礎論" David Hilbert 著

昨日飲んだ熟成純米酒に誘われたのか?いつのまにか純粋数学の古典を手に取っている。空間感覚の破壊された酔っ払いには、頭の体操にもってこい!なのだ。

幾何学は、ユークリッド以来、ひたすら公理から展開されてきた。ところが、19世紀になると集合論によるパラドックスの発見によって、その基礎は危機に曝される。そこで、ヒルベルトは公理主義を強調して数学の体系化を推進した。有名な「ヒルベルトの23の問題」が、現代数学の方向性を示したのは間違いないだろう。ヒルベルトは公理論的思惟にこだわった形式主義の立場をとることによって、数学を純粋領域で確立しようと試みた。だが、ゲーデルの「不完全性定理」の登場によって挫折することになる。言い換えれば、人間が証明できる純粋な学問は、人間の不完全性によって挫折したと言っていいだろう。人間が全ての宇宙現象を公理によって証明できるとしたら、人間の地位を神に押し上げるようなものだから。ヒルベルトの努力が、結果的に数学を再び哲学の領域へと引き戻してしまった感がある。だからといって、その貢献を蔑むことにはならない。人間の限界である完全性と不完全性の境界線を探求することに、学問の意義があるだろう。境界線に近づこうとする努力は、全てが完全であると信じるところから始まる。最初から不完全だと諦めていては、その境界線に近づくことすらできないだろう。現在においても、プラトン哲学が継承されているところがある。それは、どんな複雑な現象も、その背後には単純な自然法則が潜んでいるに違いないと信じてきた科学者の執念である。ヒルベルトもこの執念に憑かれたと言えるだろう。

本書は、カントの言葉から始まる。
「斯くの如く人間のあらゆる認識は直観をもって始まり、概念にすすみ、理念をもって終結する。」
ヒルベルトは、カントールの無限濃度アレフの存在を証明しようと試みても失敗することを認めている。つまり、本書には、有限個で完結した世界においてのみ純粋数学がありうるのであって、公理に基づいた数学を確固たる地位で安定させたかったという願いが込められる。彼は、数学をなんとしてもユークリッド幾何学に留めておきたかったのだろう。本書には、集合論の無限性を拒絶した反応があちこちに漂っている。
幾何学には、古くから議論される作図問題がある。結合公理、順序公理、合同公理、平行公理の4つの公理に基づいた幾何学においては、定規と定長尺を用いて作図することが可能である。だが、連続公理が加わった途端にその範疇から飛び出す。図を描くと自然に見えてくる定理が、ひたすら論理的な公理だけで解析を続けると、摩訶不思議な幾何学が登場してしまう。おまけに、複素数系に放り込めば、人間には手に負えない世界が広がる。そこには、幾何学と代数の融合が現れる。近代数学は、証明の可能性を示す方向から、不可能性を示す方向へと方針転換しているかのように映る。アーベルは、5次方程式の代数的解を求めることが不可能であること証明した。平行線公理の証明不可能性、あるいは、ネイピア数と円周率を代数的方法で作ることの不可能性やリンデマンの定理といった例が支配的となる。形式的公理による論理の組立てでは、人間の想像もつかない世界を構築する。こうした流れを、本書はパスカルの定理とデザルグの定理の展開から匂わせる。ちなみに、パスカルの定理とデザルクの定理は、射影幾何学の基本定理である。本書の考察は、実際に微分を用いて解析されるわけではないが、思考的には微分学の匂いがする。そして、ついに非ユークリッド空間を無視した幾何学の構築に限界が見えてくる。

数学の歴史は、抽象化の歴史と言えよう。代数の世界は、自然数に始まり、数の概念を整数、有理数、実数、複素数へと拡張させてきた。それは、自然数で引き算や割り算を行うと、答えが自然数の世界からはみ出すように、一つの系が算術によって世界が閉じられないからである。本書は、これを生成的方法と名付けている。
一方で、幾何学は、点、直線、平面の存在を仮定して公理的に展開される。結合、順序、合同と考察される中で、無矛盾性と完全性に従った公理が構築される。本書は、これを公理的方法と名付けている。そして、公理的方法の方が合理的であって、知識を完全に記述し、完全に論理的に保証する上で優れていると主張する。これは代数学への批判か?
ヒルベルトは、民族や国家の繁栄のために協和と秩序が確立されるように、学問同士の協和と数学界の秩序が重要であると訴えている。そして、幾何学では、平面方程式の一次性の定理と点座標の直交変換から、ユークリッド幾何学を完全に保証できると述べながら、あらゆる学問が公理的展開を見せると熱く語る。数論の構成には計算法則と整数法則があれば十分で、力学にはラグランジュの運動の微分方程式があり、電磁気学にはマクスウェルの微分方程式に電子と電荷の性質を加えたものが公理的な役割を演じるという。そして、熱力学では、エネルギー関数の概念と、そのエントロピーと体積を変数とした偏微分方程式で温度と圧力を定義することによって完全に構築でき、初等輻射論では輻射と吸収との関係を支配するキルヒホフの定理が中心となり、確率論ではガウスの誤差法則が、気体論ではエントロピーの定理が、曲面論では孤の長さを二次微分形式で表すことが、素数論ではリーマンのゼータ関数が、それぞれ基本定理になるという。これらの基本定理は、それぞれの分野における公理と見なすこともできよう。
本書は、高名な数学者であるクロネッカーやポアンカレのような、数学から純粋性を奪おうと企む連中が豊かな数学を脅かすと批難する。ヒルベルトは、交点定理であるデザルグの定理やパスカルの定理を仮定すれば、それを有限回繰り返すことによって、幾何学の公理を決定づけられると信じた。しかし、連続公理の無限性に現れる矛盾性がその道を妨げる結果となってしまった。デカルト座標において、幾何学的公理から矛盾が導かれれば、それは実数系の算術も矛盾として認識されなければなるまい。つまり、幾何学的公理の無矛盾性の問題は、実数の公理系の無矛盾性の問題に転嫁させる。そして、無矛盾性の問題は依然として残されたままである。

1. 5つの公理群
幾何学の構成元素といえば、点、直線、平面の3つに集約できよう。本書は、この基本元素を結合、順序、合同、平行、連続の5つを基本公理として展開する。結合公理では、2点間における直線との結合関係、3点間における平面との結合関係、あるいは平面における立体的な結合関係を示す。順序公理では、直線上、平面上、あるいは空間における点の位置関係を示す。合同公理では、線分と角から三角形の合同関係を示し、すべての直角は合同であることを導く。そして、空間移動における運動の概念を示す。平行公理では、線分と交わる角度の関係から平行の条件を導く。連続公理では、直線上の有限個の点を極限操作によって無限に拡張できることを示す。連続性については、アルキメデスの公理と完全性の公理とに分かれるという。ヒルベルトが公理の完全性を求める上で、連続性はやっかいな存在だったことだろう。無限の概念を避けては通れないからである。本書は、公理として無限性を含まないという意味で完全性公理を仮定しないと述べ、デカルト幾何学との同一性を宣言している。

2. 無矛盾性と独立性
本書は、5つの公理群の無矛盾性と独立性を証明しようとする。独立性とは、各々の公理から他の公理を演繹できないということである。平行公理の独立性には、非ユークリッド幾何学への拡張を思わせる世界をルジャンドルの定理によって紹介される。
ルジャンドルの第一定理:
「三角形の内角の和はニ直角よりも小なるか、あるいはこれに等しい」
ルジャンドルの第二定理:
「いずれか一つの三角形において内角の和がニ直角ならば、あらゆる三角形の内角の和がニ直角に等しい」

本書は、合同公理の独立性から非アルキメデス幾何学の存在を認め、連続公理の独立性から非ルジャンドル幾何学の存在をも認め、ルジャンドルの定理の拡張が述べられる。
「三角形の内角の和がニ直角よりも大か、等しいか、小になる。」
ついに、非ユークリッド幾何学の存在を認め、トポロジーの世界を匂わせる。

3. 分解等積と補充等積
三角形の合同と相似の関係を見出すのは容易である。本書は、多角形における面積理論を展開する上で、分解等積と補充等積を議論している。分解等積とは、二つの多角形をそれぞれ有限個の三角形で分割し、しかも細分した三角形が互いに合同で対応できれば、二つの多角形は合同ということである。補充等積とは、二つの多角形が互いに分解等積である場合、分解等積で得られる三角形の組み合わせで合成してできる多角形のことで、三角形の組み合わせ方で様々な多角形を形成することができる。そして、二つの同底、同高の平行四辺形は互いに補充等積となることが導かれ、二つの平行四辺形の面積は等しくなることが導かれる。
「二つの補充等積な三角形が底辺を共有すれば、その高さも等しくなる」
ここには、面積理論の基礎が構築されている。

4. デザルグの定理とパスカルの定理
デザルグの定理:
「同一平面上にある二つの三角形において、対応辺がそれぞれ平行ならば、対応頂点の連結直線は一点を通るかあるいは互いに平行である。また逆に、同一平面上にある二つの三角形の対応頂点の連結直線が一点に会するか、あるいは互いに平行であり、かつ三角形の二双の対応辺がそれぞれ平行ならば、両三角形の第三辺もまた互いに平行である。」

この定理は、結合公理、順序公理、平行公理によって証明される。しかし、直線公理および平面公理が成立しても、デザルグの定理が成立しない平面幾何学が存在する。立体公理を加えると、合同公理なしではデザルグの定理の証明は不可能という結論を導いている。本書は、デザルグの定理には、平面幾何学から立体幾何学へ拡張するための意義があるという。そして、あらゆる空間公理に代わるものになると示唆している。
パスカルの定理とは、円錐曲線論における定理である。
「点A, B, C、および点a,b,cをそれぞれ3点ずつ相交わる2直線上にあり、かつその交点と一致せざる点とせよ。しかるとき線分CbがBcに平行かつCaがAcに平行ならば、BaがまたAbに平行である。」

デザルグの定理とパスカルの定理はともに平面幾何学の条件であり、パスカルの定理もまた立体公理を加えることで合同公理なしでは証明できないという。ただ、デザルグの定理は、合同公理と連続公理を用いることなく、パスカルの定理から証明できるという。ちなみに、パスカルの定理には、比例の理論と相似関係の基本定理が内包されている。

2009-10-15

"初めてのRuby" Yugui 著

タイトル通りRuby入門書である。ただ、オブジェクト指向を少しぐらいかじっていないと読むのも辛かろう。前記事の「プログラミング言語 Ruby」と重複するところも多いが、よりコンパクトで、具体例はこちらの方が多い。頭の鈍い酔っ払いには、二冊セットで読むとちょうどよい。本書は、リファレンスを読むための手引書のような位置付けにある。ちなみに、著者のYuguiさんとは、園田祐貴さんのことでRuby1.9系統のリリースマネージャと紹介される。自らMtF-TS(Male to Female Transsexual)と告白されるように、その勇気には頭が下がる。こういう方にこそ研ぎ澄まされた感性や才能が宿りやすいのかもしれない。

人間は物事を考える時、自分で使いこなせる言語で思考するところがある。ただ、精神は言語を飛び越えた領域で思考するところもあって、言語学者は対象言語の外側から物事を眺めているのだろう。ちなみに、アル中ハイマーの精神は、しばしば自らのボキャブラリ障壁を越えられなくてイライラする。日常使われる言語には、民族の持つ文化や慣習といったものまで背負い込む。プログラムを書く時も同様に、プログラマは自然とプログラミング言語に沿って思考するところがある。そして、プログラミング言語の持つ文化や慣習といったものが思考の中に入り込む。したがって、システム構築にはプログラミング言語の選択も重要となろう。
ポール・グレアム氏は、著書「ハッカーと画家」の中で、「ハッカーというのは、言論の自由に対してものすごく執着するものなんだ。」と語った。仕事の要求が高ければ、より優れた言語を使うことで効率を上げたいと考えるだろう。だが、実際にはそれほど要求の高くない仕事がゴロゴロしている。よって、慣れ親しんだ言語を使ったり、流行を追いかけるのも悪い選択ではないだろう。言語は過去の資産や組織の政治力によって強要されることもあれば、言語には宗教のようなところがあって洗脳されるケースもあって、純粋に言語選択といっても難しいものがある。多くの言語に触れなければ的確な選択判断が難しいと同時に、一つの言語を深く使いこなさないと本質を理解できないというジレンマがある。したがって、酔っ払いには噂に流されることぐらいしかできない。
Rubyは、純度の高いオブジェクト指向言語として名高い。また、SmalltalkやLispの影響を受けた言語で、複雑なシステムを最小コストで構築する能力があると言われる。Rubyの古い謳い文句に「驚き最小の法則」というものがあるという。なるほど、その思想はシンプルである。数値や文字列、正規表現、入出力などすべてがオブジェクトで構成され、すべてのオブジェクトはメソッドを通して統一的に操作できる。
歴史的には、「より良いPerl」として受け入れられたそうな。Perlといえば、その自由さによって暗号文っぽくなりがちで、自分で書いたコードですら後で見るのが嫌になる。そんな酔っ払いが、Rubyを使えばスパゲッティコードから解放されるとは言い切れないだろうが。
また、「動く擬似コード」と評されることもあるらしい。ほとんどのプログラミング言語は、コンパイルのためのおまじないといった余分なコードが含まれる。その点、Rubyは本質的なコードのみを書くので解読しやすいという。そういえば、最近、数学書やアルゴリズム解説書で、Rubyで書かれたサンプルコードが付録されるのをよく見かける。これも、余計なおまじないがなく要所を押さえたコードということだろうか。
本書は、Rubyらしく考えることを主眼に置いている。言語を理解する上で、単なる文法法則だけを紹介されてもつまらない。言語の流儀や文化を知ることに意義がある。

ところで、オブジェクトとは何か?なんとなく目的を持って振舞う塊のようなもの。そして、多くの塊が協調しながら一つのシステムを形成する。こうした構造は、人間精神のメタファを感じる。精神には、一つの目的を持った意識のようなものが形成され、人間は多くの目的意識を見出しながら生きている。では、それぞれの意識は、何によって制御されたり操作されたりするのだろうか?そこには意志というメッセージが飛び込んでくる。これがメソッドだ。意志とは、石のような頑固な塊であって、それぞれが協調しながら妥協の中で目的を果たそうとする。その目的を持った意志が失われた時、精神は死んだり、精神病を患ったりする。目的を持った意志とは、欲望と解釈することができる。オブジェクトがデータ構造の管理を怠れば、メモリリークも起こす。そして、精神もパニックを起こし、犯罪を犯すことだってある。それが衝動ってやつか?こうした致命的なバグを言語仕様によって防ぐことができればありがたい。では、精神の衝動を抑える合理的な手立てはあるのだろうか?それが理性ってやつか?プログラミング言語の思想にも、危険な操作をすべてプログラマの良識に任せるか、すべて抑制するかという論争がある。ちなみに、Rubyの文化は前者のようだ。これも大人の世界ということだろうか。したがって、オブジェクトの構築には理性構築に通ずるものを感じる、のは気のせいか?

1. バージョン体系
MRI(Matz' Ruby Implementation)のバージョン体系は、"MAJOR.MINOR.TEENY"となっていて、MINORが偶数のバージョンが安定版で、奇数が開発版なのだそうな。ただし、1.9系統は変則で、TEENYが1以上のものが安定版で、0が開発版なのだそうだ。また、1.9系統は2.0系統の踏み台を意図しているという。なんとなく2.0に期待するのであった。

2. データ構造
Rubyは、だいたいにおいて定義が緩やかである。しかし、型変換では厳密な面を見せる。Perlのように、外部からの値を必要に応じて数値や文字列と勝手に判断して型変換をする言語は、あまり好まないのだが、Rubyの型定義の緩やかさの按配は酔っ払いの肌に合う。Rubyは、to_i, to_f, to_sなどの型変換メソッドを用意している。ちなみに、定数も変数でありオブジェクトである。ただし、定数を変更すると警告を発してくれる。
「Rubyは、すべてがオブジェクト構造をとるため、オブジェクトへの参照を別のオブジェクトへの参照へと対応付けるデータ構造をとる。」
といった表現がやたらとちりばめられる。なるほど、変数への代入は正確にはオブジェクトへの参照を代入していることになる。これは注目すべき性質であろう。例えば、以下のように動作する。
------------------
cattle = "yahoo"
animalx = cattle
animaly = cattle.dup # 複製メソッドで明示すれば分かりやすい
cattle[2] = ?p
p cattle # "yapoo"と表示
p animalx # "yapoo"と表示
p animaly # "yahoo"と表示
------------------
酔っ払いは、いかにもオブジェクト指向らしいこの性質に惹かれる。というのも、イテレータで書くと何をやっているかを明示できて、文章っぽくなるのがいい。
ところで、配列などでデータの範囲外にアクセスすると、他の言語では例外を起こすだろう。Rubyは、概して範囲外添字に対して寛容で、nilを返すだけである。この思想が良いか悪いかは、好みの分かれるところだろう。ちなみに、厳格に例外を発生させるfetchメソッドも用意されてる。
オブジェクトの占有するメモリは処理系が管理して解放するので、プログラマが管理に悩まされることはないという。ガベージコレクションが自動でメモリを解放するからである。だからといって、メモリリークが絶対に起こらないというわけでもないだろう。やたらと寿命の長い参照を作るコードが危険であるのは同じである。

3. 数値演算
多倍長整数をサポートしているので、桁あふれを心配せずに大きな数を扱うことができるという。Rubyの数値計算が遅いところは、少々気になるところである。それも1.9では大幅に改善されているそうな。言語によっては、32bitや64bit長という制限があるが、Rubyの整数型には制限がない。整数オブジェクトは、IntegerのサブクラスであるFixnumクラスとBignumクラスで実装される。Fixnumは固定長で実装される整数で、Bignumは多倍長で実装される整数で、これらのクラスを自動的に使い分ける。言うまでもなくFloatオブジェクトの実装はIEEE754に従っていて、その精度はシステムに依存する。IntegerクラスとFloatクラスの親クラスはNumericクラスである。
ちなみに、左辺が右辺よりも小さければ負の数を、等しければゼロを、大きければ正の数を返す比較演算子 <=> を、宇宙船演算子と呼ぶらしい。おいらには宇宙船の形には見えないが。
他に、数値演算に欠かせない複素数クラスや有理数クラスが提供されるのはありがたい。

4. 文字列
この手の言語で、正規表現などのunix流のテキスト処理は必須であろう。Rubyは、PerlやAwkといったシェルスクリプトを受け継ぐ。また、文字列操作のメソッドやイテレータが豊富なのも特徴である。1.9では、マルチバイト文字に対応した多言語テキスト処理をサポートする。マジックコメントは、emacsやvimにファイルのエンコーディングを知らせる方法を流用している。
Rubyには、文字クラスなるものが存在せず、マルチバイトのエンコーディングも含めて、すべてStringクラスで対応している。Rubyのライブラリ設計には、「大クラス主義」というものがあるらしい。むやみにクラスを増やしたり余計な階層化をしないという思想である。
正規表現は、1.8ではGNU regexを改造した独自のエンジンを利用していたが、1.9では「鬼車」というライブラリを採用して機能を強化しているという。
ところで、文字列とは別にシンボル(Symbol)という似通った概念がある。シンボルの特徴は、その唯一性と軽量性にあるという。文字列同士は内容が同じでも同一のオブジェクトとは限らない。対して、シンボルは内容が同値であれば同一のオブジェクトになるという。へー!オブジェクトが同一であるかを調べる場合、文字列よりもシンボルの方が高速に動作するという。シンボルは内容に対する唯一性を維持するので、文字列とは異なり変更不能(immutable)となる。このような性質はハッシュのキーなどに適していそうだ。

5. 入出力
しばしば、Rubyのクラスはunix文化に基づいていて、posixやシステムコールやC言語ライブラリ関数をオブジェクト指向でラップした形になっているという。IOクラスもその典型と言えよう。ファイルをオープンすると、ブロック付きメソッドによって自動的に閉じてくれる。こうしたライブラリがリソースを管理してくれるのはRubyの利点の一つである。リソースを手動で管理することもできるが、その時はcloseメソッドが必須となる。標準入出力やFILEやARGF以外にもIOオブジェクトがある。StringIOは、文字列に対してIOオブジェクトであるかのように振舞うラッパークラスである。1.9では、入出力も文字列と同様にエンコーディングを扱うことができるらしい。

6. 変数と式
Rubyの慣習で、変数名にcamelCaseやPascalStyleのような、大文字小文字で単語を区切るべきではなく、pascal_styleのようにアンダースコアで区切るべきだという。尚、クラス名のみは例外で、PascalStyleといった大文字小文字で名前を付けるらしい。
そういえば、Rubyには、インクリメント、デクリメント演算子がない。導入するかどうかという議論もあるらしいが、強力なイテレータがあるので不便を感じないということらしい。例えば、以下のようにやればいい。
0.upto(9){|i| puts i}
str = "Diogenes"; str.each_byte{|byte| puts byte}
多重代入で、a, b = b, a とやれば、値が交換できるのは便利。論理演算子は短絡評価にも使える。a || b は、aの値が真ならば、bの値を評価せずにaを返す。aの値が偽ならば、bの値を評価する。同様に、a && b は、aの値が偽ならば、bの値を評価しない。
ifやwhileなどの制御文は、Rubyでは値を返す式なので制御式と呼ぶそうな。ちなみに、ループ系の制御式は、loop, times, uptoなどのイテレータを使うとコンパクトに書ける。

7. メソッド
あらゆるオブジェクトにselfが存在する。C++やJavaのthisのようなものである。デフォルトのレシーバがselfなので、クラス内では省略できる。配列では、sortやuniqなどのメソッドが提供される。uniqは重複する要素を排除するメソッドで、元の配列を破壊しない新たな配列を生成する。対して、uniq!は破壊的メソッドとなり、元の配列から重複要素を削除する。一般的に破壊的メソッドは、末尾に!を付ける慣習があるようだ。
非オブジェクト指向的なメソッドに関数メソッドがある。厳密に言えば、どこかのオブジェクトに属するので、Rubyには純粋な意味での関数は存在しないようだ。つまり、トップレベルのメソッドである。
値を返す時は、returnを用いることができるが、省略すれば、メソッドの末尾の式の値が返される。ただし、多値を返すにはreturnが必須。ちなみに、void関数のような値を返さないメソッドは存在しない。神経質なプログラマは、意味のない値を返すよりも、意図されないようにnilを返すように書くらしい。
メソッドによっては、ブロック付きで動作させたい場合がある。ブロック付きメソッドを定義する時は、yieldを利用する。

8. クラスとモジュール
クラス名は大文字で始まる識別子でなければならないという。これはクラス名が定数名でもあるからだそうな。クラス定義の変更を禁止したい時は、freezeメソッドを使用すればいい。ちなみに、組み込みクラスを含む重要なクラスでも、初期状態ではfreezeされていないという。プログラマの良識に委ねているということか。
モジュールはクラスと似ているが、「インスタンス化できないクラス」のようなものだという。ClassはModuleのサブクラスである。モジュールの特徴はMix-inと名前空間にあるという。Mix-inは、制限された多重継承で、そのイメージはトッピングのような意味あいだろうか。ArrayやHashクラスには、EnumerableモジュールがMix-inされるので、その関係のイテレータが自由に利用できる。クラスにComparableモジュールをMix-inすれば、比較機能を自由に利用できる。

9. その他
gdb風のデバッガが標準に装備される。
$ ruby -rdebug hello.rb
pという信じられない短いメソッドがある。これはデバッグに用いられるメソッドでirbと共に重宝されるが、デバッグや学習、コードゴルフ以外に用いるのは行儀が悪いという。おいらは、このメソッドに病み付きだ。
RubyGemsはパッケージ管理システムで、インストール可能なパッケージの一覧などを参照できる。RubyGemsには、Ruby/GD2などの画像ライブラリやネットワークライブラリもある。
wxrubyは、クラスプラットフォームなGUIツールキットwxWidgetsをRubyから利用するためのライブラリである。

2009-10-11

"プログラミング言語 Ruby" David Flanagan & まつもとゆきひろ 著

ここ数年、遊びで書くコードはほとんどRubyである。毎日遊んでいるようなもんだが。というのも仕事では認可してくれない。管理ができないからという理由らしい。では、C++ならば管理ができるのか?正確にはC++コンパイラさえ通ればいいようだ。
ところで、遊びとはいえ使う言語の解説書を一冊も持たないことがよくある。試してみてから気に入ったら、その解説書を買うといったところだろうか。これも、安易に誤魔化すことができるネット社会の恩恵であり、惚れっぽい酔っ払いにはありがたい。ということで、Rubyの解説書を手にするのは初体験である。初体験という言葉はなんとなくドキドキさせる。これも若さというものか。

Rubyは、全般的に型の定義が緩やかである。いわゆる、動的言語で見られる「ダックタイピング」という特徴がある。ちなみに、この言葉は「あひるのように歩き、あひるのようにクワっと鳴けば、それはあひるに違いない。」という諺からきているそうな。個人的には型チェックの曖昧さを好まないのだが、あまり厳格過ぎるのも鬱陶しい。そこで、Rubyは、数値リテラルなど厳格に型チェックされる場合もあるので、その按配が肌に合うようだ。
Rubyは純度の高いオブジェクト指向言語として世界でも評判が高い。その普及を後押ししたのがRuby on Railsだと言われている。日本人が開発した言語が世界を席巻するというのもなんとなく嬉しい。文法的にもLisp, Smalltalk, Perlの影響を受けつつも、CやJavaのプログラマでも親しみやすいという特徴がある。特に、procやlambdaといったメソッド思想によって関数プログラミング風に書けるのがいい。ちなみに、lambdaは数理論理学などで見られるラムダ計算にちなんだ名前。
ところで、関数プログラミングといえば、Lispを思い浮かべる。ポール・グレアム氏は著書「ハッカーと画家」で、Lispを学べば実際にLispプログラムを作ることがなくても良いプログラマになれると熱く語っていた。現代のプログラム構造は、動作部からデータ構造へと注目点が移ってきた。Lispにはデータ構造の本質を覗かせてくれる何かがあるのだろうか?と、なんとなく興味を持っているが、いまだに手が出せないでいる。Rubyのおかげで、ずーっと避けていたLispにも手を出す日が近づいた予感がする。来年の目標はschemeあたりか?Lispは古い言語で、時代を前後した奇妙な順を追っているようでもあるが、そこは酔っ払いらしく千鳥足で言語選びの旅に出かけるのも悪くない。

本書は、改めてRubyの持つ思想や慣習といったもの味あわせてくれる。そして、かなり慣習を無視した書き方をしていることに気づかされる。やはり言語の勉強はいい加減にできるものではない。おいらの勉強は、いつも勘で始まって勘違いへと変化する。まったく学習能力がなく、いつも同じ轍を踏むわけだが、なぜか?気持ちええ。アル中ハイマー病とはそうした病である。
本書は言語リファレンスではない。それでも重要なクラスやモジュールを押さえている。Rubyの特徴は、豊かなAPIを備えていることであろう。特に、String, Array, Hash, Enumerable, IOといった主要クラスは押さえておきたい。また、数値と数学関係のNumericメソッドやMathモジュールも紹介してくれる。
Rubyのコレクションクラスには、ArrayやHashやSet(集合)があるが、いずれもEnumerableモジュールがミックスインされる。ちなみに、Enumerableオブジェクトは対象のオブジェクトを数えたり列挙したりできる。
ネットワーク機能も豊富だ。インターネットのクライアント側にはTCPSocketクラスが、サーバ側にはTCPServerクラスが、UDPデータグラムにはUDPSocketクラスが提供される。ソケットライブラリは、http, smtp, pop, imapといったプロトコルに対応している。Kernel.openは、File.openと同じような動作をするが、URLをファイルのように扱える柔軟性がある。仕事でWebアプリを作ることはないが、これを機会にRailsで遊んでみるのもいいかもしれない。
マルチスレッドも書きやすそうだ。ただ、プラットフォームに依存するのは仕方が無いか。スレッドの優先順位はOSによってまちまちである。だが、Linux上のRuby1.9はネイティブスレッドを実装していて、スレッドの優先順位の設定もRuby側で設定できるという。スレッドが一定の条件で自動で切り替わるのは多くの場合でありがたい。スレッドはキューで管理できる。

コンピュータ構造が、人間の思考方法や社会構造からヒントを得ることが往々にある。オブジェクトは、プラトンのイデア論に通ずるものを感じる。クラスという雛形からインスタンスを生成するあたりは、いわば実存認識といったところだろうか。そして、スーパークラスという基底なるものが理想イデアであって、それを継承しながら様々なクラスがイデアとして現れる。継承が複雑化して手に負えなくなると、遺伝子コピーの不完全性も現れる。ところで、オブジェクト指向という言葉が流行ったのは20年ぐらい前であろうか。Smalltalkのセミナーにも参加した記憶が蘇る。当時マイコン開発をしていた。いわゆる組込み系のプログラム設計である。そして、データ隠蔽の思想を好み、ローカルルールで実践していた。システムの規模は小さく、CPUで言うと8bitが主流で、まだ4bitも多く、稀に16bitを使うといった具合である。プログラムサイズで言うと、16KBから32KB程度でリアルタイムモニタといったところだろうか。今でこそリアルタイムOSが盛んであるが、当時は高価で手が出せかった。小規模なシステムでは助長したプログラムは実装できないので、OSもどきのカスタムプログラムを作る必要があった。使用する言語はCライクのものも登場していたが、コンパイラの性能から依然アセンブラが勢力を保っていた。小規模なシステムでは、あまり高級言語の恩恵が受けられないので、独自ルールで工夫することになる。アセンブラ言語のデータ構造はほとんど制約がないので、あらゆるアクセスを想定しなければならない。そこで、グローバルデータを思想から排除し、すべてメソッド経由でしかアクセスを認めないなどの規定をマクロ機能を駆使しながら実装する。データアクセスで必要なメソッドは、基本的にset/get系のみで集約できるはず。当時は、カプセル化の概念といった学術的な意義を知らなかったが、自然と実践していたような気がする。また、組込み系システムでは、コンピュータ上で動作する一般のアプリケーションと比べてソフトウェアの構成がハードウェアと対応付けしやすいというメリットがある。これは、ソフトウェア仕様を製品の取扱説明書と結び付けやすく、ソフトウェア部品であるオブジェクトは製品の部品のようなイメージで捉えられ、分かりやすいプログラム構造を実現できる。ちなみに、おいらはソフト屋ではない。どちらかといえばハード屋か?はたしてその実体は...雑用係なのだ。したがって、アル中ハイマーは、ソフトなピロートークを武器にハードボイルドに生きるのであった。

1. オブジェクト
Rubyの値は全てオブジェクトで、他の言語のような原始型なるものがないという。単純な数値やリテラルも普通にオブジェクトであり、それぞれのメソッドが実行できる。ちなみに、true, false, nilもオブジェクトで、Booleanクラスなるものがない。
Rubyは不要になったオブジェクトをガベージコレクションで自動的に解放するので、明示的な解放を必要とする言語に比べて、メモリリークを起こしにくいという。だからといって、メモリリークが絶対に起こらないというわけでもないだろう。やたらと寿命の長い参照を作るコードが危険であるのは同じである。
Rubyは、オブジェクトに対するテストや調査する機能が豊富である。インスタンスがどのクラスに属するかを問い合わせる機能や、クラスの親子関係を調査するのに比較演算子や等値演算子がオブジェクト間でも使える。オブジェクトの初期化ではコンストラクタを使うのがお馴染みであるが、Rubyではinitializeメソッドを使う。クローンやコピーを作らせないために、Singletonを定義することができる。ちなみに、シングルトンとは、インスタンスを一つしかもたないクラス。

2. メソッド
Rubyの構文の基本は式であり、制御文も式として評価できる。これがコンパクトに書ける理由でもある。演算子の多くはメソッドとして実装されており、クラスはメソッドを自由に定義できる。コアライブラリであってもメソッドを追加できる。ちなみに、どのクラスでもオブジェクトを文字列で表現するto_sインスタンスメソッドを定義しておいた方がよいという。デバッグ時に役立つからである。set/getメソッドを実装するのに、attr, attr_accessor, attr_reader, attr_writer(あまり使われん)によって抽象化できるのは便利である。C++のようにpublic, protected, privateを定義できるが、Rubyでの対象はメソッドのみとなる。インスタンス変数やクラス変数は、カプセル化されるからである。initializeメソッドは暗黙でprivateであるが、その他は明示しない限りpublicである。ただし、メタプログラミング機能を使えば、protected, privateメソッドも起動できるようだ。ここが、オープンな言語仕様ということなのだろう。一見矛盾した思想にも思えるが、デバッグ機能として活用できそうだ。

3. リフレクションとメタプログラミング
Rubyは、リフレクションのためのAPIを豊富に揃えている。リフレクションとは、プログラムが自分の状態や構造を解析することである。そして、その状態や構造を書き換えることさえできるという。こうした動的な性質が柔軟性をもたらし、メタプログラミングを可能にする。リフレクションAPIには、オブジェクトの型を判定するメソッドがある。文字列やブロックの評価、変数の取得、設定、テストが容易にできる。また、メソッドのリストアップと有無テストや、言語仕様の中でトレース機能を持つ。

4. セキュリティ
Webアプリでは、SQLインジェクション攻撃などのセキュリティ問題が発生するが、Rubyはこうしたリスクを追跡する手段を提供している。また、信頼されないデータやコードを区別するためのメカニズムが提供され、オブジェクトをフリーズさせたり、オブジェクトの汚染状態を明示することができる。

5. ファイバ
Fiberオブジェクトは、他の環境では一種の軽量スレッドを表すために使われるらしいが、Rubyではコルーチンと呼んだ方がいいという。これは、数値演算で数列のジェネレータなどに使えそうだ。わざわざ裏処理させる必要もないかもしれないが。ファイバは、少々分かりにくい制御構造である。スレッドのように即実行するものではなく、resumeメソッドを呼び出すことによって実行開始する。Fiber.yieldメソッドで呼び出し元へ戻したりと、スレッドを裏で実行させたい時だけ実行させるといったことができる。

6. Ruby1.8とRuby1.9の違い
細かく挙げると切りが無いので、気になったところだけを列挙しよう。
(1) スーパークラスは、1.8ではObject、1.9ではBasciObject。
(2) 1.9からパッケージ管理システムのRubyGemsが標準ライブラリ。
(3) procは、1.8ではlambdaと同じ意味であるが、1.9ではProc.newと同義語だという。1.8では曖昧さがあるのでprocを使うべきではないという。
(4) 1.9ではマルチバイト文字がシームレスに扱える。例えば、文字配列のポインタがバイト単位ではなく文字単位となる。このマルチバイト文字への対応がRuby1,8とRuby1.9の大きな違いのようだ。おいらは、jcodeライブラリあたりを意識するのが嫌いなので、もともとマルチバイトを避ける習慣がある。とはいっても、書籍購入予定リストなど日本語テキストをフィルタリングすると、マルチバイトを避けるわけにはいかない。したがって、エンコーディングクラスが提供されるのはありがたい。
そういえば、6月頃だろうか、Ruby1.8系の1.8.6-p368以前と、1.8.7-p160以前のバージョンで、DoS攻撃を受ける脆弱性があると発表された。BigDecimalオブジェクトからfloatへの変換の時、巨大な数値を扱うと、segmentation faultsを引き起こされる可能性があるといった話である。尚、1.9系は問題はないらしい。

7. 対話的Ruby
irb(Interactive Ruby)は、Rubyのシェル。
$ irb --simple-prompt # Rubyプロンプトを起動する
$ ri "keyword" # ドキュメント表示

2009-10-04

"アナログCMOS集積回路の設計" Behzad Razavi 著

ほど酔い気分で本棚を眺めていると、なにやら懐かしい香りがする。おいらがエンジニアになった頃、アナログ技術が盛んであった。20年以上前かぁ。新人研修では、テレビ受信回路や映像制御回路などが題材とされ、まともなコンピュータ研修の無かった時代である。おいらは、アナログ技術が全く理解できず、トランジスタの等価回路なんて物理的にイメージできないでいた。アナログ技術は物理数学の世界で、デジタル技術は論理学の世界である。言い換えれば、前者は職人の世界で、後者は屁理屈の世界とも言えよう。アナログ技術は、技術習得に時間がかかり、おいらのような飽きっぽい人間には難しい。とっくに数学で挫折していたので、ラプラス変換と聞いただけで蕁麻疹が出たものだ。ちょうどその頃、ワンチップマイコンやプログラマブルデバイスが登場して、デジタル技術が流行り始めた。おいらは時代に救われた。だからといって、デジタル技術が簡単なわけではない。高集積化が進めば複雑なアルゴリズムが要求され、数学からは逃れられない。結局、落ちこぼれる運命は変えられない。当時、アナログ回路は無くなるといった意見も多かった。アナログ設計者は、デジタル設計者へ転職を考えるといった社会現象もあったぐらいだ。ところが、近年システムLSIの登場により、アナログ技術者は引く手あまたである。高速化や高密度化が進むと、すべてをデジタル化することは難しい。高速化の要求はアナログ乗算器を登場させる。そして、省電力化が進み、やっかいなデジタル信号の高周波ノイズでEMC問題の対策も盛んになる。高速な半導体メモリやプロセッサは、高速デジタル設計であっても、ほとんどアナログ設計と言われる。こうした時代の流れで、アナログ技術のセミナーは大盛況で、5年ほど前にいくつか受講した。本書はその頃、再勉強しようとして購入したものである。ちなみに、アナログ回路は、おいらにとってデジタルシステムを検証するための補助的な位置付けにしかない。実験室でちょっいと試すぐらいなもの。それでも、安価な安定化電源や確実に動作するリセット回路ぐらいは必要である。最近はソフトウェア的な仕事しかしないので、実験室とは10年以上ご無沙汰している。

最近、新人君と付き合う機会が多い。教育係を依頼されるからである。ちなみに、人に教えることほど嫌いなものはない。教えるものなんて何もないから、自分の馬鹿さ加減を暴露するようなものである。なるほど、暗に引退せよ!と仄めかされているのかぁ。こんなフレッシュな酔っ払いを年寄り扱いするとは。世の中が不景気だと、若い連中を遊ばせるわけにもいかず、教育が盛んになる傾向がある。そこで、本書を読み返す羽目になる。そもそも、技術教育なんて必要なのかも疑問である。技術は盗み取るものであり、学問は知識を得るまでの過程にこそ価値がある。
ところで、新人君たちは想像もつかない勘違いをする。だが、アル中ハイマーの武勇伝には敵わないだろう。ということで、新人時代の失敗を暴露するとしよう。もはや精神の泥酔者には羞恥心の欠片もない。なにしろ、電解コンデンサにプラスとマイナスがあることも知らずに使っていたのだ。では、スモーキーなモルトに誘われて、焦げ臭いところを紹介しよう。あるシステムでアナログ部とデジタル部の電源を分離させて、双方のGNDを解放して独立に制御していた。しばらくは正常っぽく動作していたが、ある日突然高価なチップが燃えだした。いや!溶け出した。先輩から「実験室が焦げ臭いぞ!」と指摘されて「ハッ!」となる。ラッチアップを起こしたのだ。他にも、部分的なモジュールではそれらしい動作をするのに、全体を組み上げると燃えたことがある。問題は、半導体の仕組みを物理的に理解していないことだ。トランジスタとは奇妙なもので、抵抗などの素子が無いにもかかわらず、それだけで等価回路が実現できる。ということは、半導体素子を多段につなぐと、回路全体で想像もつかない機能を持つ可能性がある。一つの素子に想定外の信号が入力されると、周りの電子部品と干渉してとんでもない動作をするわけだ。アナログ回路は、物性物理学を体で覚える世界だといことを実感したものだ。
また、CMOSデバイスで回路を組んでいると、繋がなくても微妙に動作することには驚いた。バイポーラと違って、CMOSデバイスは接続されていなくてもオンすることがある。TTLが常に電流が流れるのに対して、CMOSはスイッチングの瞬間にしか電力を消費しない。言い換えれば、バタバタする信号は瞬間ノイズでうるさいわけだ。信号線にプローブをあてると完全に眠るのだが、放すと微妙に動作する。ノイズが原因だと思ったが、実は配線されていなかったというオチだ。それを解明するだけで一日無駄にするという馬鹿さ加減!導通テストは馬鹿にはできないことを実感したものだ。ちなみに、テスターで導通を確かめるのに「ピッ!」と鳴る機能は怪しい。微小抵抗でも反応するからである。もともとCMOSは遅いという弱点を持っていたが、当時は速度の問題も解消されつつあり、ほとんどCMOSを使っていたような気がする。
それにしても、半導体とは奇妙な物質である。半分だけ導体とは、これいかに?
「導体のようで導体でない、でんでん!絶縁体のようで絶縁体でない、でんでん!」
外部から熱や光あるいは磁場や電圧といった刺激を与えることによって、電気特性が得られる物質である。バンドギャップが狭いからキャリア効果も現れる。P型とN型を接合することによってその効果も上がる。電源など駆動するための仕掛けが必要であるにせよ、増幅効果があるのは電子の流れを活発にするからである。バンドギャップ内はフェルミ準位近辺になり、電子が移動できるかどうかも確率論に持ち込まれる。こうした物理現象を眺めるだけでも、LSIの歩留まりが不安定なことは容易に想像できる。
つまり、半導体とは、泥酔状態が不安定で、酔ってんだか、酔ってないんだか、自覚できない物質というわけだ。いずにせよ共通した性質は、夜の社交場でホットな女性からちょいと視線ビームを浴びせられると、電流が走って痺れる。そして、精神のエネルギー順位が高まると「君に酔ってんだよ!」と囁きはじめ、その醜態はどんどん増幅される。ただし、女性の愛情障壁は固く、強力な電子ビームをもってしても簡単には突き抜けられないので、逆電流は流れにくい。一旦、逆電流が流れはじめると、一気に燃え上がるわけだ。

本書は、基本編と応用編の二冊に分かれるが、区別することもないだろう。むしろ上下巻とした方が適切だ。本書の目的は、最終的にデバイス動作を定式化して回路モデルを作るための知識を学ぶことである。そして、MOSFETの物理から始まってプロセス技術まで網羅される。MOSFETをスイッチとして使うならば、ゲートをオンするとソースとドレインが導通するという単純な構造である。しかし、ゲート電圧は?ソースとドレイン間の抵抗は?その抵抗は線形なのか?と悩み出すと頭が痛い。回路特性が線形性を保つならば、なにも悩まないだろう。おまけに、素子間のミスマッチが製造技術とレイアウトを悩ませる。高密度化が進めば、素子そのものの遅延よりも配線遅延の方が厄介になり、クロストークといった問題も発生する。
本書は、実験室で重宝した概念をいくつか紹介してくれる。高速性や微小信号を扱う場合、差動などの対称性を利用した概念がしばしば登場する。差動回路は、耐ノイズ性に優れているのはなんとなく感覚で分かるだろう。双方でスイングすれば、微小信号でも伝送系で効果がありそうに感じる。その重要な特性は外因に対する同相の除去効果である。
また、重要な概念にフィードバックがある。負帰還では高精度の信号処理ができたり、正帰還では発振器を作ることができる。信号の平均化という意味ではフィルタ効果もある。本書では、フィードバック回路の特性で、利得の鈍感化、端子インピーダンスの変更、帯域幅の拡大、非線形性の低減といった例が考察される。ただ、回路にループがあれば予期せぬ発振はつきもの。ループゲインが大きければ発振する可能性も高い。
更に、線形帰還システムの安定性と周波数補償を議論している。これはオペアンプの応用である。オペアンプはもともと差動増幅なので、そのままでも使えるし、その名称からアナログ演算にも使える。昔は、コンパレータやマルチバイブレータといったものに利用したのを覚えている。飽和領域で動作するMOSトランジスタは電流源としても使える。ゲートとソース間の電圧が定められても、ドレイン電流が定められなければ、電流源をバイアスする方法も必要となろう。そこで、電流源は既に定まっているものと仮定して、カレントミラーによって電流をコピーするといったことを考えたりする。デジタルシステムが専門とはいえ、振幅や周波数やデューティ比を自在に制御できる発振回路や、モノマルチといった簡単な信号発生器があると、実験に重宝したものだ。こういう状況を思い出していると、現在ではFPGAやCPUが搭載されたキッドが売られているから便利である。しかも、雑誌にも付属される。これは恵まれた環境とも言えようが、回路を燃やすような体験は難しいだろう。昔は、火を入れる瞬間もドキドキした。まさしく勉強に燃えていたのだ!

1. 雑音
アナログ技術者は絶えず雑音と葛藤している。アナログ回路設計とは、自ら創出する雑音と、周りから影響を受ける雑音の双方との戦いである。ちなみに、デジタル回路は雑音を発する側なので気軽だと思っていたが、雑音の悪魔と呼ばれ、いつも謝っていたような気がする。だから、酔うと謝り上戸になるのかもしれない。
雑音は、消費電力、動作速度、線形性とトレードオフの関係にあり、その特徴はランダム性にある。したがって、長期間の観察から統計論的モデルとして扱うことになる。雑音スペクトラムとして捉えれば、フィルタによって除去できるというわけだ。雑音には、熱雑音、ショット雑音など、その要因を上げれば切りが無い。本書は、MOSFETのゲート酸化膜とシリコン基板の界面で生じるフリッカ雑音を考察している。

2. 発振器
電子制御で発振器は不可欠である。それはプロセッサのクロックから携帯電話のキャリアにまで及ぶ。本書は、VCO(電圧制御発振器)の数学的モデルを検討し、周波数変調器として動作する様子を考察している。簡単なものではLC発振器が思いつくが、分かりやすいリング発振器にも触れている。昔は、インバータの多段によって、実験用に簡単な発振器を組んだものだ。そして、同期させるためにPLL(位相同期ループ)を使った。

3. デバイスモデル
デバイスのモデリングは困難で、シミュレーション値と測定値が違うことは珍しくない。本書は、ショートチャネル効果を理解するために、SPICEモデルを考察している。そして、MOSの理想的なスケーリング則とは何か?といった問題を扱う。半導体デバイスでCMOSが主流となる理由は、静的な消費電流がゼロであることと、MOSFETのスケーリングが容易であることであろう。スケーリングされたチャンネル容量が容易に見積もれなければ、製造工程に影響を与える。チャネル内で電圧低下といった現象があると安定した動作が望めない。熱雑音による電圧電流特性において、ダイナミックレンジが一定でないのは厄介である。また、しきい値電圧は、チャネル長によって変動する。よって、製造プロセスにおいてチャネル長の正確な制御が必要となる。ゲート電圧が上昇すると、ソース側のポテンシャルを上昇させたり、ドレイン電圧も表面ポテンシャルを上昇させる要因となる。これが、電荷の流れに障害を与えて、しきい値電圧を低下させ、ドレインとソース間の電圧による出力インピーダンスが低下する。縦方向の電界による移動度の劣化や、横方向の電界による原子運動によるホットキャリア効果の影響といった物理物性の世界は、最も苦手とするところだ。こんなものが理解できるレイアウト屋さんは尊敬してしまう。

4. プロセス
本書は、概念的な製造工程を想像させてくれる。基礎となるp型基板ウェーハの上に、nウェル、ソース - ドレイン領域、ゲート絶縁膜、ポリシリコン、nウェルと基板の電極、メタル配線が形成される。その工程はだいたい以下の手順となろう。
(1) ウェーハプロセス
(2) フォトリソグラフィ(回路のレイアウト情報をウェーハに転写する最初の段階)
(3) 酸化
(4) イオン注入
(5) 成膜とエッチング
(6) デバイスの製造(能動素子、受動素子など)
エッチング中、メタル領域では、イオンを収集し電位を上昇させるアンテナ効果が現れるという。そのため、製造工程中に、MOSデバイスのゲート電圧はゲート酸化膜を回復できないまでにブレークダウンする可能性があるわけだ。ゲート酸化膜にダメージが起こる可能性を最小限にするために、総面積を制限するのが一般的だという。大面積が避けられない場合は、エッチング中に大面積が直接ゲートにつながらないように切れ目を入れたりするわけだ。