Programlama yarışmacıları neden C ++ ve Java kullanıyor? [kapalı]


94

Bu yılki Google Code Jam yarışmasında yarıştıktan ve yarıştıktan sonra , yardım edemedim, ancak C / C ++ ve Java kullanan inanılmaz sayıda [başarılı] yarışmacıyı fark ettim. Yarışma boyunca kullanılan dillerin dağılımı burada görülebilir .

Birkaç yıl boyunca C / C ++ ile programladıktan sonra, son zamanlarda okunabilir / anlaşılır yapısı nedeniyle Python'a aşık oldum. Daha yakın zamanlarda, OCaml, Scheme gibi işlevsel dilleri ve hatta Prolog gibi mantık dillerini öğrendim. Bu dillerin kesinlikle kendi yararları var ve bence bazı durumlarda C ++ ve Java'dan daha kolay uygulanabilir. Örneğin, Scheme'nin call / cc kullanımı geri takibi (birkaç soruna cevap vermek için gerekli bir araç) basitleştirir ve Prolog'un mantıksal özelliği, kaba kuvvet doğası nedeniyle verimsiz olmasına rağmen, zor olan bazı problemleri büyük ölçüde basitleştirebilir (ve hatta otomatik olarak çözebilir). beynini sarmak.

Bir yarışma yarışmacısının yarışmaya en uygun araçları kullanması gerektiği açıktır. X86 montajı bile Turing tamamlandı - bu, onunla sorunları çözmeyi haklı çıkarmaz. Bu durumda, Scheme / Lisp, Prolog ve hatta Python gibi daha az yaygın dilleri kullanan yarışmacılar, C / C ++ ve Java kullanan yarışmacılardan neden önemli ölçüde daha az başarılı? Farklı bir şekilde ifade edildiğinde, başarılı yarışmacılar neden daha az ana akım olsa da iş için tartışmasız daha iyi araçlar olan dilleri kullanmıyor?

Sorum için birkaç motivasyon var. En önemlisi, hem pratik hem de rekabet açısından daha iyi bir programcı olmak istiyorum. İşlevsel ve mantıksal programlama gibi güzel paradigmalarla tanıştıktan sonra, bu kadar çok insanın bunları C / C ++ ve Java lehine attığını görmek cesaret kırıcı. Hatta bir programlama yarışmasında bir Lisp / Scheme / Prolog programcısı olarak başarılı olamayacağımdan endişelenerek, söz konusu paradigmalara olan hayranlığımı sorgulamama neden oluyor.


11
Sanırım yürütme hızı bir faktör olabilir.
Zaki

İlginç soru; Katılımcılardan, Code Jam'de veya diğer yarışmalarda (ACM, vb.) bazı yanıtlar almak güzel olurdu. Yine de çalışma süresi sınırları, tercüme edilen dillere karşı önyargılı olabilir ...
tzaman

11
Dinamik dillerin büyük bir performans sorunu var: karşılaştırmaya bakın
NullUserException

Topcoder için, bunun tek nedeni, önemsiz görevler dışında her şeyi imkansız kılan Python standart kütüphaneleri dışında herhangi bir şeyin kullanımını yasaklayan bir kurala sahip olmalarıdır. Uzay görüntülerinde asteroit mi arıyorsunuz? Çok kötü, NumPy'yi bile kullanamıyorsun.
endolith

Yanıtlar:


69

Harika soru! Kendim de yarışmalar programlamayla uğraşan biri olarak söyleyecek bir şeyim olabilir.

[Standart feragatnameyi ortadan kaldıralım: yarışma programlaması yalnızca "gerçek dünyada programlama" ile gevşek bir şekilde ilişkilidir ve algoritmik ve problem çözme becerilerini ve hızlı ve hatasız çalışma kodu oluşturma becerisini test ederken zaman baskısı, mutlaka büyük yazılım projeleri oluşturabilme, sürdürülebilir kod yazabilme vb. ile ilişkili değildir (iyi yapılandırılmış programların hata ayıklamasının daha kolay olduğu gerçeğinin ötesinde).]

