Hatena::ブログ(Diary)

shi3zの長文日記 RSSフィード Twitter

2016-07-01

主要なプログラミング言語8種をざっくり解説 08:47 Add Starjrf (green)yatmsu18ebmgsd1235

 プログラミング言語は沢山ありますが、AKBの神セブンと同じく人気に大きな偏りがあります。

 そこで今回は、主要なプログラミング言語8種類をざっくり解説してみましょう。


 先に行っておくけど、プログラミング言語の話はすぐに宗教論争に行くのでここに書いたのはあくまでも参考的意見というか僕の独断と偏見に満ちた解説だから真に受けるんじゃないぞ。どうでもいいツッコミとかもやめてくれよ!読むときははてブのコメントも読めよ!


 さ、防衛線も貼ったところでいきましょうか。


C言語

 C言語は、AlgolとBCPLの影響を強く受けた、その次の言語という意味で「C言語」と名付けられました。

 登場当初は中級言語としてハードウェアを直接駆動するようなプログラムからより高度で抽象的なプログラムまで書ける万能性を誇り、機械語に比較したその処理速度の遅さにも関わらず、爆発的に普及しました。



 今は機械語に変換できるコンパイル言語の方が少数派になってしまったので、C言語が最速と信じる人も居ますがそれは正確とは言えません。


 まあボンクラがアセンブリ言語を書くよりはCで書くほうがよほどマシでしょうが、エキスパートがアセンブリ言語で書く場合はCより速くなることはママあります。コンパイラよりも最適なコードが書けないというのは、単にプログラマの能力が足りないんです。ここ重要。まあそのうちAIが人間よりマシなコードを書くことになるでしょうが、とりあえず今のところはコンパイラの最適化はかなり限定的です。コンパイラを盲信するのはボンクラ、ここだけ覚えておけばOKです。



 また、C言語はインラインアセンブラが使えるので、特定条件下ではかなり最速に近いところまで書けますが、インラインアセンブラを使えるから高速、と言ってしまうと、シェーダーを書けるWebGLでさえ高速ということになってしまうので普通はインラインアセンブラの話とC言語の話を混同してはいけません。


C++

 C++は、C言語にオブジェクト指向プログラミングのパラダイムを導入しやすくした言語です。

 Cとほとんどの部分で共通しており、C++はC言語の上位互換です。

 例えばC言語ではコメントは/*~*/しか使えませんが、C++では//が使えます。

 いろいろ改良されていて便利なので今はC言語で書ける内容であってもC++で書くのが普通です。

 ただし、C++はどんどん言語仕様が肥大化しており、正直おじさんにもよくわからないところまで来てるのでまあスキモノの方はご自分で調べてください。


 C/C++はネイティブ言語(機械語)にコンパイルできるので動作させるために仮想マシンが必要ありません。

 あーこんなことわざわざ書かないとならない時代になったか



Java

 Javaは、C++の影響を強く受けた言語で、もともとは組み込み機向けにバイトコードと呼ばれる中間コードを吐き出すために生まれた静的型付き言語です。


 静的型付き言語でありながら、かなり乱暴なメモリ操作が可能だったC/C++と違い、仮想マシンで動かすことを前提としているので厳密なメモリ管理とガベージコレクションが言語仕様に内包されていて、プログラマーはポインタ管理地獄から脱出できることになりましたが、そのかわりにガベージコレクション地獄という新しい地獄とご対面することになりました。


 特にゲームやユーザーインターフェース系のプログラミングでは、Javaのガベコレがいつ走るかドキドキしながら見守ったり、ガベコレを割けるために自前でオブジェクトプールを作ったりするようになったのですが、それだとC言語時代と何も変わらないじゃん、というツッコミを入れられたりしました。


 ゲームならまだしも、OSのシェルとかだとオブジェクトプールなんか作った日にゃ、シェルは動けどアプリが動かない。おいこれのどこが組み込み用なんだよ、と壮絶に思ったりしました。コンパイラによる最適化は、C言語以上に全く期待できない言語で、ハッキリいってJavaコンパイラの最適化を盲信するとかはボンクラを通り越して無能です。


 当初のJavaはC/C++に比べると圧倒的に遅かったわけですが、ジャスト・イン・タイム・コンパイラ効いてると場合によってはC並に高速に動くこともあるようです。あくまでも、きちんとアルゴリズムが最適化されていればね。


 Android向けアプリのプログラムは主にJavaで行われますが、なぜか組み込み用に設計されたのにサーバー向けプログラムもJavaが主流な業界が一部あります。


 Javaを開発したSUNは、運命のいたずらでOracleに買収されてしまい、JavaはいまやOracleのものになってしまいました。


 なにかと喧嘩のタネが絶えないので最近はちょっと下火・・・かなあ

 まあエンタープライズ方面ではバリバリ使われてますね


