Setelah berkompetisi dan mengikuti kompetisi Google Code Jam tahun ini , saya tidak bisa tidak melihat banyaknya kontestan [sukses] yang menggunakan C / C ++ dan Java. Distribusi bahasa yang digunakan selama kompetisi dapat dilihat di sini .
Setelah memprogram di C / C ++ selama beberapa tahun, saya baru-baru ini jatuh cinta dengan Python karena sifatnya yang mudah dibaca / langsung. Baru-baru ini, saya belajar bahasa fungsional seperti OCaml, Skema, dan bahkan bahasa logika seperti Prolog. Bahasa-bahasa ini tentunya memiliki kelebihan dan, menurut saya, dapat diterapkan lebih mudah daripada C ++ dan Java untuk situasi tertentu. Misalnya, penggunaan panggilan / cc Skema menyederhanakan pelacakan balik (alat yang diperlukan untuk menjawab beberapa masalah) dan spesifikasi logika Prolog, meskipun tidak efisien karena sifat brute force-nya, dapat secara drastis menyederhanakan (dan bahkan secara otomatis menyelesaikan) masalah tertentu yang sulit untuk diselesaikan. membungkus otak seseorang.
Jelas bahwa kontestan kompetisi harus menggunakan alat yang paling sesuai untuk tantangan tersebut. Bahkan perakitan x86 sudah Turing selesai - itu tidak membenarkan penyelesaian masalah dengannya. Dalam kasus ini, mengapa kontestan yang menggunakan bahasa yang kurang umum seperti Scheme / Lisp, Prolog, dan bahkan Python secara signifikan kurang berhasil daripada kontestan yang menggunakan C / C ++ dan Java? Dengan kata-kata yang berbeda, mengapa kontestan yang sukses tidak menggunakan bahasa yang, meskipun mungkin kurang umum, merupakan alat yang lebih baik untuk pekerjaan itu?
Ada beberapa motivasi untuk pertanyaan saya. Yang terpenting, saya ingin menjadi programmer yang lebih baik - baik dalam aspek praktis maupun aspek persaingan. Setelah diperkenalkan dengan paradigma yang indah seperti pemrograman fungsional dan logika, sangat mengecewakan melihat begitu banyak orang membuangnya demi C / C ++ dan Java. Bahkan membuat saya mempertanyakan kekaguman saya atas paradigma tersebut, khawatir saya tidak bisa sukses sebagai programmer Lisp / Scheme / Prolog dalam kompetisi pemrograman.
sumber
Jawaban:
Pertanyaan bagus! Sebagai seseorang yang telah mencoba-coba kontes pemrograman sendiri, saya mungkin ingin mengatakan sesuatu.
[Mari kita singkirkan penafian standar: pemrograman kontes hanya terkait secara longgar dengan "pemrograman di dunia nyata", dan sementara itu menguji keterampilan algoritmik dan pemecahan masalah serta kemampuan untuk menghasilkan kode kerja cepat bebas bug di bawah tekanan waktu, ini tidak selalu berkorelasi dengan kemampuan untuk membangun proyek perangkat lunak besar, menulis kode yang dapat dipelihara, dll (selain fakta bahwa program yang terstruktur dengan baik lebih mudah untuk di-debug).]
Sekarang untuk beberapa jawaban:
C ++ / Java juga lebih umum daripada bahasa lain di dunia nyata, jadi Anda akan melihat proporsi yang lebih tinggi di mana saja. (Tetapi bahkan lebih tinggi dalam populasi kontes.)
Banyak dari peserta ini adalah pelajar, atau mengikuti kontes sebagai pelajar, dan C ++ / Java adalah "bahasa pertama" yang lebih umum dipelajari siswa. (Siswa tingkat bawah akhir-akhir ini mungkin mulai dengan Skema, Haskell, Python, dll., Tetapi siswa sekolah menengah (seringkali otodidak) lebih jarang.) Faktanya, banyak peserta Eropa Timur masih menggunakan Pascal, dan lebih menakjubkan dengan itu daripada kita semua dengan bahasa apa pun.
Kontes tingkat sekolah dan perguruan tinggi biasanya menggunakan bahasa-bahasa ini. International Olympiad in Informatics (IOI) hanya mengizinkan C, C ++ dan Pascal (atau mungkin sekarang mengizinkan Java; saya belum mengikutinya), dan ACM Intercollegiate Programming Contest (ACM ICPC) hanya mengizinkan C, C ++ dan Java. TopCoder memungkinkan C ++, Java, C # dan VB (benar-benar: p); dan baru-baru ini, Python. Jadi bisa dibilang "ekosistem kontes" memiliki lebih banyak programmer C ++ / Java di dalamnya. Google Code Jam dan IPSC adalah di antara sedikit kontes yang mengizinkan kode dalam bahasa apa pun.
Sekarang pertanyaannya adalah, di GCJ dimana para kontestan bebas memilih bahasa, mengapa mereka tidak memilih Python atau Scheme? Faktor yang paling relevan adalah bahasa-bahasa ini lambat . Tentu, untuk sebagian besar pemrograman dunia nyata, mereka cukup cepat dengan mudah, tetapi untuk loop ketat yang sering terlibat dalam menjalankan program di bawah batas n-detik untuk semua kasus pengujian, bahasa ini tidak memotongnya untuk salah satu masalah algoritmik yang lebih terlibat. (Masalah yang dirancang untuk menerima solusi O (n log n) tetapi tidak Θ (n 2 ) solusi untuk C / C ++ sering mengesampingkan solusi O (n log n) yang optimal sekalipun dalam bahasa yang lebih lambat. Bahkan Java dulunya diberi cacat pada USACO; Saya tidak yakin ini masih terjadi.)
Faktor lainnya adalah pustaka: C ++ dan Java memiliki pustaka yang lebih baik untuk algoritme dan struktur data yang sering berguna (misalnya pohon merah-hitam, next_permutation C ++), sedangkan pustaka Python (cukup baik untuk dunia nyata) kurang berguna di sini, dan Prolog dan Skema ... Saya tidak tahu tentang perpustakaan mereka. Ini adalah faktor yang relatif kecil, karena programmer ini dapat menulis kode mereka sendiri bila diperlukan. :-)
Bahasa multi-paradigma tujuan umum lebih berguna untuk menyelesaikan sesuatu dalam batasan waktu kontes, daripada bahasa yang memaksakan filosofi atau cara melakukan sesuatu pada Anda. Inilah mengapa Prolog akan selalu tidak populer, misalnya. (Filosofi umum: beberapa bahasa "memungkinkan" bahasa yang memungkinkan Anda melakukan apa saja termasuk menembak diri sendiri, beberapa "mengarahkan" yang memaksa Anda untuk melakukan hal-hal dengan cara yang benar.) Ini juga mengapa C ++ tiga kali lebih populer daripada Java pada peserta kontes umum, dan jauh lebih populer di kalangan kontestan papan atas. Karena kode tidak harus dibaca oleh orang lain, tidak masalah dan bahkan berguna untuk memiliki makro perulangan seperti
FOR(i,n)
(lebih sedikit kode untuk diketik, dan yang lebih penting lebih sedikit kemungkinan membuat bug saat terburu-buru). Tidak ada yang melawan Java, ada beberapa programmer top yang menggunakan Java juga. :-)Akhirnya, meskipun banyak dari programmer top ini mungkin memiliki C ++ / Java / Pascal sebagai "bahasa pertama" mereka, mereka tidak bagus karena bahasanya, jadi Anda tidak perlu putus asa tentang itu. Banyak dari programmer yang sama ini telah memenangkan kontes seperti kontes ICFP bahkan dengan sengaja menggunakan bahasa gila seperti skrip shell, m4 (digunakan dalam autoconf), dan assembly (tim bernama "You Can't Spell Awesome Without ASM").
sumber
Saya menyukai ide Jerry Coffin untuk merencanakan kontestan kontes Google AI, jadi saya mengambil semua hasil dan memplotnya (rata-rata dihitung, deviasi standar, dan kemudian membuat grafik kurva distribusi normal di Excel).
Dengan Lua dan JS, dapatkan ini:
Tanpa (hanya ada sedikit kontestan, jadi mungkin hasilnya miring):
Sepertinya peserta Java jauh lebih buruk daripada yang lain, sementara Go, Common Lisp, dan C berada di ujung yang lebih baik.
sumber
Mengapa kita semua berbicara bahasa Inggris dan bukan Esperanto ? Nah, itu terjadi begitu saja. Meskipun bahasa Inggris tidak konsisten dan membengkak dan Esperanto sengaja dirancang sebagai 'alat yang lebih baik'.
Jadi, salah satu alasannya adalah tradisi. Di sebagian besar sekolah, pemrograman masih diajarkan dalam C / C ++, Java, Pascal atau bahkan Basic. Dan berpartisipasi dalam kontes yang sebagian besar adalah siswa, yang memilih bahasa yang lebih mereka kuasai.
Juga, Anda dapat melihat bahwa kebanyakan buku algoritmik menampilkan psedudocode dengan gaya Pascal atau Ada, dan sangat sangat jarang - Lisp. Entah kenapa, mungkin juga tradisi. Atau mungkin itu tidak begitu bagus untuk algoritme.
Alasan lainnya adalah kecepatan. Meskipun ini bukan masalah untuk Google Code Jam, di hampir semua kontes, perbedaan kecepatan 2x adalah perbedaan antara keputusan 'Diterima' dan 'Batas Waktu'.
Dengan kata lain, jika algoritme optimal di C ++ berjalan 10 kali lebih cepat daripada di Ruby, itu berarti algoritme sub-optimal di C ++ masih akan lebih cepat daripada algoritme yang bagus di Ruby. Dan penulis kontes biasanya tidak ingin mengizinkan pengiriman O (n ^ 2), jika O (n * logn) dapat dicapai.
sumber
Pertama, saya akan mempertanyakan premis Anda [edit: atau apa yang saya anggap sebagai premis - bahwa kontestan yang menggunakan C ++ dan Java memiliki tarif yang sama baiknya]. Sebagai contoh, inilah yang bahasa yang digunakan untuk entri yang datang dalam pertama 100 tempat dan terakhir 100 tempat di kontes AI Google baru-baru ini:
Kontestan menggunakan C ++ dan Java tampaknya tidak berada di mana saja dekat untuk sama-sama sukses dalam kontes itu. Kontestan yang menggunakan Python tampaknya tidak berhasil dengan baik, meskipun jumlahnya jauh lebih sedikit, melemahkan kesimpulan apa pun dalam hal itu.
Kedua, tentu saja, banyak sekali penjelasan (seperti yang ditunjukkan orang lain) tidak diragukan lagi hanyalah jumlah orang yang akrab dengan setiap bahasa. Mungkin ada lebih banyak orang yang mengambil kursus di Java saat ini daripada jumlah orang yang pernah menulis Lisp, Skema atau Prolog.
Sunting: Saya pikir kemungkinan ketiga hanyalah keserbagunaan. Untuk mengambil contoh ekstrim, Prolog sangat baik cocok untuk beberapa masalah, tetapi sama-sama buruk cocok untuk banyak orang lain. Hanya sedikit orang yang dapat (atau setidaknya benar-benar) mempelajari lebih dari satu atau dua bahasa dengan cukup baik untuk menggunakannya dalam kontes, jadi kebanyakan orang yang tertarik pada hal-hal seperti itu cenderung memilih bahasa yang dapat bekerja dengan baik untuk hampir semua hal, daripada mencoba mempelajari bahasa khusus untuk setiap masalah yang mungkin dipilih.
sumber
Di hampir semua putaran Google Code Jam, lebih banyak kode kontestan berperforma tinggi di C ++.
Di bawah ini adalah statistik bahasa dari Google Code Jam 2012 Putaran 1A, 1B, dan 1C (tercantum dari atas ke bawah). Jumlah kontestan di setiap babak masing-masing adalah 3.686, 3.281, dan 3.189.
sumber
pertanyaan yang menyenangkan, mungkin harus wiki komunitas.
Lihat jumlah finalis menurut negara: http://www.go-hero.net/jam/10/regions . perhatikan jumlah orang dari Eropa Timur dan Rusia. tempat-tempat itu memiliki komunitas C ++ yang sangat kuat, serta Jawa, karena sejumlah alasan.
lihat bahasa nomor di kualifikasi: http://www.go-hero.net/jam/10/languages/0 dan final: http://www.go-hero.net/jam/10/languages/6 . C ++ memulai kurang dari setengah dan memiliki 75 persen di final. baik programmer yang baik lebih suka C ++ atau C ++ membuat programmer. Mungkin pada saat Anda menguasai C ++, hal-hal lain menjadi sepele.
Anda bebas menarik kesimpulan sendiri.
sumber
Pertama-tama, seperti yang telah Anda tunjukkan
C++
danJava
merupakan bahasa arus utama. Ini secara otomatis berarti bahwa orang yang mulai melakukan kompetisi pemrograman akan diperkenalkan kepada mereka terlebih dahulu - dengan cara yang belajarLisp
sebagai bahasa pertama :) Saya juga berpartisipasi secara teratur dalam kompetisi semacam itu - saya biasaC++
berkompetisi, meskipun bahasa favorit saya adalahJava
. Saya hanya ingin berlatih bahasa lain selainJava
- jugaC++
sedikit kurang bertele-tele dan berjalan lebih cepat yang penting untuk kompetisi pemrograman. Sekarang ke poin saya - orang pertama menjadi ahli dalam bahasa arus utama. Untuk berpartisipasi dalam kompetisi pemrograman, Anda harus memiliki pemahaman yang baik tentang bahasa yang Anda gunakan. Anda tidak punya waktu untuk mencari di internet untuk hal-hal bodoh - seperti lupa membangun. Hanya saja kecepatan menjadi faktor penting di sana. MenggunakanLisp
dalam sebuah kompetisi, kamu pasti menyukainya. Saya tidak berpikir ada banyak orang di luar sana. Koreksi saya jika saya salah. Dan sejujurnya kelebihan yang telah Anda sebutkan seperti menyederhanakan kemunduran: Dalam bahasa apa pun mundur itu mudah - nyatakan sebuah metode dan panggil saja lagi untuk setiap kemungkinan hasil. Tidak bisa lebih sederhana. Saya belum merasa sampai sekarang bahwa bahasa yang saya gunakan mencoba meningkatkan kemampuan saya untuk kompetisi pemrograman.sumber
OMG ... Semua orang menelusuri Statistik dan Angka !!
Jangan lupa dasar-dasarnya .. Ini adalah dua bahasa (kebanyakan) yang diajarkan kepada orang-orang di perguruan tinggi / sekolah ...!
Itu mungkin menjawab deru berat!
sumber
Alasan penting mungkin karena setiap kontes tidak mendukung bahasa seperti python atau prolog. Khususnya ACM ICPC World Finals mendukung C / C ++ dan Java . Dan TopCoder juga hanya mendukung C ++, Java, C #, VB, dan sekarang Python . Wajar bagi kontestan bahwa mereka akan memilih satu bahasa yang tersedia di setiap kontes. Alasan lain mungkin kecepatan eksekusi. Dan ya, alasan lainnya adalah bahasa-bahasa ini yang pertama kali dipelajari oleh sebagian besar orang.
sumber
Perpustakaan besar adalah nilai jual untuk Java di ACM ICPC. Sangat berguna untuk dapat menyadari bahwa Anda menginginkan beberapa struktur data atau algoritme acak dan hanya menariknya dari pustaka standar.
sumber
Perlu diingat bahwa C ++ tidak hanya mayoritas di antara semua kontestan, tetapi seiring berjalannya putaran, persentasenya terus dan terus meningkat.
Menurut saya benar bahwa sebagian besar pesertanya adalah pelajar (Namun, karena ini adalah turnamen terbuka dengan peluang untuk wawancara kerja dengan google, maka Anda harus mempertimbangkan bahwa banyak yang berpartisipasi telah lulus). Tapi putaran terakhir hanya untuk orang dengan banyak pengalaman. Mereka bukan hanya siswa yang baru belajar membuat kode di C ++ / Java.
Tentu saja, argumen siswa juga berfungsi melawan bahasa seperti LISP dan OcaML atau ProLog. Itu adalah bahasa, yang banyak digunakan di area AI tetapi di dunia arus utama, siswa kemungkinan besar akan belajar dan menggunakannya.
Kontes besar selain Google mendukung beberapa bahasa, tapi itu masih tidak menjelaskan mengapa Pascal atau .net tidak mendekati level Java (Karena mereka cenderung sama-sama didukung dalam acara kontes besar).
Banyak pembuat kode terbaik dalam kontes ini tahu banyak bahasa. Tapi mereka masih lebih suka menggunakan C ++ selama ronde itu pasti karena alasan yang lebih besar daripada "belajar C ++" terlebih dahulu.
Saya akan membantah klaim bahwa bahasa selain C ++ atau Java adalah alat yang lebih baik untuk pekerjaan itu. Jika data langsung mengatakan bahwa finalis lebih cenderung menggunakan C ++ dan Java, itu merupakan kontradiksi langsung dengan klaim tersebut.
Data persaingan AI Google sebenarnya tidak bertentangan dengan premis apa pun tentang kemacetan kode. Ini benar-benar menunjukkan bahwa pembuat kode teratas dapat menggunakan bahasa seperti Common Lisp ketika itu benar-benar alat yang lebih baik untuk pekerjaan itu. Jika kita ingin menggunakan data ini untuk mengasumsikan bahwa CLISP adalah alat yang hebat untuk kompetisi AI, maka kita juga harus berasumsi bahwa C ++ adalah alat yang hebat untuk kompetisi algoritma seperti GCJ.
sumber