##プログラミング言語とは
データの処理や計算を行なってくれる言語のこと
→そこの観点から**HTML(マークアップ言語)やCSS(スタイルシート言語)**はプログラミング言語ではないです。
プログラミング言語は大きく分けて動的型付け言語と静的型付け言語の2つに分かれます。
また、静的/動的型付けでのプログラム要素の型を解釈(interpret)する際の性質として
型の強さ・弱さという型の扱いの厳格さ、データ型の変換の際の欠けや、ゆるさがないかでさらに分けることができます。
##動的型付け言語・静的型付け言語について
ここでは動的型付け言語・静的型付け言語について説明していきたいと思います。
動的型付け言語と静的型付け言語の違いは
変数に対して型を自ら宣言するか自動的に判定されるかにあります。
動的型付け言語の場合、プログラム実行時(動いた時)に型の判定が自動的に行われます。
それに対し、静的型付け言語の場合はプログラムの実行前(実行していない時→静の時)に
型の判定が行われ、型がつくプログラムのみをコンパイル・実行します。
###型とは何か?
そもそも型というのはコンピュータなどのハードウェアで扱うことのできるデータの種類を意味しています。そしてここでいう型とはデータ型のことを示します。
データ型とはあるデータがどのような性質を持っていて、どのように取り扱うべきかを定めたものです。典型的なものとしては整数型や文字列型などがある。それぞれの変数や値のデータ型に応じて、それを適切に扱うためのプログラムコードを記述する必要があります。
###なぜ型というものが必要なのか?
コンピューターは実際に処理を行う際、ソースコードを元に処理を行うのではなく、ソースコードがソフトウェアによって変換された機械語の情報をもとに処理を行います。
その機械語や物理メモリ上における抽象的な数字(0と1)の羅列に意味を持たせることが型の目的です
###動的型付け言語
・プログラムを実行時に型の変換が行われ型が決定されます。
・インタプリタ言語(直訳:翻訳者型言語)とも言われています。
・型の宣言(この型はこういうものですよという記述)を行う必要がないので、コードが静的よりもシンプルで簡単になりやすいという特徴がありますが、実際に実行した際、型に不整合が生じたらエラーとして表示されます。(ランタイム時)
つまりプログラムの字面に型の情報が登場せず、実行するまで型の判断はされないため、それまではエラーに気づけないというデメリットもあります。
・また、型の判定は実行時に一行ずつ行われるので静的型付け言語に比べ処理速度が遅くなってしまうというデメリットもあります。
しかし、型の判定を自動的に行うという面から静的な言語では記述できないような、柔軟なプログラミングができる可能性があります。
・動的型付け言語の例
→JavaScript,PHP,Ruby,Pythonなど
###静的型付け言語
・型付けが実行前に行われる言語のことでコンパイラと呼ばれるソフトウェアを使用して
ソースコードを機械語に変換することから、コンパイラ言語とも言われています。
※正式には静的型付けの高水準言語(人間の言葉に近い言語)のことを指します。
低水準言語(機械語に近い言語)にはC言語の元になったアセンプリ言語があります。
ややこしいですがC言語はコンパイラ言語に分類されます。
・プログラムの実行前に(コンパイル時、インタプリタ開始前)に型検査(演算とデータの型が適合しているかを確かめるために行われる型の検査)を行い、
型がつくプログラムのみコンパイルされ、実行されます。
・またgo言語では、:=を使用して型推論を行うことで、動的型付け言語のような書き心地で変数をや関数を宣言できます。
具体例
実際にGo言語とJavaScriptを比較して考えてみましょう。
####Go言語の場合
package main
import (
"fmt"
)
func main() {
// string型の変数aを定義
// 変数aにはstring型がはいることを明示的に書く
// この時点でメモリ内にstring型分の領域が確保される
var a string
// aに文字列Hogeを代入
a = "Hoge"
fmt.Println(a)
// aに文字列Fugaを代入し上書き
// string型であれば上書きすることができる
a = "Fuga"
fmt.Println(a)
//実行結果
Hoge
Fuga
####Javascriptの場合
const HogeFuga = () => {
console.log("Hoge");
console.log("Fuga");
};
HogeFuga();
// 実行結果
Hoge
Fuga
となります。
型推論とは?
静的型付け言語は関数や変数の型について明示的(はっきりと記述すること)に宣言しなくてはいけません。
しかし型推論という仕組みによってそれらの型を自動的に(暗黙的)に示すことができます。
実際にGo言語を例えに見て行きたいと思います。
package main
import (
"fmt"
)
func main() {
//:=を使用することで型推論が行われるのでデータ型をしていする必要がなくなる
//動的型付け言語のように扱うことができる
a := "Hogehoge"
fmt.Println(a)
// aに文字列Fugafugaを代入し上書き
// string型であれば上書きできる
a = "Fugafuga"
fmt.Println(a)
//実行結果
Hogehoge
Fugafuga
##型の強さ、弱さについて
次にプログラム言語の型の強さ・弱さについて説明していきたいと思います。
型が強いというのは動的型付けであれば実行時に、静的型付けであればコンパイル時に
型の不整合が検出できるものを指します。
反対に型が弱いというのは型システムに抜け穴があり,すべての型エラーを検出できなかったり、
型の不整合があっても暗黙的な変換(自動的な変換)により型エラーが検出されなかったり
することを言います。
実際のコードを例にして考えると
var x = 1
var y = “2”
x + y
の場合
強い型付け→ 型の不整合によるエラー
弱い型付け→ どんな結果になるか言語ごとに異なる
という形になります。
ちなみにJavascriptの場合
var x = 1
var y = "2"
x + y
//実行結果
'12'
となりました。
###分類
最後に型の強さ・弱さで動的と静的な型付けの言語を分けていきたいと思います。
####強い動的型付け言語
Ruby・Pythonなど
####弱い動的型付け言語
PHP・Javascriptなど
####強い静的型付け言語
Go・Javaなど
####弱い静的型付け言語
C・C++など