1. ホーム
  2. language-agnostic

[解決済み] プログラミングコンテストの出場者は、なぜC++やJavaを使うのか?[終了しました]

2023-02-13 22:22:08

質問

今年の出場とそれに続く Google コードジャム に参加してみて、C/C++ と Java を使用する参加者が非常に多いことに気づかざるを得ませんでした。コンペティション全体で使用された言語の分布を見ることができます。 ここで .

数年間C/C++でプログラミングをしてきましたが、最近になってその読みやすさとわかりやすさからPythonに惚れ込んでいます。さらに最近では、OCamlやSchemeなどの関数型言語や、Prologなどの論理型言語も学びました。これらの言語には確かに長所があり、ある状況下ではC++やJavaよりも簡単に適用できると私は考えている。例えば、Schemeのcall/ccの使用はバックトラック(いくつかの問題に答えるために必要なツール)を単純化し、Prologの論理仕様はブルートフォースであるため非効率ですが、頭を使うのが難しい特定の問題を劇的に単純化(さらには自動解決)することが可能です。

コンペティションの出場者が、挑戦に最も適したツールを使用すべきことは明らかです。x86 アセンブリでさえもチューリング完全であり、それを使って問題を解くことを正当化するものではありません。この場合 Scheme/Lisp、Prolog、そして Python のような一般的ではない言語を使用する出場者が、C/C++ や Java を使用する出場者よりも著しく低い成功を収めているのはなぜでしょうか? 言い方を変えると なぜ成功した出場者は、主流ではないかもしれないが、間違いなく仕事のためのより良いツールである言語を使用しないのでしょうか?

私の質問にはいくつかの動機があります。最も重要なことは、私はより良いプログラマーになりたいということです - 実践面と競技面の両方において。関数型プログラミングや論理プログラミングのような美しいパラダイムを紹介された後、多くの人がそれらを捨てて C/C++ や Java を好むのを見て、がっかりしています。Lisp/Scheme/Prologプログラマーとしてプログラミングコンテストで成功することはできないのではないかと心配になり、このパラダイムへの賞賛を疑問視するようにさえなっています。

どのように解決するのですか?

素晴らしい質問ですね。私自身、プログラミングコンテストに少し手を出したことがあるので、何か言えることがあるかもしれません。

[コンテストでのプログラミングは、現実世界でのプログラミングと大まかな関連しかなく、アルゴリズムや問題解決のスキル、時間的なプレッシャーの中でバグのない高速な作業コードを考え出す能力が試されますが、大きなソフトウェアプロジェクトを構築できること、メンテナンス可能なコードを書けること、などとは必ずしも相関しません(よく構成されたプログラムはデバッグしやすくなるという事実を超えて)]......。

それでは、いくつかの回答です。

  • C++/Javaは実世界でも他の言語より一般的なので、どこでも割合が高くなるのは予想通りです。(ただし、コンテスト人口ではさらに高い)。

  • これらの参加者の多くは学生であり、または学生時代にコンテストに参加し、C++/Java は学生が学ぶより一般的な "最初の言語"です。(最近の学部生は Scheme、Haskell、Python などから始めるかもしれませんが、高校生 (独学が多い) はそうでもないようです。) 実際、東欧の多くの参加者は学生であり、学生時代にコンテストに参加しました。実際、東欧の参加者の多くは今でもPascalを使っていて、他の人がどんな言語を使うよりもPascalの方が素晴らしいのです。

  • 学校や大学レベルのコンテストでは、たいていこれらの言語が使われます。International Olympiad in Informatics (IOI) では C、C++、Pascal (今は Java かも; 追ってません) のみ、ACM Intercollegiate Programming Contest (ACM ICPC) では C、C++、Java のみ使用可能です。TopCoderでは、C++、Java、C#、VB(本当は:p)、そして最近ではPythonが認められています。だから、コンテストのエコシステムには、より多くのC++/Javaプログラマがいると言えるでしょう。Google Code Jamと IPSC は、どんな言語でのコードも許可している数少ないコンテストのひとつです。

  • さて、問題は、出場者が自由に言語を選べるGCJで、なぜPythonやSchemeを選ばないのか、ということです。最も関連性の高い要因は、これらの言語が 遅い . 確かに、ほとんどの実世界のプログラミングでは、これらの言語は簡単に十分な速度を持っていますが、すべてのテストケースでn秒の制限の下でプログラムを実行するためにしばしば関与するタイトなループのために、これらの言語はアルゴリズム的にもっと複雑な問題のいずれに対しても、それをカットすることができない。(O(nlogn)の解を受け入れるように設計された問題であっても、Θ(n 2 の解を受け入れるように設計された問題では、遅い言語では最適なO(n log n)解さえも排除されることがよくあります。USACO では、かつて Java でさえハンディキャップが与えられていました。)

  • もうひとつの要因は、ライブラリです。C++やJavaは頻繁に使われるアルゴリズムやデータ構造(例えば赤黒木やC++のnext_permutation)に対してより良いライブラリを持っていますが、Pythonのライブラリ(実世界では十分に良い)はここではあまり役に立ちませんし、PrologやSchemeは...です。PrologとSchemeは...彼らのライブラリはよくわかりません。これらのプログラマは必要に応じて自分自身のコードを書くことができるので、これは比較的小さな要因です :-)

  • 汎用マルチパラダイム言語は、哲学ややり方を押し付けるような言語よりも、コンテストの時間的制約の中で物事を成し遂げるためだけの言語として有用です。例えばPrologが常に不人気なままであるのはこのためです。(一般的な考え方として、自分の足を撃つことも含めて何でもできるようにするquot;enable"言語もあれば、正しいやり方を強制するquot;directing"言語もあります)。C++が、一般のコンテスト参加者ではJavaの3倍、トップコンテスト参加者ではもっと人気があるのも、このためです。コードは他の誰にも読まれる必要がないので、次のようなループマクロがあってもいいし、便利でさえあります。 FOR(i,n) (のようなループマクロがあってもいいし、便利です(入力するコードが少なくて済みますし、何より急いでいるときにバグを作る可能性が低くなります)。Javaを悪く言うつもりはありませんし、一流のプログラマーの中にもJavaを使っている人はいます。)

  • 最後に、これらのトッププログラマの多くは、C++/Java/Pascal を彼らの "最初の言語" として持っているかもしれませんが、彼らは良いものではありません。 なぜなら というわけではありませんので、その点はご安心ください。これらの同じプログラマーの多くは、「C++/Java/Pascal」のようなコンテストで優勝しています。 ICFPコンテスト シェルスクリプト、m4 (autoconf で使用)、アセンブリ ("You Can't Spell Awesome Without ASM" というチーム) などのおかしな言語を意図的に使用しても、同じプログラマーが のようなコンテストで優勝しています。