プログラミング言語とコンピュータの歴史
まえがき
この記事は歴史に焦点を当てて各プログラミング言語やコンピューターに関わる用語を解説したいと思います。初学者向けに全体像を流れなどを中心に解説いくので広く浅くで技術的なことはほぼありません。因みに主な情報源はWikiです。
黎明期
コンピューターに人間に分かりやすい言語を使って命令セットを打ち込める高級言語がでてきたのが1950年代であり、大きく2つの言語があります。それがFORTRANとCOBOLです。
FORTRANは科学技術計算用の言語としてCOBOLは「Common Business Oriented Language」(共通事務処理用言語)として特定の分野に特化した言語として生まれました。
UNIXの登場とC言語
いわゆる現代的なOSであるUNIXが登場したのが1969年であり、最初はすべて低級言語(マシン語)であるアセンブラであったが、後に汎用高級言語であるC言語で置き換えられる。C言語はOSを作るためという思想で作られすべてのコンピューターリソースを自由に扱えるものとして1972年に初版がリリースされた。
低級言語と言われるC
すべてのコンピューターリソースを使えるという思想なのでハードウェア(低レベル部分)を触れるという意味で高級言語の皮を被った低級言語と言われることもある。
Unixのプロプライエタリ化とLinux
Unixは最初、オープンなものであったが1984年にオープンなライセンスを辞めプロプライエタリ化をする。これに反発したプログラマーはライセンス保護された部分を独自に置き換えたGNUやBSD等のUnix系のOSを作り始める。
この流れでのデファクトスタンダードになったのが1991年に開発されたLinuxである。Unixのプロプライエタリに反して生まれたこのオープン化の流れは以後のOSS=オープンソースソフトウェアへの大きな流れとなる。
Webの発展
1990年代になるとWeb技術が発展し始める。きっかけはCERN(欧州原子核研究機構)の研究者が研究結果の共有のためでありそのための言語HTML(Hyper Text Markup Langage)を作りそのための通信プロトコルのHTTP通信を規格化した。
ここで注意するべきなのはHTMLはText用の言語であってプログラミング言語では無いということである。
様々な言語の開発
C言語が広く使われるも、その汎用性の高さの代償としての特化したものがないや策定の古さからの機能面の不足などから様々な言語がC言語が出来た後も作られていた。その中でも最も有名なのがC言語の拡張言語であるC++である。C++にはC言語語に出てきたオブジェクト指向を取り入れつつC言語との互換性を保つという思想で作られたが現在では一部の互換性は放棄することになりC/C++の中の最大の闇である未定義動作が生まれた。
また最初から互換性を無くしてハード依存が強い部分をどんなプラットフォームでも同じコードで動くことを前提としたJavaも誕生する。そのためにJavaはハードウェアとアプリケーションの間に仮想マシン(Java Virtual Machine)の上で動作している。
スクリプト言語
CやJava、FORTRAN、COBOLはコンパイルという処理を動作前にしないといけないコンパイル型言語であるが、一方でより手軽に実行できる言語、いわゆるスクリプト言語も出来てくる。古く汎用的なのはPerlで1987年に誕生している。
しかしその可読性の低さからより"読みやすい・分かりやすい"を標榜したPythonが1991年に誕生している。
スクリプト言語にもオブジェクト指向を取り入れる動きがありそれを前提としたRubyが1995年に出来ている。
また当時発展してきていたWeb(サーバー側)に特化した"Hypertext Preprocessor"を意味するPHPも1995年に誕生する。
JavaScript
その中でも特殊なものとしてJavaScriptが1995年が生まれる。JavaScriptはブラウザというアプリケーション内だけで走るという特殊な用途で生まれた。
LAMP環境
OSや言語が発展していく中でWebサーバーの一つのデファクトスタンダードとしてでてきたのがLAMPというセットで狭義にはL=Linux(OS)、A=Apache(HTTPサーバー)、M=MySQL(データーベース)、P=PHPという組み合わせである。
このPはP型言語と言われる動的スクリプト言語を指すこともありPerlやPython、PではないがRubyを含める場合もある。
いずれにせよOS上にHTTPサーバーを建てHTTP通信を動的スクリプト言語で振り分けデータはデータベースに格納するというテンプレートが一世を風靡した。
ブラウザ戦争
Webの発展と共にその閲覧ツールであるブラウザの重要性がましてくる。そしてその中で動くJavaScript(LiveScript)の重要性も上がってくるが様々あるブラウザでの動作が違うという問題があった。1990年代はMicrosoft製のIE(インターネットエクスプローラー)とNetscapeであったが2000年代になるとGoogleがChromeを開発する。また、それと前後してブラウザ間の差異を吸収するためのライブラリとしてのjQueryが作られる。
HTMLで動くアプリケーション
HTMLで動くアプリケーション(≠Webアプリケーション)は最も古いものでJavaアプレットがJavaの最初期から存在していたがこれらは大きなJavaのコンパイルの遅さや豊富な機能を持つことの諸刃の刃としてのセキュリティの脆弱性などから敬遠されるようになりJava11(2018年リリース)で廃止される。
また、Adobe製のFlashによる埋め込みアプリケーションも出てくるが同じようにセキュリティ上の問題から同じく敬遠され2020年に廃止される。
WebアプリケーションとAjax
いろいろなブラウザで動くJavaScriptの仕様が違う2000年代の中盤辺りにそれらを吸収するためのライブラリjQueryが登場する。また、JavaScriptで動く通信Ajax(Asynchronous JavaScript + XML)を使って動的に情報を取得するような仕組みができることによりアプリケーションもJavaScriptへの統一が強くなって行く。
しかしながら弱い動的型付けという書きやすいが保守メンテナンスが難しいJavaScriptが大規模になる上に細かなブラウザごとの仕様の差をjQueryでは吸収しきれなくなり、保守メンテナンス性の向上が求められるようになる。その中で言語機能の拡張が策定されたがブラウザ側での対応の遅れなどがありブラウザに合わせたコンパイル似た変換であるトランスパイルをすることがデファクトスタンダードにって行く。
Node.jsの登場
上記のような理由とJavaScriptをHTML内にタグとして読み込む方法とプロトタイプ汚染の問題などからよりしっかりしたJavaScriptのmodule化とその環境の統一が望まれる中その解決策の一つとして開発されたのが2009年に初版がリリースされたブラウザ以外でも動作するNode.jsである。このNode.jsのエンジンにはその前年に開発されたGoogle Chromeと同じV8エンジンが搭載されている。
Webの標準化
JavaScriptの機能が肥大化を続けブラウザごとの差異が広がる中でそれを補うためにコンパイルのような処理、トランスパイルをかけることが一般的になっていく。また、ホームページのコンテンツを表すHTML、それのデザイン(配置等)を司るCSS(カスケード・スタイル・シート)の仕様も肥大化とブラウザベンダー間の違いが大きくなる。更にそれを吸収するためのフロントエンドフレームワークが発展そする。
その中でJavaScriptの統一的な規格が2015年としてES2015(EMCAScript2015、もしくはES6)に定められる。(この規格は20XXの形で毎年更新される)
またHTML、CSSもHTML5とCSS3がほぼ標準であるとみなされるようになった。
ネイティブアプリの動き
今ではネイティブアプリと言うとスマホアプリを思い浮かべる人が大半だろう、その中の2大ベンダーはAndroidとiPhoneであろう。特にiPhoneは新しいガジェットとして時代を席巻したそのアプリケーションの開発はMacの独自言語であり最初はObjective-Cでありその後、Swiftへと移行していく。
アプリケーションはもちろんPC上のソフトウェアも含む、いわゆるブラウザもアプリケーションの一種である。これらはだいたいC/C++で書かれている(Chromeのv8エンジンはC/C++である)。
その他のスタンドアローンアプリケーション等はJavaが使われる場合が多い。これは言語標準に様々な機能、GUIなどが含まれているからだと思われる。
また、Microsoftも独自の.NET Frameworkとそれを使うための言語C#を開発している。
LLVM(低レベル仮想マシン)と統一化
様々な環境が生まれる中でいちいち独自環境に左右されない開発方法が模索されていく、そのために"Write once, run anywhere"を掲げたJVMをより高速で動かそうとするために低レベルからの仮想化のLLVMの開発が進められている(初期は低レベル仮想マシンの略であった)。
これは高級言語と低レベル環境の間に抽象化されたレイヤーとして働くコンパイラである(らしい)。
このコンパイラのフロントエンドであるClangにはAppleやGoogleなどが開発に携わっている。
この2社が大きくWeb業界に携わっていることからもわかるようにこの流れはWebにも入ってきておりJavaScript(ブラウザ)にもWebAssemblyというより低レベルにちかいAPIも策定されつつある。
そして統一の流れからWeb/Andriod/iPhoneの統一的な開発が可能なフレームワークなどが生まれている。
あとがき
この記事は実はQiitaで埋没した記事の焼き直しである。それは言語だけに注目したものと環境などに注目したものであったがつながりが希薄になって事実の羅列になって面白みがないものになってしまった。反面、こっちは説明が長くなりそうなものを省いたのでかなり内容が薄くなってしまった気もする。また、事実関係がややこしい部分や理解があやふやなものはぼかしている(しまったので)その点でも記事が軽くなっていると感じました。
記事を書くときにどの部分に注目するのかどんなことを芯に持ってくるかなどの甘さを感じましたがひとまず投稿します。
まだ調べきれてない部分などもあるので随時更新していきたいです。
Discussion
よくまとまってますね!
一部、誤字があるようでしたのでご連絡しておきます。
COBOLは
BSD ではないでしょうか
.NET Framework
コメントありがとうございます
訂正もありがとうございます
WebアプリケーションとAjaxの最後の文、脱字があります。