为什么编程竞赛参赛者使用C ++和Java?[关闭]


93

在参加了今年的Google Code Jam 竞赛之后,我不禁注意到使用C / C ++和Java的[成功]参赛者数量之多。比赛中使用的语言分布可以在此处查看

用C / C ++编程几年后,最近我因其可读性/简单性而爱上了Python。最近,我学习了OCaml,Scheme等功能语言,甚至还学习了Prolog等逻辑语言。这些语言当然有其优点,在我看来,在某些情况下,这些语言比C ++和Java更容易应用。例如,Scheme对call / cc的使用简化了回溯(回答几个问题所需的工具)和Prolog的逻辑规范,尽管由于其强力性质而效率低下,但可以大大简化(甚至自动解决)某些难以解决的问题缠住你的大脑。

显然,竞赛参赛者应使用最适合挑战的工具。甚至x86程序集都是Turing完整的-并不能证明解决它的问题。在这种情况下,为什么使用较少通用语言(例如Scheme / Lisp,Prolog甚至Python)的参赛者比使用C / C ++和Java的参赛者的成功率要低得多?用不同的措辞,为什么成功的参赛者不使用虽然可能不那么主流但可以说是更好的工作工具的语言?

我的问题有多种动机。最重要的是,无论是在实践方面还是在竞争方面,我都希望成为一名更好的程序员。在介绍了诸如函数和逻辑编程之类的精美范例之后,令人沮丧的是,看到这么多人抛弃它们而转而支持C / C ++和Java。甚至令我质疑我对上述范例的钦佩,担心我无法在编程竞赛中以Lisp / Scheme / Prolog程序员的身份成功。


11
我想执行速度可能是一个因素。
扎基

有趣的问题;在Code Jam或其他比赛(ACM等)中从参与者那里得到一些答案是很高兴的。运行时间限制可能会偏重于解释性语言,但是……
tzaman 2010年

11
动态语言存在一个巨大的性能问题:请参阅基准测试
NullUserException 2010年

对于Topcoder,这纯粹是因为他们有一条规则,禁止使用除Python标准库之外的任何东西,这使得琐碎的任务无法实现。在太空图像中寻找小行星?太糟糕了,您甚至不能使用NumPy。
endlith 2014年

Answers:


68

好问题!作为一个自己涉足编程竞赛的人,我可能有话要说。

