主要なプログラミング言語の『使用用途』を考えてみた
プログラミング言語の主な分類としては、
- LL言語(JavaScript, PHP, Ruby, Python, Perlなど)
- 中間言語をVMで実行する言語(Java, Kotlin, Scala, C#など)
- ローレベル言語(C/C++, Go, Swift, Rustなど)
があるかと思います。
それぞれの分類ごとに使用用途を考えてみます。
Contents
1. LL言語
PHPはWeb・スマホのサーバーサイド
PHPの使用用途は主にWebのサーバーサイドかスマホアプリ/ゲームのバックエンドのJSON APIです。
私の場合、cronで動かすDB更新のバッチ処理もPHPで書く場合があります。WebをPHPで作ってるので、バッチもPHPで書いてるってだけなんですけどね。
それでも同じ言語で書くことによって、コードを使いまわせるメリットがあるので、よほど他の言語にする利点がない場合は言語を統一したほうがメリットがあると思います。
Pythonは機械学習(AI, ディープラーニング)、Web・スマホ・デスクトップ
続いてPythonですが、PHPと同様にWebのサーバーサイドやスマホアプリのバックエンドで使われています。
海外では有名なサービスの開発にも使われていて、Dropbox、Instagram、PinterestがPythonで作られているそうです。
DropboxはPCのデスクトップアプリ部分もPythonで開発してるそうです。
それからPythonには科学計算や統計処理のライブラリが充実してるので、機械学習や人工知能などのアカデミックな分野で使われています。
ここ数年Pythonの書籍出版が増えているので、勢いを感じます。
私は以前、RubyとPythonどっちを使い始めようか考えた時があって、その時はRubyを選択しました。決定打となったのはPythonのメソッド定義には第一引数にselfを書かなければならないことでした。
class HelloWorld: def hello(self): print "Hello"
def hello(self):
がメソッド定義なんですけど、引数のないメソッドでも、インスタンス自身を表すselfを引数に書かなければならないんです。selfはJavaやPHPでいうところのthisなんですけど、なんでわざわざプログラマーが暗黙の引数であるselfを書かなければいけないんだよって思ったんです。なので、Rubyの方が構文的に好きだなと思いました。
ちなみにRubyで同じコードを書くと
class HelloWorld def hello() print "Hello" end end
こうなります。こっちのがずっと自然ですよね。
まぁ、とはいえ、微々たる差なので慣れればどうってことはありません。今では私もPythonのコードも書いています。
Pythonに慣れると、今度はPHPやRubyなどの閉じカッコを書くのが面倒だなと感じてしまいます。
Pythonで以下のようにif文で:からインデントが戻るまでがif文なのに対し、
if a == 1: print("aは1です") print("aは数字です") print("こんにちわ")
PHPでは{を書いたら}で閉じなきゃなりません。
if (a == 1) { print("aは1です"); print("aは数字です"); } print("こんにちわ");
たいした手間ではないんですけど、短い方に慣れると、それが当たり前になっちゃうんですよね。
RubyはWeb専用じゃない
RubyはなんといってもRuby on Railsを使ったWebサービス開発が有名ですが、Ruby作者のまつもとゆきひろさんは、
「RubyはWeb開発用言語ではなくて、汎用言語であり、RubyってWeb用でしょ?とか言ってる人はもういいです。」
とインタビューで答えてました。(Web上の出典を探したんですが、見つかりませんでした。書籍か雑誌か、はたまたrebuild.fmかも)
その時おっしゃってたのは「Rubyは自分自身がサーバーになることもできる」とのことでした。
RubyにはTCPソケットのサーバーとして待ち受ける機能があって、通信が来たらスレッドを起動して、そのコネクションの返答をさせるということができますからね。
PHPの場合、実はこういうことができないんですよ。PHPにもTCPソケットを待ち受ける機能はあるんですが、ユーザースレッドを起動する機能がないので同時アクセスを並列でさばくことができないんです。なのでPHPはWeb用言語と言っていいかもしれませんね。とはいえ、それでもWeb以外の処理(バッチ処理とか)できるのでWeb専用とは言い難い気がします。
で、一応PHPのユーザースレッドについて現在の状況について調べてみたらpthreadsというモジュールを使うとできるらしいです。以前はなかったんですけど、今はできるみたいです。とはいえ、標準機能として提供はされていないという意味では上記は正しいと言えます。
だから、PHPってLLの他の3言語にくらべてちょっと特殊でWebに特化してる感はあります。
続いて中間言語をVMで実行するタイプの言語を見ていきましょう。
2. 中間言語をVMで実行するタイプの言語
JavaはCPUの実行性能がすごい
「Javaは処理によってはC言語よりも高いパフォーマンスを出す時がある」って話聞いたことありますよね?
CやC++でCPUごとに最適化したマシン語を生成させるには、そのマシンごとに最適化オプションをつけてビルドしなければなりません。通常はそんなことはせず、大抵のマシンで動作するように汎用的なマシン語にビルドしています。CentOSのyumやUbuntuのapt-getなどでは予め汎用的なビルドをしたモジュールを配布しています。
それが、Javaの場合、VMが実行時に、自分が動作しているハードウェアに最適なマシン語を実行してくれます。Java開発元であるOracleのサイトでは、これを「高度に最適化されたマシンコード」と表現が使われています。
なので、C/C++で汎用的にビルドしたものよりも、Javaの方が速くなることがあるそうです。
基本的にはJavaはVMを介している分遅いんですけど、上記のような条件がそろうとJavaの方が性能が出るそうです。
性能がそれだけ出て、しかもC/C++よりも生産性が高いコード(簡潔で読みやすいコード)が書けるので、CPU性能と生産性の両立をしたい場合に使うといいんでしょうね。
Javaの使用用途
主な用途はWeb・スマホのサーバーサイドとAndroidアプリ開発です。
Javaっていうと業務システム開発の印象が強いですけど、意外とWebサービスやスマホのバックエンドでも使われています。
私が以前参加した家電量販店のECサイトやスマホゲームのバックエンドでもJavaが使われていました。
ただ、業務システムと違ってフレームワークがSpirngMVCだったり、Tapestryだったりしました。業務システムは圧倒的にStruts1が主流で未だに使われています。とはいえStruts1もサポート切れとなったので、そろそろ別のものに乗せ替えられていくんでしょうけどね。
C#はモバイルのクロスプラットフォーム
C#の使用用途はWeb・スマホのサーバーサイドとWindowsアプリ開発です。
C#には他の言語にない特徴があります。それはランタイムがオープンソースとクローズドなもの2種類あるってことです。
クローズド版がMicrosoftの作ってる.NETでオープンソース版がMonoです。
Monoを使ってモバイルアプリのクロスプラットフォーム開発が実現されています。
ゲームエンジンUnityはMonoを使って実装されていて、Unity上で開発したC#のコードはAndroid用にもiOS用にもWindowsアプリ用にもビルドすることができます。この他にPlaystation用などコンソール機用にもビルドできます。
Xamarinというスマホアプリのクロスプラットフォーム開発用IDEもMonoで実装されていて、こちらも一つのコードでAndroid、iOS用にビルドすることができます。
3. ローレベル言語
C/C++、D言語、Go, Objective-C, Swift, Rustなどがこの分類でしょう。
ひとくちにローレベルと言っても、C/C++はOS開発にも使われていて、はたやObjectiveC, Swiftはスマホアプリ開発に使われているので、ローレベル言語の中でも使用用途はさまざまです。
GoはWebやスマホのバックエンドのAPIを以前はLL言語でやってたものを性能出すためにGoに置き換えたって話は最近良く聞きます。あとDevOpsの分野でも使われてるみたいです。
っと、ローレベル言語の話になった途端、説明が大雑把になった感がありますね。私自身がこのタイプの言語をあまり使っていないというのがバレバレです(笑)
仕事で使うという観点で考えてみる
技術的な観点でプログラミング言語の使用用途を考えてきましたが、仕事で使う場合、結局のところ、会社が採用してる言語を使うということになります。急に夢から覚ますような話ですが、これって逆に言えば悩みが減るという良い面もあります。
先程書いたPythonはメソッド定義にselfを書かなければならないのがイケてないという問題も、会社でPythonが採用されていたら、四の五の言わずに使うことになります。
実際使ってみれば、「selfって自分で書くのもいいやん!」って思えたりもします。案外会社から使用言語をしばられるというのもいいものです。
ですから、
- 趣味では、自分の好みで自由に言語を選択する
- 仕事では、会社で指定されているものを使う
両方の機会を持てるといいのかなと思います。
趣味で始めたものがそこそこでできるようになったら、その技術を使ってる会社に転職するというものもいいと思います。使いたい技術が使える職場を渡り歩くってエンジニアとしてかっこいいですよね!私はここ数年これを意識していて、趣味で始めたUnityやPHPで仕事をすることができました。
やりたい仕事ってこうやってたどりつくものなのかなと思います。