ラベル 計算機 の投稿を表示しています。 すべての投稿を表示
ラベル 計算機 の投稿を表示しています。 すべての投稿を表示

2010年8月3日火曜日

計算機の初歩 ~パソコンは難しい?~

見事にPostgreSQLに敗北しそうな筆者です。
NULLが、NULLの振舞いが全ての元凶っぽい。
小手先の技でのフォローも通用しないのですよ。


さて、計算機シリーズですが、ようやく初歩です。
ここからはパソコン(パーソナルコンピューター)の話に限定します。
スパコン(スーパーコンピューター)なんて弄る機会はまずありませんし、マイコン(マイクロコンピューター/マイコンピューター)は過去の遺物。
モバイル系(携帯電話・スマートフォンなど)はパソコンの派生であり、個体差が激しい分野でもあるのでパス。

よく「パソコンは難しい」という声を聞きます。
色々な事が可能な半面、知識がないとただの箱なので難しく感じるのかな? と思い、取っ掛かりにありそうな話を並べてみようと思います。

『パソコンを買ったが、何からやっていいかわからない』
⇒えー、パソコンは「とりあえず」「なんとなく」で買うものではありません。
目的なしに買ったモノがホコリをかぶって押入れの肥やし、というのは良くある話ですのでまず何をしたいか考えてみましょう。

『インターネットとメールが出来ればいいのだけど…』
⇒いずれも接続の設定が最難関。それさえクリアできれば大して問題もなく使えます。
昔は知識が必要でしたが、今は必要な情報を入力していくだけで設定が終わるような設定ソフトがありますので指示に従えば問題なく設定できるはずです。
プロバイダ(接続業者)のサポートも昔に比べれば良くなっていますので、問い合わせてみるのも良いかもしれません。

『インターネットにつながったけど、何をしていいかわからない』
⇒検索エンジンに慣れましょう。
とりあえずgoogleが良いと思いますが、検索エンジンに調べたい言葉を入れてやると該当するサイトが表示されます。
色々とコツがあるのですが、試してみるのがお勧めです。
単純にリンクをたどるだけでも面白いですよ(ただし、時間の浪費と言えるほどに時間を食います^^;)

『検索エンジンの検索結果が良くない』
⇒検索エンジンに入れる単語は、目的の情報固有の単語が良いです。
例えば、あるお店を探したい場合…
・店名だけ入力して検索
・店名+所在地(若しくは最寄駅)を入力して検索
・店名+商品名を入力して検索
という検索方法が思いつきます。
店名だけだと、同じ店名のお店がある場合に困ります。(山田商店、なんて名前だと東京で探したいのに福岡の山田商店が引っ掛かるというような感じ)
店名+所在地だと、だいたい目的のお店が引っ掛かります。
店名+商品名だと、目的のお店以外はまず引っ掛かりません。
という感じですね。

『ワープロで文書を作ってプリントしたい』
⇒これは、ソフトとハードの両方の話になります。
ごっちゃにしてしまうと意味不明になるので分割して考えるのがベストです。
「ワープロ」はソフトの話なので、ワープロソフト(wordなど)をインストールするところから始めます。
「プリントしたい」はハードの話。プリンタの接続・設定から始めます。
それぞれ正しく設定できれば普通にできるはず(むりやり紙を入れたりしなければ…)です。

『18禁の***を…』
⇒自力で頑張れw
冷たいようですが、人に聞けないなら自力でやるしかないと思えない人はパソコンを扱うのに向いていません。
筆者のようにSEとして仕事でやっているのはともかく、個人的に趣味でやる分にはまず自己解決を目指すのが筋です。
同じ問題に取り組んだことのある人が知り合いに居れば楽なのですけど…
それにしても、児童ポルノと無修正グロってどっちが性質が悪いんだろう… などと無関係な事を考えてみる^^;

『ファイル交換とかで新曲や新作映画をタダで見たい』
⇒ささやかにひっそりとであれ情報技術に関わる人間として、それはやっちゃいけないと言わねばなりません。
18禁モノはみっともいいものではない、というレベルの話で済みますが、著作権絡みの話になると犯罪行為になるのでシャレでは済みません。
正規の商品でも動かなくなるようなプロテクトをかけるとか、不正コピーの損害分を見越した価格設定をするとか、抽選券などで数を買うように仕向けたりとか、著作権料の分配が不明瞭で何処に消えたか分からないように思えるとか、CD-Rなどのメディア代にも著作権料が上乗せされているなら音楽CDとか映画のDVDをコピーする権利も同時に購入してるんじゃない?むしろそれ以外の用途で使うときの著作権料はぼったくりじゃない?という疑問とか…
いろいろ言いたくなるようなえげつない商売をする業界ではありますが、法で定められている事は守りましょう。
著作権法が納得いかなければ、改正してくれる政治家に票を入れれば良いだけです。