[让我们摆脱标准的免责声明:竞赛编程仅与“现实世界中的编程”有松散的联系,并且它在测试算法和解决问题的技能以及在以下情况下提出快速无错误工作代码的能力时,时间压力,它不一定与能够构建大型软件项目,编写可维护代码等相关(除了结构良好的程序更易于调试之外)。

现在给出一些答案:

  • C ++ / Java在现实世界中也比其他语言更普遍,因此您希望在任何地方都能看到更高的比例。(但在竞赛人群中甚至更高。)

  • 这些参与者中有许多是学生,或者是在学生中参加比赛的,C ++ / Java是学生学习的更常见的“第一语言”。(如今,本科生可能从Scheme,Haskell,Python等开始,但是高中生(通常是自学成才的人)的频率降低了。)实际上,许多东欧参与者仍在使用Pascal,并且对此感到惊讶比我们其他任何人都不会使用任何语言。

  • 学校和大学级别的比赛通常使用这些语言。国际信息学奥林匹克竞赛(I​​OI)仅允许使用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秒限制内运行通常涉及的紧密循环,这些语言不能将其用于任何一种情况。在算法上涉及更多的问题。(旨在接受C / C ++的O(n log n)解决方案而不是Θ(n 2)解决方案的问题经常排除了使用较慢语言的最佳O(n log n)解决方案。甚至Java过去也存在障碍USACO;我不确定情况是否如此。

  • 另一个因素是库:C ++和Java有更好的库来存储常用的算法和数据结构(例如,红黑树,C ++的next_permutation),而Python的库(对现实世界来说足够好)在这里用处不大,而Prolog和Scheme ...我不知道他们的图书馆。这是一个相对较小的因素,因为这些程序员可以在需要时编写自己的代码。:-)

  • 通用多范式语言比在您身上强加一种哲学或做事方式的语言更有用,它仅用于在比赛的时间限制内完成任务。例如,这就是Prolog始终不受欢迎的原因。(一般的哲学:有些语言是“使能”的语言,使您可以做任何事情,包括射击自己的脚,有些语言是“指导”,迫使您以正确的方式做事。)这也是为什么C ++的流行度是其三倍的原因Java在一般竞赛参与者中,并且在顶级竞赛者中更受欢迎。由于代码不必被任何其他人读取,因此具有循环宏(例如,FOR(i,n)(键入的代码更少,更重要的是,急忙时更不会产生错误)。不反对Java,也有一些使用Java的顶级程序员。:-)

  • 最后,尽管这些顶级程序员中有许多人可能将C ++ / Java / Pascal作为其“第一语言”,但由于其语言的原因,它们并不出色,因此您不必为此感到失望。即使故意使用疯狂的语言,例如外壳程序脚本,m4(用于autoconf)和汇编(名为“没有ASM的人也无法拼写很棒”的团队),这些程序员中的许多人还是赢得了ICFP竞赛之类的竞赛


2
我同意; 正如我所说,图书馆的存在是一个相对非常小的问题。如果您认为我夸大了它,可以删除它。
ShreevatsaR

2
在倒数第二点上关于Java的说法不是很正确。GCJ的许多顶级选手都使用Java。
NullUserException

1
[决赛的另一位参与者使用了Python,并且在比赛中使用了LOLCODE,Piet,FALSE,Whitespace和FRACTRAN等语言!]
ShreevatsaR 2010年

4
我只想在速度方面添加一些内容。像GCJ这样的竞赛中的“速度”是代码的运行时复杂度(即big-O)。在GCJ中,即使使用慢速语言(通常会有很多接受的Python提交),通常也会接受正确的算法,而即使在asm中,慢速算法也将永远消失。也有例外,但通常,如果使用正确的算法/技术,即使使用较慢的语言也可以保证安全。
MAK 2010年

1
@EvgeniSergeev对于大多数编程竞赛(例如IOI / TopCoder),您所说的都是正确的,但特别是在GCJ中,大型输入的时间限制通常为8分钟,并且通常设计问题以使Python解决方案也可以通过。即使在10年前,经验法则还是每秒〜10 ^ 9个“简单”操作,因此例如要从Ω(n ^ 3)区分O(n ^ 2),我们只需要n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3,或大约8000 <n <692000。您可以采用n = 20000,即使使用400倍慢速语言(10 ^ 9/400 s),n ^ 2算法也只需要160秒,而快速的n ^ 3将花费8000秒。
ShreevatsaR

14

我喜欢杰里·科芬(Jerry Coffin)绘制Google AI竞赛参赛者图的想法,因此我将所有结果都绘制出来(计算出平均值,标准差,然后在Excel中绘制正态分布曲线)。

使用Lua和JS,得到了以下信息:

没有(参赛者很少,因此结果可能会出现偏差):

看起来Java参与者的表现确实比其他参与者差很多,而Go,Common Lisp和C处于更好的境地。


但是,该问题询问的是Google Code Jam,而不是Google AI竞赛(您的答案是我所听到的第一个地方),因此为Google Code Jam绘制这些图形可能更相关。实际上,问题已经提到了这样的统计数据(2010年)。又见2011201220132014(在建在这个时候)
ShreevatsaR 2014年

12

为什么我们都说英语而不是世界语?好吧,就是这样。即使英语前后矛盾且肿,世界语也被故意设计为“更好的工具”。

因此,原因之一就是传统。在大多数学校中,仍然使用C / C ++,Java,Pascal甚至Basic来教授编程。并参加大多数学生参加的竞赛,他们选择他们更了解的语言。
此外,您会注意到,大多数算法书籍都以Pascal或Ada的风格提供psedudocode,而很少使用-Lisp。我不知道为什么,也许也不是传统。也许对于算法而言并不是那么好。

另一个原因是速度。尽管对于Google Code Jam而言,这不是问题,但在几乎所有比赛中,“接受”和“时间限制”判定之间的差距是2倍。
换句话说,如果C ++中的最佳算法比Ruby中的算法运行速度快10倍,则可能意味着C ++中的次优算法仍将比Ruby中的优算法更快。如果可以实现O(n * logn),则竞赛作者通常不希望允许O(n ^ 2)提交。


7
仅举您的类比评论:世界语在其目标上惨败。它的声音与Zamenhof的波兰方言几乎完全一样,其语法不自然且复杂。这绝不是一种好的通用语言。克林贡语在许多方面看起来都像人类的自然语言一样做得更好。人们可以,我想,认为有相似之处在这C ++和Java,但是这将是不公平的:)(见xibalba.demon.co.uk/jbr/ranto
安塔尔斯佩克特-Zabusky

1
@安塔尔嗯,比喻也许有缺陷,但是你明白我的意思。在你我之间,我也不会说世界语 :)
Nikita Rybak 2010年

