Mengapa C ++ dominan dalam kontes pemrograman dan kompetisi? [Tutup]


23

Saya mengerti bahwa C ++ adalah bahasa yang sangat cepat, tetapi bukankah C sama cepatnya, atau lebih cepat dalam beberapa kasus?

Maka Anda mungkin mengatakan bahwa C ++ memiliki OOP, tetapi jumlah OOP yang Anda butuhkan untuk sebagian besar teka-teki pemrograman tidak sebesar itu, dan menurut saya C akan dapat mengatasinya.

Inilah mengapa saya menanyakan hal ini : Saya sangat tertarik dengan kontes pemrograman dan kompetisi, dan saya terbiasa mengkodekan dalam C pada mereka. Namun, saya perhatikan bahwa sebagian besar orang menggunakan C ++ (misalnya, 17 dari 25 finalis di Google Code Jam 2011 menggunakannya, sementara tidak ada yang menggunakan C), jadi saya bertanya-tanya apakah saya berada pada posisi yang kurang menguntungkan dengan C.

Terlepas dari Orientasi Objek, apa yang membuat C ++ bahasa yang lebih cocok untuk kompetisi pemrograman? Apa fitur bahasa yang harus saya pelajari dan gunakan untuk tampil lebih baik di kompetisi?

Untuk latar belakang, saya menganggap diri saya cukup mahir dalam C, tetapi saya baru mulai belajar C ++.

Jawaban:


56

Untuk memulainya, akan selalu ada beberapa masalah yang lebih baik diselesaikan dalam satu bahasa daripada yang lain. Akan selalu ada bahasa yang memecahkan masalah khusus "lebih baik" daripada bahasa lain, untuk beberapa definisi "lebih baik". Namun, sejumlah besar masalah memiliki kebutuhan yang sangat mirip (beberapa I / O, beberapa perhitungan) dan menghadapi persyaratan yang serupa (keandalan yang wajar, kinerja yang wajar).

Seperti yang Anda ketahui C, untuk sebagian besar masalah di luar sana, saya menyatakan bahwa C ++ tidak memberikan kerugian yang signifikan dan sejumlah peningkatan signifikan. Berani? Beberapa orang tampaknya berpikiran demikian, tetapi sebenarnya itulah masalahnya. Mari kita mulai dengan membersihkan beberapa kesalahpahaman C ++ yang sangat umum:

  • C ++ lebih lambat dari C. Salah! Banyak program C juga merupakan program C ++ yang valid - dan program C seperti itu harus berjalan dengan kecepatan yang sama ketika dikompilasi dengan kompiler C atau kompiler C ++.

  • C ++ fitur spesifik memerlukan overhead. Salah! Yang disebut overhead yang diperkenalkan oleh fitur spesifik C ++ tertentu (seperti panggilan fungsi virtual atau pengecualian), sebanding dengan overhead yang Anda sendiri akan perkenalkan seandainya Anda mengimplementasikan fitur serupa di C.

  • C ++ berorientasi objek. Salah! Bahasa C ++ berisi beberapa ekstensi bahasa yang memfasilitasi pemrograman berorientasi objek dan pemrograman generik. C ++ tidak memaksa desain berorientasi objek di mana pun - hanya memungkinkannya. C memungkinkan untuk pemrograman berorientasi objek juga, C ++ hanya membuatnya lebih sederhana dan lebih rentan kesalahan.

Jadi, jika Anda percaya kepada saya, kami telah menetapkan bahwa "C ++ tidak jauh lebih buruk daripada C". Mari kita lihat apa yang membuat C ++ menjadi C yang lebih baik:

  • Pengetikan yang lebih kuat Sistem tipe di C ++ lebih kuat daripada di C. Hal ini mencegah banyak kesalahan pemrograman umum - ditambah dengan fitur yang sangat penting berikutnya, sistem tipe yang lebih kuat bahkan mengelola untuk tidak menjadi ketidaknyamanan.

  • Jenis parameterisasi Kata kunci templat memungkinkan programmer untuk menulis implementasi algoritma generik (tipe-agnostik). Di mana dalam C, orang bisa menulis implementasi daftar generik dengan elemen seperti:

    struct element_t {
      struct element_t *next, *prev;
      void *element;
     };