Şimdi bazı cevaplar için:

  • C ++ / Java, gerçek dünyadaki diğer dillerden daha yaygındır, bu nedenle her yerde daha yüksek bir oran görmeyi beklersiniz. (Ancak yarışma popülasyonunda daha da yüksektir.)

  • Bu katılımcıların çoğu öğrencidir veya öğrenci olarak yarışmalara katılır ve C ++ / Java öğrencilerin öğrendiği daha yaygın "ilk diller" dir. (Bugünlerde lisans öğrencileri Scheme, Haskell, Python, vb. İle başlayabilir, ancak lise öğrencileri (genellikle kendi kendine öğrenirler) daha az sıklıkla.) Aslında, Doğu Avrupalı ​​katılımcıların çoğu hala Pascal kullanıyor ve bu konuda daha şaşırtıcılar geri kalanımızın herhangi bir dilde olabileceğinden daha fazla.

  • Okul ve üniversite düzeyindeki yarışmalar genellikle bu dilleri kullanır. Uluslararası Enformatik Olimpiyatı (IOI) yalnızca C, C ++ ve Pascal'a izin verir (veya belki şimdi Java'ya izin verir; devam etmedim) ve ACM Üniversitelerarası Programlama Yarışması (ACM ICPC) yalnızca C, C ++ ve Java'ya izin verir. TopCoder C ++, Java, C # ve VB'ye izin verir (gerçekten: p); ve son zamanlarda, Python. Yani "yarışma ekosisteminin" içinde daha fazla C ++ / Java programcısı olduğunu söyleyebilirsiniz. Google Code Jam ve IPSC , aslında herhangi bir dilde koda izin veren birkaç yarışmadan biridir.

  • Şimdi soru şu, yarışmacıların dil seçmekte özgür olduğu GCJ'de, neden Python veya Scheme'yi seçmesinler? En alakalı faktör, bu dillerin yavaş olmasıdır . Elbette, çoğu gerçek dünya programlaması için yeterince hızlıdırlar, ancak bir programın tüm test durumları için n-saniye sınırının altında çalışmasına sıklıkla dahil olan sıkı döngüler için, bu diller bunu hiçbiri için kesmez. algoritmik olarak daha ilgili problemler. (O (n log n) çözümlerini kabul etmek için tasarlanmış ancak C / C ++ için Θ (n 2 ) çözümlerini kabul etmeyecek şekilde tasarlanmış bir problem , daha yavaş dillerde en uygun O (n log n) çözümlerini bile dışlar. Java bile eskiden USACO; durumun hala böyle olduğundan emin değilim.)

  • Diğer bir faktör de kütüphanelerdir: C ++ ve Java, sık kullanılan algoritmalar ve veri yapıları için daha iyi kütüphanelere sahipken (örneğin kırmızı-siyah ağaçlar, C ++ 'ın sonraki_permutasyonu), Python'un kütüphaneleri (gerçek dünya için yeterince iyi) burada daha az kullanışlıdır ve Prolog ve Şema ... kütüphanelerini bilmiyorum. Bu nispeten küçük bir faktördür, çünkü bu programcılar gerektiğinde kendi kodlarını yazabilirler. :-)

  • Genel amaçlı çok paradigmalı diller, bir felsefeyi ya da size bir şeyler yapmanın yolunu zorlayan dillerden ziyade, yarışmanın zaman kısıtlamaları içinde işleri halletmek için daha kullanışlıdır. Bu nedenle, örneğin Prolog her zaman popüler olmayacak. (Genel felsefe: bazı diller, kendinizi ayağınıza vurmak da dahil olmak üzere her şeyi yapmanıza izin veren dilleri "etkinleştiren" dillerdir, bazıları ise sizi işleri doğru şekilde yapmaya zorlayan "yönlendirme" dir.) Bu aynı zamanda C ++ 'nın, Genel yarışma katılımcılarında Java ve en iyi yarışmacılar arasında çok daha popüler. Kodun başkaları tarafından okunması gerekmediğinden, sorun değil ve hatta aşağıdaki gibi döngü makrolarına sahip olmak yararlıFOR(i,n)(yazmak için daha az kod ve daha da önemlisi aceleniz olduğunda hata yapma şansı daha az). Java'ya karşı hiçbir şey yok, Java kullanan birkaç üst düzey programcı da var. :-)

  • Son olarak, bu en iyi programcıların çoğu "ilk dili" olarak C ++ / Java / Pascal'a sahip olsalar da , dilleri nedeniyle iyi değiller , bu yüzden bu konuda umutsuzluğa kapılmanıza gerek yok. Aynı programcıların çoğu, ICFP yarışması gibi yarışmaları kasıtlı olarak kabuk betikleri, m4 (autoconf'ta kullanılır) ve assembly ("ASM Olmadan Harika Yazılamaz" adlı ekip) gibi çılgın diller kullanarak kazanmıştır .


