2014年7月27日日曜日

小林秀雄の『徒然草』にある謎掛けについて

どうしてもこの人には及ばないな、思う人が居て、私は小林秀雄という人がその人に当たる。

日本文学が濃厚たる禅の思想に基づいており、かつその思想自体の存在すら消そうとしてきたことはすでに周知だと思うのだが、私はこの時代においてあえて、その痕跡を白日の下にさらすことを敢えてやってきた。

因みに小林さんのお墓は、北鎌倉の東慶寺にある。東慶寺は元々は格式の高い縁切寺としても有名なところであったが、明治期の混乱で臨済宗円覚寺の末寺となった。大変良い場所らしく、鈴木大拙をはじめ有名人のお墓も多いようだ。だから、お墓の場所と禅宗との関連は良くは分からない。関連がないと言えないという程度なのかもしれない。

死ぬまでにお墓参りを済ませたいと思っている。だいたいが油断したために、スッカラカンになりこの有様であるから、情けない限りだ。先ずは、小林さんのお墓参りを済ませておくべきだった。療養を優先したことが間違いだった、というのが、ここ数年来の苦い後悔である。ベルクソンさんのお墓は遠すぎて一生行けないだろうから、せめて、今年は無理でも来年、仕事の閑散期には行けるようにしないといけないと思っている。

どうでも良い話しばかりしてしまったが、小林さんには、禅の公案のような問いかけがいくつかある。たとえば、ソクラテスのデモンは、どうしてソクラテスの行動に禁止しか指示しなかったのか、という指摘などである。

もう一つ有名なものが、その評論「徒然草」にある。兼好法師の筆法をモンティニュになぞらえ、また、

『 あの正確な鋭利な文体は稀有のものだ。一見そうは見えないのは、彼が名工だからである。「よき細工は、少し鈍き刀を使ふ、といふ。妙観が刀は、いたく立たず」、彼は利き過ぎる腕と鈍い刀の必要とを痛感している自分の事を言っているのである。物が見え過ぎる眼を如何に御したらいいか、これが「徒然草」の文体の精髄である。』

(※ 引用文中の「」と区別が付きやすいように引用文には『』を用いている。以下同様)

と評価する。そして、最後にこのように終わる。

『鈍刀を使って彫られた名作のほんの一例を引いて置こう。これは全文である。「因幡の国に、何の入道とかやいふ者の娘容美しと聞きて、人数多言ひわたりけれども、この娘、唯栗をのみ食ひて、更に米の類を食はざりければ、斯る異様の者、人に見ゆべきにあらずとて、親、許さざりけり」(第四十段) これは珍談ではない。徒然なる心がどんなに沢山な事を感じ、どんなに沢山な事を言わずに我慢したか。』

上記の引用文中にある、兼好法師の徒然草本文(第四十段)の意味は、

「因幡の国(現在の鳥取県に含まれる)に、何とかの入道という人の娘が大変美しいということを聞いて、求婚者が数多やってきたけれども、この娘、栗だけを食べて、米の類を食べない。このような異様な人間は、他人様に嫁がせるわけには行かないと言って、親は結婚を許さなかった」

と言うことになるだろう。

因みに、徒然草には、このような少し不思議なお話が他にもあって、たとえば、大根を万病の薬であると信じて毎朝二本焼いて食べていた人の家が警備の者の留守に敵に襲われたときに、屋敷のなから見知らぬ兵士が二人出てきて家の危機を救った。礼を言ってどなたか訪ねたら、日頃あなたが信じて食べている大根ですとだけ答えて去った、というお話(第六十八段)も載っている。

さて、栗娘の話に戻るが、これは一つの禅で言う公案であろうと思ったとき、それぞれに解き方が出てくるだろう。兼好法師も小林秀雄さんも黙って死んだのだから、黙って死ぬべきか。

そうも思ったが、凡愚きわまりない私が多少のことをしゃべったところで、中るとも限らず、中っていれば、後世多少の名誉でも残るかという欲もあって、くだらないおしゃべりをしてみようと思う。

小林さんは、この分が鈍刀を持って彫られたと言っている。と言うことは、我々がまず目が引かれる、娘が栗しか食べなかった、というところは、レトリックの部分であり、主要でないとみる。大事なのは、そのあとで、「斯る異様の者、人に見ゆべきにあらずとて、親、許さざりけり」というところであろう。こんな異様の者が結婚して幸せになれるわけがない、という親心が大事だと言っているのだろう、ということが分からなくてはならないと小林さんは言っているのだ、と私は考える。そうするとこの小林秀雄さんの評論「徒然草」の内容は一続きに通じる。私はそう思うのである。








2014年7月14日月曜日

ノーム・チョムスキー「複雑化する世界、単純化する欲望」を読んで

チョムスキー()は高名な言語学者であり、また、近年はその世界的なリベラル知識人としての名声もようやく日本でも知られるようになってきた。

私も今回初めて、言語学関係でないチョムスキーの本を読んだのであるが、インタビュー形式であるということ、豊富な注釈とによって、多岐にわたる複雑な社会問題において論じたものとしては、かなり読みやすいものであった。地球環境と経済的活動が相反することやアメリカ政府の支出が経済活動に大きな役割を果たしているという点、すなわち、経済的な欲望がもたらす側面とそれに対する合衆国政府の影響力の大きさを指摘し、第二次世界大戦以降、長らく国際的に支配的な地位を占めてきたアメリカの行動、たとえば、環境問題ほか、国際情勢、特にイラン核燃料問題とアメリカの大学の果たした役割や戦争、核の脅威、宗教問題、中国の台頭に対する軍事的措置などの様々な社会問題に、長く勤めるMIT教授としての大学人としての視点から、アメリカ社会の抱える矛盾を示しながら鋭く切り込んでいく。

過去、日本でスキャンダラスなほど過激に伝えられたリベラルとしての主張の印象は、その主張がすでに消化されたものであるからか、さほど強い印象はもたらさず、この本のもう一つの特徴である、後半ほとんど占める補遺による資料提供は、その内容をより正確に伝えようとしており、そこにも強い印象を持った。

(※ のリンク先はWikipedia、「ノーム・チョムスキー」の項を参照しています)

2014年5月25日日曜日

これに時間があるときに書き足したり、推敲したりする実験

世間は相変わらずの身勝手ぶりで 正義の味方のそぶり

