「物理学のための計算機とオープンソース」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎計算機との情報伝達手段: 誤字、また「ただ2通りだけの信号を用いて英語のアルファベットを 表現する方法を表わしている」とモールス符号を説明しているが、モールス符号は可変長符号なのでこの説明は甚だ不適切で2進機の説明をより適切な例に置換える必要がある。
タグ: 2017年版ソースエディター
Kyube (トーク | 投稿記録)
近視眼的な推敲。ところで、近年では数値計算はFORTRAN一辺倒でもないような気がしている。
2 行
----
==始めに==
この文書は、理学系の学部を卒業したものが、何らかの仕方で計算機を学ぼうと
考えた場合の教科書の役割を果たすものとしてかれるものである。
また、計算機そのものに興味は無くとも研究の手段として計算機に関わる
必要が出来、それに関する知識を得たいと考えるものも想定している。
 
この文書では、出来る限り計算機科学の原理的な部分も扱っていきたいと考えて
いる。しかし多くの部分はすでに完成しているプログラム使い方だけを示して、
その原理にまではれないことも多い。これは、ひとえに現在の物理研究と
計算機の関係を表わしてもいる。例えば、現在ではFortranによる数値計算は
物理研究にかせないものとなっている。しかし、物理学者で実際にFortranの
コンパイラをける人間はほとんどいないのである。つまり、こういった場合
物理学者はコンパイラをブラックボックスとして扱い、それによって物理的な
結果を得ているのである。
28 行
それらの原理や設計の思想を出来る限り紹介して行きたい。
また、コンパイラの中でも構文解析と呼ばれる部分は、計算機を扱う上で
いろいろな部分でであ出会う考え方であり、これは詳しく紹介したいと思う。
 
==計算機との情報伝達手段==
49 行
 
まず、メモリとCPUだけからなっている理想的な計算機を
考える。ここで、メモリはそれぞれの部分が0と1だけの情報をたくわえることが出来る
ものであり、CPUは加算、減算などの処理をすることが出来る電子回路であるとする。
 
