Mengapa industri ini beralih dari C ke C ++? [Tutup]

19

Pertama-tama saya ingin memiliki jawaban yang nyata, saya selalu berusaha untuk mendapatkan lebih banyak dari berbagai sumber dan artikel, dan ketika saya membaca hal-hal seperti C ++ lambat karena memiliki fungsi virtual dan karena C ini lebih baik , saya benar-benar tidak tahu harus berkata apa dan berpikir sebagai manusia dengan otak. Jadi tolong hindari untuk mencapai level ini dalam jawaban Anda.

Pertanyaan saya adalah tentang perpindahan besar-besaran ke C ++ yang selesai, kurang lebih, dengan Doom 3.

Hal yang menarik bagi saya adalah bahwa sebelum tonggak sejarah ini, sebagian besar mesin game dan game itu sendiri ditulis dalam bahasa C, seperti itu sejak era Gempa . Menarik juga untuk dicatat bahwa perangkat lunak ID memutuskan untuk sepenuhnya menulis ulang basis kode untuk IdTech 4 di C ++, sejumlah besar pekerjaan yang sejujurnya tidak dapat saya pahami tanpa daftar alasan yang sangat bagus.

Saya fokus pada Doom 3 karena saya terutama tertarik pada dunia OpenGL dan dalam perjalanan saya mencoba untuk tetap fokus pada topik ini, jadi saya banyak membaca tentang ini, tetapi saya pikir pertanyaan seperti itu dapat di-render-API -agnostik tanpa terlalu banyak masalah.

Mengapa pada titik waktu tertentu industri beralih besar-besaran ke C ++? Apa alasan untuk pilihan yang dibuat ID?

Hal terakhir yang ingin saya katakan adalah bahwa bahasa C jauh lebih sederhana untuk diimplementasikan dan menyediakan sejumlah fitur yang lebih sedikit, karena ini memiliki peluang jauh lebih kecil untuk "terfragmentasi" dalam bentuk yang tidak seperti C ++ yang sebenarnya sering terjadi. Dalam istilah paling sederhana saya memiliki lebih banyak peluang untuk menemukan kompiler C yang benar-benar baik daripada kompiler C ++ yang baik dengan semua fitur yang diimplementasikan dengan cara yang baik.

Misalnya NDK untuk Android masih tidak memiliki dukungan C ++ yang baik (dengan rilis r8b) dengan semua fitur terbaru dan terhebat, dan itu adalah toolkit asli untuk OS seluler paling populer di dunia!

Jika saya telah menulis kode saya dalam C ++ modern saya mungkin akan kesakitan sekarang karena salah satu OS paling populer di dunia akan terlarang bagi saya. Dan seperti Android, banyak kompiler lain tidak begitu bagus.

Saya harus menulis kode C ++ mengacu pada versi C ++ yang 2-3 rilis lama?

pengguna827992
sumber
1
Saya menduga itu hanya bahwa C + + adalah perpanjangan kuasi dari C. Orang-orang mulai menulis C dengan fitur C ++ seperti std :: vector, dari sana pada C ++ diajarkan bukannya C dan dengan demikian orang-orang mulai menulis C ++ penuh sesak nafas.
API-Beast
1
Nah, C vs. C ++ saat mengembangkan aplikasi besar ? OOP adalah paradigma yang hebat dan .. C ++ mendukungnya. Jika Anda akan menulis game dalam bahasa C, maka pertimbangkan desain berorientasi data . Kalau tidak, mari kita renungkan mengapa semua pemain industri saat ini menggunakan C ++. Rekayasa perangkat lunak, baik untuk aplikasi keuangan atau hiburan, mempelajari paradigma OOP dan pola arsitektur dan desain. Sederhananya, C tidak dapat menawarkan gambaran besar yang menawarkan enkapsulasi kepada Anda. Apakah ada perangkat lunak besar modern yang ditulis dalam bahasa C? Mungkin kernel dan sistem embedded.
teodron
@teodron 1) Saya harus menghasilkan executable yang baik, saya peduli tentang bahasa seperti saya peduli tentang aset penting, tapi itu bukan segalanya dan bukan itu yang saya jual 2) enkapsulasi itu tidak begitu baik untuk kinerja, jika seseorang ingin meyakinkan saya untuk meninggalkan dunia C ++, enkapsulasi adalah salah satu topik yang bagus untuk ini.
user827992
3
" Hal yang menarik bagi saya adalah bahwa sebelum tonggak sejarah ini, sebagian besar mesin permainan dan permainan itu sendiri ditulis dalam bahasa C, seperti itu sejak era Gempa. " Saya ingin melihat beberapa bukti untuk itu. Selain mesin open-source Id-software. Mereka bukan seluruh industri videogame.
Nicol Bolas
@NicolBolas saya menjelaskan alasan mengapa saya berbicara tentang ID, silakan dapatkan arti dari seluruh pertanyaan.
user827992