激しく脱線したような気がしますが、使い方を知らない道具を前にして戸惑うのは普通のこと、と気持ちを切り替えればパソコン恐れるに足らず、です。

2010年7月29日木曜日

計算機 初歩の初歩 ~計算機は何故動く? ソフトウェア編~

よくよく考えてみれば、計算機の動く仕組みはハード/ソフト両面から説明が必要でした。
ということで、今回はソフトウェア編です。

まずは前々回の内容から。


ノイマン型アーキテクチャの計算機は以下のようなステップを繰り返し行うことで計算を行う。
  1. プログラムカウンタのさすアドレスから次の命令を読み込む
  2. 命令長さの分だけプログラムカウンタを増やす
  3. 制御装置で命令をデコードする。制御装置は計算機の他の部分に対して命令を出したり、
    繰り返しを行うためにプログラムカウンタの値を替えたり、条件分岐のためにALUの状態によって
    プログラムカウンタの値を替えたりすることができる。
  4. ステップ1へ戻る


という部分がありましたが、この計算手順がソフトウェアの基本になります。

「アドレス」とはメモリ上のアドレス(番地)の事で、メモリ上の何番地の情報を参照する、という形で情報を見たり書いたりします。
機械語(演算装置が直接理解できる命令の事。"0"と"1"で構成される為、人間には非常に読みづらい)ではメモリのアドレスを指定するのですが、アセンブラや高級言語では直接のメモリアドレス指定はまず行いません。
しかし、メモリアドレスを意識しておかないと「何故動くの?」という問いに答えられないので書いてみました。
現実問題としてメモリアドレスを意識してコーディングすべき言語はC言語くらいまでです。
(VC++.netでは意識する必要性はありません。VC++までです)

ステップ2.の「命令長さ」ですが、メモリアドレスが指すアドレスは、命令の格納されているアドレスの一番先頭のアドレスです。
その為、アドレスに格納されている命令の長さの分だけアドレスの位置を移動させないとならないわけです。
このあたりの処理はアセンブラや高級言語で意識する必要はありません。

ステップ3.で構造化言語の要素(順次・反復・分岐)が登場します。
高級言語の場合、このレベルでソースの記述を行います。


さて、当たり前のように出てきた単語を解説しますと・・・
『アセンブラ』(wikipediaより引用)

CPUが直接実行できる言語は機械語のみであるが、機械語は数字(内部的には二進数)の羅列なので人間には理解しにくい。そこで、機械語を直接記述するのではなく、機械語の意味を表す略語でプログラムを記述することで、人間により分かりやすくしたものがアセンブリ言語である。アセンブリ言語の文法はCPUのアーキテクチャに依存するため、高級言語のような移植性はない。
アセンブリ言語を機械語に変換する事をアセンブル (assemble) すると言い、それを行うプログラムの事をアセンブラ (assembler) と言う。なお、アセンブリ言語の意味で「アセンブラ」または「アセンブラ言語」(Assembler Language)と呼ぶ場合も多い[1]。
アセンブリ言語の命令は、アセンブラに対する命令(疑似命令)やマクロ命令を除き、機械語と1対1で対応し、プログラマがCPUの動作を把握しながらプログラムを記述する事ができる。そのため、
  • 実行速度やプログラムサイズに制限があるアプリケーションで、高級言語であるコンパイラの最適化能力では達成できない最適化を手作業で行いたい場合
  • CPUの動作をプログラマが完全に制御する必要がある場合
  • メモリ容量や演算実行速度などのリソースに厳しい制約がある用途
などにはアセンブリ言語によるプログラムが行われる。現在でも、例えばOSカーネルやデバイスドライバ、組み込みシステムの開発といった場面で頻繁に用いられる。


機械語よりも人間に近いのですが、CPUの動作一つ一つについて記述が可能⇒記述が必要となります。
ずいぶんと書きづらいのですが、無駄な動きを一つもさせないというプログラミングが可能となります。
ちなみに、アセンブラは低級言語(低水準言語)と言われています。
レベルが低いのではなく、コンピューターに近い⇒原始的 という意味合いからのネーミングと思われます。

