プログラムとは何か

はじめに

この記事は自分の考えを整理する目的と知見共有のための記事になります。
いわゆる解説記事とは毛色が異なる点についてご留意ください。

プログラムって…?

多くの人が体験するプログラムとは、パソコンやスマホなどのデバイス上で起動するアプリケーションがある。
開発者の場合は、UIが存在しないバックグラウンドで起動するエージェントアプリとかを知ってるかもしれない。TomcatやMDMとかでよく見る。

プログラムは何で出来ている?

多くの人がご存知の通り、プログラムとはプログラミング言語を使ってデバイス上で実行可能にしたものである。
専門用語を使うと、オペレーティング・システム(以降、OSと呼称)が提供する機能をプログラミング言語を経由して呼び出すことで、カレンダーやブラウザやサーバーアプリケーションを実現している。
では、OSは何を提供しているのだろう..?

OSの提供するものは…?

OSは、デバイスを構成するハードウェアとやり取りを行う。OS無しでハードウェアとのやり取りをネイティブで実装するのは難易度が高く調整が難しいため、OS側でラップしてくれたフレームワークを使うことが多い。
これには、macOS SDK (App Kit)やdot NET Frameworkが有名なものとしてある。

ハードウェアは何があるのだろう..?

ハードウェアレベルまでくると、macOSやWindowsなどOSの違いは大した問題ではないと感じることが多い。というのも、量子コンピュータなどの特殊なケースを除き、多くはノイマン式の電子計算機である。
原理的には、surfaceにUbuntuやmacOSをインストールして動かそうと思えば動かせる。現実的にはOSがハードウェアとやり取りするドライバーが無いため動かないけど。

今度はハードウェアから辿ってみる

ハードウェアは原理的に同じ仕組みで動いているため、やろうと思えば全てのOSを全てのハードウェアにインストールして動かすことができる。
また、ハードウェアとやり取りするドライバーを用意すればOSとしては特に問題にはならない。
そのOSで動かすアプリはプログラミング言語で実装されているが、OSが用意するフレームワークを使えば問題ない。
ここで気になる事がある。プログラミング言語が違うことに意味はあるのだろうか?

プログラミング言語の選択に意味はあるのか?

オブジェクト指向型言語、純粋関数型言語など様々なプログラミング言語が存在するが、前述の通りOSが用意するフレームワークに従って動作する。(そうじゃないと実行できない)
極端な話、全てのシステムをアセンブリで実装できるが、かなり遠回りな実装になってしまう。
また、動的型付けでも実装できるが「型」の不確実性が高い場合は考慮コストが高くなる。その逆で静的型付けの場合は「型」を確実なものにする必要があるため、実装コストは高くなる。

おそらく適材適所なのだろう。