JavaScriptの言語的な特徴について

2021年1月12日JavaScript

JavaScriptは次のような特徴をもつ言語です。

  • high-level ハイレベル
  • prototype-based プロトタイプベース
  • object-oriented オブジェクト指向
  • multi-paradigm マルチパラダイム
  • interpreted or JUST-IN-TIME compiled
  • dynamic 動的
  • garbage-collected ガベージコレクション
  • first-class functions 関数を第一級オブジェクトとして扱うことのできる
  • single-threaded シングルスレッド
  • a non-blocking ノンブロッキング
  • event loop concurrency model イベントループ同時実行モデル

 

それぞれ簡単にみていきましょう。

high-level ハイレベル

メモリやCPUなども動くためにはプログラミング言語が必要です。
メモリやCPUなどのプログラミングは低級言語(Low-level programming language)という言語で動いています。
そしてJavaScriptは高級言語(High-level programming language)です。
低級言語と高級言語の違いは、ざっくりいうと、低級言語は数字の羅列などのコンピュータが理解できる言語に近いです。
高級言語は人間が理解しやすい英語などの自然言語が使えたりする言語です。

garbage-collected ガベージコレクション

高級言語であるJavaScriptはオブジェクトや文字列が使用されなくなると、自動的に開放してくれます。これをgarbage-collected(ガベージコレクション)といいます。
低級言語は明示してメモリーを開放しないといけませんが、高級言語はこちらがコードを書いて明示せずともお掃除してくれます。
メモリー管理をする必要がないという意味ではないので注意しましょう。

interpreted or JUST-IN-TIME compiled

機械語は2進数なので、0か1かです。
JavaScriptのような高級言語は人が理解できる自然言語に近いかたちなので、機械語に翻訳する必要があります。
開発しているときにまとめて翻訳するものを「コンパイラ」(compiler:翻訳者)といいます。
そして、実行時に逐次変換しながら並行して実行するものを「インタプリタ」(interpreter:通訳者)といいます。

この翻訳作業は、JavaScriptエンジン内で行われます。

multi-paradigm マルチパラダイム

JavaScriptはマルチパラダイム(multi-paradigm)言語です。

多くの言語が手続き型プログラミングのみであるのに対し、
JavaScriptは
手続き型プログラミング(Procedural programming)(命令型)
オブジェクト指向プログラミング(OOP, Object-oriented programming)(命令型)
関数型プログラミング(Functional programming)(宣言型)
と複数のパラダイムを利用できます。

パラダイムはコーディングのスタイルや技術に直結するものなので、マルチで選択肢があるということで自由度が高いといえます。

imperative(命令型)かdeclarative(宣言型)

プログラミング言語にはimperative(命令型)かdeclarative(宣言型)かという2つのカテゴリーがあります。
オブジェクト指向プログラミング(OOP)、手続き型プログラミング、および並列処理は、命令型プログラミングパラダイムです。
関数型プログラミング、論理プログラミング、およびデータベース処理は、宣言型プログラミングパラダイムです。

prototype-based プロトタイプベース

object-oriented オブジェクト指向
数字や文字列などのプロミティブ以外のものはすべてオブジェクトとなります。
たとえば配列はオブジェクトです。[]で囲うことで使えるようになりますが、その理由は配列の設計図(テンプレート、blueprint)のようなものがあるからです。それをプロトタイプといい、そのプロトタイプを継承しているから配列を作ることができます。
このプロトタイプはすべてのArrayのメソッドを保持しています。Array.prototype.pushやArray.prototype.indexOfなどがあります。
配列がこのプロトタイプ(設計図)からできあがり、Arrayのメソッドを継承しているから、配列を配列として使うことができます。

first-class functions

JavaScriptは関数を第一級オブジェクトとして扱うことのできます。このことをJavaScriptは第一級関数 (First-class functions) を持つと表現されます。
これの意味するところは、シンプルにいうと、関数を変数として扱えるということです。
関数を変数みたいに他の関数に渡したり関数からリターンしたりできるということです。
たとえばopenModalという関数があったとします。JavaScriptならaddEventlistener('click’, openModal)という変数の形で使用することができます。
これができるととっても便利です。

dynamic 動的

JacaScriptは動的型付き言語(dynamically typed language)です。

  • 変数宣言時に型の宣言をしない
  • 暗黙的な型変換がある

このような言語を動的型付け言語といいます。

暗黙的な型変換(implicit conversion)とは、変数が呼ばれた状況によって変数の型が自動的に変換されることです。

  • 変数宣言時に型の宣言をする
  • 暗黙的な型変換がない

このような言語を静的型付け言語といいます。

動的型付け言語の方が記述量が少なくなるというメリットがありますが、大規模プロジェクトではメンテナンスしにくくなるというデメリットがあります。
デメリットが気になる場合は上位互換の静的型付き言語にできるTypeScriptを使うことで、JavaScriptを静的型付き言語のように使用することができます。

single-threaded and a non-blocking event loop concurrency model

concurrency model(同時実行モデル)というのは、JavaScriptエンジンが複数のタスクを同時に扱えるという意味です。
concurrency = 並行性の意味です。
JavaScriptはsingle-threaded(シングルスレッド)、つまり並行処理の発生しないプログラムのことです。一度に一つのことしか処理できず、2つ以上のことを並行して処理ができません。
たとえばカレーを作りながらカレー皿を用意するというようなことができません。
カレーを作るまでカレー皿を用意することができないようなふるまいとブロッキング(blocking)といいます。
反対にカレーを作りながらカレー皿を用意することができるふるまいをノンブロッキング(non-blocking)といいます。
JavaScriptではイベントループ(event loop)を使うことによって、たとえば長い時間がかかるカレーをつくるというタスクをメインスレッドではなく、背景で実行して、完成したらメインに戻すということを可能にしています。
そのためJavaScriptはシングルスレッドでかつ、ノンブロッキングイベントループの同時実行モデルといえます。(single-threaded and a non-blocking event loop concurrency model)

同時実行モデルについて、より詳しくは次の記事を参照してみてください。