C ++ memungkinkan seseorang untuk menulis sesuatu seperti:

template <typename T>
struct element_t {
   element_t<T> *next, *prev;
   T element;
};

Tidak hanya implementasi C ++ mencegah kesalahan programmer umum (seperti menempatkan elemen dari tipe yang salah pada daftar), itu juga memungkinkan pengoptimalan yang lebih baik oleh kompiler! Misalnya, implementasi penyortiran generik tersedia di C dan C ++ -

rutin C didefinisikan sebagai:

void qsort(void *base, size_t nmemb, size_t size,
           int(*compar)(const void *, const void *));

sedangkan rutin C ++ didefinisikan sebagai

template void sort(RandomAccessIterator first, RandomAccessIterator last);

Perbedaannya adalah, bahwa misalnya mengurutkan array bilangan bulat, akan, dalam kasus C, memerlukan pemanggilan fungsi untuk setiap perbandingan tunggal, sedangkan implementasi C ++ akan memungkinkan kompiler untuk menyejajarkan panggilan perbandingan bilangan bulat, karena rutinitas aktual yang sebenarnya adalah secara otomatis dipakai pada waktu kompilasi oleh kompiler, dengan jenis yang benar dimasukkan dalam argumen template.

  • Pustaka standar yang lebih besar C ++ memungkinkan penggunaan penuh pustaka standar C. Ini tentu saja sangat penting, karena pustaka standar C adalah sumber yang tak ternilai saat menulis program dunia nyata. Namun, C ++ termasuk Perpustakaan Template Standar. STL berisi sejumlah templat yang bermanfaat, seperti semacam rutinitas di atas. Ini termasuk struktur data umum yang berguna seperti daftar, peta, set, dll. Seperti rutinitas sortir, rutinitas STL lainnya dan struktur data "disesuaikan" dengan kebutuhan spesifik yang dimiliki oleh programmer - yang harus dilakukan oleh programmer hanyalah mengisi jenis.

Tentu saja, STL bukanlah peluru perak - tetapi memang memberikan bantuan yang sangat sering, ketika memecahkan masalah umum. Seberapa sering Anda menerapkan daftar di C? Seberapa seringkah pohon RB akan menjadi solusi yang lebih baik, andai saja Anda punya waktu untuk melakukannya? Dengan STL Anda tidak perlu membuat kompromi seperti itu - gunakan pohon jika lebih cocok, semudah menggunakan daftar.

Ok, jadi saya hanya mendiskusikan bagian yang bagus. Apakah ada kerugian? Tentu saja ada. Namun, jumlah mereka menyusut dari hari ke hari. Biarkan saya jelaskan:

  • Tidak ada kompiler C ++ yang bagus Sudah seperti ini sejak lama. Tetapi Anda harus ingat, bahwa bahasa itu distandarisasi pada tahun 1998 - itu adalah bahasa yang kompleks, lebih kompleks dari C. Butuh waktu lama bagi penyusun untuk mengejar standar. Tetapi pada tulisan ini, ada kompiler yang baik tersedia untuk platform yang paling banyak digunakan di luar sana; GCC dalam versi 3.X umumnya sangat baik, dan ini berjalan pada GNU / Linux dan sebagian besar platform UNIX. Intel memiliki kompiler yang bagus untuk Win32 - ini juga cukup bagus, tetapi sayangnya masih bergantung pada MS STL yang merupakan sub-par.

  • Orang-orang tidak tahu C ++ yang bagus Ini bukan keluhan yang sering didengar, tetapi ini adalah sesuatu yang saya lihat banyak. C ++ adalah bahasa yang besar dan kompleks - tetapi juga merupakan bahasa yang banyak digemari, terutama pada masa "OOP memecahkan kelaparan, menyembuhkan AIDS dan kanker". Hasilnya tampaknya banyak kode C ++ yang benar-benar buruk, pada dasarnya C buruk dengan beberapa deklarasi kelas di sana-sini, ada di luar sana dan digunakan sebagai bahan pembelajaran. Ini berarti banyak orang yang percaya mereka tahu C ++ sebenarnya menulis kode yang benar-benar jelek. Itu terlalu buruk, dan ini masalah, tapi saya pikir tidak adil untuk menyalahkan ini pada C ++.

