2017年現在、Rustが最強のプログラミング言語である証明を以下に示します。

ICFP プログラミングコンテスト

ICFP プログラミングコンテストの説明については以下をご覧ください。

ICFP Programming Contest は「なんでもあり」が特徴の,他とは一線を画す特徴的なプログラミングコンテストです.ACM の関数型プログラミング言語の学会 ICFP (International Conference on Functional Programming) に伴って毎年開催されていまして (1) プログラミング言語自由 (2) 計算資源自由 (2) チーム人数制限なし (3) 72 時間勝負 (4) 問題の形式も毎年大きく変化,等の特徴があります.優勝者は「その年のプログラミング言語」を決めることとなっており「その年はその言語の文句は言えない」とか.


コンテスト優勝チームが使用した言語は「優秀なハッカーに選ばれたプログラミング言語」として正式に認定されます。 さらに優勝チームには「使用したプログラミング言語を一年間無制限に自慢してよい」という名誉ある権利が与えられます。

そのためICFPプログラミングコンテストは「最強のプログラミング言語を決める大会」という側面があります [1]。

最近は以下のような風潮もあるようなのですが:

それでも「自分の好きな言語に優勝させてやる!」という熱い思いをもった参加者が今年も大勢参加しました。

2017年、今年のコンテストを主催したのはオックスフォード大学です。

Rustで参加

私は昨年に引き続きRustで参加しました。8月4日から8月7日にかけての72時間です。

今年の問題

今年の問題を簡単にいうと「鉱山(λ)に道をつなげてより多くの都市(λから遠ければ遠いほど高得点)に到達しましょう。」という問題でした。 実際のルールはもっと複雑です。興味がある方は、実際の問題仕様を見てください。

「百聞は一見にしかず」、以下の実際に行われた戦いの様子をご覧ください。私はチーム hayatox です。


(Link, その他の大きなマップでの戦い: Map: junction, Map: nara)

結果

参加者から提出されたプログラムをもとにした、コンテストの1stラウンドの結果が今週発表されました。 それによると参加チームは146チーム。そのうち26チームは提出したプログラムが仕様を満たしていないことが判明し参加不可能。残りの120チームの間で戦いが行われました。

果たしてどの言語が今年は最強の名を手にするのでしょうか?

各チームの使用した言語は現在のところコンテストのサイトでは明らかになっていません。そのため以下の条件で各言語を代表するチームを適当に選びました。

  1. GitHubを"icfp 2017"で検索
  2. メインで使用した言語がほぼひとつであることをチェック(そうでなければスキップ)
  3. チーム名がREADME等に記載されている
  4. 1stラウンドの結果にチーム名が載っている -> 採用



各プログラミング言語とそれを使用したチーム [2] とその人数 [3]、そしてチームの獲得ポイント [4] です 。


使用言語 (チーム名: 人数 )
獲得ポイント


Rust (hayatox: 1)
109
C++ (GennAI: 8)
106
Haskell (Sampou: 7)
108
Common Lisp (cvnm: 1)
69
Clojure (drop table teams;: 2)
38
Java (A Storm Of Minds: 2)
109
Kotlin (Lambada Calculus: 9)
86
Scala (codingteam: 4)
48
C# (kontur.ru: 16)
70
F# (lambda-llama: 5)
0
Elixir (The Mikinators: 8)
42
Python (Lambding Snakes vs Coding Monkeys: 4)
94
Go (MIPT Lambda: 3)
64

  • Rust十分強い。しかし最強という感じはまだ受けません。
  • ほとんどのチームは複数人で参加していることがわかりました。ひとりで参加している「ぼっちチーム」はRust以外はCommon Lispだけです。さすがLisp。孤高の存在。
  • 特にC++を用いたチームGennAIは8人中7(?)人がGoogleのソフトウェアエンジニアです。
  • さらに特筆すべきはC#を用いたチームkontur.ru。なんと16人チーム!もはや数の暴力です。