テレビはデジタル化され つまりは 劣化しない画像と映像 しかも 中味も変わらず ただチャンネルの番号までも 東京と同じになった 欠番を残しながら

パネルの映すきらびやかさと対照的な生活 マンガ アニメ ヒーロー番組 映画やドラマ その他の主人公たちと同化するかの如く ツライゲンジツから目をそらせるための果てしないいじめ 動物のマウンティング いじめのための口実を提供し続る惨めさ

衆愚社会と大衆民主主義 どこの国でもナショナリズム

EUは人権条項を日本とのEPAの条件とした しょせん日本などということだ 人権において遅れた国 女たちは圧力をかけてくるが しょせんそれは何かの裏返しにすぎない そして男たちも そろって 未だに士族だとかなんだとか どこかの国が戦勝国がどうの言うような 同じようなことばかり言って 戦争に負けたことも知らんぷりにして

結局まだ容疑者だろう 有罪じゃないんだろう いくら有罪率が高くったって100%じゃないんだろう 誤認逮捕で人生狂った人間いっぱいいるんだろう でもほとんどの人にはそんなことはどうでもいいんだろう マスコミも商売さえできればいいんだろう 日本はやっぱり人権で遅れた国だろう いじめでお金儲けて国からも表彰されておけばいいんだろう

世間と世界はそんなもの

ご飯のマナーは気にするが どれだけ危険でも自動車の運転のマナーなどどうでも良い 要するに自分さえよければ 自分の気にいるかいらないかだけの問題だけで 自分だけがかわいい

可愛いは正義 ふふ 言葉とはおかしなものだ  正義とは何だ そういう問いかけはどこかに行き 可愛いにおいてすべては正当化されるという事物の断定に快感を覚える

抑圧されたかわいい 自分がかわいい 幼稚な若い女性の見かけによる差別化をはかる一種遅れた価値観

しかし 一方でかわいいは正義という断定のおもしろさには逆らえない なぜか を問いかけることはせず ある価値観で断罪することは正義か

子猫はカワイイ カワイイは正義 何でも許される でも 人間は ネコじゃない

誰かのためらいを後押しする カワイイは正義 それは優秀な宣伝文句

しょせん観念というものにおいて 我々の躍動する言葉の瞬間は固定できない そう擁護することは可能 いや 遅れた世界においてそれはたんに幼稚語のカワイイに過ぎず 遅れた我々は幼児のように面白がっているのだ という断罪がやはり正義か

正義とは平等の別名という 「目には眼を歯には歯を」命には命を 死刑は復讐であるかないか 国家が命を取ることは是か非か しかし 不条理にも奪われた命は奪った人間のそれより軽いのか なぜ被害者は加害者より常に我慢をしいられなければならないのか その疑問は野蛮だと言われるだろう 近代国家とはやりきれないものだ






2014年4月6日日曜日

人で無しのための計算機理論入門 その10 プログラムの基礎 その4 地味だけ ど大事な論理式


さて、とうとう10回目になったこの「 人で無しのための計算機理論入門」。一応、情報機器を使用したり、それ以上にプログラムさえ書いたりして使いこなしたりする上で、基本的な事項をきちんと押さえておくことがいかに大事かということをお伝えできたと思います。ほら、基本理論て意外に大切でしょう?ということです。
 
これ以上のことを説明し出すと、非常に専門的になりすぎて、普通の人が知っておけば便利だな、という内容から少し遠ざかってしまうことになりそうですので、一旦ここで、この「計算機理論入門」は区切りをつけさせていただきたいと思います。これまで読んでいただき本当にありがとうございました。
 
さて、その記念すべき最終回は、やはり地味に基本を押さえていきたいと思います。
 
以前、二進数とブール代数(論理式)について、「P=NP?問題の覚え書き」というブログの「 充足問題について その前に」という記事で、割合詳しく述べさせていただきました。
 
ここでは、分岐に欠かせない、論理式について、もう一度復習をしておきたいと思います。
 
ところで、「その7」でCPUは、

 0(ゼロ)フラグ:計算の結果が0の時に1、そうでないときは0
 マイナスフラグ: 計算の結果が負の時に1、そうでないときは0
 
というフラグを立てる、というお話をしました。
 
こういう風にフラグというもので計算結果を出したあと分岐をするということは何となくおわかりでしょうが、複数の条件が重なった場合の分岐はどうするか、ここで、論理式というものが必要になります。
 
たとえば、「もし、毎年4月はじめの日曜日 晴れだったら花見実行のメールをメンバーに出す だけど 雨が降ったら中止」というプログラムを書きたいとします。
 
いくつかの表し方があるとは思いますが、たとえば、
 
 ・Dを日付型の変数と定義
 ・Dに今日の日付を記憶
 ・Dが
   4月であるか?
    かつ
   最初の日曜であるか?
  をそれぞれ調べるサブルーチンを呼び出し、
  条件を満たせば、次へ進む。
  そうでなければ終了
 ・天気は晴れ? =>花見メール
  天気は雨?  =>中止メール
 
