僕は文学部出身で、パソコンは得意と言っても自作くらいしかやったことのない人間だった。
そんな新入社員だけれども、数カ月研修を経てまあまあプログラミング言語を使えるようになった。
ただ、コンピュータや情報処理の基本から体系的に学んでいるわけではないので、ところどこに穴があった。
その一つに規約と実装の違いの疑問があった。
いや疑問どころか理解をしていなかった。
プログラミング言語の処理系や実装は色々ある
僕が最初に学んだ言語はJava。
JavaはSun(かつてJavaを開発していた企業)が提供しているものしか無いと思っていたし、CやC++も統一されたものだとおもっていた。
そして、プログラミング言語というのはコンパイラ(言語を機械に理解できる形式に翻訳する仕組み)や実行環境(動かす仕組み)そのもので、それに付随する操作方法としてプログラミング言語というものがあるとおもっていた。
Javaであれば、Javaという言語とそのJavaを動かす仕組みというのは不可分だと思っていた。
でも、その動かす仕組みというのは色々あるんだね。
Javaで言えばコンパイラはOracleやIBM GNUなどの企業や団体がそれぞれ出しているし、実行環境もOracleやIBM Google(Android上で動くあれ)など違うものが沢山ある。
Python(プログラミング言語の一つ)だって、C言語で作られているCPython
Javaプラットフォームで動くJython
Python上で動くPypy
などなど
プログラミング言語をマシン上で動かす仕組みというのはそれぞれ選択肢はあって、言語はそれらとは独立している。
プログラミング言語はつまり規約なんだね。
文法などの決まりは中心的な団体や協議会が決めてそれに則って様々な処理系を作ることができる。
プロトコルは規約
HTTPとかFTPとかのPの部分はプロトコルの頭文字。
プロトコルを和訳すると規約なんだけれども、比喩的な意味ではなく本当に規約
HTTPは『HTTP通信をするにはこんな決まりで通信をしてください』という規約があって、それに則るように各自実装がある。
まあ、もう枯れた技術であるからC言語で書かれたライブラリをどれも使っているのだろうけれども。
規約と実装は分けられる(インターフェスもその一つ)
規約だけが決まっていて、あとは実装は色々あるというと選択肢が増えるし、
標準化されるので互換性も保たれる。
Javaのインターフェースもその一つ。
たとえばデータベースに接続するJDBCという仕組みがJavaにはあるが、
データベースはOracle DB2 MySQLなど様々な製品がある。
それぞれは内部で違う仕組みで動いているが、Javaからは同じクラスをつかって同じように操作することができる。
接続を司る仕組みをインターフェースとして決めておいて、各データベースのベンダーがそのインターフェースを実装するクラスを提供する。
プログラミングをしていくうちに会得していく考え方なのだろうけれども、
はじめのうちは理解はしづらい考え方だと思う。
ただ、決まりとそれを実現する仕組みは別物だということを考えて入社後一年目を過ごしていけば、
プログラミング言語も理解しやすくなるし、様々なソフトウェアの設計やクラス図の意図も理解しやすくなるだろう。