プログラムについて知ろう

プログラムとは何か(5)~データ編~

  • このエントリーをはてなブックマークに追加

本記事は、プログラムとは何か(4)~メモリ編 ~からの続編です。

ここからは、少し視点を変えて、コンピューターで扱われるデータについて掘り下げてみましょう。

数値

元来コンピューターは、電気のON/OFFパターンを入力したら、それを論理回路に通した結果のON/OFFパターンを出力するだけの計算機でした。その本質は、実は今も変わっていません。

よって、コンピューターが扱う最も基本的なデータはON/OFFパターン、つまり2進数としての数値になります。そして、数値でありさえすれば、2進数というのは単に表記法の一つでしかないので、数値なら10進数でも何進数でも、2進数に可逆変換して、間接的にコンピューターで扱えることになります。

アドレス

データを一時的に入れておくメモリには、その記録単位(通常は8ビット=1バイト単位)ごとにアドレスが割り当てられています。そのアドレスも、先頭から順番に0, 1, 2, 3, ・・・と割り当てられた数値なので、コンピューターで扱うことができます。

即値or参照

それでは上図のように、メモリアドレス 2番地(00000010番地)に、00000100 (10進数の 4 )が記録されている場合を考えてみましょう。

  • 2進数の 00000010 は、10進数の 2 です。
  • 2進数の 00000100 は、10進数の 4 です。

このメモリ状態で、オペランドとして 00000010 を指定した場合、どんな結果が出力されてくるのでしょうか?

NOT計算回路の例

例えば、各ビットの 0 と 1 を反対にする NOT 計算回路になるように論理回路を組み替えるオペコードを 10000000 として、

NOT 2

つまり、

各ビットの 0 と 1 を反対にする NOT オペコードの例

の2行を順次、プロセッサへ入力した場合を考えていってみましょう。

オペランドは数値か?アドレスか?

数値として見た場合

2行目の 00000010 をそのまま数値として見るなら、2 を処理することになり、

NOT 2 の結果は、11111101 になります。

計算の結果の出力先は、アキュムレータ(accumulator)と言われる計算結果専用のレジスタが、プロセッサの標準仕様で用意されています。
このため、オペランドでは特に指定していません。

これをそのまま10進数に直すと 253 。2の補数を使って、128以上の数を負数として見るなら、-3 になります。

NOT論理回路の結果は、それに +1 を足すだけで、元の数値にマイナスを付けた数値と同じになります。
つまりNOT論理回路は、足し算から引き算を生み出す、重要な論理回路なのです。

アドレスとして見た場合

一方、これをアドレスとして見るとどうでしょう?

メモリアドレス2番地を参照

2番地 に記録された中身の 00000100 、(10進数の 4 )を処理することになり、

NOT 2 の結果は、11111011 になります。

これをそのまま10進数に直すと 251 。2の補数を使って、128以上の数を負数として見るなら、-5 になります。

参照と即値

このようにオペランドで、処理対象のアドレスを指定することを、参照(reference)と言います。
逆に、オペランドへ直接入れられた処理対象を即値(immediate)と言います。

実際のオペランドには、直接的に処理対象の数値が入れられる即値よりも、むしろ間接的に処理対象のアドレス数値が入れられる参照の方が多くなっています。その方がプログラムを書き換えずに、データの入れ替えだけで異なるデータを処理できて、便利だからです。また、即値で扱えるデータの大きさは、せいぜい1~数バイト程度が限界なので、大きなデータはたとえ入れ替えることがなくても、もともと即値で扱うことができません。

オペランドの扱い方は、オペコードの仕様の一部

ただしマシンコードでは、オペランドに「番地」のような目印をつけて数値かアドレスかを区別させることはできません。オペランドを数値として扱うか/アドレスとして扱うか は、その直前に入力されたオペコードによって決められます。

また、オペランドにメモリアドレスではなく、複数あるレジスタの中から1つを指定するマシンコードが入れられるのも、参照の一種と考えられます。

文字列(string)

アセンブリ言語が作られて、マシンコードではなくニーモニックをコンピューターで扱えるようになりました。しかし、ON/OFFパターンしか入力できなかったはずのコンピューターは、どうやってニーモニックを読めるようになったのでしょうか?

文字コードとグリフ

その答えは、「文字コード」というアイディアにあります。コンピューターで使う文字1つ1つに数値のコードを割り当てたのです。例えば、

