Microsoft一党独裁ではないC++やJavaScriptの混沌

いや、別にそんなドス黒い政治的な話じゃァないんですけども。敢えて混沌と書かせていただいたのは、2020年現在のC++ってどうなってるのかなーと思って調べてみたら結構ややこしかったからでありまして。

スポンサーリンク

C++とSTL

STL?なにそれ? ああ、vectorとかそういうやつね。

僕のプログラミング遍歴で書いた通り、僕のC++生活はMicrosoft Visual C++4.0までで、そこからはVisual Basic6.0、そして現在はC#.NETという道筋を辿っています。

昔のVisual C++は基本的にMFC推し。全クラスのリファレンスが記載された辞書みたいに分厚い本を初学者の僕は読み漁っていたわけでして、文字列はstd::stringではなくCString、全てのクラスの先祖にCObjectってのが居て、std::vectorはおろかテンプレートすら使われてなかったのでCObListとかいうCObject用の可変長リストクラスがあったような無かったような。

調べてみると、VC++4.0あたりでもSTLは付属してたみたいだし、iostream関連は前述の立方体のように分厚い本にも載ってたような気がするけど、当時はMicrosoft方言がキツかったらしく、vectorとかのコンテナクラスが使えたのかどうか今となっては不明です。使えたとしても変なMicrosoft方言に寄ってたかもしれません。

そんなわけで、MFCがMicrosoft帝国国民の間でしか通用しないとは露とも知らず、「CStringって使いやすいなぁ」とか思ってたわけですワ。そしてそのままC++から離れたので、僕の知識はそこで止まっておりまして。

今僕がC++のテンプレートを理解できるのは、それがC#のジャネリクスとほぼ同じだから。std::vectorはC#のList<T>だし、他も大体JavaかC#からの逆輸入っぽいから、語るだけなら一応できます。細かい違いはよくわかんないですけどね。例えばC++のテンプレートはコード中に現れる型ごとに別々にコンパイルされるとか、そんなん知りまへんワ(知ってるやんけ)。

それでも最近は、Microsoft帝国でも最新の標準仕様に則ったコンパイラやライブラリでVisual C++を仕上げているようですね。C++/CLIとかそっち系はとりあえず脇に置いておくとして。

結局何が言いたかったかというと、Microsoft一つ見てもこの有様なのに、C++の処理系は各社各様の群雄割拠。ちょっと環境が変われば、何が使えて何が使えないのか、もうわけがわからんすよね。overrideって書けるの?書けないの?

JavaScriptの混沌

ES5だとかES6だとかそういうアレもあるけども、JavaScriptがC++以上に混沌となってる理由は、ブラウザがその場で解釈するインタープリタ言語であるというところが大きいでしょう。

つまり、処理系が多少違ってもコンパイルさえ通せばなんとかなるC++と違って、JavaScriptは常にブラウザ様の顔を伺わないといけない。しかも、Webという広大な海で24時間365日動き続けるので、おいそれと迂闊に言語仕様を変えるわけにもいかない。

その結果、古い言語仕様を保ったまま記述をラクにするjQueryなんてものを考え出す人が居たり、「これがJavaScript流のクラスの作り方や!」とどいつもこいつも俺様流クラス記法を考え出したり、もうJavaScriptを見限ってTypeScriptからトランスパイルするという発想の境地に至った一派も居たり。

何より問題なのは、みんながみんな「自分の考えたやり方のほうがすごい」って主張し合うもんだから、どうにもこうにも「これぞ」という決定版が1つに決まらない。他人や他社の書いたJavaScriptはもう自分の知ってるJavaScriptとは別の言語なんじゃないかって思うくらいに、流儀の違いが色濃く出てしまいます。

var MyNameSpace;
(function (MyNameSpace) {
    var MyClass = (function () {
        function MyClass (argConstructor) {
            //コンストラクタ
        }
        MyClass.prototype.myMethod = function () {
            //メソッド
        };
        return MyClass;
    }());
    MyNameSpace.MyClass = MyClass;
})(MyNameSpace || (MyNameSpace = {}));

もはや何をやってるのかわけわからん!

僕が気に食わないのは、こういう謎のテクニックを「上級エンジニアが使うマル秘テクニック! 上を目指すなら身につけよう!」とか言い張る変な風潮。いやまぁ、一応ある程度は身につけたりするんですけどね、なんかね、そうじゃねェだろ。テクニックとは設計やロジックやアルゴリズムを磨くことであって、こんなコンパイラやインタープリタの抜け道を針の穴を通すように探すことではない。決して。

階段をいかに難しく奇抜な方法で登るかを切磋琢磨するんじゃなくて、とっととエレベーター設置しろよ、って話ですワ。

Microsoft一党独裁の功罪

僕はMicrosoftの犬なわけでして、C++の次はVisual Basicに転身したんですワ。「Basic」って聞くとなんか初心者っぽい香りが漂ってきますが、業務というのは遂行してナンボのもの。敢えて「俺は難しいことやってるんだぜ」っていう無駄な自己満足に浸るくらいなら、ラクに成果物を作れる方法を選んだほうがマシ。というか、ビジネスであるならそうすべき。VB6ともなりゃぁP/Invokeも自由自在なので、C++に比べて遜色は無いぜよ。

言語としてBasicを採用しているのは、マニアックなものを除けば、MicrosoftのVisual Basicだけ。昔のN88BASICなどとは似ても似つかないほどに魔改造されているけど、どうせMicrosoftしか無いんだから、もう好きなだけ独自仕様にしちゃってください。

そして、エディタもIDEもコンパイラも全てが、唯一無二のVisual Basic。プログラミングというのは往々にして環境構築で挫折するものですが、ボタン一発で全てがインストールできるVisual Basicにはそんな苦労は無い。しかも、みんな同じ開発環境だから、人によってやり方が違うということも無い。

プログラミングで困ったことがあればググればいいし、ググって出てきた情報は誰のどんな環境でも使える情報。なにより、情報量が多いというのがイイですね。

それもこれも全て、Microsoftが「我こそが【唯一】なり」という強力な一党独裁体制を敷いてるおかげ。

その反面、コンパイラにバグがあったり足りない機能があった場合、自分でカスタマイズして解決方法を模索することができない。一党独裁の下に群がる下々の者は、ただただバージョンアップという啓示を待つしかない。

全ての民が1つの旗の下に集まるというメリットとデメリット。逆に、各社の勢力が拮抗していて群雄割拠という混沌を生み出しているC++やJavaScriptのメリットとデメリット。自分の業務に合った環境は果たしてどちらなのだろうか。しっかりそれを見極めていきたいですね。

今の僕はC#

今の僕のメインはC#なんですが、これも最初は(今でも?)Microsoftの決めた通りにしか使わせてもらえないプログラミング言語でした。

昔のMicrosoftはJavaに対抗してJ++なんていうわけのわからんものを作ってました(遠い昔に永眠されました。ご冥福を)。C#もそれと同じ道を辿りそうな怪しい雰囲気が最初はあったんですが、ありがたいことにめっちゃ長寿で、今でも現役です。

しかも、対抗勢力の無い初期の頃にガチガチに「これぞC#」という仕様を誰にも邪魔されずに策定していったので、良きにつけ悪きにつけ、方言だらけになってカオスになるようなこともありませんでした。

オープンな仕様で切磋琢磨する言語もいいですが、多少機能不足があったとしても政治力で「これぞ」という唯一の仕様を作り上げた言語のほうが、僕には合ってる気がします。だって、できるだけラクして成果物をさっさと仕上げて報酬に替えたいじゃん?

スポンサーリンク