UNIXに関する世界観です。
UNIXの歴史は、MIT、ゼネラル・エレクトリック、当時のAT&Tベル研究所により開発された、MulticsというOSから始まる。
多機能を目指したOSだったが、そのおかげで当時のコンピュータでは使い物にならなかった。
ベル研究所のグループによって、単純な機能を目指したOSが作られた。それがUNIXである。
UNIXは当初はアセンブリ言語で書かれたが、後に高級言語のC言語で書かれるようになった。そのため、移植性の高いOSになった。
C言語も参照のこと。
UNIXのソースコードは、AT&Tが独占禁止法の管理下にあったため、商用ではなくパブリックドメインで公開された。
そのことから、大学や研究機関に爆発的に広まった。
また、UNIXのソースコードをベースにカルフォルニア大学バークレー校によるBSDが開発された。
だが、時代とともにAT&Tが独占禁止法の管理下ではなくなり、それまでオープンだったUNIXは非公開の独占的ソフトウェアに戻った。
また、UNIXの名称や商用コードを巡って商売をする、Sunのような商用UNIXベンダーも居た。
そのことから、リチャード・ストールマンによるGNUプロジェクトは新しいフリーのUNIX互換OSとして、GNUを開発した。
自分の書いたブログ「神々とともに生きる詩人」2021/01/21より。
UNIXの考え方は、単純にしろ、ということ。
複雑なシステムは必ず破綻する。
システムをシンプルに、単純に保つことで、UNIXはマルチタスクやネットワーク環境において、高い信頼性と安定性を実現した。
この教訓は、エンジニアすべてが学ぶべき教訓である。
何よりも、単純でシンプルなシステムが、どんなシステムよりも正しい設計となる。
実際、Linux周辺の、特に統合デスクトップ環境の開発者は、このシンプル第一の原則に立ち返って、反省すべきだろう。
UNIXはネットワークへの親和性が高いことで知られる。
特に、コンピュータそれぞれに違う役割を持たせたり(ログイン用のマシンやデータ保存用のマシンなど)、コマンドをネットワークで実行することに長けている。
UNIXは優れたコマンドライン環境を備える。現在ではコマンドラインシェルはBashやTcshが使われることが多い。
X11というウィンドウ・システムも存在し、GUIウィンドウとしてBashを複数使うこともできるほか、Linuxのコマンドライン環境ではAlt+F1~F6で仮想コンソールを使うことが出来る。
UNIXはマルチタスク・マルチユーザのタイムシェアリングOSとして、最初から複数のユーザーによって操作されることを念頭に置いている。
UNIXのマルチユーザ環境の特徴は、「そのユーザが実行したプロセスは、そのユーザの権限において実行される」ということであり、これにファイルやディレクトリのパーミッションが加わって、それぞれのユーザが安全にシステムを使うことが出来るようになっている。
UNIXのマルチタスク環境では、あるプロセスを実行中に別のプロセスも実行することが出来る。これは、DOSのようなシングルタスクのOSにはない特徴だ。単純なコマンドプログラムだけではなく、デーモンなどもマルチタスクで動作する。
パソコンで使うOSというよりも、安定したサーバーやワークステーションでの利用を念頭に置いている。
UNIXはリソースのあり方を「ファイル」という概念で一般化した。プログラム、データ、はてはデバイスまで、全てを「ファイル」という考え方に落とし込む。
だが、このファイルという考え方は、ネットワークやGUIなどにおいてはあまり一般的でなくなっている。そのため、新しいPlan 9という研究用の分散OSでは、ネットワークなどについても「ファイル」という考え方を突き詰めている。
UNIXは、そもそもがパブリックドメインで開発されたOSです。
大学や会社の研究機関とインターネットの違いはあるかもしれませんが、オープンソースであるLinuxはUNIX本流の開発のし方をしていると言えます。
オープンソースも参照のこと。
UNIXは、「OS」という考え方をIBM System/360が作ってから、さまざまなOSが生まれたところでの、OSという考え方の本家本元だと言えます。
C言語という高級言語で書かれ、マルチユーザ・マルチタスク・タイムシェアリングといった、今のOSの基本的な考え方の本流です。
そして、IBMのメインフレーム用のOSから、BeOSのようなパーソナル向けのOSまで、UNIX互換であり、POSIX互換である、ということは、一種の標準となりました。
WindowsはUNIX互換ではありませんが、今あるOSのうちWindowsを除いたOSは、ほとんどがUNIX互換であるか、何らかのUNIXとのつながりを持っていることが多いです。
また、UNIXは安定していて、堅固である、ということは良く言われます。
今のLinuxは、Fedoraの実験指向もあって、昔ほど安定した印象は無くなりましたが、Windowsと比べると、カーネルやコマンドラインで言えば安定しているのかな、とは思います。ですが、GNOME/KDE/MATEにはバグは多いです。
セキュリティに関して言えば、最近のLinuxはSELinuxなどもっとセキュリティを高める試みをして不安定になる印象はありますが、パッケージ管理システムで全ソフトウェアを一発で最新にすることが可能で、カーネル以外は再起動しなくても良いなど、やはりセキュリティは高いのかなという気がします。
rootユーザーを使わなければ、おそらく簡単にシステムは壊れません。
大規模サーバーではデータフォルダをきちんとバックアップすれば、基本的に壊れることは無いでしょう。
現実的に考えて、IT業界全体の標準まで普及しているWindowsよりは、狙われることは少ない、というのは、シェアが少ない故の長所ではあるかもしれません。
古いコンピュータ(メインフレーム・ミニコン)も参照のこと。
UNIXは、ネットワークとの親和性が高いです。
特に、Sun Microsystemsのような会社の努力もあって、コンピュータをネットワークに繋ぐことを当たり前のものとしました。
Sunも参照のこと。
逆に、UNIXはGUIとの親和性は低いかもしれません。今でも、コマンドライン環境だけでネットワークに繋いで利用されることの方が多いでしょう。
ですが、それを逆に言えば、GUIの操作をしなくても、コマンドだけでほとんどのことを行える、という、「コマンド主義」のOSである、という言い方も出来るでしょう。
Windowsは、サーバーに使うWindows Serverでさえ、GUI環境で使うことを基本としています。Linuxはコマンドライン環境だけをインストールして、SSHで操作することも出来ます。
GNUなどのシステムについて言えば、なぜかUNIXとは本来関係がないはずのLispとの親和性が高いです。
GNU Emacsは、Lispによる拡張によってコンピュータ総合システムとなります。また、sawfishのようなLispで拡張されるウィンドウマネージャ(昔のGNOMEで使われていた)や、マニアックなところではGNU GuixのようなLispで書かれたパッケージマネージャもあります。
UNIXはプログラマの仕事台と言われているように、プログラマに対する支援が手厚いです。
特に、コンパイラやmakeのようなプログラムは最初から無料で用意されており、そしてスクリプト言語や他のプログラミング言語のインタプリタ・コンパイラも豊富です。
システム・アーキテクチャとしての洗練性が高いです。
プログラムはパッケージ管理システムを利用することで、常に最新のパッケージが自動でインストールされます。
ですが、GNOMEとKDEを見ていると、GUI環境の洗練性はWindowsに遅れています。その代り、もっと良いものを目指して日進月歩でみんなで開発しています。
Linuxは、特にWeb開発のためのツールが豊富です。
Mozilla FirefoxのようなWebブラウザアプリケーションや、Apacheやqmailのようなサーバーソフトウェアが豊富なだけではなく、最先端のRuby on Railsのようなツールを使うことが出来ます。
Perl/CGIのような、インターネットの昔標準であった流行の技術は、多くがUNIXの技術を元にしています。
IEやMS-OfficeのようなWindows標準の技術も、Mozilla.org(旧Netscape)やGoogleの努力もあって、Linuxでデスクトップでインターネットを見ることは難しくは無くなってきています。特に、YouTubeはHTML5の標準技術を採用しているため、僕はLinuxでYouTubeの高品質な動画や音楽を楽しんでいます。
プログラマを目指している人にとっては、メインフレームや大規模なデータセンターの環境と近いことがメリットとして言えるかもしれません。
DockerやjailのようなOSレベルの仮想化環境や、MySQLのような関係データベースサーバーは、たくさんのプロセッサを繋いで一つにしたデータセンターやメインフレームのシステムと近いでしょう。
Linuxは楽しいことが長所として挙げられます。全てがオープンに公開され、共同で協力して開発し、成果をみんなと共有するLinuxのバザール開発は、インターネットを使った革新的な開発として、とても「楽しい」ことがメリットとして挙げられます。
バザール開発だけではなく、UNIXはとてもカスタマイズ性が高く、システムをほとんど制限のない無限の自由に設定・拡張することが出来ます。
また、Microsoftのような単一のベンダーではなく、全てのソフトウェア・ハードウェアの開発企業にオープンで開かれていて、誰もが開発に参加出来ます。
そして、UNIXというシステムそのものが、楽しいシステムである、といえるでしょう。Bashやパッケージ管理システムを使うことで、とても楽しくシステムの管理やプログラミングを行うことが出来ます。Gentoo LinuxのPortageを使っていると、まるでこの世界の全てを全部自分の力で構築しているような錯覚に陥ります。
短所としては、出来る人間や分かっている人間にしか使えない、ということもあります。
特に、サバイバル的な用途が考えられます。自分の力で問題を解決出来る、ITのエキスパートでなければ使えません。デバイスドライバを自分で書け、といわれることすらあります。
ですが、本当はそれらを言う人間は、Linuxカーネルの開発に参加出来るような、上級者を育てたいだけです。
Windowsが家庭料理のレシピ本であるなら、Linuxはプロの料理家に弟子入りするようなものである、といえるかもしれません。全て、出来ないのは自分の責任だと言えます。
ですが、C言語やBashを分かりたい、といった人しか、そもそも使おうとはしないでしょう。ApacheやPHPは、マニュアルは整備されています。ネットにも情報はあります。怯えずにトライしてください。トライし続ければ、きっと90%の人間は、何かのシステムをきっかけやベースにUNIXとコンピュータのことがきちんと分かる、そういうシステムだと思います。
UNIXのプレートに見られる「Live Free or Die」の文字は、元々はアメリカのニューハンプシャー州の標語。
UNIXの「自由を守らなければ死を」という精神が刻銘に刻まれている。
UNIXはC言語のふるさとです。C言語は、UNIXを移植性の高いOSにするために開発され、その後UNIXだけではなく多くのシステムの記述を行うシステムプログラミング用の言語として普及しました。
UNIX系のOSであるLinuxでは、GNUのツールチェイン(gcc, binutils, make, gdbなど)をフリーで使うことができます。コンパイラが無料でオープンソースであることは、Windowsのように有料である場合よりも、プログラミング入門者の敷居を著しく低くします。
また、Linuxでは、UNIX系のAPIをネイティブに使うことができます。open(), close(), write(), read(), printf(), scanf()などのUNIXの標準的なAPIをネイティブに使えます。これらはWindowsなどでも実装はされていますが、WindowsではWindows APIへの依存度も高いです。
ただし、LinuxではGUIの「標準」のAPIがありません。X11を使うのが普通ですが、X11を導入しないサーバーマシンとしての利用もあることから、X11を標準にはしておらず、場合によってはX11を導入せずにコマンドラインで使うことが推奨される場合(SSHでリモートログインする場合など)もありますし、X11が入っていたとしても、GTK+やQtのような追加的なツールキットのAPIを使う場合もあるでしょう。
C言語を学ぶ上で、Linux環境があることはとても良いことです。それは開発環境のツール群が整備されていることだけではなく、Linuxはほとんど全てのソフトウェアをオープンソースで再配布している、ということも言えます。オープンソース・ソフトウェアは、最近はgithubなどを使うことで、ソースコードをすぐに確認し、開発に参加することができます。Windowsの場合、Microsoftの社員にしかアクセスが許されていない情報にも、Linuxならアクセスできます。
このような理由で、UNIXはC言語のふるさとである、と言えると思います。
Windows環境が必ずしも悪いわけでは全くありません。たとえば、日本やアメリカやほとんどの国において、一般的に使われるOSはWindowsであり、Windows向けのネイティブアプリケーションを開発することは、「多くの人に使ってもらう」上で有利となるでしょう。Linuxでは使われないソフトウェアも、Windowsでは使われる可能性があります。ビジネスチャンスもあります。ですが、Linuxで開発したアプリケーションが、必ずしも誰にも使われないかと言うと、そうでもないのです。それは、デスクトップアプリケーションだけがLinuxではないからです。Linuxにはサーバーアプリケーションもあります。ここで、PHPやPythonやRubyで作られたWebサービスは、多くの人に使ってもらう可能性を秘めています。ただし、自宅サーバーを立てるのにはコストがかかります。最近はクラウドによるインフラを借りることもできます。最近はネットワークサービス全盛期です。時代はLinuxに向いていると思います。
また、最近はAndroidのアプリケーションもあります。AndroidはJavaとLinuxで構成されたGoogleによるオープンソースソフトウェアです。Linuxの知識が活かせる可能性はきっとAndroidにもあるでしょう。
また、さらに言ってしまえば、C/C++でネイティブアプリケーションを作る必要は必ずしもありません。それは、Javaやスクリプト言語という選択肢があるからです。特に、JavaでSwingなどで作られたアプリケーションは、WindowsでもLinuxでも動作します。モダンなUNIXプログラミングを行うのであれば、JavaやPython/Rubyなど(GTK+/QtアプリケーションはPython/Rubyでも開発できる。GTK+/QTはクロスプラットフォームにも対応している。)を選択することもあり得るでしょう。
UNIXの発明を参照のこと。
GNUを参照のこと。
商用UNIXを参照のこと。
Plan 9を参照のこと。
Multicsを参照のこと。
UNIXの歴史については、Linux 歴史を参照のこと。