実際にはメモリとCPUの実際の設計は計算機科学というよりも工学部の特に
電気電子系で扱われることが多い内容であり、その詳細にはれることが出来ないが、
直観的にはメモリはただ2つの量子状態からなる電子スピンのようなものを
想像し、CPUに関しては、AND回路やOR回路が標準的な仕方でつらなっている
ものを想像すればよい。例えば、2進数の1桁の数に対する加算回路を考えてみる。
このとき、2進数の1桁の数は0と1のみであり、これらの足し算の結果の
1桁を考えてみる。すると、それらの和は
:{| class="wikitable"
| +
71 行
が得られる。これは回路としてはXOR回路と呼ばれる回路であり、
ある回路によって作ることが出来ることが知られている。
更に、1桁どうし同士の足し算によって2桁の数が作られることに注目して、
2桁めの数値を計算する回路も考えてみる。このとき、2桁めの数値は、
:{| class="wikitable"
97 行
さて、ここまでで計算機に命令と命令を実行するのに必要なデータを与える
手段が分かった。理想的にはここからの話で、CPUへの命令は全てモールス信号的な
2進数の信号で行なわれており、2進数記での命令を作ることを人間の側が
行なっているとしてもよい。しかし、それはあくまでも実用的に役立つ
文書を作るという本来のこの文書の目標に反している。例えば、
文書の執筆を行なうという大事業を2進数でくことはほぼ不可能である。
ASCIIコードも全て手作業で2進数に直さなくてはならないし、
漢字が加わると更にその作業は難度を増す。
114 行
それについては個々のCPUメーカーの作る文書を読むしかその内容を知る
方法は無い。しかし、実際にはそれでは問題が生じて来る。
あるソフトウェアをあるCPU向けにいたとする。このとき、このソフトは
あるそのCPUが理解できる命令の集まりとなっている。
このソフトを、他のCPUに対しても使いたいと思ったとしよう。
このとき、CPUごとに命令の体系に異なった信号を命令が用いられていたとすると、
このある命令の集まりはそちらのCPUに対してはなんら意味のある活動を
こさせることが出来ない。このことを、得られた命令に移植性がないという。
このことは、そもそもCPUごとの命令に定まった意味が無く、信号ごとの意味の
当てはめ方が任意であったことを考えると、全く当然のことと言えるのだが、
それでも、1つのCPUに対していた2進数プログラムと、他のCPUに対していた
2進数プログラムに全く互換性が無いとすると、それぞれのCPUに対して
全く別のプログラムを書くことをしなければならず、このことは非常に大変な
作業になると考えられる。
実際にはこの問題は、CPUに対してだけに留まらない。昨今ではそれぞれの
機器、例えばハードディスクやサウンドカードなどがげられるが、
それぞれが個別の命令の体系を持っており、それら自身もある程度それを
作るメーカーに信号の受け方を決める権限が任されている。
164 行
別の統一された名前を与え、それらの名前だけを用いてプログラムを作製する
ことである。このことは実際にはコンパイラに関する話題とも密接に関係する
のだが、つまり、そのような名前をある文法にしたがってき並べることで、
プログラムをより汎用的な形で書くことが出来るのである。
もちろん書き上げたプログラムを2進数のプログラムに変換する簡単な方法が
ないのなら、これは全く無意味な事であるが、
幸いにもそのような作業を行なうプログラムが実際にけることが
知られており、また広く流通してもいる。このような抽象化された
名前によって作られたプログラムを、あるCPUに向けた2進数プログラムにえる
プログラムをコンパイラと呼ぶのである。
しかし、このことはある機器が持つ標準的でない機能はコンパイラを使って
185 行
これは、例えばハードディスクに対する命令を抽象化することを
考えてみるとわかりやすい。ハードディスクはその中に磁気的なしくみで
たくわえられている情報を読みだしたり、新しい情報を書きこんだり
する機能を持っているのだが、その仕組みは単に情報をreadする、または
writeするという言葉で抽象化することが出来るのである。
もちろんreadやwriteという言葉は人間にとって直観的に意味が把握できることは
便利な事だであるが、それ自体はコンパイラに取っては意味があることではなく、
もっと分かりづらい名前にしてもよいのである。例えば、readは英語であるが、
これを日本語にしたり、別の言語にしたり、何の意味も持たない文字の羅列と
してもよい。ただ、コンパイラとそれを用いる人間の間に共通の情報であれば
それで用は足りているのである。
実際には、ハードディスクが扱える0と1の情報を用いて人間にって
分かり易い仕方で情報をたくわえることはそれ自体が興味ある仕事である。
例えば、昨今どのような計算機においても用いられているツリー状の
ディレクトリ構造も計算機に分かる仕方でそれを構成するのは、例え
202 行
これ以降どのようなファイル構造が主流になるかは、今の時点では
よく分からないといえる。このように計算機の機能を用いて、
情報をたくわえる方法をファイルシステムと呼びこれもOSの理論の重要な
一分野となっている。また、この部分は実際のOSメーカーの力も強く
アカデミックな研究とメーカーとの距離が近い分野であるといえよう。
208 行
 
上ではread(),write()の命令を持っている機器としてハードディスクを
げたが、実際にはこのような命令を持っている機器はハードディスクに代表される
記憶装置だけにとどまらない。実際にはグラフィックカードやサウンドカードも
このような命令を持っているのである。例えば、Linuxの重要なサウンドカード
を扱う命令群に[[w:alsaAlsa|alsa]]
があげられるが、そのコードの中には各々のメーカーのディレクトリがあり
それぞれのメーカーの機器の命令を抽象化するようなread命令とwrite命令が
226 行
ある定まった形式のデータを送り込む命令である。このデータは
サウンドカードによって音楽を表わすデータと解釈され、それが本物の
音楽であるなら音楽をらし、全く関係の無い文字などの羅列なら、
ノイズをらすのである。このような音楽は通常圧縮された形式で
計算機上にたくわえられ、もともとどのような形でたくわえられていたものなのか
知るのは困難だが、各々の形式のデータを扱う音楽プレーヤーそれぞれの
仕方で圧縮されたデータを元のデータに変換しそれを用いて音楽を
らしているのである。このことは、例え音楽をらすような複雑な操作が
行なわれるにしても、計算機の側からはその機器は
通常の記憶装置の一種にしか見えないというやや非直観的な側面を持っている。
241 行
特許が取得されている場合があり、そのような場合はこれらの情報を
容易に用いることは出来ず、必ず特許取得者に対して何らかの額のお金を
払わなくてはならない。このことは著作権研究への投資守り回収し更なる研究を進めることを助けるという
観点から当然視されているが、あまりにも特許の内容が簡単な事であり
その特許の適用範囲が広大である場合には、その特許を守ること自体が
研究の進行をらせる働きをしてしまい本来の特許法の意義に反する結果に
なることが起こることもあり、そのような場合について様々な議論が
かわされているようである。
301 行
そのような事は既に設定されていることが普通なので、
ここからはそのような機能が既に得られているとする。
一方、計算機からユーザーに対しても文字を表示したり音楽をらしたりと
様々な方法が考えられる。ただし、特に音楽や動画については現時点では
OSごとに移植性が無い場合も多く、今後の発展が期待されるところである。
321 行
やや難しい場合が多い。例えば、OSによっては標準的な仕方でグラフィックカードを
動かせるとは限らないし、動かせたとしてもそれに対応するライブラリが存在するとは
限らないのである。ライブラリが無いときにはそれを力で作製するしか無いが
それには通常多くの人手や予算がかかり、実際にそれを行なうのは困難であることが
多いのである。しかし、幸いにしてそのようなライブラリ等の問題を
330 行
その間には互換性がないということである。それぞれのグラフィックライブラリは
製造元も発生の歴史的経緯も異なっているため、これらに互換性が無いのは
当然であるが、昨今ではLinuxが用いているのを中心に
グラフィックライブラリを様々なOSに移植する計画が進んでいる。
Mac OS Xに対する[[w:Xdarwin|Xdarwin]]と呼ばれるプロジェクトはこの一種である。
ただし、実際には移植はただ一度だけではすまず、ライブラリが新機能を
加えるたびしたがって、何度もそのような作業をり返す必要があり
どのような仕方でこのプロジェクトが進行していくかは今の時点では分からない。
このように、GUIは様々な問題をかかえているが、特に初心者向けの
374 行
それ以上に詳しく知ることが許されないものでもあり、あまり一般的な事は
知ることが出来ないのが現状である。一方、実験で得たデータを
加工する技術は計算機技術の一種としても非常におもしろ面白いものであり、
またコンパイラの理論との関連にも興味ぶかいものがあるため、追って
詳しく述べたいと思う。
 
393 行
方法である。
ただし、OSの種類によってはそのような機能をサポートしていないことがあり、
やや移植性にけるという欠点がある。
まず第1に、外部プログラムのコードを自分が作成したコードの中から直接
呼び出す方法がある。つまり、自分が作成したコードが外部プログラムの
439 行
プロセス間通信とは複数のプロセスの間でデータの電送を行なう手法の
ことである。これは、実際にはある計算機で動いている2つのプロセスの
間だけでなく、他の計算機で動いているプロセスに対してもおたがいの間で規格が
統一されていればデータを送ることが出来る。例えば、Webサーバーなどは
この仕組みを用いて作成されている。
445 行
プログラムの設計上重要となるものと思われるが、実際にはそのような仕組みを
採用しているプログラム自体が少ないため、あまりどの仕組みが重要なのかは
れないことにする。ここでは、様々なサーバーの仕組みの基礎を成す
ソケットについて説明する。ソケットは、プロセス間通信の規格の1つであり
現在では数多くのOSにおいて使用可能となっている。
ソケットの仕組みは、OSのメモリ上にある領域を作成しておき、
その地点で2つのプロセスから来る信号をけることにある。
ここで、2つの信号がうまくであったならその2つの信号を発した
プロセス間にデータを送受信するトンネルを開いて、各々の間で
468 行
この手法が使えるOSを用いている場合はもっとも手軽な方法である。
ここで、プロセスを生成する方法を見るために、プロセス管理の手法を
すこし深く見て行くことにする。
通常、OSは複数のプロセスを管理するためにプロセステーブル
と呼ばれる表を持っている。プロセス生成を行なうためには、
482 行
====概説====
理論的な研究手法に役立つ計算機技術の1つとして、計算機代数を
げようと思う。計算機代数は実用的にそれらによって得られる結果もおもしろ面白
ものであることが多いが、その構成自身も非常に興味ぶかいものであることが
多く、ここではすこし詳しく扱う。
 
計算機によって数式を扱うことは、計算機によって通常の数を扱う場合とは
やや異なった性質をびる。なぜなら、通常加法や減法のような
数に対する四則演算は、CPU自体がそのような命令を持っていることが普通であり、
そのような手法を利用者はいかなる意味でも書き下すことは無い。
589 行
プログラムは通常何らかのデータを他の形に加工するために作製されるため、
データの処理は常に必要となる。もちろんこの分野はアカデミックな研究分野としても
重要と思われるのだが、そうではなくより実用的な計算機技術においても
このことはしばしば問題となっており、それぞれに対して解決法が考察されている。
ここでは、データの扱い方をすこし一般的に扱う。
 
ここでいうデータは、
625 行
====正規表現====
[[w:正規表現]]とは次の規則で生成される文字列のことである。
(1)用いたい文字を全て導入し、それらを<math>a _1</math>,<math>a _n</math>とする。(n(nは整数。)
(2)それらの任意の並びを文字列と呼ぶ。
(3)更に、ある文字列が任意の回数だけくり返されてできる文字列も