アラビア数字の”1″という文字には、
00110001 (10進数の49)
アルファベットの”A”という文字には、
01000001 (10進数の65)
アルファベットの”a”という文字には、
01100001 (10進数の97)

この “1” や “A” や “a” のように、1つの文字コードに対応した1つの文字をグリフ(glyph)と言います。

同じグリフには毎回同じ文字コード、異なるグリフには異なる文字コードとなるように、グリフと文字コードとの対応表が作られました。(ASCIIコード表など)

つまり、コンピューターは相変わらず2進数の数値しか処理できないままでも、文字コードという2進数をコンピューターに扱わせることで、文字も数値と同様に扱えるようにしたのです。そして文字コードは、人間が関わる時だけ、文字として見えるように機械的に変換されます。

では、実際に人間が関わる、文字の入出力はどうなっているのでしょうか? 以下では、人間が操作するキーボードによる文字入力と、人間が文字を見るディスプレイ出力について、見ていきます。

キーボード入力

キーボードのしくみは簡単です。キートップ(キーボードのキーの上面)には、 “A” や “1” などの文字が描かれていますが、コンピューターにしてみれば、そこに何が描かれているかは読めませんし、関係がありません。

ただ、キーボードが

  • “A” のキーを押すと、 01100001 の信号をコンピューターに送る
  • “1” のキーを押すと、 00110001 の信号をコンピューターに送る
  • “Shift” キーを押しながら “A” のキーを押すと、 01000001 の信号をコンピューターに送る

というように、キートップのグリフに対応した文字コードを送るようにさえなっていれば、人間の思い通りの文字コードをコンピューターに入力できるのです。

ディスプレイ出力

ディスプレイは、キーボードよりもだいぶ高度です。もっとも単純化したディスプレイであるランプから、少しずつ高度化していき、現在の標準的なディスプレイになるまでを見てみましょう。

ランプ

ランプは点灯/消灯の2状態が基本です。これは、1 と 0 のビット情報に対応付けられます。

電卓の液晶画面

次に、いくつかのランプを並べて見ましょう。横一列に8個並べれば、8ビット=1バイトの情報を表示できます。これを横一列ではなく、日の字型に配置した7本の太線の点灯/消灯で一桁の数字を表すのが、単純な電卓の液晶画面です。

電卓の8

画像表示ディスプレイ

ランプを縦横にたくさん並べれば、白黒の画像を表示することもできます。たくさん並べると場所を取るので、1個1個のランプを小さく小さくします。縦横に並んだ小さな小さなランプ(画素、ピクセルまたはドットと言います)が、縦100個×横100個、全部で1万個くらいになると、そこそこ簡単な画像を表現できます。

赤ちゃんの画像
100×100画素の白黒画像

なお、1万個の全ランプを一度に点灯/消灯させようとすると、配線も1万セットくらい必要になってしまいます。これはかなりの設備投資です…

走査型ディスプレイ

しかし、一度に点灯/消灯するのはあきらめて、順番に1個1個、点灯/消灯させていくようにすれば、配線は1セットで済みます。このように順番にランプを操作していく方式を走査(raster scan)と言います。走査順は通常、英文の文字の並びと同じ順(横書き式)になっています。それは、以下のような順番です。

  1. まず左上が出発地点となり、そこから右へ順番に、右端まで。この一行が一本の走査線になります。
  2. 走査線の右端まで来たら、一行下の左端へ移り、そこからまた右へ…と何本も何本も、一番下の走査線まで走査を繰り返します。
走査

この走査順に合わせて、順番どおりに点灯/消灯の情報を並べた画像データを、ビットマップ(bitmap)と言います。文字通り、一筋のビット(bit)情報を、平面に配置(map)していましたね。これは電話線一本で画像を送るFAXの基本動作でもあります。

高精細ディスプレイ

単純な点灯/消灯だけでなく、明るさの度合い(輝度)も細かく指定できれば、より精細に画像を表現できます。

グレースケール
明るさの度合いを細かく指定

また、白色ランプの点灯/消灯では、白黒の画像しか表現できませんが、3原色の小さな小さなランプを縦横均等に並べて、各ランプの輝度調整をすれば、カラーの画像も表現できます。

3原色から様々な色を表現
3原色の度合いを調整することで様々な色を表現できる

こうしてハードウェアとしてのディスプレイの進化に合わせて、ビットマップデータにも輝度や色合いの情報が加えられ、より高精細な画像を記録・表現できるようになりました。

動画再生ディスプレイ

