プログラムはどうやって動く?

記事
IT・テクノロジー

プログラムはどうやって動く?

プログラムがどうやって動いているかご存知ですか?知っているとプログラム開発にも役に立ちます。この記事ではプログラムを動かす仕組みについて紹介します。


プログラムが動く仕組み

プログラミングの学習をされている方でも、プログラムがどのように実行されるかを説明している情報は意外に少ないので詳しい仕組みはご存知ない方も多いかと思います。

一言で言えば、プログラムは「CPU」が実行します。これは、何となく誰でも知っている事だと思います。しかし、プログラムをどのように CPU に渡しているかというと、よくわからないという場合も多くなります。

そもそも、「プログラムとは何か?」と言うのも説明するのは意外に難しいものです。 プログラムは、コンピュータ(CPU)に仕事をしてもらうための指示書です。実際にコンピュータ(CPU)にやって欲しい事を書いたものがプログラムというのが比較的わかりやすい説明です。

現在主流の CPU は、簡単に言うと電気のスイッチが入っているか、切れているかの組み合わせでいろいろな計算(データ処理)をする仕組みを作っています。二つの状態(ON か OFF)を使って、コンピュータ内のデータを扱っています。従って、コンピュータに渡すプログラム(手順書)もこの二つの状態で表す必要があります。ON の状態を「1」と OFF の状態を「0」としてデータを作っています。(いわゆる二進数です)

CPU が受け取れるデータはこの二進数だけなのです。したがって、この二進数にコンピュータにやって欲しい仕事を割り当てます。 例えば、「0001」なら足し算、「0010」なら引き算というように数字に処理する内容を割り当てます。こうした割り当て当てた処理を「命令(instruction)」と呼んでいます。これに、処理する数字を組み合わせて手順書にしたのがプログラムというわけです。

ところが、こうした「0」と「1」で表した場合、人間が理解するのは大変です。そこで、人間にもわかりやすい記号を割り当てて、「0001」なら「add(たし算)」のように割り当てて、プログラムでこの記号を「0」と「1」に変換するようにして、開発できるようにしたのが「機械語(assembly languate)」と呼ばれるプログラミング言語です。

これでプログラムが書けそうですが、実は CPU ができるデータ処理は限られていて、基本的にはシンプルな処理に限定されています。

そこで、もう少し複雑な処理を人間にもわかりやすい形で書いて、変換できるようにした物が現在よく使われているプログラミング言語と呼ばれる物です。多くのプログラミング言語が英語圏で作られている事もあって、プログラミング言語は英語に近い言葉で書けるように工夫されています。

こうした書かれたプログラムを CPU がわかる形にしたものを CPU に渡して実行させています。

プログラムはどこにある?

ところで、作成したプログラムはどこにでもあるかご存知ですか? いろいろありますが、現在主流のプログラムは、大きく分けて二つです。

* 実行をするコンピュータにある場合
* ネットワーク上のサーバーにある場合
デスクトップアプリの場合は、実行をするコンピュータやスマホ上にあります。このプログラムを CPU に読み込んで、渡しているのが「OS(オペレーティングシステム)」です。同じ CPU でも、OS が違うとプログラムをどのように渡すかが違ってきます。最新の Mac は ARM という CPU に変わってしまいましたが、以前の Mac は Windows の PC と同じインテル社の CPU を採用していました。したがって、Mac に Windows を入れて動かすことも簡単にできました。しかし、実行するプログラムは、同じ CPU でも、Mac 版と Windows 版では違います。これは、OS が CPU にプログラムを渡す仕組みが違うからです。

デスクトップのアプリは、通常は、OS 上のファイルという形で、端末(PC やスマホ)のディスクドライブに保存されています。 このファイルを、OS の「特別なプログラム」が読み込んで、端末(PC やスマホ)のメモリ上にコピーして、 CPU にプログラムがある場所を教えて実行する仕組みになっています。このメモリにコピーする方法と手順が OS によって違っています。

