最近になってプログラミングの基本の部分で、理解できていないことがあることに気がついたので、この機会に学びなおしてみようと思いました。
プログラミングとは
プログラミングとは機械に命令する文を記述することです。
命令といってもできるのは計算のみです。
意外に思うかもしれないのですが、あなたが今見ている画面に映っているものもプログラムの計算の結果です。モニターのどの座標にどの色を表示していくか計算で導き出して画面に表示させているのです。
しかしコンピュータは人間の言葉を理解できません。
「1 + 1 を計算して!!」と頼んだところで機械から帰ってくるのはエラーメッセージのみです。
しかし機械にも人間が創り出した言語で1つだけ理解できるものがあります。
それは何かというと「機械語」です。機械語は二進数、つまり0と1のみで構成された言語です。
この時点で察しのいい方ならお分かりかと思いますが、二進数を人間が扱うのはとても大変です。
例えば「Hello」という単語を二進数で表現すると以下のようになります。
1001000 1100101 1101100 1101100 1101111
たった5文字の単語を表すのに、二進数で表すのに必要な文字数は35文字必要でした。
このことからもわかる通り、コンピュータに人間が二進数で命令を出すのは現実的ではありません。
ではどうするのかというと、人間が使っている言葉に近い言葉を機械語に翻訳するプログラムを使用します。
人間が使っている言葉に近く、尚且つ機械語に翻訳しやすい言葉を「プログラム言語」といいます。そして機械語に翻訳してくれるプログラムのことを「コンパイラ」といいます。
また、機械語に翻訳する行為を「コンパイル」といいます。
このコンパイルのタイミングで「スクリプト言語」と「コンパイラ言語」の2種類に分かれます。すべての命令をコンパイル(機械語に翻訳)してからコンピュータに命令する言語を「コンパイル言語」、命令をコンパイルしつつコンピュータに命令していく言語を「スクリプト言語」と言います。
それぞれの特徴を挙げると
スクリプト言語:
- 人間が使っている言語に近いため、習得が比較的簡単かつ環境の構築が安易。
- コンパイルしつつコンピュータに命令を送るので動作が低速。
- javaScriptはブラウザ上でしか動作しないなど、用途が限定される。
- 小規模開発に向いている。
コンパイル言語:
- 機械語に近いので習得が難しい。
- すべての命令をコンパイルしたのちにコンピュータに命令を送るので、動作が高速。
- それ故に修正するのにいちいちプログラムを停止しなければならないため、修正が手間。
- 処理が高速且つ出来ることが多いので大規模開発に向いている。
というように一長一短です。
代表的なプログラム言語を挙げると
スクリプト言語:
- JavaScript
- PHP
- Python
- Ruby
- Lua
コンパイル言語:
- Java
- C#
- C言語
- C++
- Go
などが挙げられます。
ちなみに例えば150+150の計算結果を出力するコードをJavaとPython2で比較すると以下のようになります。
Java:
public class Main {
public static void main(String[] args) throws Exception {
int num= 150+150;
System.out.println("計算結果は"+num);
}
}
Python2:
# coding: utf-8
result = 150 + 150
print"計算結果は:", result
この通り、スクリプト言語のほうが如何に記述すべき事柄が少ないのか、お分かり頂けたと思います。
プログラミングの記述ルール
次にプログラミングにおける共通のルールを解説していきたいと思います。
散々偉そうに解説しておきながら、僕はスクリプト言語を触ったことがありません。
そのため、あくまでコンパイラ言語での共通のルールであることをご了承ください。
1.プログラムの実行順
まずプログラミング言語は上から下に向かって、1行ずつ処理されていきます。
これは現実世界でも共通のルールだと思います。チェックリストを作ってそれ通りに行動するとき、わざわざ下のほうから行動していく人はいないと思います。ごくシンプルで当たり前のルールです。
2.プログラミング言語に置ける「。」
次にプログラミング言語にも人間が使う言語に置ける句点やピリオドなどの存在があるということです。
それは「;」です。
これも当たり前のことですよね。
文章を書くときに、
「着替えて朝ご飯をたべて歯磨きをして身支度をして出勤してください」
なんて書かれたら読む側からしたら読みにくいったらありゃしないと思います。
ただ、人間だったら
「着替えて
朝ご飯をたべて
歯磨きをして
身支度をして
出勤してください」
と書かれれば、なんとなく「段落で区切ってるんだな」と理解できると思います。
しかし機械は往々にして融通が効かないもの。もし上記のような命令をコンピュータにしようものなら、すべての命令をいっぺんにしようとすることでしょう。つまり「着替えながら、朝ご飯を食べながら、歯磨きをしながら、身支度をしながら、出勤する」という行動をとることだと思います。
つまりプログラミングをするときには、きっちり命令の終わりを明示してあげることが重要なのです。その命令の終わりを指すのが「;」ということです。
3.値を代入する箱「変数」
次にコンピュータに値を扱ってもらうには「変数」と呼ばれる箱に値を代入することが必要です。
変数は
型 変数名;
int num;
という記述で宣言(用意)します。
型というのは扱う値の属性です。数値なら数値の型を、文字列なら文字列の型を指定してあげます。
主な型は以下の通りになります。
int :整数を扱う。
dabble/float:小数点つきの数値を扱う。
String:文字列を扱う。
Char:文字を扱う。
boolean:真偽を扱う。(true/false)
などがあります。
そして代入するには以下のように記述します。
int num;
num = 1;
or
int num = 1;
というようにイコールで値を代入させます。
4.処理を纏めるための「クラス」
次に処理ごとに記述を纏める必要があります。
区切るにはクラスを作成しその中に処理する記述を書き込みます。
記述方法は以下のようになります。
修飾子 class クラス名{
}
この一区切りをブロックと呼びます。
修飾子とは呼び出せる範囲を指定したりするための物です。詳しく書くと長くなるので、割愛します。classはクラス作成時にマストで記述しなければいけない単語です。
5.処理そのものである「関数/メソッド」
次に紹介するのは関数です。
関数とは値を渡すことで、決められた処理を行い、結果を返してくれる命令文の塊です。
メソッドなんて言ったりもします。
記述方法は
修飾子 戻り値 メソッド名(引数){
}
です。
{}の中に処理を記述します。
戻り値はメソッドを実行することで得られる値の型です。引数はメソッドを実行するうえで必要になる値の種類です。これは、いくつでも指定できます。
6.プログラミングを効率的に行うための大事な概念「オブジェクト指向」
最後に紹介するのは「オブジェクト指向」です。
これは記述のルールではなく、概念、考え方の事なのですが、オブジェクト指向に基づいた言語において非常に重要な事柄なので、軽く説明しておきます。
オブジェクト指向とは「処理を部品化して、部品を組み合わせることで1つのプログラムを作る考え方」のことを指します。
わかりやすく説明するために例を挙げると、ゲームの敵モンスターを作りたいといった場面で、ボスとその取り巻きのモンスターを作りたいとしましょう。
ボス、取り巻きどちらでも構わないのですが、今回はわかりやすいようにボスから作って行きましょう。
ボスはボスなので当然、取り巻きよりもすべてのステータスが上であるべきです。それに加えて攻撃するための技も強力にします。
そんなわけで、強力な技とステータスを持つボスが完成しました。
では、そのボスをベースに取り巻きのモンスターを作って行こうと思います。
1からボスとは全く別のモンスターを作ることもできますが、技の処理が複雑だったりした場合、もう一度同じような処理を作らなければいけないのは手間です。
そのようなときに役立つのが、オブジェクト指向の持つ特性の1つである「継承」です。
継承とは特定のクラスのメソッドや値を引き継いで、新たなクラスを作成できる機能のことです。
継承元のクラスをスーパークラス、継承先のクラスをサブクラスと呼びます。
サブクラスはスーパークラスのメソッドや値をそれぞれの継承元のクラス名+名前だけで呼びさせます。
なので、わざわざ同じような内容の処理を作るような必要はないのです。
しかし、スーパークラスのメソッドをそのまま使ってボス、取り巻き両方が持つ通常攻撃を実装してしまうと、ボス並みに強力な通常攻撃を持つ取り巻きが出来てしまいます。そうなってしまうとゲームとして、成り立たなくなってしまいます。
そこで、「オーバーライド」という機能を使用します。
これは、メソッドを同名のまま上書きする機能です。
同名のまま上書きするということは、スーパークラス(ボス)の通常攻撃はそのままに、サブクラス(取り巻き)の通常攻撃の威力を落とすことができるのです。
また、「オーバーロード」という機能もあります。
通常、メソッド名を重複させることは出来ません。
しかし、これでは同じような処理を行うが、必要とされる値が違うメソッドを作りたい場合不便です。
そのような時、便利なのがオーバーロードです。
この機能を使うとメソッドを実行するときに必要な値の数や、種類によって対応するメソッドを呼び出してくれます。
このように、オブジェクト指向ではプログラムを柔軟に利用できる仕組みが備わっていて、そのおかげで効率的な開発が可能になっているのです。
まとめ
プログラミングの概要
- プログラミングとは機械に命令をだすために専用の言語(プログラミング言語)で命令文を書くことをいうよ。
- プログラミング言語は機械にしか解らない機械語に訳す必要があるよ。また、機械語に訳すプログラムをコンパイラと呼び、機械語に訳す作業自体をコンパイルと呼ぶよ。
- プログラミング言語はコンパイルのタイミングで「スクリプト言語」と「コンパイル言語」に別れるよ。
- スクリプト言語はコンパイルしながら機械に命令を送るよ。また、コンパイル言語はすべての命令をコンパイルしたのち、機械に命令を送るよ。
プログラミングの記述ルール
- プログラミング言語にも日本語で言うところの「。」に相当する「;」があるよ。
- 記述を纏めるのに「クラス」を使うよ。
- 処理そのものを「関数/メソッド」と呼ぶよ。
- プログラミング言語によっては「オブジェクト指向」というものを元に作られているよ。オブジェクト指向とは「処理を部品化して、部品を組み合わせることで1つのプログラムを作る考え方だよ。オブジェクト指向の機能「オーバーライド」や「オーバーロード」を使うことで効率的にプログラミングすることができるよ。