では、ディスプレイはどのくらいの速さで画面を走査しているのでしょうか?仮に画面全体の走査に数秒もかかっていれば、目でその動きを確認できるでしょう。しかし、0.01秒レベルの速さになると、人間の目には画面全体が一度に表示されているように錯覚されます。この1画面分の全走査を1フレームと言います。(「額縁」と同じ英語の frame です)

何フレームもの画像を高速に連続して再生させれば、パラパラ漫画や映画フィルムのように、動画になります。こうしてフレームデータを連続してつなげたものが、動画の映像データになります。 現在は、1秒あたり30フレーム(1フレーム約0.033秒)が標準映像になっています。

インターレースとプログレッシブ

なお、映像データを1フレームずつ送らずに、1走査線飛ばしの半フレーム、つまり 奇数番走査線の半フレーム/偶数番走査線の半フレーム を交互に送る方式をインターレース(interlace)方式と言います。インターレースにすることで、データ送信速度が遅い場合でも、滑らかな動きに見せられる場合があります。

1走査線飛ばしのインターレースに対して、全走査線を飛ばさず毎回順番通りに操作する方式をプログレッシブ(progressive)方式と言います。十分なデータ送信速度があれば、プログレッシブの方が、高画質になります。

OSでの処理

キーボード入力のしくみより、キーボードの”A”を打てば、コンピューターに 01000001 が入力され、メモリへ新たに 01000001 が記録されます。こうした入力受付からメモリ記録までのような共通処理は、OSの役目になります。

例えば、文字 “A” をディスプレイ画面に表示する場合、OSは以下のように動きます。

  1. あらかじめ、各グリフ用の画像データ(フォントデータ)をメモリにロードしておく。
  2. 文字コード 01000001 に対応するグリフ “A” のフォントデータとその表示位置情報をグラフィックス処理回路へ送る。
  3. グラフィックス処理回路で、このグリフ “A” のフォントデータを、基になるフレームデータ内のあるべき位置に合成し、ディスプレイに送るフレームデータを完成させる。(レンダリング)
  4. 完成したフレームデータの前後をつなぎ、連続した映像データとしてディスプレイに送る。

こうして、ディスプレイ画面のあるべき位置に “A” の文字が映し出されます。

なお、グラフィックス処理回路とは、プロセッサ内にある論理回路の一種で、パイプライン(多重並列配線)により、画像処理を効率的にできる回路のことです。CPUとは別に、GPU(Graphics Processing Unit)というグラフィックス専用プロセッサをコンピューターに搭載する場合もあります。

画像(image)

画像出力

上記、文字列に関してのOSでの処理のポイントは、1. で画像データがすでに用意されており、2. 以降は指定された画像データをディスプレイに出力するまでの処理を示しているだけということです。

したがって、文字に限らずディスプレイへ出力する画像はすべて同じ手順、つまり以下の3ステップで処理されます。

  1. 画像データとその表示位置情報をグラフィックス処理回路へ送る
  2. グラフィックス処理回路でレンダリング(画像合成したフレームデータ作成)を行う
  3. フレームデータを連続して、グラフィックス処理回路からディスプレイに送る

画像データ

では、画像データはどういうものかというと、画像データには、ラスタ(raster)データベクタ(vector)データの2種類があります。

ラスタデータ

raster は、熊手の掻き跡のことで、走査線像を意味します。したがって、ラスタデータは、ピクセルごとの色データをあらかじめ走査順に合わせて記録してあるビットマップのようなデータになります。デジタルカメラやスキャナによる記録も、その場でラスタデータが作られます。色データの例としては、以下のようなものがあります。

RGB
光の3原色=赤(Red)・緑(Green)・青(Blue)それぞれの度合いを数値で表したデータ
CMYK
印刷用インクの4原色=シアン(Cyan)・マゼンタ(Magenta)・イエロー(Yellow)・ブラック(blacK)それぞれの度合いを数値で表したデータ
HSL
色の3要素=色相(Hue)・彩度(Saturation)・明度(Lightness)それぞれの度合いを数値で表したデータ

なお、それほど色構造が複雑でない画像には、圧縮変換を施すことで、データ量を少なくすることができます。

ベクタデータ

ベクタとはベクトル、つまり向きと長さを持った線のことです。直線や曲線、面などの図形は関数で表現でき、関数はベクトル(描線)の集まりとして表現できます。ベクタデータは、数学的な関数グラフの座標に相当する各ピクセルへの描線(色データの割り当て)データを、順次記録したデータです。