『高級言語(高水準言語)』(やはりwikipediaより引用)

「高級」の由来は、コンパイラなどで直接機械語にするのではなく、一度アセンブリ言語に変換されて、機械語に変換されることがあったため、アセンブリ言語を低級言語、低級言語に変換できる言語を高級言語と区別したことから。インタプリタなどでは低級言語ではなく、中間言語にされて実行されることが多い。
アセンブリ言語と比べ、
  • 人間にとってわかりやすい
  • CPUに依存した処理を書かなくてよい
  • メモリ制御、IO制御等CPUレベルの操作を意識しなくてよい
という違いがある。広義の意味は主に三番目の理由からである。

人間寄りのプログラミング言語です。
機械語/アセンブラレベルの複数の命令を、高級言語の1つの命令で済ませることが出来ます。
現在のプログラマ(プログラミングが出来る人)はほとんどすべてが高級言語を扱っています。
たまに筆者のようにアセンブラ経験者(※筆者は大学の演習で使用しました)や、組み込み系一本でアセンブラばりばりな技術者がいますが例外的存在になりつつありますね。


一言でまとめると
『計算機は機械語しかわからないが、翻訳(コンパイル)することで高級言語による命令が実現されている』
のが現状であり、現在の計算機を動かしているソフトウェアとなります。
本当にプログラムを書けるというのは、機械語レベル(せめてアセンブラレベル)を理解して高級言語を使用している状態をいうのではないかなぁと思います。

尚、javaが環境を選ばずに動かせるというのは仮想マシン(VM)があるからなのですが、仮想マシン=計算機と見なすとその理由がわかりやすくなります。
仮想マシンを使うことで、どのような環境でも同じ計算機で計算を行うという状況を作り出している。
その結果、環境を選ばない、という利点が生まれているわけです。
一つ余計なもの(仮想マシン)が追加されている為に動きが遅かったり、サーバやクライアントのスペックを無駄に要求されるのですけどね^^; そんな理由から、筆者はjavaが好きじゃなかったりしますが、それも計算機の仕組みを知ればこそです。


やはり、ちゃんと肉付けして説明すると講義数コマ分の分量のある内容だけに消化不良かもしれないですね。
そこまで書ききる気力がないので今日はこの辺で終了です。

2010年7月28日水曜日

計算機 初歩の初歩 ~計算機は何故動く?~

ブログのアクセス解析ツールを使うことにしました。
といっても、すぐに結果が出てくるわけではありませんのでしばらく待ちです。

さて、前回の反響も見ずに計算機初歩シリーズ第二回です。
今回はハードウェアの基本的な構成と各部の働きを見てみようと思います。
正直なところ、大まかに理解していればあとはぐぐる先生に質問できますので(←基礎知識なしではぐぐる先生に質問しても効果が薄いのです)最低限このくらいは抑えておこうというレベルで書いてみます。


ノイマン型の説明で
『ノイマン型アーキテクチャの計算機は5つの部分からなる。演算論理装置(ALU)、制御装置、メモリ、入出力と、これらを接続する情報経路である。』
と前回引用しましたが、これだけだと手元にあるパソコンのどの部品がどの部分に当たるのかわかりづらいと思います。
その為、もう一段階現在に近い説明を引用します。(引用元)

コンピュータは制御装置、演算装置、主記憶装置、補助記憶装置、入力装置、出力装置 で構成されています。
コンピュータの心臓部は中央処理装置 (CPU) です。
中央処理装置は制御装置と演算装置から成っています。
主記憶装置はプログラムやデータを記憶し、CPU の求めに応じて素早くデータを送ったり、 CPU から返された処理結果を記憶して、コンピュータの働きの中心となるメモリ  です。
大型コンピュータが中心であった頃の習慣で、CPU と主記憶装置をコンピュータ本体といい、 入力装置、出力装置、補助記憶装置はコンピュータ本体の周辺に設置されていたことから 周辺装置 (peripheral equipment) といいます。

入力装置はキーボードやマウス、 バーコードリーダーやイメージスキャナーなど、 コンピュータを操作したり、さまざまな情報をコンピュータに与えるために使用されます。