2
Katılıyorum; dediğim gibi, kütüphanelerin varlığı görece çok küçük bir konu. Abarttığımı düşünüyorsan onu kaldırabilirim.
ShreevatsaR

2
İkinci ila son madde noktasındaki Java hakkındaki bu kısım pek doğru değil. GCJ'nin en iyi yarışmacılarının çoğu Java kullanıyor.
NullUserException

1
[Finaldeki diğer katılımcı ("linguo") Python kullandı ve yarışma boyunca LOLCODE, Piet, FALSE, Whitespace ve FRACTRAN gibi dilleri kullandı!]
ShreevatsaR

4
Hızla ilgili kısma biraz daha eklemek istiyorum. GCJ gibi yarışmalardaki "hız", kodun çalışma zamanı karmaşıklığıdır (yani büyük-O). GCJ'de genellikle doğru algoritma yavaş bir dilde bile kabul edilir (bu nedenle kabul edilen çok sayıda Python gönderimi vardır), yavaş bir algoritma ise asm'de bile sonsuza kadar sürecektir. İstisnalar vardır, ancak genellikle doğru algoritmayı / tekniği kullanırsanız, daha yavaş bir dille bile güvendesiniz.
MAK

1
@EvgeniSergeev Söyledikleriniz, IOI / TopCoder gibi çoğu programlama yarışması için doğrudur, ancak özellikle GCJ'de, zaman sınırları genellikle büyük girdi için 8 dakikadır ve sorunlar genellikle Python çözümlerinin de geçebileceği şekilde tasarlanmıştır. 10 yıl önce bile pratik kural saniyede ~ 10 ^ 9 "basit" işlemdi, bu nedenle örneğin O (n ^ 2) ile Ω (n ^ 3) arasındaki farkı ayırt etmek için n ^ 2 <10 ^ 9 * 60 * 8 <n ^ 3 veya kabaca 8000 <n <692000. n = 20000 alabilirsin ve n ^ 2 algo 400x daha yavaş bir dilde (10 ^ 9/400 / s) sadece 160 saniye alırken hızlı n ^ 3 8000 saniye sürecektir.
ShreevatsaR

14

Jerry Coffin'in Google AI yarışmasının yarışmacılarını çizme fikrini beğendim, bu yüzden tüm sonuçları aldım ve grafiğini çizdim (hesaplanan ortalama, standart sapma ve ardından Excel'de normal dağılım eğrilerinin grafiğini çizdim).

Lua ve JS ile şunu anladım:

Olmadan (çok az yarışmacı vardı, bu nedenle sonuçlar çarpık olabilir):

Görünüşe göre Java katılımcıları diğerlerinden belirgin şekilde daha kötü performans gösterirken Go, Common Lisp ve C daha iyi durumda.


Ancak, Google AI yarışması değil, Google Code Jam hakkında sorulan soru (cevabınız bunu ilk duyduğum yer), bu nedenle bu grafikleri Google Code Jam için çizmek daha uygun olabilir. Aslında soru zaten bu tür istatistiklerden bahsediyor (2010) ; ayrıca bkz. 2011 , 2012 , 2013 ve 2014 (şu anda devam ediyor) .
ShreevatsaR

12

Neden hepimiz Esperanto değil de İngilizce konuşuyoruz ? Şey, öyle oldu. İngilizce tutarsız ve şişirilmiş olsa da ve Esperanto kasıtlı olarak 'daha iyi bir araç' olarak tasarlanmış olsa da.