(自然)语言是部落成员身份的象征,编程语言受到许多相同压力的影响
梯形

12

首先,我会问你的前提[编辑:或者我要以什么为前提-使用C ++和Java的参赛者的表现大致相同]。例如,以下是Google最近AI竞赛中前100名 100名中使用的语言:

替代文字

使用C ++和Java参赛者似乎没有在任何地方接近,以同样成功的那场比赛。使用Python的参赛者似乎也表现不佳,尽管他们的数量要少得多,这削弱了这方面的任何结论。

第二,当然,很多解释(正如其他人所指出的)无疑只是熟悉每种语言的人数。现在,与以前编写过Lisp,Scheme或Prolog的人数相比,现在使用Java课程的人数可能更多。

编辑:我认为第三个可能性就是多功能性。要选择一个极端的例子,Prolog是非常适合一些问题,但同样不佳适用于许多其他问题。很少有人能够(或至少能够)学会一种或两种以上的语言,足以在比赛中使用它们,因此,大多数对此类事物感兴趣的人可能会选择对几乎任何事物都适用的合理语言。尝试为可能选择的每个问题学习一种专门的语言。


1
好吧,似乎大多数顶级参与者都使用C ++ / C#,而很少使用Python / Haskell / Lisp / Scheme / Ruby / Prolog,这加强了问题的前提,不是吗?问题不是要在C ++和Java之间进行比较(尽管这很有趣,谢谢),而是类似这样的:“为什么“好的”语言在顶部没有那么成功?为什么好选手(大概会讲多种语言)不选择其中一种?” 但我同意,熟悉是主要原因之一。
ShreevatsaR

我的印象(也许是错误的)是,假设使用C ++和Java的参赛者同样成功。在某些比赛中这可能是正确的,但似乎并非如此。尽管确实如此,但确实如此,使用Go,Haskell,Lua和CL的参赛者似乎比使用Java的选手更成功(尽管公认的是,就成功率而言,C ++显然起了主导作用,至少在这种特殊情况)。
杰里·科芬

5
请原谅我的“挑剔”,但这确实应该是条形图,而不是折线图...
tzaman 2010年

天啊。我一直在努力制作一个小时的合理图表,但我没有取得进展。Excel和Google Spreadsheets让我感到愚蠢。
Tatiana Racheva 2011年

Lisp在技术上不能用作C / C ++宏预处理器吗?您可以使它看起来像您提交了C ++程序,但实际上您是用Lisp编写的!
aoeu256 '19

12

在几乎所有的Google Code Jam回合中,更多使用C ++表现更好的参赛者代码。

以下是Google Code Jam 2012 Round 1A,1B和1C(从上到下列出)的语言统计信息。每回合的参赛者人数分别为3686、3281和3189。

