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

削除された内容 追加された内容
M編集の要約なし
編集の要約なし
2 行
----
==始めに==
 
 
この文書は、理学系の学部を卒業したものが、何らかの仕方で計算機を学ぼうと
考えた場合の教科書の役割を果たすものとしてかかれるものである。
27 ⟶ 25行目:
この文書でも、コンパイラの理論自体を扱うことは出来ない。しかし、
それに関係する部分で、それほど複雑でない部分は出来る限り扱っていこうと
考えている。例えば、webWeb上にはすでに多くのコンパイラが出回っており、
それらの原理や設計の思想を出来る限り紹介して行きたい。
また、コンパイラの中でも構文解析と呼ばれる部分は、計算機を扱う上で
いろいろな部分でであう考え方であり、これは詳しく紹介したいと思う。
 
 
 
 
==計算機との情報伝達手段==
 
理想的な計算機は、0と1の2種類の信号しか受け取れない機械であり、
これによって2種類以上のことをさせるよう指事を出すことは不可能に思える。
54 ⟶ 48行目:
やや複雑になるが、簡単な例を取って考えてみることにする。
 
まず、メモリとcpuCPUだけからなっている理想的な計算機を
考える。ここで、メモリはそれぞれの部分が0と1だけの情報をたくわえることが出来る
ものであり、cpuCPUは加算、減算などの処理をすることが出来る電子回路であるとする。
 
実際にはメモリとcpuCPUの実際の設計は計算機科学というよりも工学部の特に
電気電子系で扱われることが多い内容であり、その詳細にはふれることが出来ないが、
直観的にはメモリはただ2つの量子状態からなる電子スピンのようなものを
想像し、cpuCPUに関しては、andAND回路やorOR回路が標準的な仕方でつらなっている
ものを想像すればよい。例えば、2進数の1桁の数に対する加算回路を考えてみる。
このとき、2進数の1桁の数は0と1のみであり、これらの足し算の結果の
72 ⟶ 66行目:
\end{pmatrix}
</math>
が得られる。これは回路としてはxorXOR回路と呼ばれる回路であり、
ある回路によって作ることが出来ることが知られている。
更に、1桁どうしの足し算によって2桁の数が作られることに注目して、
83 ⟶ 77行目:
\end{pmatrix}
</math>
となるが、これはandAND回路に等しい。結局、andAND回路とxorXOR回路を組み合わせることで、
2進数の加法を行なう回路が作れたわけである。このように、cpuCPU
計算を行なう回路を集積したものであり、どちらかといえば計算機というより
電気系の学課の題材といえるだろう。
また、多くの実際に使われているcpuCPUの詳細は全くの企業秘密であり、
それらを自由に扱うことは出来ない。
 
一般にcpuCPUに対してモールス信号的な2進数で表現された命令や足し算等に必要な
数値を与える部分を理想化したものをレジスタと呼ぶ。物理的には、cpuCPU
対して外部から電気信号を送るための端子である。レジスタは通常
複数あり、命令を受けるレジスタと、データを受け取るレジスタは別になっている。
 
さて、ここまでで計算機に命令と命令を実行するのに必要なデータを与える
手段が分かった。理想的にはここからの話で、cpuCPUへの命令は全てモールス信号的な
2進数の信号で行なわれており、2進数標記での命令を作ることを人間の側が
行なっているとしてもよい。しかし、それはあくまでも実用的に役立つ
文書を作るという本来のこの文書の目標に反している。例えば、
文書の執筆を行なうという大事業を2進数でかくことはほぼ不可能である。
axciiASCIIコードも全て手作業で2進数に直さなくてはならないし、
漢字が加わると更にその作業は難度を増す。
そのため、計算機に効果的な仕方で指示を与えるには、何らかの仕方で
110 ⟶ 104行目:
 
==移植性==
ここまででcpuCPUに命令を与える方法について考察して来た。
 
