MIS.W 公式ブログ

早稲田大学公認、情報系創作サークル「早稲田大学経営情報学会」(MIS.W)の公式ブログです!

「どのプログラミング言語を使ったらいいのか」 【新歓ブログリレー2016 11日目】

新入生のみなさん初めまして。49代プログラミング研究会会長のCashew(カシュー)と申します。

さて、僕はプログラミング研究会に所属しているので、プログラミングをしたくてミスに入る人に向けて記事を書きたいと思います。

ズバリ、「どのプログラミング言語を使ったらいいのか」ということです。

「どのプログラミング言語を使ったらいいか」は新入生からよく聞かれる質問です。

しかしながらこの質問、とても答えにくいのです。

なんにでも使えるとても使いやすい良い言語というのがあったら多分世界にこんなプログラミング言語は溢れていないですね。つまり普遍的な答えはないのです。

この質問に答えるには前提条件なるものが足りないのです。

一番鍵となるのは作りたいものは何かということです。

例えば、iOSで動く普通のアプリケーションを作りたかったとしましょう。そうなると選択肢は大体3つくらいになってきます。

くらいです。この中でObjective-CとSwiftはアップルが正式にサポートしている言語です。8割くらいの普通のアプリはこの2つの言語で書かれているのではないかと想像します。一方C#マイクロソフトが中心となって進められていると言っても過言ではないでしょう。そのMicrosoftが買収したXamarinという企業があるのですがそこが作ったXamarinを使うとC#だけでWindows,iOS,Androidの開発が出来てしまうという優れものがあります。そしてこのXamarinはつい先日の4/1にVisualStuidoから無料で使えるようになったことが公表されました。Xamarinを使えばAndoridとの共同開発が楽になることから今後はC#でのiOS開発が盛んになると思います。

では、ゲームを作ろうとする時はどうなるでしょうか。ゲームは普通のアプリケーションと違ってもっと低レベルなAPIを基本的には叩かなければいけません。もちろん普通のOS側が提供しているWin32APIやUIKitでも画像は表示できるので、ゲームが作れない訳ではありませんが、たいていの場合そのようなAPIを使ってしまうともっさりしたゲームになってしまいます。(UIKitのdrawRectなら速いかも未検証)ゲーム制作の時にどのようなAPIを叩けばいいのかというと、DirectXOpenGLといったAPIを叩けば良いのです。DirectXMicrosoftが提供しているAPIで高速であるという特徴があります。しかしながら、WindowsXboxでしか利用することができないという特徴があります。一方OpenGLDirectXと比べると低速であるが正確であると言われています。OpenGLはPCやスマートフォンであれば利用できます。

ではDirectXOpenGLが利用できる言語(正式にサポートされている言語)はどんなものがあるのでしょうか。

DirectXが利用できる言語

OpenGLが利用できる言語

  • C(C++/Obj-Cは当然可)

という感じなのですが、OpenGLのラッパーが提供されているまで含めるとJavaC#OpenGLを利用できるので事実上OpenGLの方が使える言語は多いです。(あまり有名でないライブラリまで含めればDirectXも使える言語)

ゲーム制作ではこんな感じですが、他の言語について見ていきましょう。(このスタイル書きにくかった(小声))

汎用言語

C言語

カシューC言語を教えてるけどC言語大好きなのかなと思いましたか? 違うんですね。C言語が好きかと言われるとそうでもないんです。 C言語はとても小さいという感覚を持ってください。小さいので扱いやすかったり割と初心者に勧めやすかったりするのですが、例えばキューというデータ構造を使おうと思った時にはC言語であると自作しなくてはならず、大変です。 C言語の何がいいかというとハードウェアに近いことです。ハードウェアに比較的近い言語であるので、高速に動作しますし、チューニングのしやすさは群を抜きます。

C++