Jawaban:

28

C ++ melakukan semua yang dilakukan C. Anda dapat dengan mudah mencampurkan C dan C ++ dalam kasus-kasus di mana keunggulan C lebih besar daripada C ++. Ini adalah keputusan desain yang sangat disengaja dari C ++.

C ++ melakukan hal-hal yang tidak dilakukan C. Ini termasuk polimorfisme yang mudah, tetapi juga mengkompilasi pembuatan kode waktu yang mudah melalui templat. Ini sangat berguna untuk hal-hal seperti wadah, yang merupakan kelemahan terbesar C. Ini juga memungkinkan tipe seperti pointer yang ditentukan pengguna (smart handle) yang menghemat banyak waktu, serta tipe seperti primitif yang ditentukan pengguna seperti vektor dan matriks dengan dukungan operator (juga menghemat banyak waktu).

Fungsi virtual lebih lambat daripada fungsi non-virtual. Namun, Anda harus ikut serta dalam fungsi virtual, dan seorang programmer yang kompeten hanya melakukannya jika bermanfaat. Pemrogram C memiliki pointer fungsi dan sering menyimpan koleksi yang ada di struct yang direferensikan oleh struct lainnya; dengan kata lain, mereka melakukan kerja ekstra untuk membuat ulang hal yang sama persis dengan tabel fungsi virtual. Dalam kasus di mana hanya satu fungsi pointer diperlukan dan tidak ada tabel yang diperlukan, C ++ masih sepenuhnya memungkinkan itu dan setara dengan C. Dengan kompiler modern, C ++ hanya lebih lambat dari C dalam kasus-kasus tertentu pemrogram memilih fitur . Selain itu, overhead fungsi virtual dalam praktiknya sangat kecil pada CPU modem. Perangkat keras saat ini dirancang untuk pola penggunaan C ++, dan bahkan semakin dirancang untuk kebutuhan bahasa tingkat tinggi yang ditafsirkan.

Pengecualian C ++ secara historis memaksakan banyak overhead, membuat C ++ lebih lambat walaupun Anda tidak menggunakannya. Pengecualian adalah hal yang mengerikan untuk ditambahkan ke C + +, jika tanpa alasan lain selain peningkatan besar pada kompleksitas yang terlibat dalam penulisan kode pengecualian-aman, dan pada kenyataannya beberapa desain wadah secara harfiah tidak mungkin untuk membuat pengecualian aman. Pemrogram game sering mengabaikan keberadaan pengecualian, dan bahkan menonaktifkannya di kompiler. Kompiler modern memiliki pengecualian nol overhead (yaitu, Anda hanya membayar biaya untuk itu ketika Anda benar-benar menggunakannya).

C lebih mudah untuk mempelajari semua aturan. C ++ adalah bahasa yang sangat besar dan kompleks. C ++ memungkinkan penulisan kode tingkat lebih tinggi, menghasilkan API yang lebih mudah dan lebih sederhana. Beberapa orang ingin memahami bahasa lebih mudah, beberapa orang ingin menulis kode lanjutan lebih mudah. Ini adalah pertukaran antara kesederhanaan memahami apa yang dilakukan kompiler dengan sepotong kode tertentu vs kesederhanaan menulis aplikasi besar yang saling terkoneksi kompleks. Beberapa orang menilai satu jauh lebih dari yang lain, karena berbagai alasan.

Pada akhirnya, C ++ adalah superset dari C. Menurut saya, tidak ada yang seperti ini sebagai programmer C ++ yang sangat kompeten yang juga bukan programmer C lumayan (meskipun ada banyak programmer C ++ yang jatuh di bawah bar saya yang akan hilang dalam C murni). Sementara C ++ menambahkan fasilitas untuk mengisolasi programmer dari banyak C, kode C ++ non-sepele seringkali memang perlu menggunakan C untuk menyelesaikan sesuatu. Ini adalah salah satu perbedaan utama antara C ++ dan Java dan C #. Ada alasan mengapa Anda sering melihat "C / C ++" disatukan.