もちろんcpuCPUに与える命令自体はcpuCPUを作るメーカーに任せられており、
ここまででcpuに命令を与える方法について考察して来た。
それについては個々のcpuCPUメーカーの作る文書を読むしかその内容を知る
もちろんcpuに与える命令自体はcpuを作るメーカーに任せられており、
それについては個々のcpuメーカーの作る文書を読むしかその内容を知る
方法は無い。しかし、実際にはそれでは問題が生じて来る。
あるソフトウェアをあるcpuCPU向けにかいたとする。このとき、このソフトは
あるそのcpuCPUが理解できる命令の集まりとなっている。
このソフトを、他のcpuCPUに対しても使いたいと思ったとしよう。
このとき、cpuCPUごとに命令の体系に異なった信号を用いていたとすると、
この命令の集まりはそちらのcpuCPUに対してはなんら意味のある活動を
おこさせることが出来ない。このことを、得られた命令に移植性がないという。
このことは、そもそもcpuCPUごとの命令に定まった意味が無く、信号ごとの意味の
当てはめ方が任意であったことを考えると、全く当然のことと言えるのだが、
それでも、1つのcpuCPUに対してかいた2進数プログラムと、他のcpuCPUに対してかいた
2進数プログラムに全く互換性が無いとすると、それぞれのcpuCPUに対して
全く別のプログラムをしなければならず、このことは非常に大変な
作業になると考えられる。
実際にはこの問題は、cpuCPUに対してだけに留まらない。昨今ではそれぞれの
機器、例えばハードディスクやサウンドカードなどがあげられるが、
それぞれが個別の命令の体系を持っており、それら自身もある程度それを
作るメーカーに信号の受け方を決める権限が任されている。
そのため、それらに対しても個別に信号の受け方や送り方を規定せねばならず、
それぞれの機器がそれぞれのcpuCPUや他の機器と組み合わせて用いられることを
考え合わせると、その組み合わせは非常に多くの数を持つと考えられる。
 
138 ⟶ 131行目:
いくつかの場合にこのことは依然として問題になっており、完全な
解決が得られたわけではないことに注意しなければならない。
1つめの方法として、ハードウェアやcpuCPUが受けつける命令自体を
統一してしまうことがあげられる。このことは通常ハードウェアメーカー各社の
努力によってなされる。
<!--
歴史的には、cpuCPUメーカーのうちでintelのcpuCPU
家庭用パソコンに登載されるcpuCPUの市場シェアの
多くを占めたため、パソコン用のcpuCPUについては、
intelの命令に合わせた仕方でcpuCPUの命令を組み立てるメーカーが
増えた。
 
しかし、パソコン用であっても、
金銭的な理由やそれ以外の歴史的な理由などにより
それ以外のcpuCPUを使うメーカーも存在する。また、
-->
例えば、家庭用パソコンでない
より多様な仕方で用いられるcpuCPUのについては、大きな市場シェアを
占めるメーカーが存在せず、それらに対する対応はまちまちであるといえる。
関連のハードウェアについてもそれらへの命令の体系はあまり統一されているとは
171 ⟶ 164行目:
幸いにもそのような作業を行なうプログラムが実際にかけることが
知られており、また広く流通してもいる。このような抽象化された
名前によって作られたプログラムを、あるcpuCPUに向けた2進数プログラムにおきかえる
プログラムをコンパイラと呼ぶのである。
しかし、このことはしかし、ある機器が持つ標準的でない機能はコンパイラを使って
それを扱うことが難しいことを意味する。そのようなものについては
必要な部分だけを2進数で書くか、コンパイラに適切な分岐を用いて
182 ⟶ 175行目:
作ることが、それぞれの機器の機能を移植性を保った方法で
用いるために役立つことが分かった。実際にはこれらの抽象化された名前の体系は
まさにOSの機能の一部分を成している。例えば、OSの1つであるlinuxLinuxでは、
このような抽象化された命令としてread()とwrite()を持っている。
これは、例えばハードディスクに対する命令を抽象化することを
248 ⟶ 241行目:
なることが起こることもあり、そのような場合について様々な議論が
かわされているようである。
 
 
==アプリケーション==
 