Dolayısıyla, nedenlerden biri gelenektir. Çoğu okulda programlama hala C / C ++, Java, Pascal ve hatta Basic'te öğretilmektedir. Ve bu yarışmalara çoğunlukla daha iyi bildikleri dili seçen öğrenciler katılır.
Ayrıca, çoğu algoritmik kitabın Pascal veya Ada tarzında ve çok nadiren - Lisp tarzında sözde kod içerdiğini fark edebilirsiniz. Neden bilmiyorum, belki de bir gelenek. Ya da belki algoritmalar için o kadar iyi değil.

Diğer bir neden hız olabilir. Google Code Jam için bir sorun olmasa da, hemen hemen tüm yarışmalarda 2x hız farkı, 'Kabul Edildi' ve 'Zaman Sınırı' kararları arasındaki farktır.
Diğer bir deyişle, C ++ 'daki en uygun algoritma Ruby'den 10 kat daha hızlı çalışıyorsa, bu, C ++' daki optimal altı algoritmanın Ruby'de iyi bir algoritmadan daha hızlı olacağı anlamına gelebilir. Ve yarışma yazarları, eğer O (n * logn) elde edilebilirse, genellikle O (n ^ 2) gönderimlerine izin vermek istemezler.


7
Sadece benzetmeniz üzerine bir yorum: Esperanto hedeflerinde sefil bir şekilde başarısız oluyor. Sesleri hemen hemen Zamenhof'un Lehçe lehçesiyle aynıdır ve grameri doğal değildir ve karmaşıktır. Hiçbir şekilde iyi bir evrensel dil değildir; Klingon, birçok yönden doğal bir İnsan dili gibi görünme konusunda daha iyi bir iş çıkarır. Sanırım bu konuda C ++ ve Java ile benzerlikler olduğunu iddia edebilirim, ancak bu haksızlık olur :) (Ayrıca bkz . Xibalba.demon.co.uk/jbr/ranto .)
Antal Spector-Zabusky

1
@Antal Evet, benzetme kusurlu olabilir, ama benim fikrimi anladınız.
Aramızda kalsın,

(doğal) dil, kabile üyeliğinin bir işaretidir ve programlama dilleri aynı baskıların çoğundan etkilenir
yamuk

12

İlk olarak, önermenizi [düzenle: veya benim bir öncül olarak gördüğüm şeyi - C ++ ve Java kullanan yarışmacıların eşit derecede iyi olduğunu] sorgulayacağım. Örneğin, Google'ın son AI yarışmasında ilk 100 sırada ve son 100 sırada gelen girişlerde hangi dillerin kullanıldığı aşağıda açıklanmıştır :

alternatif metin

C ++ ve Java kullanan yarışmacılar , bu yarışmada eşit derecede başarılı olmaya yakın bir yerde görünmediler . Python kullanan yarışmacılar da pek başarılı görünmüyordu, ancak çok daha azı vardı ve bu konudaki herhangi bir sonucu zayıflattı.

İkincisi, tabii ki, açıklamaların çoğu (diğerlerinin de belirttiği gibi) şüphesiz her dile aşina olan insan sayısıdır. Muhtemelen şu anda Java'da bir kurs alan, şimdiye kadar Lisp, Scheme veya Prolog yazan toplam insan sayısından daha fazla insan vardır.

Düzenleme: Üçüncü bir olasılığın basitçe çok yönlülük olduğunu düşünüyorum. Uç bir örnek almak için, Prolog çok olduğu iyi birkaç sorun uygundur ama aynı derecede kötü diğerleri için uygundur. Çok az insan bir veya ikiden fazla dili bir yarışmada kullanmak için yeterince iyi öğrenebilir (veya en azından öğrenebilir), bu nedenle bu tür şeylerle ilgilenen çoğu insan, hemen hemen her şey için makul derecede iyi çalışabilen dilleri seçebilir. seçilebilecek her problem için özel bir dil öğrenmeye çalışmak.


