情報処理概論
工学部 物質科学工学科
応用化学コース
機能物質化学クラス

第３回
２００５年 ４月２８日

○ 計算機に関する基礎知識
・ Fortranプログラムの基本構造
・ 文字や数値を画面に表示する
・ コンパイル時のエラーへの対処ハードウェアとソフトウェア
z ハードウェアz 計算，記憶等を行う機械

z ソフトウェア
z ハードウェアに対する命令
z データ

ソフトウェア（命令）がないとハードウェアは動かない

計算機の構造
入出力装置
ハードディスク
ディスプレイ
キーボード
Etc…

記憶装置(メモリ)
プログラム
データ処理装置（CPU)
制御装置

演算装置

イメージとしては…
メモリ（主記憶装置）

演算装置
制御装置

ハードディスク

入出力装置

計算機内のデータ： 全て２進数
z

２進数＝０と１だけで数値を表記する方法
２進数

z

００１１

何故 ２進数？

１０２

計算機の動作に利用される
電気，磁気，光による保存・伝達に適しているから
z 例えば，電圧が高い＝１，低い＝０z 計算機の回路を単純にできるから

１１３１００４zz

１０進数

２進数だけで計算や文字操作や画像編集ができる？

２進数の計算• 積
0×0=00+0=0 0+1=1
1×0=0
1+0=1 1+1=10
計算回路の実装が簡単

z 和

計算例：
101+100----1001

111
+010
---1001010
×110---000010
010-----01100

0×1=0
1×1=1

111
×110
---000111
111----101010

数字以外のデータも数値化
z

文字： それぞれの文字に対応する番号を使用
A

６５

a９７

Hello

７３ １０１ １０８ １０８ １１１z

画像： 点毎に赤・緑・青の明るさを数値化z

音声： 一定間隔の周波数毎に強さを数値化

結局，すべてのデータが２進数で扱われる

プログラムも数値化
z 例：

変数 a と b の和を計算

z Ｆｏｒｔｒａｎ：

a+bz 機械語：
z aの格納場所から値を取り出し，計算スペース１へ
z bの格納場所から値を取り出し，計算スペース２へ
z 計算スペース１の値に計算スペース２の値を加算機械語と命令コードz

機械語の作成にはハードウェアの命令コード表を利用

命令コード

動作

１

加算２

積算

３

値の取り出し４

値の格納

zaの格納場所(番地１００)から値を取り出し，計算スペース１へ

３

１００ １

zbの格納場所(番地２００)から値を取り出し，計算スペース２へ

３

１００ ２

z

計算スペース１の値に計算スペース２の値を加算

１１２

2進数の処理
電圧の高低で１と０を伝達
z 入力信号（=プログラム，データ）に応じてプロセッサ内部の電圧状態を変更したり，信号を出力したりして計算を進める．
z1
1
3 200
3 100221

初期状態

1
1
3 200

2
2

スペース１にaの値が入った状態

1

12

スペース１にaの値スペース２にbの値が入った状態

a+bの結果プログラムのコンパイルから実行まで
ハードディスク処理装置（CPU)

ソースプログラム制御装置program test...
a+b...

演算装置

レジスタ（計算スペース）
コンパイル

実行ファイル... 3 100 1 3 200 2 1 1 2 ...

実行開始

記憶装置(メモリ)
プログラム... 3 100 1 3 200 2 1 1 2 ...

CPUの性能z「動作クロック周波数」と「ＣＰＵの名前」
でなんとなく分かる
動作クロック周波数z 計算機内部の状態変化の周期→ 大きいほど速い
z 単位：ＭＨｚ（メガヘルツ） １，０００，０００Ｈｚ
ＧＨｚ（ギガヘルツ） １，０００ＭＨｚz ＣＰＵの名前
Pentium4 > Athlon, Pentium III > Celeron, Duronz 命令の実行方法や計算スペースの大きさ等に違い
zz

