コンピュータにおけるプログラムとはなにか?
おはようございます。またはこんにちは。もしくはこんばんわ。マゲっちSCと申します。愛媛松山は9月10日の朝を迎えました。最近は朝晩が非常に過ごしやすい気温となりましたね。しかし昼間はまだまだ暑い日が続きます。西日本側は10月までお昼は夏の気温になりますので、特に西日本の皆さんはまだまだ熱中症にお気をつけください。
さて、前回のブログではゲームソフトの販売形式が少しずつ変わってきたということをお話させていただきました。ビジネスソフトでもそうですが、事前にある程度の操作感覚がわかっているということは非常に重要ですよね。ユーザもメーカーも納得した上での売買はとても大事なことです。
さて、ゲームソフトもビジネスソフトもユーティリティソフトもウェブサービスを行うためのシステムも、細かく見ていくとコンピュータプログラムによって制作されているわけですが、プログラムとは一体何か皆さんはご存知でしょうか?その存在を知ってはいるものの、定義やどういうものかということを説明できる方はおそらくそう多くはいらしゃらないと私は思います。
プログラムとはコンピュータに与える指示書です。どんなコンピュータでもこの指示書のとおりに動作します。その途中で計算を行ったりその結果を利用して条件を判断し画面に表示するメッセージを変えたりします。例えば皆さんがコンピュータに対して自分の生年月日を入力したとします。するとコンピュータが現在の年月日をOSから取得してきて、皆さんの現在の年齢と誕生日から何日が経過したかを計算して結果を表示するということもできるわけです。みなさんの生年月日を入力するときに使用する入力エリアの形式もキーボードから入力させるのかマウスで選択させるのかを設定するのもプログラムで指定できます。ちなみに計算結果などが違っている場合、その原因はプログラムがおかしいために発生します。コンピュータは与えられたデータをもとにプログラムの内容に準じて計算しますが、計算方法が間違っていれば当然違う結果になります。例えば足し算を掛け算と間違えてプログラムすると当然違う計算結果が出ます。これを不具合やバグと呼びます。これを解消するためにはプログラムの内容を読み、間違っている箇所を修正します。この作業を不具合修正やバグ潰しと呼ぶことがあります。
現在コンピュータ上で動くものはすべて何らかのプログラム言語で制作されています。そのソフトやシステムの規模にもよりますが、店頭販売されているソフトに関してはだいたいどのソフトも数十万行から数百万行くらいのプログラムで制作されていると言われています。なぜそんなとんでもない行数になっているのかということですが、簡単に言うと機能を追加したりメンテナンス性を高めるために人が読みやすいように空白や改行をしているためです。もう1つは正常に動作した場合と以上が発生した場合の2パターンに対しての処理を行う必要があるからです。
まず機能の追加に関してですが、現在のコンピュータの事情としてはインターネットに接続するのが当たり前となっています。現在出ているWindowsもMacOSもLinuxも、iOSもAndroidOSもですがそれの上で動作するソフト全般もすべてインターネット対応になっています。ビジネスで使っているワープロソフトも表計算ソフトも、ゲームソフトもユーティリティソフトもそうですね。個人で制作された超小規模なソフトであればインターネット未対応のものも普通にありますが、明らかに企業が制作したものに関しては有料でも無料でもだいたいインターネットに対応しています。機能の追加や不具合修正は現在では新しいバージョンを作成してネットでリリースします。以前は一度販売したらかなりクリティカルな不具合が発見されない限りはもうそのままでした。一応ユーザサポートはあり、不具合が出たら連絡して解決策を仰ぐという形で行っていたわけです。プログラムは結局のところ人が作るものなので、必ず何らかの不具合は存在しています。インターネットが普及する前はざっくりいうと、細かい不具合はみんな目をつぶって利用していたわけですね。ところが現在では高速で大容量なインターネット回線が普及したため、機能の追加も細かい不具合修正も簡単に行えるようになりました。ただ、ソフトをリリースしたあと半永久的にソフトのサポートをし続けるのは事実上不可能です。古いソフトに使われている技術はどんどん廃れていくので、ある程度時間が経つとサポートを打ち切り新しいソフトへ移行するように勧めます。古い家電に対しての修理の部品が徐々になくなっていき、修理が受けられなくなるのと同じですね。
そして、普通のソフトやシステムであれば正常に動作しているときと何らかの異常が発生したときの処理を分けるのが普通です。正常に動作しているというのは、例えばキーボードで文字を打つとちゃんと入力した文字や数字が入力したとおりに画面に表示されているであるとか、マウスでアイコンをダブルクリックしたらソフトやファイルが開くとか、いわゆる普通に使える状態を言います。異常が発生した場合はキーボードから入力した文字や数字が間違って表示される場合や(漢字などの誤変換は除く)、マウスでダブルクリックしてもソフトやファイルが開かないなど、きちんとコンピュータが動作していない場合をさします。もちろんハードウェアは壊れていないし、設定も正しいということが前提です。
もし仮に異常が発生してしまった場合に、異常を処理するためのプログラムがないとどうなるのか?ということですが、それは実際に起きないとわからないというのが実情です。OS側で以上が発生した場合にそのソフトを強制的に終了させるという事はできるとは思いますが、常に強制的に終了させることができるかどうかはわかりません。Windowsには仮に操作不能になる不具合が発生しても強制的に終了させることができる機能がついています。他のOSも同じ機能はついているはずです。わかりやすい例で言えばファミリーコンピュータでゲームをプレイしている際に何らかの原因でカートリッジがずれて、接触不良が起こりゲームが止まるという状況でしょう。皆さんも経験があると思いますがそうなるともう電源を入れ直すかリセットボタンを押すしか対策のしようがありません。PCでも同様(接触不良はないと思いますが)の状況になるとは思いますが、どちらにせよ電源を入れ直すかリセットする以外になすすべはないはずです。そうなるとワープロや表計算ソフトで制作したデータが保存をしていない限りはすべて消えてしまいます。またコンピュータ・システムを再起動させる必要があり非常に手間です。しかし、異常な動作をしてしまった際にどうするかがプログラムされていると、ある程度のデータ救済措置が取られたり最悪の場合でもコンピュータを再起動させるような状態になるわけではなく、そのソフトだけを再起動させれば復旧したりします。
というわけで、店頭販売されているソフトやウェブサーバのシステムに関しては数十万行とか数百万行のプログラムが書き込まれているわけです。しかし、コンピュータは人間が使っている文字や数字をそのまま理解できるわけではありません。コンピュータが理解できるのはあくまで0と1だけです。つまりONかOFFかだけです。コンピュータが登場して科学技術の発達とともに大容量化するなどの進化を遂げてきてはいますが、結局のところは0と1だけしかコンピュータは理解できません。ただ、実際のプログラムは人が見てわかる形式で書かれています。簡単に言うと半角の英数字とプログラムに使う特殊記号で構成されています。プログラムを書くのはあくまで人ですので、プログラムの記述そのものは人がわかる形式で記述していきます。昔は記述する人も0と1を駆使してプログラムを書いていたそうです。プログラムの技術が発達していき、ルールを守ればある程度人間が見てわかるようなプログラムの方式に徐々に変化していったのです。
0と1だけで構成されたプログラムに書かれている言葉はマシン語と呼ばれます。その名の通りCPUやAPUが直接理解できる言語です。ところが人がプログラムに使う言語はたくさん存在します。昔はアセンブラ言語(アセンブリ言語)と呼ばれるものが存在していました。ただ、普通の人が手を出すのはなかなかに難しい言語です。そして現在ではほぼ使用されないプログラム言語になりました。基本情報技術者試験では2021年現在でもプログラミング言語の問題で選択可能ですが、実際の業務での使用はされていないと言ってもいいでしょう。現在では組み込み系のプログラムでのC言語を使うことが多いようです。
その後BASICがプログラム言語としてスタンダードになります。コンピュータに計算させたいことを英数字で記述できるようになったのはアセンブラ言語からなのですが、それよりももっと人間の話し言葉に近い形式で記述できるようになりました。しかし、コンピュータが理解できるのは0と1で構成されたマシン語です。人間の話し言葉に近い形式のものをどうやって0と1だけのマシン語に翻訳しているのか?ということになりますが、これを実行しているのがコンパイラです。プログラム言語を記述したファイルをコンパイラに通すとマシン語に翻訳(コンパイル)されるわけです。コンパイル前のファイル(ソースファイル)はそのまま残ります。コンパイル後のファイルは基本的には残りません。コンパイラを使用した言語はC言語やC++、Javaなど様々な種類があります。
マシン語に変換する仕組みとしてコンパイラの他にもう1つ存在しているのがインタープリタ(インタプリタ)を使用したプログラム言語です。コンパイラと同じく人間がわかりやすい形式で書かれたプログラム言語を0と1のマシン語に変換するわけですが、コンパイラとは動作方式が違います。コンパイラを使うとどうなるのかということですが、例えば10行で制作されたソースファイルの場合1行目から10行目まですべてを一括でマシン語に変換し一気に最後まで実行します。インタープリタの場合は1行目だけをまずマシン語に変換して実行します。動作が終了したら2行目をマシン語に変換して実行します。このように1行ずつ読み込んでマシン語に変換し、実行したあと次の行へ移動します。そして10行目まで実行したら終了します。このように一括で翻訳を行うのかその都度翻訳を行うのかの違いがあるわけです。インタープリタ言語としてはRubyやPython、JavaScriptやPHPなどがあります。
動作速度としてはコンパイル言語のほうが速いです。すでにすべての翻訳が終了しているためです。インタープリタ言語は1行ずつ変換するためさながら同時通訳のような感じになります。動作速度が速いのであればコンパイラ言語だけで充分な気がします。ではインタープリタの強みは何でしょうか?実はコンパイラはその特性上、プログラムがすべて完了していることが動作の条件になります。プログラムを打っている途中で動作テストをしたい場合でも一度プログラミングを完全に終了させる必要があります。ここで言うプログラミングの終了とは機能の完全な実装ではなく、プログラム言語の文法上という意味です。よくわからない方は実際にコンパイル言語でのプログラミングを経験されるといいでしょう。しかしインタープリタ言語ではプログラミングが完全に終了していなくてもインタープリタに意味が通じれば実行することができます。つまり気になったらインタープリタが理解できるところまでプログラミングを終了させた上で動作テストができるわけです。このように開発者側としてはインタープリタのほうがその都度実行できるのでやりやすいわけです。ただ、実行速度に関しては現在のコンピュータの処理速度を鑑みると身を持って速度の違いを体験するのは不可能です。JavaScriptやPHPはウェブページに組み込まれているプログラム言語ですが実際の処理速度は結構速いです。それよりも結果が返ってくるまでの待ち時間(インターネット回線の速度)のほうが気になると思います。
ウェブページの制作にもプログラム言語が使われていますが、基本的にはマークアップ言語というもので制作されています。ざっくりいうとHTML言語のことであると思っていただいて構いません。タグで囲んだ範囲をハイパーテキストとしてウェブブラウザに表示します。私が大学時代に最初に覚えたのがこのHTML言語です。これに先述したJavaScriptを併用することでHTMLだけではできない表現を使用することが可能になります。例えばウェブサイトのトップページにテキストエリアを作って、その中に「お越しくださいましてありがとうございます」という文章を表示させてスクロールさせることができたり、アンケートなどで必須入力項目が全て埋められていない場合に、ウェブサーバへ接続する前に自身のPC内でちゃんと必須項目が埋まっているかどうかのチェックを行うことができたりします。PHPと併用するとBBS(ウェブ上の掲示板)に新しいスレッドを作成できたり、動画投稿サイトに新しい動画をウェブブラウザから閲覧するためのウェブページを新規作成できたりします。現在のウェブページはHTMLにCSS(スタイルシート)とJavaScript、PHPを併用して制作されているものが多いですね。個人のサイトでもHTMLとCSS、JavaScriptくらいは使用されていると思います。
というわけでプログラムとはどういうものかを簡単にお話させていただきました。現在は多種多様なプログラム言語が存在していて、それぞれに得意不得意があります。自分が作りたいソフトやシステムにあったものを学習するとよいでしょう。1つだけではなく複数覚えられることをオススメしておきます。また、マークアップ言語はプログラミングの基礎を覚えるにはかなり簡単で有用ですので、まずはHTMLから学習されるといいと思います。ある程度プログラム言語の文法になれたら開発環境を導入して効率よくぷる具ラミングできるようにすることもできます。開発環境は現在では無料で入手できるものも多くありますので、まずは実際に使ってなれてみるのが一番です。ウェブを検索すれば各プログラム言語入門自体はすぐできます。昔は書籍を購入して勉強していましたが、最近ではプログラム言語の環境をインストールし、ウェブページを読みながら学習することで無料でぷるぐらむの知識を手に入れられます。
では次回はコンピュータに関する資格試験に関してお話させていただきます。民間のものから国家資格まで様々ですが、基本情報技術者試験についてのお話にする予定です。ご興味がありましたらまたお立ち寄りください。それでは失礼いたします。