C# それはC++とは似ても似つかないもの
C#とはマイクロソフトが2000年にリリースした言語で、C++に似ていなくもないJavaを意識した言語です。マイクロソフトが開発した言語なので、よくよく調べれば、開発経緯に関する資料も見つかるのかもしれませんが、ここは私の記憶を頼りに背景を思い出してみます。
C Sharp(C#)
マイクロソフトといえばBASICから始まった会社ですから、マイクロソフトのBASICであるVisualBASICの話から始めなければなりません。Windowsでプログラムを開発するVisualBASICはMS-DOSで使われていたQuickBASICをベースにレポートジェネレータを開発していたエンジニアと契約して、これらを組み合わせて作り上げたものです。VBはUCSD-PASCALなどと同様にpCodeと呼ばれる仮想マシンのコードを出力するコンパイラを含んでおり、仮想マシンインタプリタを含むDLLを使って実行ファイルを走らせていました。
Visual Basic
VBでポイントになるのが、GUI部品などを独自に拡張するためにVBXという仕組みを導入したことで、API的な拡張を行うDLLと違い、VBのインターフェースが使える形の呼び出し方法を提供するようになったことです。VBのバージョンが上がりWindows側の仕組みが整うに合わせて、VBXはOCXそしてActiveXとして進化を続けました。これでVBに限らず、いろいろな言語から比較的容易にWindowsGUIの独自部品を使うことができるようになり、広く使われるようになりました。
Component Object Model
VBもVersion6(VB6)になるとVBでOCXを容易に作成できるようにもなり、さらにVBの世界はオフィスアプリケーションのマクロとしてのVBAも使えるようになり、このVBAからもOCXを簡単に使うことができるので、マイクロソフトとしては、これでWindowsの世界を賄おうとしていました。
さて気がつくとWindows以外の世界ではBASICは完全に廃れてしまい、Javaという新勢力が台頭してきました。そこでマイクロソフトは、JavaをVBと同じように使えるように実装し直したJ++という言語を開発し1996年にリリースしました。これはコードのレイヤだけJava風にしたもので、VBと同じpCodeで走り同じようにOCXを使うこともできました。
Microsoft Visual J++
ここでマイクロソフトはサンマイクロの逆襲にあいます。Javaの権利を握っていたサンマイクロは、不十分な互換性しか無い独自の実装を認めないと訴えたのです。確かにWindows固有であったもののGUIパーツを持つJ++が普及してしまえばJavaの世界はWindowsとそうでないものに分裂してしまうことを恐れたのでしょう。結局マイクロソフトはJ++を手放すことになり、ここでかなり学習をしたので、慎重に新しいプラットフォームの設計をはじめました。それが .NET Framework です。
.NET Framework
このフレームワークはWindowsアプリにとどまらずWebサービスやWebアプリも包括するもので、マイクロソフトが手掛けてきた仮想マシン環境を共通言語基盤という形で整理してオープン化したのです。これを受けてオープンプラットフォームのmonoが開発されるようになり、.NET の世界は Windows に閉じた世界からLinuxやMacOS、果にはiOSやAndoriodまでをカバーできるようになりました。
Mono (ソフトウェア)
オープンソースのフレームワーク/Monoとは
.NET FrameworkとMonoの関係
.NET Core / .NET Framework / Xamarin / Monoの関係を整理する
当然、マイクロソフト自身も問題となったJ++を、このプラットフォーム上で動作するように設計し直しJ#としてリリースしましたし、ご本家VBもVB.NETという形に再編しました。もちろんマルチプラットフォームといってもWindowsGUIに関わるクラスライブラリはWinodws専用で、.NETと言ってもすべての部分で互換性があるわけではありません。そして、C/C++を使っていた用途であるとか開発者に対しても、この.NETの世界に足を踏み入れてもらおうと設計したのがC#です。
C#の実際は、C++のように見えるJavaで、ネイティブなマシンコードではなく、.NET仮想マシンで動作します。開発はDelphiの設計に関わったエンジニアが担当したので、何らかの影響もあるはずです。仮想マシンのコードもJITと呼ばれる実行時逐次コンパイルの技術により、充分なパフォーマンスが出るようになり、C++のようにC言語との互換性も不要だったので、問題の出やすい文法を引き継ぐ必要もありませんでした。
Delphi
一番助かるのはヒープ管理をガベージコレクションがやってくれることで、最初の頃は「C++にあってC#にないもの」というのが、それなりにあったのですが、バージョンが上がるにつれ、細かく機能が追加されて、今ではC++に実装されていないような機能も多くあります。そして、曲がりなりにも「Cのような」言語なので、C言語で作られた過去の関数などを呼び出す仕組みも使いやすいので、特別な理由がなければC#ですべてを賄うことができるようになりました。
さてさて、C#登場までの道のりで、とても長いことになってしまったので、C#自身の特徴であるとか文法などはリンク先で見てみてください。道のりも記憶を頼りにしているところも多いので、もしかしたら不十分であったり不正確なところもあるかもしれません。お気づきのことがありましたらコメントでご指摘いただければ幸いです。
C# 関連のドキュメント
C# の歴史
ヘッダ画像は、以下のものを使わせて頂きました。
https://commons.wikimedia.org/wiki/File:C_Sharp_wordmark.svg
Jason Groce - https://github.com/dotnet/docs/blob/cb475ed45f881e9462e34764480d3b0ebce85e91/docs/images/hub/csharp.svg, パブリック・ドメイン, https://commons.wikimedia.org/w/index.php?curid=21111649による
この記事が気に入ったらサポートをしてみませんか?