ラスタデータとベクタデータの比較

ベクタデータは、ラスタデータのようなピクセルごとのデータを持たず、関数データとそれに沿った色データだけを持ちます。各ピクセルは、レンダリング段階で関数計算により、色データを割り当てられ、ビットマップに変換されます。(この変換処理をラスタライズと言います。)

このため、画像サイズを拡大(ピクセル数を増殖)しても、同じ関数の再計算によってあるべき線が引け、ラスタデータよりも、あるべき画像をうまく再現できます。

一方、複雑な色構造を持つ画像をベクタデータで表現しようとすると、必要な関数の種類が膨大になり、並行処理できない計算が多くなります。このため、グラフィックス処理回路の性能を上回るフレーム変化が起こるとそれについていけず、ディスプレイ画面上の映像に遅延や欠落などが生じます。

音声(audio)

スピーカーとマイクのしくみ

音声は、ディスプレイを使わずに、スピーカーを通して出力されます。スピーカーは、スピーカーの中心にあるコイルを電磁力で振動させ、音を発生します。マイクからの入力データも電磁力の振動です。

アナログデータとデジタルデータ

よって、その電磁力の振動変化を記録したものが音声データになります。しかし、マイクやスピーカーが扱えるのはアナログの音声データだけです。一方、コンピューターが扱えるのはデジタルデータだけです。

そこで、コンピューターでの音声データの利用にはデジタルデータとアナログデータを可逆変換するコンバーター(converter)が使われます。

動画(video)

動画データは、基本的には画像データを連続させたフレームデータです。(監視カメラ映像など)

コンテナファイル

しかし、映画やテレビの影響もあり、フレームデータに音声データや字幕データなども同期して再生できることが望まれます。よって、動画データは単独で扱われることよりも、これらの別種データと共にひとまとめにしたパッケージデータで扱われることが多くなっています。このパッケージデータを記録したファイルのことをコンテナファイルと言います。

データ圧縮(compression)

画像データに、より細部まできれいな高画質を記録しようとすると、ピクセル数を増やす必要があり、データ量が膨大になります。

音声データも、より微細な振動変化をとらえた高音質を記録しようとすると、時間当たりのデータ量が膨大になります。

そこで、高画質・高音質をより小さなデータ量で記録するための工夫として、データ圧縮という技術が使われます。情報量を変えずに、データ量だけ小さくなるように変換しているので、「圧縮」という言葉が使われます。

データ圧縮には、

  • データ中にある不変部分をひとまとめにした、元に戻せる可逆圧縮
  • 人間にとって不変と感じられる部分をひとまとめにした、元に戻せない不可逆圧縮

の2種類があります。

不可逆圧縮では、人間にとっての情報量は変わりませんが、コンピューターにとっての真の情報量が欠落するため、元に戻せなくなります。

データ圧縮は、全てのデータを同じように圧縮できるわけではなく、対象データの特徴(どういう不変部分がどれだけあるか)によって、利用すべき圧縮技術が異なります。

例えば、数本の斜め線のように構成が単純なラスタデータをベクタデータに変換することは、良好な可逆圧縮になります。

コーデック

このように、データを圧縮すると、そのままでは再生(人間向けの出力)ができない形式になります。このため、再生の際には圧縮されたデータの解凍(圧縮前と同じ形式に逆変換すること)が必要になります。

この圧縮と解凍の形式変換のセットをコーデック(codec)と言います。

非可逆圧縮では情報量が減っているため、データの逆変換はできませんが、形式としては元のデータと同じ形式に戻します。

プログラム内で扱われるデータ

全てのデータはバイナリデータに変換

この記事の冒頭で、コンピューターは基本的に電気のON/OFFパターン(2進数の数値)しか扱えないということを書きました。

でも実際は、文字列や画像、音声、動画など、様々な数値以外のデータまで、コンピューターで扱えているように見えます。しかし、それらはコンピューター外での見え方で、コンピューター内ではやはり数値に変換されたデータが扱われているのです。

この変換後の、電気のON/OFFパターンだけで表せる2進数の数値を、バイナリデータ(binary data)と言います。マシンコードのデータは、全てバイナリデータである必要があります。

特殊な数値もバイナリデータに変換

また、数値と言っても、ON/OFFパターンだけでは負号(マイナス)や小数点が使えません。