C#

 JavaはC++の欠点に対する理想的な解決策だ!やったぜバンザイ!と思ったら、いろいろと喧嘩になったので、仕方なくMicrosoftが自分で作ったのがC#です。+と+があわさって#っていうね。こちらもJavaと同じく中間コードコンパイラ言語なので、動作させるためには仮想マシン環境が必要です。


 Javaより新しい言語なので、C/C++/Javaの影響を強く受けつつも、いーカンジになってるのがC#です。

 たとえばC++では無茶苦茶面倒臭いDirect3DのCOM操作がスッキリと書けて衝撃を受けました。


 なかなかいーカンジなのでファンは多く、今はUnityのスクリプト言語として主要な使われ方をしています。

 まあ誰も書きたくないでしょうがWindowsアプリもC#で書けますし、C#の実行環境であるmonoはLinuxでも動作します。


JavaScript

 JavaScriptは、C言語よりも歴史が古いLISP言語の影響を強く受けた関数型言語で、当初はLiveScriptと呼ばれていましたが、マーケティング上の都合で、当時流行っていたJavaの名前を借りてJavaScriptになりました。でも、JavaとJavaScriptが似てるのは文法の表面的なところだけで、中身は全く別物です。

 HTML5で動作するアプリやWebサイトを作るためには今のところJavaScript一択ですが、最近はC言語からJavaScriptにコンパイルする環境が出てきたり、WebAssemblyが出てきたりして立場も微妙になってきました。


 個人的には一番好きな言語のひとつです。

 でもクセがあるので勉強する時には注意が必要です。


 V8やnodeJSを使えばサーバーサイドのプログラミングも可能です。


Ruby

 島根県のまつもとさんが開発したスクリプト言語です。

 基本的に遅いです。

 遅いとか速いとかは、Rubyにとっては飾りです。偉い人にはそれがわからんのです

 最近のはJITが入ってVM化して速くなったそうですが、他の言語と違い、高速に処理することよりも楽しくプログラミングすることに重点が置かれているため、いろいろと楽しく書けますが、処理が重くなるとしんどくなります。



 Ruby on Railsというフレームワークをオランダ人が開発して大ブレイク。シリコンバレーで最も高い給料を貰える言語として有名になりましたが、反面、日本ではRubyしか使えないニワカプログラマーが大増殖し、我々古来からのプログラマーの頭痛のタネとなっている側面もあります。


 Rubyしか使えないプログラマーは、まつもとゆきひろ氏を神と崇め、DHHというオランダ人をキリストだと思っているので異様に他の言語を蔑み、Rubyが最高だと思っているので異教徒を弾圧しようとします(まあ自分が唯一使える言語を狂信するのは初心者にはよくあることです)。


 彼らに地動説を訴えても無駄ですので、まつもとさんのことは個人的には尊敬していますが、狂信者の方々とは距離をとることにしています。




 また、よくいるRubyしか使えないプログラマーの人は、アルゴリズムをプログラミングとは直接関係ないものだと思っていて衝撃を受けます。


 先日、なんと僕にプログラミングを教えてくれるというありがたい教室の方がいらして、どのくらい教えてくれるのかとおもって「そこのホワイトボードにバブルソートのアルゴリズムを書いてみてもらえますか?10分あげますから」と言ったら「すみませんアルゴリズムは知らないんです。Ruby on Railsなら教えられるんですけど」とのたまい、僕の頭がおかしくなったのかと思いました。


 Ruby on Railsしか使わないんだったら確かにアルゴリズムは意識しないかもしれないですが、アルゴリズム+データ構造=プログラムです。人に教えるのを商売にするならちゃんと勉強しようね。アルゴリズムを教えず(つうかたぶん講師が知らない)にRuby on Railsだけ教えるんだったらPHPと大差ないじゃんよ(なのにPHPをディスるRuby教徒は多いんだよなあ。だれの受け売りなんだ)。


 誤解なきよう。

 僕もRubyは好きな言語のひとつです。


 ですがRubyはあまりにも良く出来過ぎているため、小学生でも使えるサブマシンガンみたいな感じがして使ってる人が怖いです。


 そんでもって、Rubyのおかげでプログラミングの間口が広がったのはいいんですが、トンデモも大量に混入してきて困惑してます。いやね、僕もまさか僕にプログラミング教えようっていう人がアルゴリズムを知らないってのは長年生きてきて初めてだったからさ。ビックリしたのよ。