Keyakinan pribadi saya - yang dibagikan dengan sebagian besar profesional industri game lain yang pernah saya berinteraksi - adalah bahwa peningkatan ekspresif dan fasilitas pemrograman tingkat tinggi dari C ++ lebih besar daripada meningkatnya kompleksitas bahasa di atas C, dan sebagian besar yang sering lainnya klaim anti-C ++ dibuat sudah ketinggalan zaman dengan teknologi saat ini.

Sean Middleditch
sumber
19
"Tidak ada yang seperti ini sebagai programmer C ++ yang kompeten yang juga bukan programmer C yang kompeten" Saya sangat tidak setuju dengan pernyataan ini. Idiomatik C sangat berbeda dengan idiomatik C ++. Dua gaya telah berbeda, satu gaya menekankan pointer buram dan fungsi statis, yang lain menggunakan enkapsulasi berbasis bahasa dan sebagainya. Seseorang yang hanya tahu C ++ idiomatis akan kompeten dalam C ++, tetapi masih agak bingung oleh C. idiomatik
Nicol Bolas
Saya tidak setuju bahwa Anda bisa menjadi kompeten dalam C ++ dan hanya tahu "idiomatik C ++." Bagian yang sulit dari C ++ adalah bagian yang sulit dari C (ditambah templat). Jika seorang programmer C ++ menjadi bingung oleh fungsi standalone, struct sederhana, dan pointer mentah atau buram, dia belum menulis kode C ++ non-sepele dalam skenario non-akademik dunia nyata apa pun. Saya lebih jauh berargumen bahwa siapa pun yang hanya mahir "idiomatik" apa pun belum mencapai kompetensi.
Sean Middleditch
3
"Idiomatik" adalah cara lain untuk mengatakan "nyaman," yang — selain relatif — juga berarti ada, hampir secara definisi, wilayah bahasa yang tidak nyaman di mana programmer C ++ yang kompeten tidak akan mahir. (Saya tidak selalu berpikir itu berarti bahwa mereka "bingung" oleh elemen-elemen itu, hanya bahwa mereka tidak nyaman dengan atau tidak lancar dengan mereka.) Dan, pada tingkat tertentu, orang yang belajar bahasa C ++ idiomatis diajarkan untuk merasa tidak nyaman pada hanya melihat sekilas pointer mentah. Jadi saya tidak berpikir bahwa seorang programmer C ++ yang kompeten menyiratkan seorang programmer C yang kompeten.
John Calsbeek
Dengan kata lain, pasti ada ranah C ++ tingkat tinggi di mana Anda benar-benar dapat menghindari menggunakan fitur tingkat lebih rendah yang akan diminta untuk menulis kode C serius. Saya yakin bahwa kebanyakan basis kode non-akademik dunia nyata tidak sepenuhnya berada dalam ranah ini, tetapi saya curiga Anda dapat menemukan seseorang yang hanya nyaman dengan ranah ini dan masih menyebut mereka "kompeten." Tentu saja, Anda tidak akan membandingkan orang seperti itu dengan programmer C — Anda akan membandingkannya dengan seseorang yang memprogram dalam sejumlah bahasa tingkat tinggi lainnya.
John Calsbeek
1
@DanielCarlsson: Cukup adil, saya hanya bertele-tele. Maaf. Dalam nada itu, meskipun ... C ++ tidak melakukan apa pun yang membuat optimasi lebih sulit daripada C. :) Maksud saya, tentu saja, jika Anda menggunakan STL maka Anda terbatas pada apa yang dilakukan STL, tetapi sebagian besar alasannya kami menggunakan C ++ alih-alih C # atau Java adalah karena kami dapat menerapkan kembali seluruh STL atau menggunakan array mentah atau bahkan engkol di inline assembler atau ekstensi bahasa (seperti SSE intrinsics), dll.
Sean Middleditch
12

Mengapa pada titik waktu tertentu industri beralih besar-besaran ke C ++? Apa alasan untuk pilihan yang dibuat ID?

Id Software bukan "industri". Mereka adalah satu perusahaan. Meskipun mereka mungkin berpengaruh, mereka bukan semua orang.

Saya telah bekerja pada beberapa mesin game yang berasal dari tahun 1999, dan mereka menggunakan C ++.