このため、負整数や小数のデータも、負号(マイナス)や小数点無しの数値(バイナリデータ)に変換して、処理します。

負整数から変換する例

[10進数の -3 ] ⇒ [2進数の -11 ] ⇒ [負号無し2進数の 11111101 ]

負整数は、多くの場合、正整数と同じ扱いができる方式【2の補数(two’s complement)】が採用されています。

2の補数
2の補数の考え方

例えば8ビット制限のデータ(00000000~11111111)は、10進数の 0 ~ 255 (正整数)を表すのではなく、(負整数) -128 ~ 127 (正整数)を表す整数データ(integer)として扱われます。

この方式は、11111111 に 00000001 を足すと、繰り上げビットの「桁あふれ」を無視すれば 00000000 となり、ループしてまた 0 に戻ることを利用しています。

つまり、(負整数) -128 ~ -1 は 10000000 ~ 11111111、0 は 00000000 、(正整数) 1 ~ 127 は 00000001 ~ 01111111 に、それぞれ変換されることになります。

負整数は、10進数だけで考えると「256を足した数値に変換される」と考えることもできます。実際、-128 は、256 足した 128 (10000000) に変換され、-1 は、256 足した 255 (11111111) に変換されます。

小数から変換する例

[十進数の 0.125 ] ⇒ [二進数の 0.001 ] ⇒ [小数点無し二進数の 00111110000000000000000000000000 ]

+/-小数点シフト小数部分

上の例では、
十進数表示なら、 0.125 = 1 / 8 = + 1.00000000000000000000000 × 2 の -3
二進数表示なら、 0.001 = 1 / 1000 = + 1.00000000000000000000000 × 10 の -11

累乗の負整数を負号無しに変換すると、
+ 1.00000000000000000000000 × 10 の (01111100 – 01111111)乗  【黒字部は固定値】

多くのコンピューターで採用されている変換方式【浮動小数点法(floating-point)】の場合、広範囲の数をそこそこの精度で扱えるようにしているため、小さな数でも、データの桁数はたくさん必要になります。(上記は32ビットアーキテクチャの例)

データ型

そして、バイナリデータはプロセッサで処理され、また別のバイナリデータ (処理結果) になりますが、処理結果のバイナリデータは、基本的にまた変換前(バイナリデータ化前)と同じタイプのデータとして、復元できなければなりません。

この処理後の結果がまた戻るべき、バイナリデータ化前のデータのタイプを、データ型と言います。

データ型の例: 整数型、浮動小数点数型、文字列型、日付型、ブール型… etc.

ブール型

プログラミングをする人以外にはイメージしづらいものとして、ブール型というデータ型もあります。ブール型は、TRUEまたはFALSEのどちらかの値しかとらないデータ型です。「〇か?×か?」という論理判定をブール代数という数学としてまとめた、ブール(Boole)さんの個人名から来ています。「ブールさんが考えたもの」という意味で、ブーリアン(Boolean)型と言われることもあります。

一般的には、1ビットのバイナリデータに変換され、〇ならTRUEで “1”、×ならFALSEで “0” となりますが、そうならない環境もありますので、注意が必要です。

バイナリ型

なお、画像や音声のように文字化されていないデータを、高級プログラミング言語で扱う場合、言語仕様として画像型や音声型といったデータ型を作らずに、バイナリ(binary)というようなユルいデータ型で扱われることが多くなっています。

バイナリ型とは、そのままバイナリデータとして扱えるようになっているデータのことで、バイナリデータはすべてバイナリ型です。
逆に、数値や文字列のように文字化されているデータテキストデータとも言います。

画像や音声のように文字化されていないテキストデータは、通常、文字だけで書かれるソースコード上に表記することができません。そのため、他のデータ型と同じようにして扱うことはできないのです。

そこで、画像/音声は、画像/音声用のファイルフォーマットに従って記録された画像/音声データ、つまりファイルを、プログラムでの取り扱い単位とします。

そのファイルが、どんなファイルフォーマットに従って記録されているかは、通常、ファイル名に含まれる拡張子や、ファイルデータの冒頭(ファイルヘッダ)で判別できるようになっています。

プログラムでのファイルの取り扱い

ファイルのオープン

プログラムでファイルを扱うためには、まず、プログラムからシステムコールを使って、ファイルの中身をメモリにロードしておく処理が必要になります。この処理をファイルのオープン(open)と言います。

ファイルをオープンするシステムコールでは、ファイル名オープンモード を指定します。

