Ruby
C
C++
Go
ポエム

いつもお世話になっているあのソフトウェアがどの言語で書かれているか調べてみた

「次に勉強するべきはどの言語?」を考えるための材料として、身近にあるソフトウェアが何言語で書かれているかをリストアップしてみました。
リストは完全に私の独断によるもので、特に他意はありません。
アプリケーションよりはミドルウェア寄りな視点になっています。
ジャンル分けも適当です。

ジャンル 名前 言語
OS Linux Kernel C
OS Windows C++
RDBMS MySQL C/C++
RDBMS PostgreSQL C
WebServer Apache C
WebServer Nginx C
WebServer h2o C
KVS redis C
KVS memcached C
KVS tokyotyrant/tokyocabinet C
KVS kyototycoon C++
DB MongoDB C++
DB ElasticSearch Java
Logger Fluentd Ruby
Tool Embulk Java
CI Jenkins Java
PackageManager yum python
PackageManager apt python
PackageManager homebrew ruby
Firewall firewalld python
Browser GoogleChrome C++
ImageManipulation ImageMagick C
VCS git C
Language Perl C
Language PHP C
Language Ruby C
Language HHVM/Hack C++
Language go go
Language node/v8 C++
Tool Gnu coreutils C
Tool AWS CLI python
DevTool peco go
DevTool ghq go
DevTool Vagrant Ruby
ProccessManager supervisord Python
Provisioning Ansible Python
Provisioning Chef Ruby
Provisioning Berkshelf Ruby
Provisioning ServerSpec Ruby
Container Docker go
Container kubernetes go
Container rkt go

リストアップしてみての感想

  • ミドルウェアや言語処理系ではまだまだC言語が広く使われている。特に2014年に登場したh2oがCで書かれているのは特筆するべき。
  • 最近のミドルウェア/処理系ではC++を使っているケースもちらほらある。代表例はChrome,MongoDB,node.js,HHVMなど。
  • Java製ツールは(自分の身近には)あまり多くない。embulkがJava製なのは要注目。
  • 2009-2013年あたりに登場したインフラ系プロダクトではRuby製が多い。ただ最近ではGoに押され気味。
  • 2013年以降、Go製のツールが急に増えてきた印象がある。

各言語について思うところ

(特定の言語をDisる意図はありません)

C

既存ミドルウェアでC製のものが多いので、トラブルシューティングをしたりパッチをあてたりするにはC言語とその周辺ツール(make,gdb,lddなど)の知識は必要。
スクリプト言語のモジュールでも、速度が要求されるものはたいていCで実装されている。(PerlのXS、PHPのextension、Rubyのgem)
Linux KernelがC言語で書かれているのは大変重要で、これはこの先も当分変わらなそう。

C++

MongoDB,node.js,HHVMなどを皆が使っているわけではないので、もし現場でC++製ツールを使っていないなら、勉強せずにスルーしてもいいかもしれない。将来的にgoやrustに取って代わられる可能性が高そう。

Java

Java製のツールで広く普及してるものといえばJenkinsくらいしか思いつかない。
古き良き言語で若干時代遅れだと思われていたが、Java8でキラキラ感を取り戻した感あるので、今後じわじわくるかもしれない。

Perl

Perl製のツールって最近あまり聞かない気がする。昔は鯖管=Perlなイメージがあったが、近年はその市場をRuby/Goに奪われた感ある。かなしい。

PHP

PHP製のツール・ミドルウェアというのはほぼ皆無である。
PhpMyAdminとかWordpressとか「アプリケーション」的なものが多い。
PHPプログラマは他言語を勉強しないとやっていけないが、他言語プログラマはPHPを勉強しなくてもやっていけるのである。
rebuildfmでPHP書ける人が登場しないのはつまりそういうことである。

Ruby

Infrastructure as code をやるなら多少なりとも読み書きできる必要がある。
Chef/Vagrant/Fluentdの登場で、インフラの言語としてかなり定着してる感ある。DSLの書きやすさ、プラグイン機構の作りやすさが、インフラ系で採用される大きな決め手になったと思われる。

Python

主要なLinuxディストリビューションに最初から入ってるスクリプト言語は今やpythonだけである。yum/apt/firewalldなどOSのコアに近い部分で縁の下の力持ちとして働いている。
が、最近のツールでpython製のものはだいぶ少なくなってきている気がする。
広く使われているものとしてはaws-cliがあるが、将来的にこれはGo言語で置き換わりそうな気がする。
pythonは勉強しなくても何とかなるかもしれない。

元々欧米では広く使われていた、科学計算ライブラリが豊富、だったところに、機械学習という強い追い風がきたので、今後重要性が高まってきそう。

Go

2014年以降に書かれたCLIツールはGo製のものが大変多い。CLI分野ではRubyをしのぐ勢いがある。
例えばhubコマンドはもともとRuby製だったのがver 2からはGo言語で書きなおされていることがそれを象徴している。
またコンテナ系でよく使われているので、コンテナ技術を深堀りするためには避けては通れない。

Rust

C,C++言語を置き換えるかのようなコンセプト・可能性がある。将来どこまで勢力を広げるかは未知数。

結論

これから自分が勉強するべきなのはC/Go/Ruby/Rustあたりか。
(それとは別にアプリケーション用言語としてJS/Java/Swiftを勉強する必要もある)