というように要素を分解して表せば計算機のプログラム的になるのは分かりますよね。(その他の天候の時は空気を読めということです。空気読むのは日本人として大事ですよ、ほんとうに。それができないから(ry)
 
ところで、上の例で条件による分岐のところで”かつ”という言葉が出てきました。少し抽象して
 
 条件Aを満たす
 かつ  
 条件Bを満たす
 
というのは条件Aと条件Bが両方満たされて初めて次に進めるわけですから、ある条件を満たしたとき立つフラグを1それ以外を0とすれば、
 
 条件Aのフラグ     0  1  0  1
 条件Bのフラグ     0  0  1  1
 AかつBをみたす?   0  0  0  1 
 
となり、かけ算したときの計算の結果と同じです。これを論理積と言い、その筋の学問の記号では∧と表します(集合の積集合の記号∩に似ていますが、0か1の2値しかないので、どちらかに決まるということで尖っていると思ってください)。
 
また、同様に「または」、というのもありますが、表にすると
 
 条件Aのフラグ     0  1  0  1
 条件Bのフラグ     0  0  1  1
 AまたはBをみたす?  0  1  1  1
 
となり、かけ算したとき計算の結果と同じです。これを論理積と言い、その筋の学問の記号では∨と表します(∧と同様に集合の和集合の記号∪に似ていますが、はやり、論理式では0か1の2値しかないので、どちらかに決まるということで尖っているわけです)。
 
他に、もちろん、否定(記号:¬)と言うものもありますが、これは
 
 条件Aのフラグ     0  1
 条件Aの否定      1  0
 
と、わかりやすいです。
 
こういう数式を扱う学問にブール代数というのがあるのですが、言語の中には0をFalse、1をTureと表現する、ブーリアン型というのがあります。これはブール代数からきているわけですね。
 
だから、プログラム言語によっては、分岐の条件の部分で0以外の値にすればとすれば常に真と判断するという言語もありまして、慣れないととわかりにくいバグになりますから、気をつけてくださいね。
 
以上です。
 
最後まで地味なこの講座にお付き合いいただきまして本当にありがとうございました。まだ、葉桜の咲くこの時期にこうして一つ書き物を終了させることができたことを本当にうれしく存じます。
 
つたない講座でしたが、何とか終わらせることができましたのはみなさまのご声援と叱咤激励の賜であり、繰り返しになりますが、心より感謝の意を表させて頂きます。
 
                             平成26年4月吉日

2014年4月5日土曜日

人で無しのための計算機理論入門 その9 プログラムの基礎 その3 使い回して効率を上げよう

がんばるためにがんばる、そんな訳の分からない状況で、貧乏なのに国のためにボランティアをやっている、なんだか訳の分からない私。しかし、「世界市民のみなさん。アメリカがあなたのためになにをしてくれるかではなく、人類の自由のために共になにができるかを考えようではありませんか」とは故ケネディ大統領の有名な演説にもある通り。少なくても今までこの国でも人権さえも無視されてきても、ホモサピエンスには違いありませんので、気持ちだけでも人類の自由のために微力を尽くそうという次第。
 
※ ところで、一つ訂正があります。「その3」にて、C/C++、Javaなどの高級言語のことを関数型と申し上げていましたが、オブジェクト指向型と申し上げるべきでした。お詫びして訂正いたします。ブログの方の記事においては訂正済みです。
 
さて、今回はサブルーチンについてお話しします。
ある程度プログラムが書けるようになって、いろいろなプログラムを書いているうちに、あれ、これってどこかで同じプログラムを書いたな、とか、この部分は他でも何回も使うんだけど、いちいち同じことを書いたりするの面倒だな、という気になってきますよね。
そういうときに、その部分だけを独立させて使い回すことをサブルーチン化すると言います。考え方としては、木の幹、いわば幹線的な処理を行う部分をメインルーチン、そこから呼び出されて様々な専門的に特化した仕事を繰り返し行うところをサブルーチンといいます。

以前、「その7」で説明した、フローチャートの記号は以下のようになります。


現在主流のオブジェクト指向型言語では、サブルーチンの処理をクラス(class)として、独立させることが主流です。
 
どのように独立させるかというと、
 
 1.サブルーチンの中で使用する変数とその中で行う処理を
   他から影響されない一つの独立した組にする。
  (カプセル化)
 2.似たようなサブルーチンは、同じクラスの中で、
   異なるメソッド(method)と記述し、呼び出すときは、
   [クラス名].[メソッド名]のようにして呼び出す
 
といった感じでしょうか。ちなみに、クラスの中の変数にも、
 
   [クラス名].[変数名]
 
という感じで呼び出せるものもあります。(呼び出せないものもあります。これについては後述します)
 
このような、
 
 [クラス名].[メソッド名]や、
 [クラス名].[変数名]
 
で呼び出せるものを、メンバ(member)と呼びます。3年B組の誰々さんを呼び出すのとちょっと似ていますよね。
 
一般にクラスの中だけで使う変数や、サブルーチンなどは、プライベート(private)と分類され、クラス外側から見えないようにします。クラスの外側から見えてもいいものをパブリック(public)に分類します。
 
このあたりのことは、言語の仕様にも依る部分があるので、詳しくはその言語の使用をよくご確認下さい。
ただ、プロセスが分かっていると、クラスに関しても何となくよく分かりますよね。
 
さて、このように、誰にだって、(コンピュータのプログラムにだって!)プライベートはあるんです。私にはありませんけど……。

2014年4月3日木曜日

人で無しのための計算機理論入門 その8 プログラムの基礎 その2 変数とメモリの関係

もう書かなくて良いのかと思っていたら、なんだか書かないといけないような雰囲気。四月バカであるように祈りたいです(この部分は4月1日に書いています)。しかし体調はいまいちなんだけどねえ。また使いつぶされてる為の陰謀じゃないのか、と半分本気で疑っている現在。みなさまどうお過ごしでしょうか。

(※4月3日注記 などと書いていたら4月2日のニュースで、オバマ大統領の訪日決定しそうだとあり、かなりビクビクているところ。私なりに大急ぎで仕上げたのは言うまでもありません)

さて、分岐ができればループができるということは前回の図でもおわかりいただけるのではないかと思います。

となると、他にいくつかの予備知識が有れば、もう、プログラムも書けるんじゃないかな、と思うでしょう。かけると思うけど、世の中そんなに甘くはないけど、結構甘い。どっちなんだ。

あと二つ、いや、三つかな、お話しすれば、関数型と言われる言語であれば、そこそこなプログラムは書けるになると思います。多少、経験は必要でしょうが。

まず、前回のフローチャートで、変数を使っていますが、意味的にはおわかりいただけたでしょうか。
 
たとえば、

  i=i+1

などというのは、計算機プログラム上よく出てくる表現ですが、これは、もともと、計算機のメモリのある番地の内容を変数iとして使用しますよ、ということから出てくる、一般的な数学では見かけない表現で、要するに変数iとして割り当てられたメモリの内容を1増やしなさいということを計算機に指示する表現です。

 この命令は、計算機内部では、メモリの内容をCPUのレジスタに読んでそのレジスタの内容を一増やして、もとのメモリの番地に書き込むという作業が行われるわけですが、それ以前の重要な問題がありますよね。

すなわちまず、ある変数をメモリに割り当てる、という命令がたいていのコンピュータ言語では必要となります。(Rubyという言語では勝手にそのあたりの空気を読んでこっそりとやってくれたり、それ以外の言語でも、統合開発環境と呼ばれるプログラム作成用のアプリケーションソフトを使えば、プログラムの作成中に指摘してくれたりもするようですが)たとえば、C/C++と言われる言語であれば、

 int i;

と、変数を宣言します。これは、C/C++言語では「変数iを整数型の変数として宣言します」と言う意味ですが、実際のプログラムの実行上はメモリのある番地に整数の変数iの内容を記憶する領域を確保して下さいね、と言う意味です。(なんだかちょっとプロセスというのが分かってきたでしょう?)

つまり、プロセスというのは、プログラムが実際CPUで実行される形式(これを機械語、あるいはマシン語とも言います)で表現されたプログラムと、このような変数の為のメモリの領域が確保されたものということです。

さて、プロセスが分かっていただいたところで、この節での大きな一つの目的は果たしたわけですが、せっかくだからもう少しプログラムを書く上で重要なことを説明しておきましょう。ここからは少しややこしくなりますので、分からなくてもかまいません。しかし、知っていると、後々プログラムを書く技法上でのいろいろな悩ましいことがらでスマートに解決できる、という点で違ってきますので、一応説明します。

上記の例で、変数iをメモリのある番地の内容とすることにしました。ところで、その変数iの内容がどの番地にあるかということをどこかに記憶しておかなければ、高級言語から機械語に翻訳するときなどで困ります。

C/C++言語などで言われる、いわゆるポインタというものです。

たとえば、変数iの内容を変数jと同じ内容にしますということを行うときに、我々は変数iが変数jと同じになればいいんだから、たとえば、

 i=j

と表現すればそれで良いと考えますが、しかし、よくよく考えるとコンピュータでは、実は基本的には二種類のやり方があって、
 
1.変数iと変数jの内容を記憶するメモリの領域を
  別々に二つ確保して、変数iの内容を変数jと同じにする

2.変数jの内容を記憶するメモリの領域を一つだけ確保し、
  変数iは、変数jの番地と同じ番地を参照するようにする

という、非常に微妙な話があります。

1.を「値渡し」あるいは「内容渡し」、2.を「参照渡し」もしくは「ポインタ渡し」と言います。

一般的なコンピューターの高級言語は、変数と変数において「値渡し」であり、「参照渡し」は特別な指示をしないとできなかったり、そもそもサポートしていなかったりしますが、次回説明する予定のサブルーチンに値を渡すときに、言語によって元々の設定が「値渡し」か「内容渡し」かが異なりますから注意しておかないといけません。

「値渡し」であれば、たとえば、上の例では、
 
 i=j

としたあとは、それぞれ独立した変数になりますが、「参照渡し」であるときには、iの内容だけを変更しようとしてjの内容まで変更する、ということが発生しますからね。

このあたりは本当にややこしくて、注意していないとバグ(コンピュータプログラムが考えているとおりに動かないときのミスをバグが紛れ込んでるという言い方をします)としても発見できにくいバグになりやすいので、「値渡し」か「参照渡し」かは、少しプログラムが書けるようになってきたら、で良いですので、いつも気をつけておいて下さいね
 

2014年3月24日月曜日

人で無しのための計算機理論入門 その7 プログラムの基礎 その1

 勝手ながら、国際情勢に気を使いながらのこの記事の作成ですが、明日から春休みということもあり、にこにこしながら大きな荷物を抱えて戻ってきている子供たちも見るという状況。というわけで、核安全保障サミットもある一方、糊口を凌ぐためのお仕事にも精を出さないといけない状況になっていまして、昨日に続き一本記事を上げたいと思っています。

この記事からしばらくプログラムについての基本的なお話をしたいと思います。例によってハードウエアに一番近い部分から、プロセスという概念がどうして必要になったかというところまでお話ししていく予定です。

まず、プログラムをするのに必要な最小限度の要素を考えてみることにしましょう。

実は処理の流れを図式化したものに、フローチャート(流れ図)と呼ばれるもので、日本工業規格(JIS規格)でもきちんと定義されていたりもします(JISX0121)。これは、たとえば、ISO( 国際標準化機構 )の品質マネージメント規格にISO9000シリーズというのがありますが、そこでそろえる書類の手順書などにも用いられたりして、汎用性が高いので覚えておいても損はないと思います。

ここでは、あまり細かいことまでは言わず、まずはごく基本的な次の5つだけ説明しておきましょう。






以上の五つとなります。これに時には矢印を加えて、処理の流れを表わすのですが、だいたい、上から下へ処理の順序を書いていくのがふつうです。

ここで、「その2」のCPUに必要な機能で説明していなかった分岐というものが出てきました。この部分について説明して、今回の記事は終わりたいと思います。

CPU何らかの計算をすると、計算の結果に応じてフラグというものを立てます。ゲームなんかをやっている人は、あるイベントをクリアするとフラグが立って次のステージに進める、などと使ったりしてませんか。あのフラグと同様です。

ただし、CPUが計算の結果立てるフラグは基本的には次の二通り。

0(ゼロ)フラグ:計算の結果が0の時に1、そうでないときは0
マイナスフラグ: 計算の結果が負の時に1、そうでないときは0

この他に、割り込みの信号が検出されたときに1となる、割り込みフラグというものもあります。

CPUはこのフラグの状態をみて分岐をします。

たとえば、ある二つの変数の内容が等しいかどうかが必要なときは、引き算をしてゼロフラグが0か1かという結果を見て分岐の処理します。

また、同様に大きい、小さいの比較は引き算をした結果、マイナスフラグが立っている(=1)か立っていないか(=0)ということで分岐を判断します。

このように、ごく単純なことに、我々の作業は分解されて計算機では処理されていくことを少しご理解いただいておくと、計算機に対する見方もまた違ったものになるのではないでしょうか。


2014年3月23日日曜日

人で無しのための計算機理論入門 その6 基本ソフトの基本機能(OSのカーネルについて)

まだまだ寒かったり暑かったりですが、本日はよく晴れて春麗ら。連休最終日に好天に恵まれたか人出も多く、宛にしていた図書館の駐車場も満杯といった様子。どうしたものかと途方に暮れて喫茶店に入ったところです。

さて、今日は何をやるかというともちろんピクニックではありません。日本語では基本ソフトともいわれるオペレーションシステム(以下OS)の基本機能について簡単に触れたいと思います。この部分は縁の下の力持ちの部分ですので、あまり普段は意識して使っていないかもしれませんが、理解しておいても損はありません。

まず、OSの大まかな役割としては、前回の仮想メモリのお話でも分かるようにハードウエアの差異を吸収する、言い換えれば、ハードウエアを抽象化するという働きがまずあります。
それは、CPUから見たときのメモリばかりでなく、人間からみた場合もそうでした。細かいハードウエアの差異を吸収し、ほぼ同じような操作性を提供しています。

このほかに、CPUの処理能力やメモリを効率的に利用できるようにする、計算資源(一般にはリソースと呼ばれる場合も多い)の最適化ほか、入出力装置(IO)に関しての管理(パソコンに新しい機器を繋ぐとデバイスドライバをインストールしています、などと表示されますよね)などなど、さまざまな機能を持っています。

世の中に出回っているOSには、たくさんの種類があり色々なやり方で構成されていますが、どのOSにも共通している基本的な機能、言い換えれば、計算機のハードウエアに一番近い処理を管理するをプログラム群のことをカーネル(Kernel)と言い、基本的に次の4つの機能に分けることができます。


1.プロセスの管理
 プロセスというのは、計算機が処理を行う上で基本単位となりうるプログラムとデータのセットだと考えて下さい。

ほかに、計算機の処理における仕事の単位としてタスクというのがありますが、これは、人間からみた場合の計算機にやらせたい仕事の単位です。
以前にも少しお話ししましたが、CPUさんは単純なものすごく細かい処理を、1秒間に10億回といった単位で処理しています。一方、人間の入出力の単位はせいぜいマイクロ秒、ミリ秒単位でしょう。そのため、人間には気づかれないように、自分がやりやすいように処理を分割して、人間からは並列に見えるような程度に処理の時間を区切りつつ多数の処理をちょっとずつ行っていたりします。

したがって、人間が計算機に何かやってとお願いしているときとの仕事の単位と、実際に計算機が処理を行っているときに管理する仕事の単位とは全く別のものになります。
たとえば、スマートフォンのアプリ。これは、人間からみたら、一つのプログラムに見えますよね。でも実際にたくさんの機能があって、それぞれの機能も計算機側からみたらいくつもの種類に分けることが可能です。

このように、スマートフォンのアプリのように人間が計算機にやらせようと考える仕事の単位をタスク、計算機側からみた仕事の単位をプロセスといいます。

このプロセスの管理や、計算機資源の効率的な仕様、並列処理などのお話はまた稿を改めて詳しくお話しするつもりです。


2.メモリ管理
 メモリとCPUは計算機にはなくてはならないもの。このメモリの抽象化については、仮想メモリについて述べましたが、このほかに、メモリを管理する上で、別のプログラムが同じメモリ領域にアクセスしないようにするメモリの保護などというものもあります。


3.デバイス管理
 OSのカーネルはデバイスドライバという形で、計算機の付属する各入出力装置や、外部記憶装置、あるいはネットワーク機器など一般にデバイス(IT業界におけるデバイスの意味は広いので使い方が難しいですが、OSのカーネルについて触れる時は、CPUとメモリ以外の様々なIO装置群)を
動かすプログラムを保持、その動作を管理しています。

たとえば、ディスプレイやキーボードなどの基本的な入出力装置以外に、プリンタに出力を送りプリントが終わればユーザに知らせたりもします。このほかに、ネットワークやファイル・ディレクトリの管理など、 カーネルはそのようなIOの管理機能の基本的な部分を提供しています。


4.システムコール
 以上のようなカーネルの機能はもちろんプログラムで書かれています。しかし、カーネルはハードウエアと密接に関わる部分であるため、簡単にカーネルの処理にアクセスするようなプログラムを作ってそれに触れるようなことがあればコンピュータは正常に動かなくなってしまいます。そこで、一般には、通常、カーネルはOSもしくはCPUが提供する特権モードで動作し、特別な許可を持つユーザしか触れることしかできません。しかし、一方で、一般のユーザもハードウエアに近い部分できめ細かい作業を行いたい場合もあります。そのような場合に、安全にカーネルの機能を提供する為の機能がシステムコールです。

例として、Windows系のOSでは、Windows APIと言われるものがあり、C言語やVisual BASICのようなプログラム言語から関数して呼び出すことができるような形で提供されています。


今回は、少しややこしかったですね。私もだいぶ忘れているところも多くありましたので、今回は、ウキペディアの記事のいくつかを参考書として勉強させていただきました。機能の分類は比較的一般的になものであり、ほかに引用などそのまま使用した部分はありませんが、念のために記載しておきます。

ウキペディアでの参考記事
・カーネル   : http://ja.m.wikipedia.org/wiki/カーネル
・OS      : http://ja.m.wikipedia.org/wiki/オペレーティングシステム
・システムコール http://ja.m.wikipedia.org/wiki/システムコール

2014年3月20日木曜日

人で無しのための計算機理論入門 その5 仮想メモリ

なんだか国際問題にまで関わってきているような気がするこの人で無しのための計算機理論入門。きっと気のせいだということで、話を続けたいと思います。

今回は今では当たり前になったOSの重要な機能の一つ、仮想メモリについてお話ししたいと思います。

以前「その2」で、内部メモリと外部メモリの違いは価格だけだということをはなしました。一方、「その3」では、OSが無い段階のプログラムでは、内部メモリの大きさにプログラムが依存する場合があるということをお話ししています。そのようなハードウエアの差異をなくすのがOSであるということでしたね。

そのことについて今回は少々詳しく説明します。今回、比較的高度に専門的な内容ですので、理解できなくてもかまいません。このあたりのことを知らないIT業界の人なんかいっぱいいます。また、その分説明も詳しくなるため、文章も長いです。

では、まずCPUがどうやってメモリにアクセスするのかということについてお話ししたいと思います。

その2で、CPUとメモリはバスというもので結びついていて、バスにはアドレスバスとデータバスがあるということをお話ししました。

このバスは、基本的には電気信号を通す線、つまり電線ですが、機能が高度になり、高速化の要求に従っていろ色々なことがやられるようになっています、が、ここではそこまで詳しい内容にはふれません。

前回(その4)CPUとメモリの両方に関することとしてビット(bit)という単位が関係するという話をしました。そこでは、ビットとはCPUとメモリが一度に処理できる二進数の桁数であり、CPUがメモリにアクセスするとき指定するメモリの番地を表すときの桁数でもあるという話をしたと思います。

つまり、CPUがメモリとデータをやりとりするときに使われる信号線がデータバス、メモリの何番地のデータであるかを指定するのがアドレスバスというわけです。

遅まきながら、計算機が2進数を使用する理由は、それが、電線に流れる信号が、ONとOFFだけで表せられるからです。このあたりのことは、いずれ機会があればデジタル信号処理ということでお話しできるかもしれませんが、今回はごくイメージ的に。たとえば、モールス信号のように、とんつーとんつーと信号のあるなし、あるいは信号の長い短いで通信していた頃を思い出して下さい。その方が、明らかに明瞭に遠くまで信号を伝えることができますよね。計算機の世界では、同様に簡単なことをいかに速く動作させるか、処理させるかというようなことが基本的な考え方です。

さて、話しは、CPUとメモリの話に戻ります。内部メモリは動作が速いけれど高価で、外部メモリは遅いけれど安価というお話をしました。だいたい、現代のパソコンやスマホで使われる内部メモリは一般にDRAMと呼ばれる半導体のメモリですが、動作は数nsから数十nsで動作するのに比べて、HDDドライブなどの外部メモリはそれよりも数百倍ぐらい遅かったりします。ビットあたりの価格も逆方向に同じぐらい違いますけどね。

ところで、「その4」で説明しましたが、32ビットでアクセスできるメモリアドレスの範囲は4G(ギガ)、64ビットだと16E(エクサ)でした。これに対して、現在の高機能スマホでもメモリは2Gが一般的。パソコンのCPUは64ビットが普通ですが、せいぜい8Gから16Gぐらいが一般的ではないでしょうか。つまり、CPUが指定できるメモリアドレスの範囲より、遙かに小さいことがわかります。

CPUは、基本的にメモリにアクセスする場合、単にアドレスを指定してその番地の内容を読み書きするだけ、です。一方、OSさんは、たくさんのプログラムが時分割で同時に走らせていることで、計算機では、あたかも並列に色々な処理ができるように見せかけています(これも、マルチタスクと呼ばれるOSの重要な機能です)あるいは、一つのプログラムでも、CPUがメモリアクセスできる番地いっぱいのデータを処理する場合もあります。

そのような場合、OSさんは、こっそりと、CPUさんをだまします。つまり、外部メモリにあるような、プログラムやデータもあたかも内部メモリにあるように見せかけて、CPUが指定する本来内部メモリにはないアドレスも、あるように見せかけてCPUに処理をさせるのです。このようなOSの働きによって、CPU側から見ると、あたかも広大なメモリ空間に何も考えずにアクセスできているようにみえる。そういうOSの機能のことを仮想メモリ、と呼びます。

ただし、CPUはハードウエア的には内部メモリにしかアクセスできないため、OSさんは、一生懸命できるだけCPUさんが早く処理をできるように色々予測しながら、内部メモリの内容が外部メモリの内容とあまり頻繁に入れ替えをしなくて済むように考えて処理をしています。このように仮想メモリという考え方によって、現代のCPUは内部メモリの大きさに関わらず、様々な処理を行えます。

ただし、処理の内容が大きく、一方それに比べて、相対的な内部メモリの大きさが小さいような場合、内部メモリと外部メモリとの間の内容の入れ替えをOSは頻繁にしないといけなくなります。これが、古いパソコンで、なにかあるとHDDがカリカリ動き出す理由です。

したがって、パソコンやスマホ、タブレットPCを長く使いたいならば、CPUの性能はもちろん、内部メモリ(一般にDRAMあるいはRAMとよばれる半導体メモリ)の大きさも重要です。個人的には、新しくパソコンを買うとしたら、一番高いCPUより、二番目に高いCPUを選択し、その分、メモリにお金を使う方が、長く使うことができると思います。私なんか、パソコンは8年前に買ったものですが、メモリは奮発して2G載せていました。さすがにそろそろ限界に近いですが、まだそれなりにではありますが、Windows8.1走ってますよ。

2014年3月19日水曜日

人で無しのための計算機理論入門 その4 計算機に関するいろんな単位

さて眠れない夜、簡単に計算機で使われている単位のお話でもすることにしましょう。ここからは、若干ですが、専門的になっていきますので、わからなければそれはそれで良いと思って下さい。

まずCPU。

CPUは、電子回路で構成されています。従って電源が必要です。もう一つ、クロックと呼ばれるものがどうしても必要になります。これは、行進の時にかける号令のようなもので、電気ですので、イチ、ニ、のかわりに、on、off、オン、オフを繰り返します。このイチ、ニ、のかわりのオンとオフ(あるいは、オフとオン)の一セットを1クロックと呼び1クロックこれがCPUが命令を基準となる単位です。クロック数はHz(ヘルツ)で表し、大きい方が1秒間に実行できる命令の数が多いことになります。クロックが1GHzだと1秒間に最大10億回の処理が理論上できるということになります。

もっとも、1クロックに1命令処理できるとは限らず、数クロック掛かる命令もありますし、CPU設計の考え方の違いも有るので、あくまでも処理の速さとしてはの目安です。

他に、ビットと言うのもありますが、これはメモリとも関係しますので、少し後回しにします。

次にメモり。これは、少々やっかいです。というのはメモリの記憶容量を表すのに、ビット(bit)という単位とバイト(byte)という単位の2種類を使います。さらに、2の10乗が1024で、1000に近いこともあって、キロ(K)、メガ(M)、テラ(T)などの表現も10進数か2進数かで微妙に違います。

そういうややこしいことは後回しにして、とりあえずは基本的な事項。ビットというのはCPUやメモリが一度に処理できる2進数の桁数です。これが大きいほど、CPUとメモリで一度にやりとりできる情報の桁数も増えます。また、当然CPUが処理できる2進数の桁も増えます。そうすると、一度に処理する情報の量も当然増えますから、処理も速くなる傾向があります。

また、CPUが指定するメモリの番地もの大きさも広がります。一般に32ビットのCPUだと理論的に最大4ギガですが、64ビットであれば16エクサ(=100京)と無限に近いような大きさの数字です。

一方、メモリの容量バイト(byte、一般に大文字のBで表すことも多い)というのが使われますが、これは、これは、慣習的なもので1バイトは8ビットのことです。

細かいことを言い出すとこの辺も本当にややこしくなるので、基礎的な事項のみ説明しました。

2014年3月16日日曜日

人で無しのための計算機理論入門 その3 プログラムとOS


さて、おそらく絶賛大不評中であろうこの人で無しのための計算機理論入門、今回で、ごく初心者のための入門記事は終わりとなります。これだけわかっていれば、おそらくこの情報化社会のごく基本的な部分が魔法で動いているのではないということがわかっていただけるでしょう。ちなみに、某半導体工場で働いているときにエンジニアの女の子が半導体にあれだけ微細な加工をして動いているわけがない、ということを言っていたのでひっくり返りそうになった覚えがあります。では、なぜ、どうやって動いていると言うんでしょうかね。全く、技術者のくせにどういう教育を受けてきたんだと思いましたが。

それはそうとして、これだけわかっていただければ、アルゴリズムというものもウィキペディアそのほかネットの資料を読めばわかるようになるでしょう。これまでは、私にしては速いペースで記事を上げてきましたが、これからは、ごく不定期で書きたいと思います。いろんなことでこれでも忙しいのです。


その2までを読んでいただいたかたならおわかりと思いますが、計算機というのは、本当に単純なことしかできません。

そのため、ごく初期の頃は人間の方が計算機にあわせる必要がありました。プログラムというのは、そういう計算機に処理をさせる手順を書いたものですが、ただ足し算をするのにも、いちいち、レジスタAにメモリの何番地のデータを入れて、レジスタBには別のメモリの番地からデータを読み込んできて、レジスタAとレジスタBの内容を加えてレジスタAに入れるような命令を書き入れるというような、非常に面倒で手間のかかることをやっていました。

しかし、そのうち、効率よくプログラムを書くために、もう少し人間の方にわかりやすいプログラムを書くための方法が考え始められます。

まず、共通のプログラムを使いたいという欲求が沸いてきますよね。いちいち足し算をするにも、メモリの何番地があいているからそこにデータを入れて、そこから、どのレジスタにデータを読み込むのか、などという管理までちまちまとやっていられない。

そこで、そういうことを自動で行うプログラム、つまり、人間にわかりやすいプログラムを書くためのプログラムを作ろうという動きが出てきました。これが高級言語と一般に言われているものです。

現在よく使われている高級言語には、C/C++やJavaなどのグループがオブジェクト指向型言語と分類されもっとも普及しています。他にインターネットのホームページで使われるHTMLというのもプログラム言語です。細かい用途によって様々なプログラム言語があります。

さて、いろんなプログラムが書かれるようになりましたが、それは、ハードウエアの仕様により、様々に細かいところが異なってくる場合がありました。例えば、同じ種類のCPUを使っていても、内部メモリの大きさが違えば、処理できるプログラムは微妙に違います。そのような管理をいちいちプログラムでするのは面倒ですよね。

そこで、ハードウエアの差異を吸収して、人間に同じような操作性を提供するプログラムが必要だと考えられるようになりました。それが、オペレーティングシステム(以下OSと呼ぶ)です。

パソコンならWindows、スマートフォンやタブレットPCならば、iOSやAndroidが有名ですよね。このようなOSがあるからこそ、メーカー毎、あるいは発売された時期ごとに異なるハードウエアの細かい仕様の違いをユーザー側はあまり意識せずにスマホも使用することができ、また開発者側の負担も大幅に減らすことができるわけです。

2014年3月13日木曜日

人で無しのための計算機理論入門 その2 一般的な計算機のハードウエア構成要素とCPUの概略

では、一般的な計算機、(あ、特に言わなったけれど、学問の世界でコンピューターのことを計算機というのが普通です、念のため。)に必要な要素は何かということをここで改めて考えましょう。

 基本的に計算機ですので、計算する装置が必要ですね。現代の計算機ではこれをCPU(Central Processing Unit :中央演算装置)と呼ぶものを使っています。電子的に計算を行う装置ですね。

 あと、何が必要でしょうか。良く聞くメモリっていうものも必要でしょうかね。プログラムやデータを記憶させておくところです。少し専門的なことを言うと、メモリというのは内部メモリと外部メモリに分けられます。この辺りのことは、話せば長くなるんですが、要するにコストの問題で内部メモリと外部メモリが分けられていると思って一向にかまいません。一般的に読み書き速度の早いメモリは構造的に高価なためです。

 もう一つ、人間が使うものだから、やはり、やりとりをしないといけません。これを一般に入出力装置、あるいは単にI/O (Input/output)呼びます。

現在の処、コンピュータというのはどれだけ高価だろうが、小さくなろうが、この三要素で構成されています。


では、ここで、ノイマン型コンピュータのCPUについて少し説明を試みたいと思います。

今度はCPUに必要な要素を考えてみようと思います。

中央演算装置と言うくらいですから、まず演算する構造が必要ですね。ところが、基本的にCPUさん、面白いもので、演算は足し算しかできません。かけ算は、といえば、足し算をものすごいスピードでやります。3×3だと3を3回足すんです。乗算器という仕組みもありますが、これは応用編で。基本は足し算。引き算は、というと、二進数の世界はうまいことやると、その性質を使って引き算もできるんですね。だから割り算もできる。四則演算ができれば、とりあえず計算機としてはOKですが、だいたいのCPUには、二進数を桁上げしたり桁下げしたりという機能もついています。

つまり、CPUの世界では計算機と言いつつ、実は基本的な演算は加算しかできません。あとは、CPUを作る人や使う人の創意工夫による、というのがこの世界の掟。だからこそ面白いんですけどね。

さて、他には何が必要か。そうですね、たくさんでは無くても計算をしたいデータや計算結果を記憶しておくメモリが必要ですね。このような、CPUの処理に必要なメモリのことをレジスタ、と呼びます。

他に、プログラムカウンタという奴も必要ですね。今プログラムの何処を走らせているのか、一つ処理が終わったら次のステップを処理する、そんな管理をしているところです。

他に、メモリとのデーターやプログラムの命令をやりとりする部分が必要ですね。現代のCPUには内部メモリとのあいだに更に早い速度のメモリ、キャッシュ、を持っていることも多いです。しかし、一般的に、データをやりとりするわけで、その部分をバス(bus)と呼んでいます。busには、アドレスバス、とデータバスというのがあるんですが、まあ良いですか、今のところはそこまで知らないで。

これくらいあれば、とりあえずプログラムを処理できそうですね。あと、割り込みというのがあって、ねえねえ、そんなことばっかりやってないで、ちょっとこっち見てよ、という事をやる働きの信号の受付の部分もありますね。

だいたい、こんなとこでしょうか。次は、プログラムとかOSとか、ソフトウエアのお話です。

2014年3月11日火曜日

人で無しのための計算機理論入門 その1 ノイマン型コンピュータ


だいたい、分かりやすく専門の知識について説明する講座などのことを、サルにも分かる○○入門だというようだが、モラルハザードに陥って、一人では何もできず、あるいは匿名でしか何かできない可哀想な人で無しの連中とサルを比べるとサルにも申し訳ないような気がする。そこで、サル以下の可哀想な人のために、計算機理論のお話をすることにした。今回は、まず、ノイマン型コンピュータ。

人間誰しも、一つ以上のことをするときには、リソースが限られていることもあって、ただ一つのことに専念するときと比べて、効率が落ちる。もっとも分かりやすいのは、自動車を運転しながらの携帯電話が、何処の国でも法律で禁止されているという事を挙げれば良いだろう。

さて、最近のCPUでは、4コアだとか、マルチスレッド対応だとか、あるいは動的配置だとかいろいろあるが、基本的にノイマン型コンピュータの枠をでない。GPUに関しては、厳密にはノイマン型コンピュータと違うが、基本的には、ノイマン型コンピュータの延長から生まれたものだ。

さて、何となくイメージが持てた方もいようが、非ノイマン型コンピュータというのはどういうものか、という事を先に説明しよう。

例えば、ニューラルコンピュータがそう。あるいは、PS3のCPU(Cell)ももともとは、非ノイマン型コンピュータを目指して作られたものの延長だと言えよう。実現はされていないが、量子コンピュータもその部類に入る。つまり、並列にいろんな物事を処理できるように、根本的に設計されているものを非ノイマン型コンピュータと呼ぶ。

逆に言えば、ノイマン型コンピュータは、基本的に一度に一つのことしかできない。それをものすごい早さでやるから、1秒間にどれだけの計算ができるか(FLOPS:フロップス、Floating-point Operations Per Second 1秒間に浮動小数点の数値演算がどれだけできるかを表わす)というのが、いまだにスーパーコンピューターにおいても速度の目安となるわけ。スーパーコンピューターはもっとも、ものすごいCPU数があってそれをうまい具合に並列処理させる仕組みで動いているけれど、ね。しかし、各CPUはたとえば、日本の誇る「京」だって、ノイマン型の処理をするCPU(今はなきSUNのSPARCの改良型)だからね。ノイマン型は基本中の基本というわけ。

つまり、古典的な紙テープに書いてあるようなプログラムというのが単に記憶装置の進化で電子化されて、後の仕組みは、大して変わらない。いまだに化石燃料を使う内燃機関の進化よりマシだけどね、内燃機関の基本は何にも変わっていないのと同じ。いまのCPUはスーパーコンピューターの世界でいうベクトル型の並列処理を取り入れてたり、一部、スカラー型の並列処理を取り入れたりもするけど。そういう進化はあるにせよ、だね。たとえば、CPUガソリンエンジンに例えると、GPUコンピューティングもスーパーコンピュータの世界ででいえばスカラー式というやつで、つまり、電気モータの補助を使うようなもの。ハイブリッドというのが、低消費電力時代のコンピュータ。

つまり馬鹿という奴が馬鹿。いい加減一回死んで私が死んだくらいに出直してきてくれ。もしくは一昨日来やがれ…って先一昨日あったのかな?ハハハ。

2014年1月7日火曜日

小林さんの「モーツアルト」より、天才とは努力しうる才だ

「天才とは努力しうる才だ、というゲエテの有名な言葉は、ほとんど理解されていない。努力は凡才でもするからである。然し、努力を要せず成功する場合には努力しまい。彼には、いつもそうあって欲しいのである。天才は、寧ろ努力を発明する。凡才が容易とみる処に、何故、天才は難問を見るというのが屡々(しばしば)起きるのか。詮ずるところ、強い精神は容易なことを嫌うからだという事になろう。自由な創造、ただそんな風に見えるだけだ。制約も障碍(しょうがい)もない処で、精神はどうしてその力を試す機会をつかむか。何処にも困難がなければ、当然進んで困難を発明する必要を覚えるだろう。それが凡才にはかなわぬ。抵抗物のないところに創造という行為はない。これが、芸術に於ける形式の必然性の意味である。あり余る才能も頼むに足らぬ、隅々まで意識され、なんの秘密も困難もなくなってしまった世界であれば―天才には天才でさえ容易に見える時機が到来するかもしれぬ。モオツァルトには非常に早く来た。」
 
小林秀雄 「モーツアルト」より

こんな事を書く人の文章にでてくる言葉を、売れるためになら何しても良いんだ、などという、あまりにも「凡人」的に解釈するなど一笑に付されて然るべきだろう。本居宣長の「ものの哀れ」というものをどれだけ貶めて考えれば良いのか。本居宣長が溢れるほど詰め込んではち切れそうになった「ものの哀れ」という言葉は、小林さんはまた、上記のように解釈して述べているに違いない、と私は思う。「隅々まで意識され、なんの秘密もなくなってしまった世界」において「ものの哀れ」という言葉に何を詰め込んだというのか、という事を反省するならいくら反省しても反省したりない、というところを感得すべきだ。そこが分からないとは何とも情けないと思う。

彼らの芸術に関してもそうだ。「抵抗物のないところに創造はない。これが、芸術に於ける形式の必然性の意味である」という言葉に対して、どれだけ反省があるというのだろう。私にはさっぱり理解できない。神と遊ぶとは一体どういうことなのだろう。ぴいとヒヨドリが鳴いて正気に戻った柳田国男の感性がなければできない相談であると言う事も分からないというのも悲しい話だ。

あまりにもばかばかしい話が世の中に出回っていて、疲れて来た。それは、年を取るというのを齢を重ねるという表現をするようなものではあるまい。一方で馬齢を食うという表現もあるわけである。なんの抵抗も緊張のないところに創造はない。それらのないそこにあるものは、単なるティッシュペーパーにしか過ぎない。