計算機全体の性能には，他の装置の要素（メモリの容量や種類等）も大きく影響OS(オペレーティングシステム）z 全てのプログラムが効率よく実行できるよう資源の割り当てを調整する
z

複数のプログラムを「見かけ上」同時に実行
z 実は1/1，000秒程度の間隔でプログラムを切り替え

プログラム
プログラム
プログラム
プログラム

OS計算機プログラミング言語とコンパイラz

プログラミング言語は人間にとって読み書きが容易なプログラムの記述方法→ 計算機は直接実行できないz

そこで，プログラミング言語を機械語に翻訳するソフトウェア＝ コンパイラを利用．

Fortran program test
implicit none
write (*,*) 'Hello'stop
end program

機械語 3
翻訳

100
1
3200
2

CPU実行

Fortran言語z

最も古いプログラミング言語の一つzz

１９５７年に最初のコンパイラ開発

特徴：
覚えることが比較的少ないz 過去のプログラムが豊富に蓄積
z 特に数値計算に適した機能が充実
zz

Fortranの歴史
z

Fortran II(1958)→ Fortran IV(1962) 後の Fortran66→ Fortran 77(1977)→ Fortran90(1991)→ Fortran95(1998) → Fortran2000

Fortran 77 と Fortran90
z 文法に大きな変更
z 主に書き易さと実行効率の向上が目的
z しかし研究室等には Fortran 77 で書かれたプログラムがまだたくさん残っている（現在利用可能なほとんどのコンパイラは両方サポート）z 本講義では Fortran90 を扱う
z 今後の主流

計算機のプログラムとはz

仕事の手順書z計算機で処理できるように記述したもの

z

記述方法に関する規則＝文法z

この講義では，問題に応じて計算機用の解決手順（アルゴリズム）を考え
z 文法に従ってプログラミング言語で記述zするための知識を習得する．

・ 計算機に関する基礎知識○ Fortranプログラムの基本構造
・ 文字や数値を画面に表示する
・ コンパイル時のエラーへの対処Fortran90のプログラム例

program hello
write(*, *) 'Hello, Fortran.'stop
end programFortran90プログラムの基本的な形
z どんなプログラムにも必ず書く３行

program プログラムの名前

stop
end program

プログラムの内容に応じて追加

program と end programz

主プログラムの開始と終了を指定
主プログラム： プログラムの主体⇔ 副プログラム： プログラムの中で呼び出される関数やサブルーチン（ずっと後で説明）
z どんなプログラムでも必ず主プログラムの最初から実行が開始される
zzプログラムの名前に関する決まり：
使用できる文字は英数字と _ だけz 空白を入れない
z 先頭は英字z 長さは ３１文字以内
zstop 文
z 実行を停止

z end program 直前以外でも必要に応じて記述可能

プログラムの書き方
z

大文字と小文字：zFortranでは大文字と小文字は区別しない
z ただし，全角と半角は区別するので注意．
例） . と ． は別の記号．
 全角文字を使うのは画面に出力する文字くらい


z

空白：
zz

write(*, *) 'こんにちは'１個でも複数個でも働きは同じ
z 見やすさを考えて調整
z 命令や変数の名前を分けないよう注意（pro gram，writ e 等）．

改行
z

１行でも複数行でも働きは同じ
z 見やすさを考えて調整(通常，プログラムの意味的なまとまり毎に空行)

空白、空行の例
program kuku
implicit none
integer :: i,jdo i=1,9write(*, '(i4,":"$)') i
do j=1,9write(*, '(1x, i4$)') i * j
end dowrite(*, *)end dostop
end program

・ 計算機に関する基礎知識
・ Fortranプログラムの基本構造○ 文字や数値を画面に表示する
・ コンパイル時のエラーへの対処write文z

文字列や数値の表示
write(*,*) 表示内容z

文字列： ' または " で囲むzz' や " を表示したいとき：
write(*, *) "I'm a student."
write(*, *) 'She said, "Hello." 'z もしくは，直前に ¥ を書いても良い.
write(*, *) 'I¥'m a student.'

数種類の内容を表示したい場合は , で区切る.
write(*, *) 'Total = ', 1000, ' yen.'

・ 計算機に関する基礎知識
・ Fortranプログラムの基本構造
・ 文字や数値を画面に表示する○ コンパイル時のエラーへの対処コンパイル時のメッセージの意味
z 正常終了→ 何も表示されない% f90 hello2.f90%z 異常終了→ 以下のようなメッセージ表示% f90 hello2.f90
Fortran diagnostic messages: program name(test)
jwd1003i-s "hello2.f90", line 2: 文字定数が途中で終わっています.
% f90 hello3.f90
Fortran diagnostic messages: program name(main)
jwd1302i-s "hello3.f90", line 1: この文は,FORTRANの文とはみなせません.
% f90 hello4.f90
Fortran diagnostic messages: program name(main)
jwd1333i-s "hello4.f90", line 1: 名前であるべきところが名前でありません.

デバッグ：プログラムの間違い修正
z エラーメッセージから間違いの場所や内容を推定% f90 hello2.f90
Fortran diagnostic messages: program name(test)
jwd1003i-s "hello2.f90", line 2: 文字定数が途中で終わっています.

2行目
program hellowrite(*, *) 'Hello, Fortran.
stop
end program

’ が無い

デバッグ
z エラーの内容
z 文字定数が途中で終わっています→ ' や ” の対応関係を調べる
z 区切り記号が正しくありません→ （ ） 等の対応関係を調べる
z この文はFortranの文とはみなせません→ 綴り違いを調べる
z 名前であるべきところが名前でありません→ プログラム名や変数名の先頭文字が数字になっていないか調べる

演習
z 作業ディレクトリへの移動
z プログラムの入力
z コンパイル（デバッグ）
z 実行
z 応用：

１．表示文字列の変更
２．複数行の表示

作業対象ディレクトリへの移動 cd/% cd fortran/april
home00nen
te199999
fortranapril

カレントディレクトリ

ファイルの編集

emacs% ls./../% emacs hello.f90/

プログラム編集

home00nen
te199999
fortranhello

hello.f90% ls./%../

hello.f90

内容
program hellowrite(*, *) 'Hello, Fortran.'stop
end program

プログラムのコンパイル/実行
コンパイル

間違いを修正したら再コンパイル．

% f90 hello.f90 –o hello

エラーメッセージが表示された？
NO

再編集
YES

% emacs hello.f90

実行% ./hello

結果がおかしい、もしくはエラーメッセージが表示された？
NOCongratulations !!

YES応用１： 表示文字列の変更
program hellowrite(*, *) 'All you need is love.'stopend program
文字列は全角（漢字やひらがな）でも可．
但し,他の部分では一切不可なので半角／全角の切り替え忘れに注意．

応用２： 複数行の表示
program hellowrite(*, *) 'Yesterday,'write(*, *) 'All my trouble'
write(*, *) 'Seemed so far away.'
stopend programEmacsのコマンド（追加）
キー操作

意味

C-k

カーソルから右を切り取り

C-y

直前に切り取った部分を貼り付け

C-a

行の先頭に移動

C-e

行の末尾に移動切り取りと貼り付けを利用した行のコピー

注意：カーソルは行の先頭に置く
program hello■write(*, *)*) 'All'All youyou needneed isis love.'love.'
stopwrite(*,endstop
program*) 'All you need is love.'write(*,endstopprogram
end program

C-kC-kC-yC-ywrite(*, *) 'All you need is love.'
改行連続行のコピーz 連続行の切り取り：

C-k を連続して押すと連続行を切り取り可z C-k 以外の操作を行うと連続行の切り取り終了
z C-y を押すとその時点で切り取られた連続行を全て貼り付け
z C-k 以外の操作を行った後再び C-k を押すとそれまでの切り取り分はクリアされる

次回
z 計算

四則演算
z 数学関数z 計算結果の表示z