1
Görünüşe göre en iyi katılımcıların çoğu C ++ / C # kullanıyor ve daha azı Python / Haskell / Lisp / Scheme / Ruby / Prolog kullanıyor, bu da sorunun öncülünü güçlendiriyor, değil mi? Soru, C ++ ve Java'yı kendi aralarında karşılaştırmak değildi (bu ilginç olsa da, teşekkürler), ama şöyle bir şey: "Neden" güzel "diller en tepede daha az başarılı? Neden iyi yarışmacılar (muhtemelen pek çok dil bilen) bunlardan birini seçmiyor? " Ancak aşinalığın ana nedenlerden biri olduğuna katılıyorum.
ShreevatsaR

Benim izlenimim (belki de yanıldı), C ++ ve Java kullanan yarışmacıların eşit derecede başarılı oldukları yönündeydi. Bu bazı yarışmalarda doğru olabilir, ancak kesinlikle bu yarışmada görünmüyordu. Daha az sayıda olduğu kesinlikle doğru olsa da, Go, Haskell, Lua ve CL kullanan yarışmacılar Java kullananlardan daha başarılı görünüyordu (yine de başarı oranı açısından C ++ kesinlikle en azından bu özel durum).
Jerry Tabut

5
Özür dilerim ama bu çizgi grafikten çok çubuk grafik olmalı ...
tzaman

Aman. Bir saattir mantıklı bir çizelge oluşturmak için mücadele ediyorum ve ilerleme kaydetmiyorum. Excel ve Google E-Tablolar kendimi aptal hissetmeme neden oluyor.
Tatiana Racheva

Lisp teknik olarak bir C / C ++ makro ön işlemcisi olarak kullanılamaz ...? Bir C ++ programı göndermiş gibi görünebilirsin ama aslında Lisp'de kodladın!
aoeu256

12

Neredeyse tüm Google Code Jam turlarında, yüksek performanslı yarışmacıların çoğu C ++ ile kodlanır.

Aşağıda, Google Code Jam 2012 Round 1A, 1B ve 1C'den (yukarıdan aşağıya listelenmiştir) dil istatistikleri verilmiştir. Her turdaki yarışmacı sayısı sırasıyla 3.686, 3.281 ve 3.189'dur.

Google Code Jam 2012 1.A Turundan Dil İstatistikleri Google Code Jam 2012 Tur 1B'den Dil İstatistikleri Google Code Jam 2012 1. Tur'dan Dil İstatistikleri


8

eğlenceli soru, muhtemelen topluluk wiki olmalıdır.

Ülkelere göre finalist sayısına bakın: http://www.go-hero.net/jam/10/regions . Doğu Avrupa ve Rusya'dan insanların sayısını fark edin. bu yerlerde çok güçlü C ++ toplulukları ve bir çok nedenden ötürü Java var.

niteleyicilerdeki sayı dillerine bakın: http://www.go-hero.net/jam/10/languages/0 ve finaller: http://www.go-hero.net/jam/10/languages/6 . C ++ yarıdan az başlar ve finallerde yüzde 75'e sahiptir. ya iyi programcılar C ++ 'ı tercih eder ya da C ++ programcıları yapar. Muhtemelen C ++ 'ya hakim olduğunuzda, diğer şeyler önemsiz hale gelir.

Yine de kendi sonuçlarınızı çıkarmakta özgürsünüz.


5

Her şeyden önce, belirttiğiniz C++ve Javayaygın diller olduğu gibi. Bunlar otomatik olarak, programlama yarışmalarına başlayan kişilerin ilk olarak - bu şekilde Lispbirinci dil olarak öğrenenlerin tanıtılacağı anlamına gelir :) Bu tür yarışmalara da düzenli olarak katılıyorum - C++en sevdiğim dil olmasına rağmen yarışmak için kullanıyorum Java. Sadece başka bir dilde pratik yapmak istiyorum Java- ayrıcaC++biraz daha az ayrıntılıdır ve daha hızlı çalışır, bu da yarışmaları programlamak için önemlidir. Şimdi benim açımdan - insanlar önce ana akım dillerde uzmanlaşıyor. Programlama yarışmalarına katılmak için kullandığınız dili oldukça iyi kavramış olmanız gerekir. İnternette aptalca şeyler aramak için zamanınız yok - bir yapıyı unutmak gibi. Sadece burada hız önemli bir faktör. KullanmakLispbir yarışmada, ona düşkün olmalısınız. Dışarıda bu kadar çok insan olduğunu sanmıyorum. Eğer Yanlışsam beni düzelt. Dürüst olmak gerekirse, bahsettiğiniz profesyoneller geri izlemeyi basitleştiriyor: Hangi dilde geri izleme kolay olursa olsun - bir yöntem bildirin ve her olası sonuç için onu tekrar çağırın. Daha basit olamazdı. Şimdiye kadar kullandığım dilin yarışmaları programlamak için ayaklarımı kaldırmaya çalıştığını hissetmemiştim.