一方で、Web ブラウザで動作する Web アプリの場合は、プログラム(この場合は、基本的に Javascript)は、ネットワーク上の Web サーバー上にあります。このプログラムを Web ブラウザが指定した URL から、実行する端末の Web ブラウザが利用できるメモリの場所にコピーしてきて Web ブラウザを介して CPU に実行してもらう仕組みになっています。

従って同じことプログラムでも、デスクトップアプリと Web アプリでは動く仕組みが違います。

デスクトップのアプリの場合は、プログラムのファイルがある場所(パス:path)を OS に教えておく必要がありますし、Web アプリの場合は、ネットワーク上の住所(URL・リンク)が必要です。

Web アプリを開発する場合、開発中の実行は、開発用の PC に「仮想の Web サーバー」(localhost)を作って、その仮想サーバーにアクセスして実行する場合が多いので、実際にはネットワークを使っていませんが、仮想サーバーに仮想ネットワークアクセスをしてプログラムを実行する Web ブラウザに取り込んでいます。

Web プラウザーは、基本的に Javascript のコードのみを実行できるようになっています。従って、Typescript で書いた場合には、Javascript に変換しておく必要があります。Web ブラウザは Typescript のプログラムは理解できないためです。

この Web ブラウザの Javascript を実行する仕組みを取り出して、デスクトップアプリとして利用できるようにした物が、「node.js」です。

プログラムを読み込む

Web アプリの場合は、既に上で書いた通り、ネットワーク上の Web サーバーから Javascript のファイルを読み込んで実行します。この仕事は Web ブラウザが行なっています。Web ブラウザ自体は、デスクトップアプリで、OS がプログラムのファイルを読み込んで、実行する端末(PC やスマホ)のメモリに読み込まれます。

従って、作成したプログラムは Web サーバー上におく必要があります。開発用の場合は、仮想のネットワークなので、実際は、開発用の PC 上で実行できる仕組みを使う場合が多いですが、インターネットに公開して運用する場合は、Web サーバーに作成したプログラムをおく必要があります。ファイルを Web サーバーに送る仕組みは、Web ホスティングを提供するサービスが、ネットワーク上の Web サーバーにコピーをする仕組みを提供する場合が保飛んで、あまりこの作業を意識しなくてもできるように工夫だれています。

一旦、Web サーバーにプログラムを置いておけば、あとは、Web ブラウザが面倒を見てくれるので、利用する端末にインストールしなくても簡単に実行できるようになっています。

開発者側で、サーバーにプログラムをおく作業(deployment)を行うので利用者のやることは Web ブラウザを開いて URL を指定するだけでアプリが利用できます。

セキュリティ上の問題

Web アプリは便利ですが、Web サーバーにあるプログラムを誰でも簡単に実行できてしまうので、ある意味ちょっと危険です。 そうした危険を最小限にするために、Web ブラウザで実行する機能には制限がつけられています。

一番大きいのは、実行している端末のリソースには基本的にアクセスできない仕組みになっています。 利用者が意図的に指定したファイル以外にはアクセスできませんし、端末のフォルダの書き込みにも制限があります。 ファイルを保存する場合でも、自由に保存する場所を選べるわけではなく、ブラウザ上のファイルの中身を作成しておいて、Web ブラウザ経由でその中身をダウンロードするという形で保存するのが一般的です。

少し不便ですが、セキュリティを確保するための手段として、こうした制限を設けています。

まとめ

一般的に、作成したプログラムのほとんどが「ファイル」という形で保存されて、それを読み込んで、CPU にわかる形にし他ものを実行する端末(PC やスマホ)のメモリにコピーして CPU に渡しています。

従って、プログラム実行の手順は

1. プログラムのファイルの作成(コンパイルやビルドと呼んでいます)
2. プログラムのファイルを「特定の場所」に保存
3. 別のプログラム(OS や Web ブラウザ)がプログラムを読み込んで実行する端末のメモリにコピー
4. CPU が実行
という流れになります。プログラムをおく「特定の場所」によって、デスクトップと Web アプリに大きく分類する事ができます。

プログラムを開発する際は、どこにプログラムが置かれて、どのように実行されるかを理解していることが大切です。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す