프로그래밍 대회 참가자가 C ++ 및 Java를 사용하는 이유는 무엇입니까? [닫은]


93

올해의 Google Code Jam 대회에 참가한 후 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 프로그래머로서 성공할 수 없을까 걱정하면서 패러다임에 대한 존경심에 의문을 제기합니다.


11
실행 속도가 요인이 될 수 있다고 생각합니다.
Zaki

흥미로운 질문입니다. Code Jam이나 다른 대회 (ACM 등)에서 참가자들로부터 답변을받는 것이 좋을 것입니다. 실행 시간 제한은 해석 된 언어에 대해 편향 될 수 있지만 ...
tzaman

11
동적 언어에는 엄청난 성능 문제가 있습니다. 벤치 마크 참조
NullUserException

Topcoder의 경우 순전히 Python 표준 라이브러리를 제외한 모든 항목의 사용을 금지하는 규칙이 있기 때문에 사소한 작업 이외의 다른 작업은 불가능합니다. 우주 이미지에서 소행성을 찾고 계십니까? 안타깝게도 NumPy도 사용할 수 없습니다.
endolith

답변:


68

좋은 질문입니다! 직접 프로그래밍 콘테스트에 참여한 사람으로서 할 말이 있습니다.

[표준 면책 조항을 없애자 : 컨테스트 프로그래밍은 "실제 환경에서의 프로그래밍"과 느슨하게 관련되어 있으며, 알고리즘 및 문제 해결 기술과 빠른 버그없는 작업 코드를 만드는 능력을 테스트합니다. 시간에 대한 압박이 있기 때문에 대규모 소프트웨어 프로젝트를 빌드하고 유지 관리 가능한 코드를 작성할 수있는 것과 반드시 ​​관련이있는 것은 아닙니다 (잘 구조화 된 프로그램이 디버그하기 쉽다는 사실 외에도).]

이제 몇 가지 답변을 드리겠습니다.

  • C ++ / Java는 실제 세계의 다른 언어보다 더 일반적이므로 어디에서나 더 높은 비율을 기대할 수 있습니다. (그러나 대회 인구에서 훨씬 더 높습니다.)

  • 이러한 참가자 중 상당수가 학생이거나 학생으로서 콘테스트에 참가했으며 C ++ / Java는 학생들이 배우는 더 일반적인 "제 1 언어"입니다. (요즘 학부생은 Scheme, Haskell, Python 등으로 시작할 수 있지만, 고등학생 (종종 독학)은 덜 자주 사용합니다.) 사실 많은 동유럽 참가자들은 여전히 ​​Pascal을 사용하고 있으며 더 놀랍습니다. 나머지 우리가 어떤 언어를 사용하는 것보다

  • 학교 및 대학 수준의 콘테스트는 일반적으로 이러한 언어를 사용합니다. IIOI (International Olympiad in Informatics)는 C, C ++ 및 Pascal 만 허용하고 (또는 지금은 Java를 허용 할 수도 있습니다. 따라 잡지 않았습니다.) ACM Intercollegiate Programming Contest (ACM ICPC)는 C, C ++ 및 Java 만 허용합니다. TopCoder는 C ++, Java, C # 및 VB를 허용합니다 (정말 : p). 그리고 최근에는 파이썬. 따라서 "컨테스트 생태계"에 더 많은 C ++ / Java 프로그래머가 있다고 말할 수 있습니다. Google Code Jam 및 IPSC 는 실제로 모든 언어로 코드를 허용하는 몇 안되는 대회 중 하나입니다.

  • 이제 질문은 참가자들이 언어를 자유롭게 선택할 수있는 GCJ에서 왜 Python이나 Scheme을 선택하지 않을까요? 가장 관련성이 높은 요소는 이러한 언어가 느리다는 것 입니다. 물론, 대부분의 실제 프로그래밍에서는 충분히 빠르지 만 모든 테스트 케이스에 대해 n 초 제한에서 프로그램을 실행하는 데 종종 관련된 엄격한 루프의 경우 이러한 언어는 알고리즘 적으로 더 관련된 문제. ( C / C ++ 용 Θ (n 2 ) 솔루션이 아닌 O (n log n) 솔루션을 수용하도록 설계된 문제 는 느린 언어에서 최적의 O (n log n) 솔루션조차 자주 배제합니다. Java조차도 핸디캡이 주어졌습니다. USACO; 나는 이것이 여전히 사실인지 잘 모르겠습니다.)

  • 또 다른 요소는 라이브러리입니다. C ++ 및 Java는 자주 유용한 알고리즘 및 데이터 구조 (예 : 빨강-검정 트리, C ++의 next_permutation)에 대해 더 나은 라이브러리를 제공하는 반면 Python의 라이브러리 (실제 세계에 적합)는 여기서 덜 유용하며 Prolog 및 Scheme ... 나는 그들의 도서관에 대해 모른다. 이 프로그래머는 필요할 때 자신의 코드를 작성할 수 있기 때문에 이것은 상대적으로 사소한 요소입니다. :-)

  • 범용 다중 패러다임 언어는 철학이나 작업 방식을 강요하는 언어보다 콘테스트의 시간 제약 내에서 작업을 수행하는 데 더 유용합니다. 이것이 Prolog가 항상 인기가없는 이유입니다. (일반적인 철학 : 일부 언어는 자신의 발에 총을 쏘는 것을 포함하여 무엇이든 할 수있게 해주는 "활성화"언어이고, 일부는 올바른 방식으로 일을하도록 강제하는 "지시"언어입니다.) 이것이 C ++가 C ++보다 3 배 더 인기있는 이유이기도합니다. 일반 콘테스트 참가자의 자바, 상위 참가자들 사이에서 훨씬 더 인기가 있습니다. 다른 사람이 코드를 읽을 필요가 없기 때문에 다음과 같은 루프 매크로를 사용하는 것이 좋습니다.FOR(i,n)(입력 할 코드가 적고 급할 때 버그를 만들 가능성이 더 적습니다.) Java에 반대하는 것은 없습니다. Java를 사용하는 몇몇 최고의 프로그래머가 있습니다. :-)

  • 마지막으로, 이러한 최고 프로그래머 중 상당수가 "제 1 언어"로 C ++ / Java / Pascal을 사용하고있을 수 있지만 언어 때문에 좋지 않기 때문에 절망 할 필요가 없습니다. 이 같은 프로그래머 중 상당수는 쉘 스크립트, m4 (autoconf에서 사용됨) 및 어셈블리 ( "ASM 없이는 굉장한 맞춤법을 사용할 수 없습니다"라는 팀)과 같은 미친 언어를 의도적으로 사용하여 ICFP 대회 와 같은 대회에서 우승했습니다 .