カシューは何が好きなんだと思いましたか?C++が好きなのです。 C++の良さはここに書くにはスペースが足らないと言いたいところですが、とりあえず書いてみましょう。 まず一つ目はオブジェクト指向プログラミング(OOP)が出来るということです。 オブジェクト指向プログラミングとは何かがわからない人は最近のプログラミングには不可欠な概念であるということだけはわかっておいてください。(自分で調べてみましょう) この特徴は汎用プログラミング言語では一般的ですね。 2つ目はC++の型システムです。C++の型システムはかなり厳しい方であるといえるでしょう。 C++テンプレートと呼ばれる型を引数にとるようなプログラミングができるようになっていて、テンプレートだけで色々と出来てしまったりします。 そしてこのテンプレートを利用したSTL(Standard Template Library)という標準ライブラリ群があり、これがとても便利なのです。(しかも速度が速い) STLが僕を虜にしてしまったと言っても過言ではないでしょう。 3つ目は速度が速いということを挙げておきます。 C++は入門には少しハードルが高いと言われています(小声) 好きであるからこそデメリットも挙げておきましょう。 1つ目は全て値型であるということです。値型とはデータを渡すやり方のことなのですが、コピーしなくてもいいところまで何も考えずに書いているとコピーしてしまいます。コピーしないための特別な書き方があり、もしかすると面倒であると感じるかもしれません。何も考えずにプログラミングをしていてJavaより遅くなってしまうことさえあります。 2つ目にGC(ガベージコレクション)がないことです。GCがわからない人は飛ばしてください。「C++やるとnewやったらdeleteしなきゃいけないんでしょ」なんてことは良く言われます。今は参照カウンタ方式のメモリ管理が標準ライブラリで実現可能なためそこまで問題にはならないと思うのですが、参照カウンタ方式は循環参照の危険性があり、これまた何も考えずにプログラミングをしているとバグを産んでしまうという注意点があります。 3つ目の欠点として初心者に分かりづらいという点を挙げておきます。 僕自身C++を勉強してから他の言語を使うようになってきたのですが、他の言語の方が大抵の場合言語仕様が小さく理解しやすいものです。C++をやると他のOOPの言語は使えるようになりますが、他の言語をやった人はC++が使えないと言われるくらいです。(実際そう感じた)

Java

プログラミング言語と言ってこの言語を思い浮かべる人も少なくないのではないでしょうか。 とても有名なプログラミング言語ですね。 もし、今企業で自社内のパソコンで動かすアプリケーションを作ろうとなった場合Javaが選択されることが多いのではないかと思います。 なぜかというと、C/C++よりもOSに依存する部分が少ないこと、標準ライブラリが充実していること、バグを生み出しにくいこと(人によります)、分業がしやすいこと、パッケージ管理が楽なこと、そして開発環境が充実していることでしょうか。 入門という点から考えても結構いい言語です。 しかしながら僕はあまり好きではなかったりします。僕が思う欠点としては、"もっさり感"でしょうか。JavaIDEJavaで書かれていることが多いのですが、メモリ消費量が多くなってくるとなかなか上手く動いてくれなくなってしまうように感じます。Javaはとても小さいプログラムだとC言語で書いたものと同じくらい高速に動きます。しかし、大きいプログラムになってくるにつれて遅いと感じることが多いです。 あと一つ気になることがあるとしたらiOSとの相性が悪いということでしょうか。(一応無理やり使える筈...)

C#

はい来ましたC# (●`∀´)9 ヨッシャ!! 思うに今最もアツイ言語ではないでしょうか。 "Microsoftが作った言語"ですね。この言語ができた当時、Javaとあまり変わらないとかコピーだとか言われた経緯がありますが、今はそんなことはありません。むしろ使いやすさでいったらjavaを完全に超えていると言ってもいいのではないでしょうか。しかしながらC#microsoft が作ったということもありWindows系でしか使えない過去がありました。その後monoと呼ばれるものを使うことによってC#が他のOSでも使えるようになりUnityでもC#が使えるよういなっているわけですね。そして先ほど紹介したXamarinの無償化によってC#マルチプラットフォーム開発が一般に普及していくことになると思います。

Objective-C

実は割と経験者のいる言語でしょうか。iOSプログラミングとかOS Xプログラミングに使われますね。僕はこの言語を使ってラベル付き引数が好きになりました。こういってしまうと失礼な気がしますが、ダラダラやるにはいい言語な気がします。他の言語と比べるとなんだか英文を読んでいる気がしてくる言語です。標準ライブラリのクラスの関数名がとても長いということがそうさせているのだと思うのですが、「これ何だっけ」ってことが少なくなるので長い関数名も苦じゃないです。言語自体が優秀だとはあまり思わないのですが、Xcodeの補完が素晴らしく使い易いものになっていると思います。ただ言語仕様がC++ほどじゃないけれども複雑ですね。(Obj-Cがスモールトーク系だから僕が馴染みがなかっただけかもしれない。)

軽量言語

javascript

おなじみjavascriptですね。javascriptは今使われているほとんどのブラウザで実行することができますね。 そういったことからブラウザでゲームを作るのに使うことができるのは分かると思います。 しかし、javascriptの利用はhtmlの中に書くだけにはとどまりません。実はJavascriptC++Javaなどの言語に組み込むのが容易という性質があり、高速に動作する必要がある部分は汎用言語で書き、ちょくちょく変更する部分はJavascriptで書くということがされることがあります。そのような構成にすると、毎回コンパイルしてから実行する手間がなくなり、スクリプトを変更して実行するという手順になるのでプログラマーの仕事をデザイナーに任せられたりすることができます。ただし、Javascript自体はオブジェクト指向プログラミングを利用できるのですが、classを作れないことから使いづらいと言われることがあります。そのような問題にぶつかってしまったときはalt-jsと呼ばれるjavascriptを強化したような言語たちがあるのでそれを使うといいかもしれないですね。