出力装置はディスプレイやプリンタなど、コンピュータの処理状況や処理結果を表示、 印刷するものや、 音声のデータを再生するスピーカなども出力装置の仲間です
補助記憶装置はフロッピーディスクや ハードディスク、CD-ROMドライブなどです。
ハードディスクに保存されているプログラムを主記憶装置に送ったり、 コンピュータで作られたデータをフロッピーディスクやハードディスクに保存する、 などというふうに使用されます。

ちなみに、この引用元は大学の講義資料のようなので堅いですが比較的整理されています。
独習時の参考サイトとしてお勧めしておきます。

ノイマン型の5つの部品と、上記引用との対応をとってみると…

・演算論理装置(ALU)+制御装置 ⇒ 中央処理装置(CPU)
・メモリ ⇒ 主記憶装置
・入出力 ⇒ 入力装置・出力装置
・これらを接続する情報経路 ⇒ (マザーボード上の回路(バス)・配線など)

となります。
尚、補助記憶装置はノイマン型では考えておらず、現実問題(主に費用の問題)として必要な為に追加されたものです。
計算機が直接扱うのはメモリ上の情報であって補助記憶上の情報ではないのです。


上記引用で、おおざっぱな理解は可能ですが念のため解説を。

0、(パソコン起動)
1、起動終了後、入力待ち状態になる
2、入力(キーボード・マウス・FDやCD挿入)に応じて処理開始
3、入力された情報が情報経路を通ってCPUに伝わる
4、必要な情報を補助記憶装置から主記憶装置に読み込む
5、命令を実行する
6、必要に応じて処理後の情報を出力装置や補助記憶装置に送る
7、命令がある間、4、~6、を繰り返す
8、入力待ち状態に戻る

7、で「命令がある間」とありますが、命令の最中でも確認メッセージ表示(**して良いですか? Yes/No)の入力待ちのように入力を促す場合があります。

全て書いていませんが、装置間の情報伝達は全て情報経路を通じて行われます。

常に各装置をフル稼働しているわけではありませんので、複数のプロセス(上記1、~8、を行う手続き)を同時に動かしているのが現在のコンピュータ(正確にはOS)です。
同時に、と言っても全ての命令や処理を一度に行わせるのではなく、作業予定表を作るようにして順番に処理を実行させます。この効率が良ければ良いほど各装置を有効活用できます。


深堀はいくらでも出来る分野なのですが・・・
あまりやるとこれだけでブログが一つ出来てしまうので、というより筆者のレベルの浅さが露呈する(笑)のでここまでにしておきます。

実際問題としては、どのような装置がどのような役割を担って計算機が動いているか、上記のレベルで理解していれば、調べものなり質問なりが比較的スムースに行きます。


2010年7月27日火曜日

計算機 初歩の初歩の初歩 ~計算機とは?~

技術的な話の少ない当ブログ。
このままでは良くない、と感じた筆者は抜本的な構造改革に取り掛かる。
しかし、その行く手には・・・

って、どこぞの予告編みたいですね。
かなり気合入れていますので、今回の投稿が予告編になってしまう恐れがありますが進めてみます。


この文章を見ているということは、読者は全て『計算機』を使用しているということになります。
さて、『計算機』とは何か?
パソコン? スパコン? マイコン? ケータイ? 電卓?
どれも『計算機』に当たります。(マイコンや電卓ではこの文章は見れませんが^^;)

「パソコンの何処が計算機なのさ?」

と思われると思いますので、『計算機』とは何か、を書いてみようと思います。