正規化

数の暴力にはこちらも理不尽な理論で対抗するしかありません。「獲得ポイント」を「チームの人数」で割ってやりましょう [5]。 正規化した結果は以下のようになります。


Rust
109.0
C++
13.2
Haskell
15.4
Common Lisp
69.0
Clojure
19.0
Java
54.5
Kotlin
9.6
Scala
12.0
C#
4.4
F#
0.0
Elixir
5.2
Python
23.5
Go
21.3


以上によりRustが最強であることが示されました [6]。証明終わり。

おまけ

そういえばコンテストの翌日にオフィスで会った時そんなこといった気がします。:)

実際、私は大したことはしていません。今回は合計で12時間くらいしか参加しておらず、仕様もすべては実装していません [7]。それにもかかわらず最低限動くプログラムを完成・提出できたのは、すべてはRustという素晴らしい言語を作成したコアチームと、crates.io という素晴らしいパッケージ・エコシステムのおかげです。今回のコンテストではじめて使用したライブラリがいくつかありますが、すべて苦労することなく使用することができました。私は巨人の肩に乗っかっただけです。

来年に向けて

  • 「私の愛するJavaScriptがRustごときに負けるはずがない。」
  • 「はっはっはっ。自称最強Ruby使いであるこの私が出場していない大会で良い成績をとることに何の意味があるというのか?かわいいやつらめ。」
  • 「その証明には致命的な誤りがあります。どこが間違っているかというと....」

もっともなご意見でございます。しかしながら、参加しない人に反論する権利はまったく与えられないのがこのICFPプログラミングコンテストです。

唯一の正しい反論の方法は「机上の空論を展開」することではなく、実際に「愛するXXX言語を勝たせてやる」ことです [8]。 ぜひ来年のICFPプログラミングコンテスト2018に参加してみてください。

興味をもった方は雰囲気をつかむため過去の問題に挑戦してみるとよいかもしれません。 特に2006年カーネギーメロン大学が主催した「古代文明が作ったコンピュータの仕様とその上で動くプログラムを記した古文書」を巡るコンテストは「神回」として伝説になっています [9]。 ぜひ挑戦してみてくださいね。


footnotes:

  • [1]: ICFP学会としては、コンテストを通じて「関数型プログラミングの優位性」を示したいという思いがあったはずなのですが、コンテストでは必ずしもHaskellのような「いわゆる関数型プログラミング言語」が優勝するとは限りません。主催者かわいそう。
  • [2]: チーム名をここに記載すべきかどうか迷ったのですが、各言語のコードを見ることは読者にとっても有益だと思い、リンクと共に載せています。特にC#チームとF#チームのREADMEは非常によく書けていて勉強になります。
  • [3]: 各チームの人数は、レポジトリのREADMEにメンバーが記載されている場合はそこから、記載されていない場合は実際にレポジトリに貢献した人数で判断しています。
  • [4]: 獲得ポイントは1st Roundの結果のみを使用しています。最終結果はICFP(学会の方)当日、現地オックスフォードで発表されます。最終結果が発表される前のタイミングでないとこのような方向性の記事は書けません。:)
  • [5]: 参考にした理論: ウォーズマン理論
  • [6]: Common Lispが2位ですが、Lispは神が作った神言語なので妥当な結果といえるでしょう。
  • [7]: optionという使用すれば絶対有利になる仕様を利用していません。Timeout対策も実装していません。想定以上の大きさのGraphではTimeoutするはずです。
  • [8]: もちろんチーム内で複数言語を用いるというのもありです。人数の制限がないのも含めて「なんでもあり」なところがこのコンテストの魅力です。
  • [9]: 2006年のICFPコンテストはその内容があまりに濃かったため、参加者の間で「これ、もう主催者側が優勝でいいんじゃね?」と言われていたそうです。

© 2005-2017 hayato.io