Çoğul anekdot veri olmayabilir, ancak Scheme'yi ilk dilim olarak öğrendim ve CS kursum Haskell'deydi. Yine de bunun alışılmadık göründüğüne katılıyorum: C / C ++ / Java / Python popüler olanlar gibi görünüyor.
Wang

İyi bir nokta; Sanırım bu meselenin özüne iniyor. Sık sık ortaya çıkan şeyleri yapma konusunda yeterince pratiğe sahip programcılar için, diğer dillerde gerçekten büyük bir fayda yoktur. (Ve Perl'in metin işleme yeteneği gibi özellikler bu yarışmalarda nadiren kullanılır.)
ShreevatsaR

3

OMG ... İnsanlar İstatistikler ve Rakamlar üzerinden geçiyor !!

Temel bilgileri unutmayalım .. Bunlar, kolejlerde / okullarda insanlara öğretilen (çoğunlukla) tek dildir ...!

Bu, yoğun aceleye cevap verebilir!



2

Büyük kütüphaneler, ACM ICPC'de Java için bir satış noktasıydı. Rastgele bir veri yapısı veya algoritma istediğinizi fark edip bunu standart kitaplıklardan çıkarmanız kullanışlıdır.


2

C ++ 'nın yalnızca tüm yarışmacılar arasında çoğunluk olmadığını, turlar ilerledikçe yüzdesinin sadece devam ettiğini ve gelişmeye devam ettiğini unutmayın.

Katılımcıların çoğunun öğrenci olduğunu söyleyebilirim (Ancak, google ile iş görüşmesi şansı olan açık bir turnuva olduğundan, katılanların çoğunun mezun olduğunu düşünmelisiniz). Ancak son turlar yalnızca tonlarca deneyime sahip kişiler içindir. Onlar sadece C ++ / Java ile kodlamayı öğrenmiş öğrenciler değiller.

Tabii ki, öğrenci argümanı LISP ve OcaML veya ProLog gibi dillere karşı da işe yarar. Bu, AI alanlarında çok kullanılan dillerdir, ancak ana akım dünyada öğrencilerin öğrenmesi ve kullanması en olası olanlardır.

Google'ın dışındaki büyük yarışmalar birkaç dili desteklemektedir, ancak bu yine de Pascal veya .net'in neden Java seviyesine yakın olmadığını açıklamaz (Büyük yarışma etkinliklerinde eşit olarak desteklenme eğiliminde oldukları için).

Bu yarışmalardaki en iyi kodlayıcıların çoğu birçok dil biliyor. Ama yine de turlar sırasında C ++ kullanmayı tercih ediyorlar, bu ilk önce "öğrenilmiş C ++" dan daha büyük bir sebepten dolayı olmalı.

C ++ veya Java dışındaki dillerin iş için daha iyi araçlar olduğu iddiasına karşı çıkıyorum. Doğrudan veriler, finalistlerin C ++ ve Java kullanma olasılıklarının daha yüksek olduğunu söylüyorsa, bu iddia ile doğrudan bir çelişkidir.

Google AI rekabet verileri, aslında kod sıkışmasıyla ilgili herhangi bir önermeyle çelişmez. Aslında, en iyi kodlayıcıların iş için gerçekten daha iyi bir araç olduğunda Common Lisp gibi dilleri kullanabildiklerini gösteriyor. Bu verileri CLISP'in AI yarışmaları için harika bir araç olduğunu varsaymak için kullanmak istiyorsak, o zaman C ++ 'nın GCJ gibi algoritma yarışmaları için harika bir araç olduğunu da varsaymalıyız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.