Alasan prinsip untuk adopsi C ++ "sekitar waktu itu" adalah:

  1. Itu standar . C ++ 98 dinamai demikian karena dirilis sebagai standar ISO pada tahun 1998. Sampai saat itu, ada beberapa dialek C ++ tanpa ide yang jelas mana yang "nyata" atau "benar". Setelah standar, dan kompiler mulai menerapkan standar, pengembang game dapat mengandalkan standar aktual.

  2. Ingat lelucon lama: Seorang pria masuk ke kantor dokter dan berkata, "Rasanya sakit ketika saya mengangkat tangan saya seperti ini." Jadi dokter berkata, "Jadi jangan angkat tangan seperti itu."

    Jika fungsi virtual lambat untuk kebutuhan Anda, C ++ tidak memaksa Anda untuk menggunakannya. Segala sesuatu di C ++ adalah opt-in. Anda memilih untuk menggunakan setiap fitur tertentu. Jika Anda menggunakan kode kritis kinerja dan Anda tidak ingin overhead virtual, Anda tidak menggunakan fungsi virtual. Seperti halnya jika Anda menggunakan kode kritis kinerja di C, Anda tidak menggunakan pointer fungsi.

    Memang, ini menyebabkan banyak game C ++ tidak menjadi C ++ idiomatik (setidaknya, bukan C ++ idiomatik modern ), tetapi hanya "C dengan kelas". Dan ini adalah cara yang berfungsi sempurna untuk memprogram C ++. Sial, hanya bisa tidak harus mengetik typedef structketika Anda membuat tipe baru adalah keuntungan.

    C ++ adalah sekumpulan besar fitur, dan Anda dapat memilih yang mana yang Anda inginkan.

Misalnya NDK untuk Android masih tidak memiliki dukungan C ++ yang baik (dengan rilis r8b) dengan semua fitur terbaru dan terhebat, dan itu adalah toolkit asli untuk OS seluler paling populer di dunia!

Maksudmu adalah? Google nyaris tidak mentolerir orang yang menggunakan NDK; sudah jelas bahwa mereka ingin semua orang menggunakan Java. Satu-satunya alasan NDK ada adalah karena ada pengembang penting tertentu yang tidak akan menggunakan platform tanpa itu. Dengan demikian, NDK ada untuk melayani mereka dan kebutuhan fitur mereka.

Ya, C ++ adalah spesifikasi yang lebih besar, lebih rumit untuk diterapkan. Begitu juga Jawa. Begitu juga bahasa apa pun kecuali C.

Juga, apa maksud Anda "semua fitur terbaru dan terhebat"? Jika Anda berbicara tentang hal-hal C ++ 11, well, belum ada yang sepenuhnya mengimplementasikannya. Speknya baru berumur hampir satu tahun sekarang. Juga, saya tidak tahu apakah NDK mendukung C11 juga; ya, C juga memiliki "fitur terbaru dan terhebat" yang tidak didukung di mana-mana.

Yang memunculkan poin penting: jika Anda ingin aplikasi pure-C Anda dikompilasi di Visual Studio, maka itu harus sesuai dengan C89, dan tidak ada yang lebih tinggi dari itu. Jadi fragmentasi dengan C sudah ada. Beberapa platform hanya mendukung C89. Beberapa mendukung C99. Beberapa mendukung C11, hingga derajat yang berbeda-beda. Dll

Jika Anda ingin menggunakan C, maka menggunakan C . Fakta bahwa orang lain tidak membuat pilihan itu tidak berarti pilihan Anda salah atau pilihan mereka salah. Anda tidak perlu membenarkan diri Anda kepada mereka, dan mereka tidak perlu membenarkan diri mereka sendiri kepada Anda.

Nicol Bolas
sumber
2
Saya tidak berpikir bahwa Google nyaris tidak mentolerir yang menggunakan NDK karena pengembangan NDK sedang berlangsung dan ada beberapa rilis yang tersedia untuk Android, juga bahkan jika Google membenci C / C ++ saya tidak berpikir bahwa saya dapat mencapai tingkat kinerja yang baik untuk permainan saya di Jawa atau pemain paling penting di pasar dapat menulis ulang kode mereka hanya untuk java dan Android, Mungkin itu adalah kejahatan yang diperlukan untuk Google, saya tidak tahu, maksud saya adalah bertanya tentang luas lihat dan bukan pertanyaan lumpuh tentang C vs C ++ vs Java vs dunia, saya sedang mencari jawaban yang lebih umum dari bahasa terus
user827992
ke kompiler mempertimbangkan semua fitur bahasa, jawaban Anda juga memungkinkan saya untuk menekankan poin awal saya tentang ketersediaan kompiler C di pasar, pada Windows saya memiliki hampir semua rumah perangkat lunak yang menghasilkan kompiler dengan kompiler mereka sendiri, saya juga punya opsi gratis lainnya seperti MinGW. Masalah sebenarnya yang saya temukan dengan C adalah kurangnya dukungan asli untuk struktur data, wadah, di C ++ Anda bisa mendapatkan gagasan tentang berapa banyak biaya yang harus Anda
bayar untuk
di C mungkin kode yang melakukan hal yang sama memiliki lebih dari 1 implementasi, juga di C ++ kompiler dapat lebih mengoptimalkan sebagai konsekuensi dari ini. Saya mungkin harus belajar C ++ lebih banyak tetapi saya pikir saya akan beralih ke C ++ hanya untuk dukungan yang baik untuk beberapa fitur tertentu, bukan untuk bahasa itu sendiri.
user827992
7