ここまででそれぞれの機器の機能を抽象化しある一定の機能を用いる方法を
見てきた。おおよそ、現在用いられている家庭用パソコンはここまでに
286 ⟶ 277行目:
 
===ユーザーインタフェース===
 
ここからは個々のアプリケーションについて見て行きたいと思う。
ただし、あまりにも個々のアプリケーションの機能に特化した
309 ⟶ 299行目:
OSごとに移植性が無い場合も多く、今後の発展が期待されるところである。
ここでは特に、利用者から計算機のインターフェースに注目する。
現在では主要なインタフェースは大きく分けてcuiCUIguiGUIがあげられる。
cuiCUIcharacterCharacter-based userUser interfaceInterfaceの略であり、文字を用いて
利用者に情報を送る方式である。この方式は古い方式で今は主流でないと
考えられがちであるが、実際にはそうではない。例えば、技術者だけが
319 ⟶ 309行目:
ことが予想される。そのため、より変化の速い分野においては現在もそうであるし、
おそらくこれからも文字による情報伝達は主流であり続けるであろう。
次に、guiGUIは、graphicGraphic-based userUser interfaceInterfaceの略であり、それぞれの情報に
アイコンやスクロールバーなどのグラフィックを表示し、それぞれの情報を
より直観的に提示する方法である。この方法は使うときには
329 ⟶ 319行目:
多いのである。しかし、幸いにしてそのようなライブラリ等の問題を
全て乗り越えた計算機も家庭用パソコンを中心として多く存在する。例えば、
現在のwindowsWindowsや、macMac osOS XやlinuxLinuxは通常グラフィカルな表示を持っており、
そのような問題を解決しているといえる。ただし、更に問題なのは
それらのOSはそれぞれ異なったグラフィック表示ライブラリを用いており、
340 ⟶ 330行目:
加えるのにしたがって、何度もそのような作業をくり返す必要があり
どのような仕方でこのプロジェクトが進行していくかは今の時点では分からない。
このように、guiGUIは様々な問題をかかえているが、特に初心者向けの
アプリケーションについてはこのような直観的な入力方法は必須であり、
各々のメンバーが様々な仕方で開発を進めているといえる。
 
ここからは、特にcuiCUIを中心に用いた手法を進めて行こうと思う。
なぜなら、上でも書いた通りguiGUIを用いた方法は移植性が無い場合が多く
それぞれのOSに対して解説を加えるのも大変であるからである。
また、計算機の機能を全て使うという点ではcuiCUIの方がguiGUIよりも優れているといえる。
例えば、通常あるアプリケーションのguiGUIを作製するためには、 cuiCUIを用いる場合が
多い。これは、guiGUIで用いられるのはあくまでライブラリに代表される
抽象化された名前の集合であり、それらを扱うのは通常コンパイラの仕事であり、
またコンパイラ自身は通常cuiCUIによる入力を受け取る方が普通だからである。
また、cuiCUIを用いたプログラムは移植性に長けている場合が多く、
様々なOSで実行できる場合が多いことも理由の1つとしてあげられる。
 
==物理学研究に際して応用上重要なアプリケーション群==
 
===物理学研究に必要な計算機技術に関する一般論===
 
ここからは本題である物理的な結果を得るために応用できる
ソフトを説明して行く。一般に物理の研究は実験系と理論系に分かれており、
364 ⟶ 352行目:
理論の側にとって理論研究に必要な計算機技術のうち多くは数値計算と
代数処理である。また、 数値計算を行なうときには計算機言語としては通常Fortranを
用いることになる。しかし、このときにはしかし、計算機科学に属する詳しい知識は
実はあまり必要でない。どちらかといえば、このときに必要の知識はより実用的な
数値計算の知識であり、どちらかといえば工学に属する分野の知識であるといえる。
387 ⟶ 375行目:
数値計算で得た結果を直接外部のプログラムを呼び出してプロットを
作成する手法が問題になる場合がある。
しかし、このことについては、しかし割合深い計算機の知識が必要であるため、
ここですこし詳しく述べておこうと思う。
 