Python

熱狂的信者の多めなpythonです。なんといっても今は情報系ではDeepLearningが流行っていますね。このDeepLearningをするにあたって最も使われている言語です。早稲田の情報系の研究室でもよく使っているという話を聞きます。C/Javaと違ってブロック({}で括られる部分のこと)を使いません。階層構造はインデントで区別されています。なので入門者にPythonを教えるとインデントがしっかりとする癖がつくから良いという話も聞きますね。書く人によるインデントの癖も出にくい(出ない?)ので読みやすい言語とも言えるのではないでしょうか。Pythonから派生した言語にCythonというものがあり、これはPythonC言語のコードに変換してからコンパイルしてバイナリを作ることができるのでパフォーマンスが必要になってきたらCythonに変えられるというメリットがありますね。

Lua/Squirrel

これはゲーム制作でよく利用される言語の一つです。C/C++に組み込んで利用することができます。先ほどJavascriptC/C++/Javaに組みこむことが出来ると言いましたが、むしろLua/Squirrelは組み込まれることが前提としてあると言えます。スクリプト言語の中では結構高速な部類に入ります。LuaPythonに似ていてSquirrelC/C++に似た書き方をします。この2つを選ぶのは書き方の好みだったりするのではないでしょうか。

PHP

PHPは動的なサイトを作るのによく使われていますね。動的なサイトを作りたいときは一番PHPが楽な気がします(Web系の標準ライブラリが豊富)。特徴と言っても特に思い当たることがないような言語ですが、PHPファイルをサーバーに設置すればすぐに使えるようになるという点とCGIではなくデーモンとして実行されるという強みがあります。ただ動くコードを作れるのとセキュリティ的に安全なコードが違ったりするので注意が必要です。もし型が欲しかったり高速化を望むならば某大企業が作ったHackを使いましょう。(HackはPHPを拡張した言語です。)

Ruby

日本で生まれた言語というだけあって資料が豊富・入門しやすい言語です。Ruby on Rails(RoR)を使うために勉強したという人が結構多いのではないでしょうか。RoRPHPと同じように動的なWebページを制作することができるのですが、PHPより大規模なシステムの制作に向いていると思います。TwitterRoRで作られていたことで有名ですね。

番外

Lisp/Haskell/F#/Scala (関数型言語)

関数型の言語について触れておきたいと思います。関数型は最近人気がありよく見かけるようになってきました。 関数型を勉強してもC/C++/Java等に役に立たないという人もいるのですが、僕はそうは思いません。 関数型に関しては僕は不勉強ですし他のサイトで勉強してみて欲しいです。特に参照透明性に関してはオブジェクト指向しか使う気がない人でも知っている人と知らない人で使い易い関数が書けるかどうか・コードの汚さという概念が分かるかどうかが変わってくると思ってるので勉強することをお勧めします。 Lispはとても言語仕様が小さく初めて勉強したときは逆に混乱してしまいました。Lispの方言(派生)が多く中には入門に適したものもあるようです。 Haskellはちょこちょこと勉強しているのですが仕様が重厚でなかなか覚えられないですね。ただ、数学的なバックグラウンドがあったり、副作用を厳格に扱ったりするのでプログラミング自体の勉強にはとてもいいと思います。(ただし初心者でない人に限る) F#はC#と並列して(組み込みなのかな?)利用することが出来るのでC#の普及と共に一気に利用者が増えそうな予感がする言語です。ScalaC#と同じくらいアツイ言語だと思います。 ScalaJavaを知っている人ならそこまで苦でもないと思いますし、Javaのライブラリが使えるのがいいですね。

Swift

Swiftは少しいじってみたのですがあまり理解していないのでここに書くつもりがなかったのですが、今日ビッグニュースが入ってきたので書きたいと思います。 SwiftはAppleが作った言語です。Swift自体はオブジェクト指向(OOP)と関数型言語の特徴をサポートします。SwiftではiOS/OS Xのアプリケーションを作れますが、先般オープンソース化が発表され実施されていました。そして今日Android開発でSwiftを使えるようにするかもしれないという報道が出てきたのですね。まだ噂段階の情報ですが、Androidで今まで開発に使われていたJavaOracleとの特許権で訴訟があっただけあり本当な気がします。もし実現したらSwiftでAndroidiOSの開発ができるようになることになるので楽しみです。

他にも色々と言語はあるのですが時間が足りなくなってきたのでここまでにします。 やってみたい言語はありましたか? 新入生にはC言語から始めてC++まで教える予定です。 ミスへの入会を待っています。

以上Cashewがお送りしました。