PHP


 PHPはApacheと一体化してるのでRubyに比べてWebサービスのメンテナンス性が高く(まあこれも諸説あるでしょうが)、しかも中間コードにコンパイルできて実用上十分高速なので普通はWebサービスを運営するときはPHPを使います。


 自社のサービスにPHPを使う代表的な企業はFacebookです。

 ちなみに彼らのPHP愛は凄まじく、2014年にはPHPを独自に拡張したプログラミング言語Hackを公開しました。

米Facebook、PHP互換の新プログラミング言語「Hack」を公開 | OSDN Magazine

https://osdn.jp/magazine/14/03/25/141500 

 PHPのプログラムはRubyやPythonなどの言語とくらべてお世辞にも綺麗とは言えません。

 PHPはプログラミング言語というよりはWebサービステンプレート言語なので、まあそれも仕方ないかなという感じです。


 PHPの強みは、およそどんな人間でも、一週間もあれば基本はできることです。

 その分、実用サービスに持っていくためには扱いが難しいのですが、それでも、どうでもいいサイトならすぐに立ち上げられるのがPHPのメリットです。


 サービスというのはプログラマーが楽しけりゃいいってもんじゃなく、いかにメンテナンスできるプログラマーを育てられるかということが大事だったりもするわけです。


 自由度が高すぎてオレオレ記法に陥りがちなほかのプログラミング言語よりも、大学生のバイトでもバグが追っかけられるPHPが重宝される理由は僕にはよくわかるなあ。


 僕も最初はC++でWebサーバー書いて、次にJavaで書いて、デプロイの煩雑さに頭をかきむしって最後はPHPで書くようになった。最近は自分が書きやすいという理由でPythonにしてるけど。PHPは欠点も多いけど利点も多いよ。


Python

 Pythonは、UNIXのスクリプト言語です。

 UNIXのスクリプト言語としては他にもシェルスクリプトPerlといったものがあるんですが、Pythonは色々と歴史があるぶん、いろんなことがラクです。

 Pythonを積極的に使っている代表的な企業はGoogleです。

 誰が書いても同じ処理がだいたい同じ感じのプログラムになってしまうのと、「こういうことできないかなー」と思うと誰かが既にモジュールを書いたりしているのでいろいろプログラミングしなくていいのでラクです。圧倒的にラク。Windowを出すようなアプリから画像処理、動画の処理、などなどできそうなことはなんでもできます。

 リフレクションも強力なので、やりたいと思ったことはだいたいできますし、プログラムの挙動を追いかけるのも簡単です。

 あと、C言語と同等のインターフェースを持っているので、UNIX用にコンパイルされた共有ライブラリに直にアクセスできるのでそれも便利。

 Pythonはかなりバランスのとれた言語だと思いますが、UNIXでないとその実力を発揮しにくいかもしれません。

 僕が最近一番使っているのはPythonです。

 人工知能にかぎらず、たいていの処理はPythonで書くのがラクです。









 というわけで世の中にはいろいろなプログラミング言語があるわけですが、なぜかRubyしか使えない人がRubyしか使えないくせに他の言語を舐めてる傾向があります。


 以前、某渋谷系の人材紹介会社の人が僕の所に来て


 「うちはとにかく凄いエンジニアを紹介できるんですよ」


と自信満々に言うので、


 「へえ、どんなふうに凄いんですか?」


と聞くと


 「実はみんな、Ruby使いなのです」


ドヤッと胸を貼るので、お引き取り願いました。塩も撒いた。


 あんなあ、なにかひとつの言語を使えたら凄いって、そんなラクなことないぜ。

 芥川龍之介は凄いけど、彼が凄いのは日本語という言語が使えるからじゃないだろう。


 まつもとゆきひろさんは凄いけど、Oculusのジョン・カーマック(伝説的なゲームプログラマー)はRubyなんか興味もないぜ。


 だからといってカーマックの使ってるC/C++/C#といった言語を使えるならそのプログラマーが凄いということにももちろんならない。「オレはアメリカ大統領と同じ英語を喋ってる」と自慢するアメリカ人がいたら笑いものでしょう。


 プロのプログラマーなら、最低6言語、ふつう20言語くらいは一通り使えてるべきで、凄い人っつうのは自分でプログラミング言語作って普及させたとか、ライブラリ作って普及させたとか、そういうエビデンスがあって初めて客観的に「すごいなー」って言われるのよ。


 後日談、再び某渋谷系の人材紹介会社がやってきて、


 「こんどこそ、凄い人材集めましたよ」


 と言ってくるので


 「へえ、どんなふうにですか?」


 と聞いたら、


 「なんと全員、githubに投稿してるんです」


 ドヤッと胸を貼るのでお引き取り願いました。

 あんなあ・・・(以下略)