Google Code Jam 2012 Round 1A的语言统计 Google Code Jam 2012 Round 1B的语言统计 Google Code Jam 2012 Round 1C的语言统计


8

一个有趣的问题,可能应该是社区Wiki。

按国家/地区查看决赛入围者的数量:http//www.go-hero.net/jam/10/regions。注意来自东欧和俄罗斯的人数。出于多种原因,这些地方拥有非常强大的C ++社区以及Java。

看看限定词中的数字语言:http : //www.go-hero.net/jam/10/languages/0和决赛:http : //www.go-hero.net/jam/10/languages/6。C ++的起步时间不到一半,而最终成绩则占75%。优秀的程序员更喜欢C ++或C ++成为程序员。也许当您掌握C ++时,其他事情变得微不足道了。

您可以自由得出自己的结论。


5

首先,正如您所指出的那样C++,在比赛中,您一定会喜欢它。我认为那里没有这么多人。如果我错了,请纠正我。老实说,您提到的专业人士简化了回溯:在任何容易回溯的语言中,都必须声明一个方法,然后针对每种可能的结果再次调用它。这再简单不过了。直到现在,我还没有感觉到我所使用的语言正试图使自己参加编程竞赛。Java它们是主流语言。这些自动意味着开始参加编程竞赛的人们将首先被介绍给他们-通过学习Lisp母语的方式:)我也定期参加此类竞赛-我曾经参加C++竞赛,尽管我最喜欢的语言是Java。我只是想练习另一种语言Java-C++有点儿冗长,运行速度更快,这对编程比赛很重要。现在我要说的是-人们首先成为主流语言的专家。要参加编程比赛,您必须对所使用的语言有很好的了解。您没有时间在互联网上搜索愚蠢的事物-例如忘记构造。只是速度是那里的重要因素。使用Lisp


轶事的复数形式可能不是数据,但我以第一语言学习了Scheme,而我的CS入门课程是在Haskell。我确实同意这似乎并不寻常:C / C ++ / Java / Python似乎很流行。
王先生2010年

好点子; 我认为这已成为问题的核心。对于具有足够的实践能力来执行经常出现的事情的程序员,其他语言确实没有太大的好处。(而且,例如Perl的文本处理功能之类的功能在这些比赛中很少使用。)
ShreevatsaR 2010年

3

天哪...人们都在通过统计和数字!

让我们不要忘记基础知识。.(这是仅有的两种语言被大学/学校教给人们...!

那也许可以解决急事!



2

大型库是ACM ICPC中Java的卖点。能够意识到您需要某种随机数据结构或算法并将其从标准库中提取出来很方便。


2

请记住,C ++不仅是所有参赛者中的大多数,而且随着回合的进行,其百分比不断提高。

我要说的是,大多数参与者都是学生(不过,由于这是一次公开比赛,有机会接受Google的求职面试,因此您必须考虑很多参加者已毕业)。但是最新的回合只适合有大量经验的人。他们不仅仅是学习C ++ / Java编码的学生。

当然,学生论点也适用于LISP和OcaML或ProLog之类的语言。那就是在AI领域中经常使用的语言,但是在主流世界中,学生最有可能学习和使用它们。

google以外的大型竞赛支持的语言很少,但这仍然无法解释为什么Pascal或.net不能达到Java的水平(因为在大型竞赛活动中它们同样受到支持)。

这些比赛中许多优秀的编码员都懂多种语言。但是他们仍然喜欢在回合中使用C ++,这一定是出于比首先“学习C ++”更大的原因。

我反对这样的说法,即除C ++或Java以外的语言是更好的工作工具。如果直接数据表明决赛入围者更可能使用C ++和Java,则这与该主张有直接矛盾。

Google AI竞争数据实际上与代码阻塞没有任何矛盾。实际上,这确实表明,顶级程序员确实可以使用Common Lisp这样的语言,因为它确实是更好的工作。如果我们要使用此数据假设CLISP是AI竞赛的绝佳工具,那么我们还应该假设C ++是GCJ等算法竞赛的绝佳工具。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.