2
나는 동의한다; 내가 말했듯이 라이브러리의 존재는 비교적 사소한 문제입니다. 내가 과장했다고 생각되면 제거 할 수 있습니다.
ShreevatsaR

2
마지막 두 번째 항목에서 Java에 대한 내용은 사실이 아닙니다. 많은 GCJ의 최고 참가자들이 Java를 사용합니다.
NullUserException 2010 년

1
[최종 ( "linguo")의 다른 참가자는 Python을 사용했으며 대회를 통해 LOLCODE, Piet, FALSE, Whitespace 및 FRACTRAN을 포함한 언어를 사용했습니다!]
ShreevatsaR

4
속도에 대한 부분을 조금 더하고 싶습니다. GCJ와 같은 대회에서 "속도"는 코드의 런타임 복잡성입니다 (즉, big-O). GCJ에서는 일반적으로 느린 언어 (따라서 많은 Python 제출이 허용됨)에서도 올바른 알고리즘이 허용되지만 느린 알고리즘은 asm에서도 영원히 걸립니다. 예외가 있지만 일반적으로 올바른 알고리즘 / 기술을 사용하면 느린 언어로도 안전합니다.
MAK

1
@EvgeniSergeev 당신이 말하는 것은 IOI / TopCoder와 같은 대부분의 프로그래밍 콘테스트에서 사실이지만, 특히 GCJ에서 시간 제한은 일반적으로 큰 입력에 대해 8 분이며 문제는 일반적으로 Python 솔루션도 통과 할 수 있도록 설계됩니다. 10 년 전에도 경험 법칙은 초당 ~ 10 ^ 9 "간단한"작업이었습니다. 예를 들어 O (n ^ 2)와 Ω (n ^ 3)을 구별하려면 n ^ 2 <10 ^ 9 * 60 만 있으면됩니다. * 8 <n ^ 3 또는 대략 8000 <n <692000입니다. n = 20000을 취할 수 있으며, 400 배 더 느린 언어 (초당 10 ^ 9 / 400)에서도 n ^ 2 알고리즘은 160 초 밖에 걸리지 않습니다. 빠른 n ^ 3은 8000 초가 걸립니다.
ShreevatsaR

14

저는 Jerry Coffin의 Google AI 대회 참가자를 플로팅하는 아이디어가 마음에 들었 기 때문에 모든 결과를 가져와 플로팅했습니다 (계산 된 평균, 표준 편차, Excel에서 정규 분포 곡선 그래프).

Lua와 JS를 사용하면 다음과 같은 결과를 얻을 수 있습니다.

제외 (참가자가 적어 결과가 왜곡 될 수 있음) :

Java 참가자는 나머지 참가자보다 현저하게 나 빠졌고 Go, Common Lisp 및 C는 더 나은쪽에 있습니다.


