gpt4 book ai didi

language-agnostic - 编程竞赛参赛者为什么要用C++和Java?

转载 作者:行者123 更新时间:2023-12-03 04:57:34 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

6年前关闭。



Improve this question




参加和关注今年的Google Code Jam比赛中,我不禁注意到使用 C/C++ 和 Java 的 [成功] 参赛者数量惊人。整个比赛使用的语言分布可见here .

在用 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,并且使用它更令人惊叹比我们其他人永远不会使用任何语言。
  • 学校和大学级别的比赛通常使用这些语言。国际信息学奥林匹克竞赛 (IOI) 只允许使用 C、C++ 和 Pascal(或者现在可能允许使用 Java;我没有跟上),而 ACM 校际编程竞赛 (ACM ICPC) 只允许使用 C、C++ 和 Java。 TopCoder 允许使用 C++、Java、C# 和 VB(真的:p);最近,Python。所以你可以说“竞赛生态系统”中有更多的 C++/Java 程序员。 Google Code Jam 和 IPSC实际上,是少数允许使用任何语言编写代码的竞赛之一。
  • 现在的问题是,在参赛者可以自由选择语言的GCJ中,他们为什么不选择Python或Scheme?最相关的因素是这些语言是 .当然,对于大多数现实世界的编程来说,它们很容易就足够快了,但是对于让程序在所有测试用例的 n 秒限制下运行通常涉及的紧密循环,这些语言并没有削减它算法上更复杂的问题。 (设计为接受 O(n log n) 解决方案而不是 C/C++ 的 Θ(n2) 解决方案的问题经常排除在较慢的语言中即使是最优的 O(n log n) 解决方案。甚至 Java 也曾在 USACO 中遇到过障碍; 我不确定情况是否仍然如此。)
  • 另一个因素是库:C++ 和 Java 有更好的库用于常用的算法和数据结构(例如红黑树、C++ 的 next_permutation),而 Python 的库(对现实世界来说足够好)在这里用处不大,Prolog 和 Scheme ...我不知道他们的图书馆。这是一个相对次要的因素,因为这些程序员可以在必要时编写自己的代码。 :-)
  • 通用多范式语言对于在比赛的时间限制内完成事情更有用,而不是将哲学或做事方式强加给你的语言。例如,这就是为什么 Prolog 总是不受欢迎的原因。 (一般哲学:有些语言是“使能”的语言,可以让你做任何事情,包括用脚射击自己,有些语言是“指导”,迫使你以正确的方式做事。)这也是 C++ 比 C++ 流行三倍的原因Java 在一般参赛者中,在顶级参赛者中更受欢迎。由于代码不必由其他人阅读,因此使用像 FOR(i,n) 这样的循环宏是可以的,甚至很有用。 (要输入的代码更少,更重要的是,在匆忙时产生错误的机会更少)。不反对Java,也有一些顶级程序员也使用Java。 :-)
  • 最后,尽管这些顶级程序员中的许多人可能将 C++/Java/Pascal 作为他们的“第一语言”,但由于他们的语言,他们并不擅长,所以您不必对此感到绝望。许多相同的程序员赢得了比赛,例如 ICFP contest即使故意使用疯狂的语言,如 shell 脚本、m4(在 autoconf 中使用)和程序集(名为“没有 ASM 就无法拼写真棒”的团队)。
  • 关于language-agnostic - 编程竞赛参赛者为什么要用C++和Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3380993/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com