416 ⟶ 404行目:
このようなコードの一部分だけを再利用する方法は、巨大なライブラリの多くが
Cによって書かれているため、Cによる方法だけを修得すればよいように思える。
しかし、[[w:Java|Java]],[[w:perlPerl|perlPerl]]などそれぞれの言語が無視できない
異なった手法を提示しているためここではこれ以上深く扱わず、抽象的に
そのようなことがなられたものと仮定するにとどめておく。
435 ⟶ 423行目:
仕事をするだけなら、このようなプロセス管理の考え方は必要がない。
例えば、巨大な数値計算を専門に行なう計算機に取っては、常にただ1つの命令を
扱えば十分であり、それ以上に複雑な処理を行なうことはcpuCPUに不必要な
負担をかけることになる。そのため、プロセス管理の手法は計算機の用途によって
使いわけることが必要となる。実際の現代的な家庭用パソコンでは
446 ⟶ 434行目:
ことである。これは、実際にはある計算機で動いている2つのプロセスの
間だけでなく、他の計算機で動いているプロセスに対してもおたがいの間で規格が
統一されていればデータを送ることが出来る。例えば、webWebサーバーなどは
この仕組みを用いて作成されている。
このような仕組みは伝統的に複数知られており、どの仕組みを用いるかは
462 ⟶ 450行目:
データを送信することも出来そうに思える。しかし、実際にはそのような
機能を付け加えることは割合手間がかかるため、そのような機能をそなえた
外部プログラムはあまり知られていない。例外的に[[w:OpenOffice.org|OpenOffice.org]]
と呼ばれる
オフィスソフトは、利用者が作成したプログラムとソケットを用いて更新することで、
486 ⟶ 474行目:
 
===計算機代数===
 
====概説====
 
理論的な研究手法に役立つ計算機技術の1つとして、計算機代数を
あげようと思う。計算機代数は実用的にそれらによって得られる結果もおもしろい
496 ⟶ 482行目:
計算機によって数式を扱うことは、計算機によって通常の数を扱う場合とは
やや異なった性質をおびる。なぜなら、通常加法や減法のような
数に対する四則演算は、cpuCPU自体がそのような命令を持っていることが普通であり、
そのような手法を利用者はいかなる意味でも書き下すことは無い。
これは計算手法のハードウェア的な実装と呼ばれ、あらゆる意味で最も高速に
559 ⟶ 545行目:
<!--
====実際の使い方====
 
上のような手法で数学的な計算手法を計算機で扱うことが出来ることが分かった。
しかし、手法として知られていても実際にそれらが使える仕方で配付されていないなら
606 ⟶ 591行目:
(2)データとして扱われるものは文字でも数値でもよい。
を満たすものとする。例えば、計算機を用いて計算した数値計算の結果や
すこし一般的には学術論文などに用いられる.texファイル、更に[[w:xmlXML|xmlXML]]形式で
保存されたオフィスソフトの文書などもこの中に含まれる。
 
633 ⟶ 618行目:
 
====正規表現====
 
[[w:正規表現]]とは次の規則で生成される文字列のことである。
(1)用いたい文字を全て導入し、それらを<math>a _1</math>,<math>a _n</math>とする。(nは整数。)
658 ⟶ 642行目:
したツールも知られており、その様なものを用いれば、
データを加工することが可能となるのである。
そのようなツールは[[w:perlPerl|perlPerl]],[[w:pythonPython|pythonPython]]などが知られているが、
これらについてはプログラミングの手法でより詳しく述べる。
 
 
==プログラミングの手法==
===CVS===
 
 
===CVS===
===Fortran===
 
 
==CUIの技術==
 
===viエディタ===
 
===shellプログラミング===