그러나이 질문은 Google AI 콘테스트가 아니라 Google Code Jam에 대한 질문이므로 (귀하의 답변은 제가 듣는 첫 번째 장소입니다) Google Code Jam에 대해 이러한 그래프를 그리는 것이 더 적절할 수 있습니다. 사실, 질문은 이미 그러한 통계를 언급하고있다 (2010) ; 또한 참조 2011 , 2012 , 2013(이 시간에 진행) 2014 .
ShreevatsaR

12

왜 우리 모두는 에스페란토가 아니라 영어를 사용 합니까? 글쎄, 그냥 그렇게 일어 났어. 영어가 일관성이없고 부풀어 오르고 에스페란토는 의도적으로 '더 나은 도구'로 설계되었지만.

따라서 한 가지 이유는 전통입니다. 대부분의 학교에서 프로그래밍은 여전히 ​​C / C ++, Java, Pascal 또는 Basic으로 진행됩니다. 그리고 대부분 학생들이 더 잘 아는 언어를 선택하는 이러한 콘테스트에 참여하십시오.
또한 대부분의 알고리즘 책에는 Pascal 또는 Ada 스타일의 의사 코드가 있으며 매우 드물게 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 .)
Antal Spector-Zabusky

1
@Antal 글쎄, 비유에는 결함이있을 수 있지만 내 요점을 알 수 있습니다. 당신과 나 사이에서도 나는 에스페란토어를 못합니다 :)
Nikita Rybak 2010-08-01

(자연) 언어는 것입니다 부족의 회원 배지 및 프로그래밍 언어는 같은 압력의 많은 영향을 받는다
사다리꼴

12

먼저, 나는 당신의 전제에 의문을 제기합니다 [편집 : 또는 제가 전제라고 생각하는 것-C ++와 Java를 사용하는 참가자들은 거의 동등하게 좋다]. 예를 들어, 다음 은 Google의 최근 AI 콘테스트에서 처음 100 개 장소와 마지막 100 개 장소에 들어온 항목에 사용 된 언어입니다 .

대체 텍스트

C를 사용하여 ++ 및 Java 참가자는 어디 될 것 같지 않았다 가까운 똑같이 성공에 그 대회이다. Python을 사용하는 참가자는 상당히 적었지만 그에 대한 결론을 약화 시켰습니다.

둘째, 물론 (다른 사람들이 지적했듯이) 많은 설명은 의심 할 여지없이 각 언어에 익숙한 사람들의 수입니다. Lisp, Scheme 또는 Prolog를 작성한 총 사람 수보다 현재 Java 코스를 수강하는 사람이 더 많을 것입니다.

편집 : 세 번째 가능성은 단순히 다양성이라고 생각합니다. 극단적 인 예를 선택하려면 프롤로그는 매우되고 몇 가지 문제에 적합하지만, 똑같이 가난하게 많은 다른 사람들에게 적합합니다. 콘테스트에서 사용할 수있을만큼 한두 개 이상의 언어를 잘 배울 수있는 (또는 적어도 그렇게하는) 사람은 거의 없습니다. 따라서 이러한 것에 관심이있는 대부분의 사람들은 거의 모든 것에 대해 합리적으로 잘 작동하는 언어를 선택하는 경향이 있습니다. 선택 될 수있는 모든 문제에 대해 전문화 된 언어를 배우려고합니다.


1
글쎄요, 대부분의 최고 참가자들은 C ++ / C #을 사용했고 그들 중 소수는 질문의 전제를 강화하는 Python / Haskell / Lisp / Scheme / Ruby / Prolog를 사용하는 것 같습니다. 질문은 C ++와 Java를 서로 비교하는 것이 아니라 (재미 있지만 감사합니다) 다음과 같은 것입니다. "왜"좋은 "언어가 정상에서 덜 성공적입니까? 좋은 참가자 (아마도 많은 언어를 알고있는)가이 중 하나를 선택하지 않는 이유는 무엇입니까?” 그러나 나는 친숙 함이 주요 이유 중 하나라는 데 동의합니다.
ShreevatsaR

내 인상 (아마도 착각)은 C ++와 Java를 사용하는 참가자가 거의 똑같이 성공했다고 가정 한 질문이었습니다. 일부 대회에서는 사실 일 수 있지만 확실히 이번 대회에서는 그렇지 않은 것 같습니다. 그 수가 적다는 것은 확실히 사실이지만, Go, Haskell, Lua, CL을 사용하는 참가자는 Java를 사용하는 참가자보다 더 성공적으로 보였습니다 (물론 성공률 측면에서 C ++이 확실히 지배하는 것처럼 보였습니다. 이 특별한 경우).
Jerry Coffin

5
내 nit-pickin을 용서하십시오. 그러나 이것은 실제로 선 그래프가 아닌 막대 차트 여야합니다 ...
tzaman