Jadi, hanya dua masalah utama dengan C ++ adalah hasil dari C ++ menjadi bahasa yang muda. Pada waktunya mereka akan lenyap. Dan untuk sebagian besar masalah di luar sana, jika Anda bisa mendapatkan programmer yang baik (atau belajar C ++ yang baik sendiri), masalahnya bukan masalah saat ini.


8
+1. Jawabannya sangat lengkap. Satu-satunya hal yang saya punya pendapat berbeda adalah bahwa di masa depan, kerugian utama C ++ akan hilang. Karena C ++ harus kompatibel ke belakang, hampir tidak ada fitur bahasa yang dihapus dari C ++, hanya yang baru ditambahkan (C ++ 11 adalah contoh sempurna untuk ini). Itu akan membuat bahasa ini menjadi lebih rumit daripada sekarang, yang merupakan IMHO kelemahan terbesar C ++.
Doc Brown

@DocBrown: Itu tergantung pada bagaimana Anda menggunakan C ++. Jika Anda bekerja dengan banyak kode lama, Anda perlu memahami cara kerjanya, dan karena itu mungkin membutuhkan pengetahuan luas tentang C ++. Jika Anda hanya menulis kode baru (seperti dalam suatu kompetisi), Anda dapat membatasi diri hanya pada apa yang akan Anda gunakan, menghindari banyak kesalahan (seperti, katakanlah, auto_ptr<>).
David Thornley

Jawaban yang bagus, tapi saya pikir "Banyak program C juga program C ++ yang valid" tidak cukup kuat karena perbedaannya tidak mengubah pembuatan kode. Hampir setiap program C dapat ditulis ulang sebagai program C ++ yang valid dan identik dengan sedikit usaha.
Gort the Robot

3

Kontes seperti itu tidak banyak tentang kecepatan program seperti kecepatan programmer. C ++ memiliki fitur pustaka standar, tipe keselamatan, dan bantuan untuk manajemen memori yang membuat pengembangan dan debugging lebih cepat, bahkan jika executable berakhir sedikit lebih lambat.


2

Berbicara sebagai finalis Code Jam sebelumnya, sebagian besar tentang perpustakaan daripada fitur bahasa. Solusi persaingan jarang menggunakan prinsip-prinsip desain OOP, tetapi Anda cenderung melihat tur sebagian besar kontainer dan algoritma perpustakaan standar - string, vektor, daftar, tumpukan, antrian, deque, priority_queue, set, peta, kompleks, pasangan, bitset, lower_bound, mundur, sortir, cari, hitung, nth_element, min, max, min_element, max_element, unik, next_permutation, ... kontestan yang terampil akan terbiasa dengan semuanya dan mendapatkan banyak waktu dengan tidak harus mengimplementasikan dan debug mereka dalam C.

Code Jam memungkinkan kontestan untuk membawa kode mereka sendiri dan menggunakan perpustakaan pihak ketiga, sehingga secara teori seorang kontestan dapat memiliki semua ini pra-implementasi di C. Namun, tidak semua kontes mengizinkan ini, dan template dan kelebihan operator membuat ini lebih mudah dibaca dari pada C.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.