Menarik juga untuk dicatat bahwa perangkat lunak ID memutuskan untuk sepenuhnya menulis ulang basis kode untuk IdTech 4 di C ++, sejumlah besar pekerjaan yang sejujurnya tidak dapat saya pahami tanpa daftar alasan yang sangat bagus.

Sudah umum bagi mereka untuk menulis ulang hampir seluruh mesin untuk setiap rilis (setidaknya sampai saat ini - saya tidak tahu banyak tentang beberapa game terakhir), dan karena C ++ semakin populer, masuk akal untuk menggunakannya daripada menggunakan stick dengan C. Seiring waktu semakin sedikit dan semakin sedikit orang yang akan kompeten dengan C.

Mengapa pada titik waktu tertentu industri beralih besar-besaran ke C ++?

Karena itu memberi Anda banyak fungsi tingkat yang lebih tinggi sementara hampir seluruhnya kompatibel dengan kode C.

Apa alasan untuk pilihan yang dibuat ID?

Google akan menjawab ini untuk Anda: http://fabiensanglard.net/doom3/interviews.php

"... setengah programmer benar-benar memiliki latar belakang C ++ di awal. Saya memiliki latar belakang C dan Objective-C, dan saya semacam" meluncur ke C ++ "dengan hanya melihat kode yang ditulis oleh orang-orang C ++. Di belakang, saya Seandainya saya telah menganggarkan waktu untuk meneliti dan mengeksplorasi bahasa secara menyeluruh sebelum baru mulai menggunakannya.

Anda mungkin masih dapat mengetahui bahwa kode penyaji sebagian besar dikembangkan dalam C, kemudian diurutkan menjadi C ++.

Hari ini, saya sangat yakin bahwa C ++ adalah bahasa yang tepat untuk proyek-proyek besar, multi-developer dengan persyaratan kinerja kritis, dan Tech 5 jauh lebih baik untuk pengalaman Doom 3. "

Jika saya telah menulis kode saya dalam C ++ modern saya mungkin akan kesakitan sekarang karena salah satu OS paling populer di dunia akan terlarang bagi saya.

  1. Programmer tidak bisa melihat masa depan. Mereka tidak akan tahu bahwa akan ada platform baru dengan dukungan C ++ yang buruk. Android tidak ada dengan benar sampai 2009. Doom 3 berasal dari 2004.
  2. Apakah Anda pikir programmer yang menulis game 3D mutakhir untuk PC dan konsol juga mengharapkan kode mereka berjalan di ponsel? Bertujuan untuk tingkat portabilitas seperti itu sangat jarang dan seringkali tidak berguna karena perbedaan besar dalam daya yang tersedia.

Saya harus menulis kode C ++ mengacu pada versi C ++ yang 2-3 rilis lama?

Mengapa kamu peduli tentang ini? Jangan terjebak mengejar barang terbaru. Jika itu cukup baik 5 tahun yang lalu, itu tidak akan tiba-tiba memburuk sekarang.

Kylotan
sumber
3

Yah, C ++ telah keluar sejak tahun 80-an jadi jika kompiler tidak mendukungnya, mungkin Anda harus menggunakan kompiler yang berbeda. Dan juga, C + + tidak jauh lebih lambat dari C. Ini benar-benar hanya lebih lambat jika Anda memuatnya dengan fungsi virtual dan abstraksi lainnya. Namun, C ++ banyak digunakan saat ini di dunia non unix karena fleksibilitasnya dan fitur-fitur baru yang tidak dimiliki C. Menulis kode modular dalam C ++ jauh lebih mudah daripada melakukannya di C dan membantu Anda menulis lebih banyak kode portabel. Kembali pada subjek kompiler, saya tidak tahu ada kompiler yang tidak mendukung C ++ (mungkin tidak sepenuhnya C ++ 11, tetapi setiap kompiler yang layak setengah harus mendukung C ++).

CobaltHex
sumber