어머. 나는 한 시간 동안 의미있는 차트를 만들기 위해 고군분투 해 왔지만 진전을 이루지 못하고있다. Excel 및 Google 스프레드 시트는 저를 어리석게 만듭니다.
Tatiana Racheva 2011 년

Lisp는 기술적으로 C / C ++ 매크로 전처리기로 사용할 수 없습니다 ...? C ++ 프로그램을 제출 한 것처럼 보이게 만들 수 있지만 실제로는 Lisp로 코딩했습니다!
aoeu256

12

거의 모든 Google Code Jam 라운드에서 더 많은 성과를내는 참가자가 C ++로 코드를 작성합니다.

다음은 Google Code Jam 2012 Round 1A, 1B 및 1C의 언어 통계입니다 (위에서 아래로 나열). 각 라운드의 참가자 수는 각각 3,686 명, 3,281 명, 3,189 명입니다.

Google Code Jam 2012 Round 1A의 언어 통계 Google Code Jam 2012 Round 1B의 언어 통계 Google Code Jam 2012 Round 1C의 언어 통계


8

재미있는 질문, 아마도 커뮤니티 위키 여야합니다.

국가 별 결선 진출 자 수를 확인하세요 . 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이 인기있는 것 같다.

좋은 지적; 나는 이것이 문제의 핵심이라고 생각합니다. 자주 나오는 일을 충분히 연습하는 프로그래머에게는 다른 언어에서 큰 이점이 없습니다. (예를 들어 Perl의 텍스트 처리 능력과 같은 기능은이 콘테스트에서 거의 사용되지 않습니다.)
ShreevatsaR

3

OMG ... 사람들은 모두 통계와 그림을 통해 가고 있습니다!

기본을 잊지 말자 .. 이들은 대학 / 학교에서 사람들에게 가르치는 유일한 두 가지 언어 (대부분)입니다 ...!

그것은 무거운 러시에 답할 수 있습니다!


3

중요한 이유는 모든 대회가 파이썬이나 프롤로그와 같은 언어를 지원하지 않기 때문일 수 있습니다. 특히 ACM ICPC World Finals는 C / C ++ 및 Java를 지원 합니다. 또한 TopCoder는 C ++, Java, C #, VB 및 이제 Python 만 지원합니다 . 참가자가 모든 대회에서 사용할 수있는 하나의 언어를 선택하는 것은 당연합니다. 또 다른 이유는 실행 속도 일 수 있습니다. 그리고 네, 또 다른 이유는 이것들이 대부분의 사람들이 먼저 배우는 언어이기 때문입니다.


2

큰 라이브러리는 ACM ICPC에서 Java의 판매 포인트였습니다. 임의의 데이터 구조 또는 알고리즘이 필요하다는 것을 깨닫고 표준 라이브러리에서 꺼내면 편리합니다.


2

C ++는 모든 참가자 중 다수 일뿐만 아니라 라운드가 진행됨에 따라 비율이 유지되고 계속 개선됩니다.

참가자 대부분이 학생 인 것은 사실이라고 말하고 싶습니다. (단, 구글과의 면접 기회가있는 오픈 토너먼트이기 때문에 참가하는 분들이 많이 졸업했다고 생각해야합니다). 그러나 최신 라운드는 경험이 풍부한 사람들만을위한 것입니다. 그들은 단지 C ++ / Java로 코딩을 배운 학생들이 아닙니다.

물론 학생 주장은 LISP, OcaML 또는 ProLog와 같은 언어에도 적용됩니다. 그것은 AI 영역에서 많이 사용되는 언어이지만 주류 세계에서는 학생들이 학습하고 사용할 가능성이 가장 높습니다.

구글 이외의 큰 대회는 소수의 언어를 지원하지만 Pascal 또는 .net이 Java 수준에 미치지 못하는 이유를 설명하지 못합니다 (주요 대회 이벤트에서 동일하게 지원되는 경향이 있기 때문).

이 콘테스트의 많은 최고의 코더들은 많은 언어를 알고 있습니다. 그러나 그들은 라운드 동안 C ++를 사용하는 것을 선호합니다. "학습 된 C ++"보다 더 큰 이유가 있어야합니다.

나는 C ++ 또는 Java 이외의 언어가 작업에 더 나은 도구라는 주장에 반대합니다. 직접 데이터에 따르면 결선 진출자가 C ++ 및 Java를 사용할 가능성이 더 높다는 것은 해당 주장에 대한 직접적인 모순입니다.

Google AI 경쟁 데이터는 실제로 코드 잼과 관련된 어떤 전제와도 모순되지 않습니다. 실제로 최고의 코더가 Common Lisp와 같은 언어를 사용할 수 있다는 것을 보여줍니다. 이 데이터를 사용하여 CLISP가 AI 대회를위한 훌륭한 도구라고 가정하려면 C ++가 GCJ와 같은 알고리즘 대회를위한 훌륭한 도구라고 가정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.