ソースコード中での記述イメージ: open ( ファイル名 , オープンモード )

オープンモード

オープンモードとは読み/書きの制限のことで、以下の3種のモードを組み合わせて指定します。(例:RB+ = 読み書き併用バイナリモード)

R / W / A モード
R
読み取り(Read)モード
W
上書き(Write)モード(元の中身を削除して新規書き込み)
A
追記(Append)モード(元の中身は削除されない)

上書きと追記をまとめて「書き込み」と言い、さらに読み取りもまとめて「読み書き」と言います。

B モード
B
バイナリ(Binary)モード(通常、バイト単位で読み書き)
省略
テキストモード(通常、行や文字単位で読み書き)
+ モード
+
更新モード(読み書き併用)
省略
専用モード(読み取り専用/書き込み専用)

ストリーム

オープンによってファイルがロードされたメモリ領域を、ストリーム(stream)と言います。

英語の stream は本来「続く流れ」と言う意味で、ストリームは、終わりが見えない現在進行形のデータ入出力にも対応します。

バッファ(buffer)

終わりが見えない現在進行形のデータ入出力にも対応するため、ストリームでは、ファイルの最後まで一気にではなく、プログラムからの読み書き状況や入出力状況に応じて、段階的に中身を入れ替えていく読み書き方(バッファリング:buffering)ができるようになっています。

bufferとはショック吸収のための余地のことです。プロセッサと入出力機器との間で、ストリームが治水用のため池のようになり、一気にデータが入ってきてあふれたり、急に流すデータが無くなったりするのを防ぐ役割を果たす様子を、バッファと言っています。

ファイルオープンのリターン(戻り)

システムコールによるオープンが終了すると、元のプログラムへ、あるメモリ領域への参照がリターンされてきます。

そのメモリ領域には、ストリームのメモリアドレスやストリームのサイズ、モードなど、オープンに関係した情報が、カーネルによって記録されています。

このメモリ領域FILE型オブジェクト(FILE型構造体)と言い、そこへの参照ファイルポインタと言います。

[ファイルポインタ(シンボル)]→[FILE型オブジェクト(ストリーム情報)]→[ストリーム(ロードされたファイル)]

オープンで指定されたファイル名が存在していなかった場合、書き込みではそのファイル名で新規ファイルを生成し、読み取りでは特別なファイルポインタ(NULLポインタ)を戻します。

NULLポインタは、参照先が必ず空っぽ(無)として扱われる特別な参照です。

プログラムによるファイルの読み書き

プログラムからファイルへの読み書きは、ストリームへの読み書きになります。

この時の読み書きは、オープンモードに従った読み書きに制限されます。

Rモードでは、ストリームの内容を変更できません。

Rモード以外では、即座にストリーム(バッファ)の内容を変更できますが、その場合でも、ストレージに記録されているファイルの中身は即座に変更されません。

ストリームの内容変更にいったん一区切りついたところで、ストリーム(バッファ)の内容をストレージに記録されているファイルへ一気に反映させる処理を、フラッシュ(flush)と言います。

ファイルのクローズ

読み書きが終わったファイルは、クローズ処理で閉じます。

この時、Rモード以外ではストリームの内容がフラッシュされ、ストリームが初期化(メモリ領域が解放)されます。

まとめ

コンピューターが扱うデータは、すべて電気のON/OFFパターンになります。これをバイナリデータと言います。

バイナリデータは、2進数の数値としてみることができ、数値以外のデータ、つまり、文字や画像や音声などのデータも、数値化することで、バイナリデータへ変換でき、コンピューターで扱えるようになるのです。

数値でも、負整数や小数は、負号や小数点といった記号を使う代わりに、整数型や浮動小数点数型といった特定のデータ型を指定することで、別の数値(バイナリデータ)に変換し、処理をしやすくしています。

画像や音声などの非テキストデータは、バイナリ型として、ファイル単位で扱います。その時に、ファイルの一部または全体を記録しておくメモリ領域をストリームと言います。

ストリームは、終わりが見えない現在進行形のデータ入出力にも対応するため、バッファの役割も果たしています。

ストリームは、FILE型オブジェクトで管理され、プログラムからは、FILE型オブジェクトを参照するファイルポインタで指定します。

個々のデータには、それを識別するための名前も必要です。データの識別方法については、プログラムとは何か(6)~シンボル編~に続きます。

  • このエントリーをはてなブックマークに追加

コメントを残す

*

CAPTCHA