プログラミングと聞くと難しそうでなんだか限られた専門家 (プロ) だけが扱う事ができる特別な技術というイメージがあります。ただ、本当に限られた人にしか扱う事のできない技術なのでしょうか?プログラミングを行うのに何か特別な免許が必要というわけではないですよね?
そんなプログラミングについて出来るだけ深く理解していくために、基礎知識としてプログラムの仕組みをまとめてみましたので見ていきましょう。
SPONSORED LINK
▼この記事の目次
プログラミングとは?
プログラミング (Programming) とはコンピュータを制御するためのコンピュータプログラム (Computer Programs) を作る事です。わかりやすく言うとコンピュータがソフトウェアとして機能するための手順書に当あたります。プログラムを作る全ての工程がプログラミングで、プログラムとソフトウェアは同じ意味で扱われます。
プログラミングを行う者はコンピュータを動作させるための手順をコンピュータが解釈出来るような命令文として記述します。コンピュータは命令文通りの手順で動作し、命令文に記述していない部分にあたる動作はしません。
プログラムとアルゴリズム
プログラムの事を調べるとアルゴリズム (Algorithm / 訳…算法) という言葉がよく出てきます。これはコンピュータが正しく動作するための手順です。違う言い方をすると問題までの解決の道のりを具体的に表したものです。さらにわかりやすく言うと「ある問題を解くための明確な手順」がアルゴリズムです。
プログラムはアルゴリズムの手順をコンピュータが理解できるためのプログラミング言語で記述したものとなります。
世の中でアルゴリズムとして成り立つあらゆる事はプログラムによって作る事ができ、アルゴリズムが成り立たないものはコンピュータで再現する事が出来ません。これを決定不能といいます。
例えばギャンブル、人間の考える事はアルゴリズムが成り立ちませんよね。統計のパターンから予想して勝利に近づける事はもしかしたら出来るかもしれませんが。しかし最近ではよく耳にする人口知能があるのでそれでどこまで実現出来るのかはわかりません。
世の中はプログラムで溢れている
一言でプログラムといってもその用途は幅広くあり、「知ってるよ」というものから「えっ?!これもそうなのか」というものまでソフトウェアだったりします。
スマホのアプリ、パソコンのソフトウェアはもちろんの事。OSやブラウザもプログラムの集まりです。日常でいえばテレビ、リモコン、エアコン、炊飯器などの家電にも使われています。さらには自動販売機、ATM、エレベーター、ナビゲーション、飛行機、人口衛星、ロボットなど、これってどうやって動いているの?といったものや便利だと思えるものにはおそらくほとんどプログラムが組み込まれています。
このようにプログラムは現代を生きる私達の生活になくてはならないものですし、幅広い分野で活躍しているのです。プログラミング言語を覚えようとして途中で挫折してしまう人の原因のうちの一つともなっているのが「何を作っていいのかわからない」という事のようです。
プログラミング言語を覚えようとして始めて見ると文字列ばかりズラーっと画面いっぱいに並んでいてなんだか面白くないといった事を感じる人もいるかもしれません。ただこうして世の中に溢れているプログラムを見るとなんだかイメージが沸きやすくなりませんか?
何も最初から高度なプログラム技術を使うわけではなく、最初は画面にテキスト・ボタンを表示させるだけでも良いですし、それに慣れたらボールを転がすだけの単純なゲームでも良いと思います。
普段使っているスマホアプリを見て下さい、懐中電灯アプリ、ストップウォッチアプリ、電卓アプリなどのごくごく簡単な限られた機能だけを提供しているアプリもストアには沢山出回っているはずです。
プログラムの種類
プログラムの種類としては、大きくわけて「低水準言語」と「高水準言語」に分ける事ができます。低水準 (低級) は劣っている、高水準 (高級) だから優れているという意味ではなく低水準はコンピュータに近く、高水準は人間に近いという言語になります。
「機械語」「アセンブリ言語」「高級言語」に分類する事が出来ます。「機械語」がコンピュータにとって直接理解出来る言語、即ち機械寄りの言語になります。「高級言語」はその逆で人間にとって一番理解しやすい、わかりやすい言語という事になります。
「低水準言語」機械語
機械語 (マシン語) はCPUが動作を実行するために一番理解出来る原始的な言語で、コンピュータは機械語を読み取ってプログラムを実行します。バイナリデータ (2進数のデータ) として読み書きする時は16進数として表示される事もありますがこれも機械語です。
機械語はCPUの全ての機能を操作する事ができ人間が機械語を記述する事も出来ますがプログラミングの場面ではアセンブリ言語や高級言語で記述するのが一般的で、機械語を記述するというのは大変で骨がおれる作業です。
というのもCPU内部では人間が理解しずらい0と1だけ (電源がOFFかON) の2進数で表現されているからです。今では効率的な高水準言語でプログラムされるのが一般的ですが、ひと昔前の初期の頃はこの機械語によってプログラミング作業が行われていました。
高水準言語を使用しても最終的にはコンパイル (後述) されてバイナリデータとなるので機械語を知っておくとプログラミングへの理解が一層深まります。
「低水準言語」アセンブリ言語
アセンブリ言語 (Assembly Language) は機械語と同じ「低水準言語」に属します。英単語のAssemblyは組み立てを意味します。
機械語と高級言語の中間地点に位置し、よく言われていますがアセンブリ言語は機械語と1対1の関係になります。これは人間にとって難解な機械語を人間が記述できるようにしたプログラミング言語なのでそう言われています。
今では技術者でない限りアセンブリ言語を使う機械は減ってきていますが、アセンブリ言語を理解出来ていればハードウェア的な動作を扱うための構造が理解できるようになると言われています。
アセンブルとアセンブラ
語尾の「ラ・リ・ル」が違うだけでなんだかややこしいですが、アセンブリ言語で記述したプログラムを機械語に変換する事を「アセンブル (Assemble)」、その変換を行うためのソフトを「アセンブラ (Assembler)」と呼びます。
「高水準言語」高級言語
高級言語とはプログラミング言語の中でもより自然語 (英語を元に作られている) に近い言語です。そのため人間にとって理解しやすいという特徴があります。
高級言語によって作られたプログラムはそのまま実行するのではなく、コンパイラやインタプリタによって機械語に翻訳されてから実行されます。
手続き型と非手続き型
高水準言語は大きく「手続き型」と「非手続き型」に分ける事ができます。
「手続き型」は処理手順を記述するタイプで、「非手続き型」はそれに該当しないタイプとなります。Javaなどのオブジェクト指向はこの「非手続き型」になります。
コンパイラとインタプリタ
プログラムは人間が理解できるように記述されています。というのも、英語と記号で表記されているからです。なのに、なぜわかりにくいんでしょう?
英語を知っている方が有利?!
プログラミング初心者がズラーっと画面一面に並んだコードを見て思わず「うわ・・」と思ってしまうのは、「プログラム+英語」の要素が組み合わさっている難しさであって、私達日本人からしたら英語がわからないから余計にわかりずらいというのもあるかもしれません。
実際にパソコン用語は英語が多いですし。なのでもしかしたら英語圏の方、または英語を知っている方の方が少し有利なのかもしれませんね。英語圏のネイティブの方は初心者から始めても英語を知らないよりはハードルが低いかもしれませんね。
その人間が理解できる高水準言語をコンピュータが理解できて実行するには機械語に翻訳する必要があります。その翻訳機の役目を果たすのが大きく分けて2通りあり「インタプリタ」と「コンパイラ」です。2つとも機械語に翻訳するためのソフトウェアですがそれぞれどのような機能を持つのか見てみましょう。
インタプリタ方式
インタプリタ (Interpreter) は高水準言語で記述されたプログラムのコードを一行ずつ翻訳しながらそのプログラムを実行していくという方式です。翻訳と実行が同時進行するためコンパイラと比べて処理速度が遅くなりますが、作成したプログラムを直ちに実行する事ができる・バグを発見しやすいというメリットがあります。
インタプリタ型の主なプログラミング言語
- PHP
- Python
- Perl
- Ruby
コンパイラ方式
コンパイラ (Complier) は高水準言語で記述されたプログラムのコード全行を一括にまとめて翻訳するという方式です。WEBサイトをGoogle翻訳で翻訳する時をイメージするとわかりやすいかもしれません。
コンパイラによって翻訳されたプログラムをオブジェクトコード (またはオブジェクトファイル) と呼びます。オブジェクトコードは翻訳された機械語または中間言語となります。
一度にまとめて翻訳するのでインタプリタと比べて全体の処理速度が速くなります。
リンカ
コンパイラされた後にプログラムが実行されるまでの間にリンカ (リンケージエディタ) と呼ばれるプログラム処理がされます。高水準言語が機械語にコンパイルされた後に作成されたバイナリデータとライブラリ (プログラムの部品) を統合しプログラムとして実行可能な形式にします。
このリンカは一般的にコンパイラと開発環境としてセットとなっているので特に意識しなくても動作するという内部的な動きになります。
コンパイラ型の主なプログラミング言語
- C言語
- C++
- Objective-C
- アセンブリ言語
中間言語方式
Javaなどの翻訳方法は特殊で、中間言語 (Inter Language) 方式と呼ばれています。Javaのコードはコンパイラによって高水準言語と機械語の中間となるバイトコードに一度変換されます。
その後Java仮想マシン (Java Virtual Machine) と呼ばれるインタプリタによってプログラムが実行されます。
この記事のまとめ
このように一言にプログラムと言っても様々な種類があります。私が習得したいのはJavaなので、高級言語の特に「手続き型」「非手続き型」「オブジェクト指向」についてそのうち詳しくまとめてみたいと思います。