Computer(コンピューター)の和訳(google辞書で翻訳)は
  1. コンピュータ
  2. コンピューター
  3. 計算機
  4. 電子計算機
  5. 計算器
  6. 高速演算機構
     となり、「計算の為の機械」と言えます。(「機械」と「器械」の差はスルーします。このへんを厳密に定義する人々もいるようですが本筋じゃありませんので)

    では、どのようにして正しい計算をする仕組みを作るのか?
    この理論の大本と言えるのが『オートマトン』です。
    wikipediaによると















    オートマトン (automaton (pl: automata)) とは「自動人形」を意味している言葉で、情報科学の分野においては、次のような特徴を持ったシステムのことである。
    • 外から、連続している情報が入力される
    • 内部に「状態」を保持する
    • 外へ、何らかの情報を出力する
    というのがオートマトンなのですが、ずいぶんと抽象的になります。
    具体的には有限オートマトンに詳しいのですがここをしっかり説明すると大学の講義数コマ分の分量になりますので、興味のある方はリンク先(wikipedia)を見てください。
    尚、リアルでの質問も受け付けます。(メールなどでの質問は申し訳ありませんが勘弁してください。参考サイトを検索する方が遥かに早いです)


    簡単に言うと、状態の遷移を示す為の理論です。


     「状態:空腹」、「入力:食事」⇒「遷移」⇒「状態:満腹」、「入力:時間経過」⇒「遷移」⇒「状態:空腹」・・・


    と言えばなんとなくわかるかと思います。
    上記のオートマトンの説明に沿うならば、

    外からの情報入力(「入力:**」)があり、情報入力に応じて状態遷移する。
    遷移元と遷移先の「状態:**」を内部に保持し、「状態:**」の情報を外へ出力する。

    と言えますね。


    どれほど複雑なプログラムでも、このような状態遷移が必須となります。
    初期状態と外からの入力がない限り、どれほど高度なシステムも動きようがないのがわかると思います。

    このオートマトンというものは、自動/半自動の仕組みの大半で使われていますので、身近なもので状態遷移を考えてみるのも面白いと思います。



    さて、オートマトンが状態遷移を示すのはわかるのですが、それのどこが「計算」なのか?
    次はそのへんを見ていきたいと思います。



    現在使用されている『計算機』の基本は、ほとんどが「ノイマン型」と言われるものを使用しています。
    この「ノイマン型」計算機は「チューリングマシン」の理論を使っているのですが、「チューリングマシン」は「オートマトン」の定義を拡張したものです。


    もう少し噛み砕いてに説明をしたかったのですが、これはそういうものだ、そういう関係だと思ってください。
    チューリングマシンとは(wikipediaより)


    チューリングの仮想機械は、
    1. 無限に長いテープ
    2. その中に格納された情報を読み書きするヘッド
    3. 機械の内部状態を記憶するメモリ
    で構成され、内部状態とヘッドから読み出した情報の組み合わせに応じて、次の動作を実行する。
    • ヘッド位置のテープの情報を読みとる
    • ヘッド位置のテープに情報を書き込む
    • 機械の内部状態を変える
    • ヘッドを右か左に一つ移動する
    上の動作を、機械は内部状態が停止状態になるまで反復して実行し続ける。
    というものです。
    オートマトンの拡張だけあって、似ていますね。
    情報の読み取り(オートマトンで言えば外部からの入力)、情報の書き込み(外部への出力)、内部状態の記憶(内部に「状態」を保持する)、とそろっています。


    実際には「無限に長いテープ」なんてものは存在しませんが、ノイマン型コンピューターでは有限の記憶領域の範囲内での計算を保証する作りになっています。
    ノイマン型とは(再びwikipediaより)


    ノイマン型アーキテクチャの計算機は5つの部分からなる。演算論理装置(ALU)、
    制御装置、メモリ、入出力と、これらを接続する情報経路である。


    ノイマン型アーキテクチャの計算機は以下のようなステップを繰り返し行うことで計算を行う。
    1. プログラムカウンタのさすアドレスから次の命令を読み込む
    2. 命令長さの分だけプログラムカウンタを増やす
    3. 制御装置で命令をデコードする。制御装置は計算機の他の部分に対して命令を出したり、
      繰り返しを行うためにプログラムカウンタの値を替えたり、条件分岐のためにALUの状態によって
      プログラムカウンタの値を替えたりすることができる。
    4. ステップ1へ戻る
    とあります。
    ようやく計算っぽい話(ステップ3.)が出てきました。


    外部からの入力(命令の読み込み)に応じて計算を行うのがノイマン型コンピューター。つまり、計算する為の機械。『計算機』です。
    ここまで書いて(全く厳密じゃない、さわりだけですが)ようやく『計算機』が『計算する為の機械』であるという説明が出来ました。


    ノイマン型アーキテクチャのステップ1,2はマシン語やアセンブラに、ステップ3は構造化言語に、それぞれ関連してきますので、SEならば知っておきたいところです。
    というか、これくらいは知っておかないとプログラミング言語の基本をおさえたとは言えませんので。
    又、ノイマン型アーキテクチャの計算機の5つの部分は、ハードウェアの基本そのものになります。


    さて、ずいぶん大量の情報を垂れ流してしまいましたが、これが初歩の初歩の初歩。
    理解なしでもシステム構築が出来る世の中ですが、理解しておいた方がより良いです。
    続編の予定としては、この書き込みの派生として、それぞれの分野の話を書いていこうと思います。