Saya seorang pembuat kode dan memiliki pengalaman dengan kode asli dan dikelola. Saya mulai dengan Pascal dan C, kemudian pindah ke C ++ dan akhirnya ke C #.
Selama setahun terakhir ini, saya telah mengkode hampir secara eksklusif di C # dan telah kehilangan banyak dari apa yang dulu muncul secara alami ketika saya adalah seorang Coder C ++.
Beberapa minggu yang lalu ketika saya duduk untuk menulis beberapa kode C ++ asli, saya menemukan diri saya meraba-raba ketika saya perlahan-lahan mengenal kembali kompleksitas, keanehan, dan kekhasan dari semua itu. Saya hampir malu untuk mengatakan bahwa saya benar-benar lupa bahwa melewatkan array yang dialokasikan secara dinamis ke suatu fungsi tanpa juga melewati ukurannya akan berarti bahwa fungsi penerima tidak memiliki cara untuk mengetahui berapa lama array tersebut.
Ada banyak artikel dan dokumen yang membandingkan dan membandingkan kode dikelola vs tidak dikelola. Kita semua tahu bahwa kode asli, jika dioptimalkan dengan baik, dapat berjalan secara signifikan lebih cepat dan lebih ringan daripada kode yang dikelola. Di sisi lain, kode terkelola memiliki pengumpul sampah dan pengoptimalan khusus-waktu-CPU dan OS-spesifik yang dapat membuat kode asli berjalan untuk mendapatkan uangnya.
Dari sudut pandang teknis, tidak ada pemenang yang jelas.
Tidak ada keraguan bahwa kode yang dikelola adalah urutan yang lebih sederhana untuk dikodekan dan dipahami. Lihat saja perbedaan dalam jumlah baris yang diperlukan untuk membangun GUI sederhana di Win32 C ++ vs C #.
Kembali pada hari-hari pengkodean asli saya, saya kebanyakan menulis simulasi matematika yang berjalan pada superkomputer. Mereka memiliki CLI yang jelek dan sebagian besar berfokus pada algoritma. Saat ini saya menulis dalam bahasa C # dan menghasilkan aplikasi GUI yang indah, tetapi akan hilang jika saya harus membuat sesuatu kaliber serupa pada bahasa asli. Bahkan dengan kerangka kerja seperti QT, masih akan memakan waktu dua kali lebih lama untuk menghasilkan sesuatu di C ++ / QT daripada di C #.
Setiap kali saya melihat seseorang yang telah menulis aplikasi GUI skala besar dengan fitur lengkap di C / C ++, saya tidak bisa menahan perasaan kagum dan sedikit cemburu.
Saya ingin tahu bagaimana coders berpengalaman lainnya melihat bahasa yang dikelola dan tidak dikelola. Apakah Anda melihat kode terkelola sebagai amatir-ish ? Apakah Anda melihat coders asli sebagai lebih hardcore ?
Sayangnya, Microsoft telah mengarahkan kita untuk mengonfigurasi "Managed Code" dengan Perpustakaan kelas C # /. Net.
Ada dua hal yang terpisah dan hampir tidak berhubungan yang berperan di sini.
Pustaka .Net keren.
Kode yang dikelola.
C # menawarkan keduanya dalam paket yang rapi, didukung, mudah digunakan dengan satu harga.
C ++ memiliki banyak pustaka keren yang melakukan hampir semua yang dilakukan Net. Daripada menyalahkan kode "asli C ++" sebagai yang memiliki lebih banyak "kompleksitas, keanehan, dan keanehan" daripada kode C # /. Net, Anda bisa mencari perpustakaan C ++ yang lebih baik.
Perpustakaan yang lebih baik memungkinkan Anda untuk menulis kode C ++ yang bagus.
Kebijakan yang buruk. Sebagai gantinya Anda harus mencari tahu perpustakaan definisi kelas apa yang mereka gunakan. Anda juga bisa menggunakan perpustakaan itu.
Ini semua tentang alat. Tanpa alat, kita hanya binatang di celana.
"Native C ++" tidak berarti Anda harus membuang semua alat Anda. Itu berarti Anda harus menemukan alat yang bagus. Microsoft tidak lagi membantu Anda, jadi Anda perlu menghabiskan waktu mencari campuran alat yang tepat.
sumber
Masalahnya di sini bukan tentang pemrograman hardcore atau semacamnya, ini tentang kontrol. Faktanya adalah bahwa C # menawarkan produktivitas dengan biaya kontrol. Jika Anda sedang menulis sebuah program yang membutuhkan kontrol dalam jumlah besar (memori ini sedang tidak dialokasikan tepat sekarang), maka Anda tidak punya pilihan selain menggunakan C ++. Jika Anda harus menyelesaikannya dengan cepat, maka Anda mungkin perlu menggunakan C #. Masalahnya adalah bahwa pustaka pendukung untuk C # jauh lebih baik dan lebih baru daripada yang disediakan untuk C ++. Sebagai contoh, MFC sangat, sangat tua dan praktiknya diketahui mengerikan, kebanyakan ditulis jauh sebelum Standardisasi. Jika Microsoft berupaya menyediakan pustaka C ++ baru, misalnya, periksa PPL baru di Visual Studio 2010, maka anehnya, tugas itu menjadi mudah di C ++. Dan saya pikir mereka bermigrasi seperti itu,
Saya telah mendengar banyak pendukung bahasa yang berhasil mengatakan ini, tetapi saya sebenarnya tidak pernah benar-benar melihatnya. Faktanya adalah bahwa instruksi CPU baru yang tersedia di CPU yang lebih baru tidak menawarkan banyak keuntungan kecuali jika Anda melakukan matematika yang sangat hardcore, dalam hal ini Anda tidak mampu membayar overhead karena harus mengkompilasi atau menafsirkannya saat dijalankan -waktu dan Anda bisa menggunakan kompiler C ++ Intel untuk menggunakan SSE terbaru dan terhebat. Ruang lingkup optimisasi kompiler C ++ sangat besar dibandingkan dengan apa yang dapat dilakukan JIT, karena JIT harus mengeksekusi dalam waktu yang singkat ketika program sedang berjalan, sedangkan kompiler C ++ cukup legendaris untuk mengambil waktu manis mereka untuk dikompilasi.
Pengumpulan sampah bukanlah sesuatu yang hebat secara ajaib atau semacamnya - ini adalah pilihan algoritme. Apakah ini sesuai untuk semua situasi? Tidak jauh-jauh melihat kekacauan IDisposable di C # dan bagaimana Java bahkan tidak repot-repot untuk mencoba dengan masalah itu, sedangkan destruktor C ++ akan menutup file Anda dan membebaskan memori Anda dan menutup soket Anda, dll. GC sangat bagus untuk beberapa program , dan tidak untuk beberapa orang lain.
sumber
String foo,bar;
pernyataanfoo=bar;
akan menjalankan dua instruksi - beban register dan toko register. Waktu eksekusi konstan terlepas dari panjang string. Bisakah C ++ mendekati?Menurut pendapat saya asli C / C ++, membandingkan dengan C #, sepertinya assembler ke C / C ++ itu sendiri. Lapisan abstraksi kompleks lainnya (tidak benar benar, tetapi katakanlah demikian) seperti biasa, memberi Anda pengembangan yang lebih mudah, tetapi sedikit pengurangan dalam kecepatan dan penggunaan memori yang berlebihan. Jadi, seperti yang saya lihat, itu hanya terbagi ke kategori yang berbeda, sehingga menciptakan subtipe baru dari programmer.
Namun untuk tingkat abstraksi C # sangat cepat, microsoft melakukan pekerjaan yang sangat baik.
sumber
Ada programmer amatir, bukan bahasa amatir. Bahasa mereka memiliki semua (well, sebagian besar dari mereka setidaknya) tujuan mereka.
Saat ini saya bekerja bersama pada mesin penghitung asuransi yang digunakan untuk menguji sistem produksi. Sistem produksi dibuat di C, mesin kami dilakukan di Jawa dan sejak waktu yang lama kami mengungguli mesin C, pada saat yang sama jauh lebih produktif. Bukan karena Java per se lebih cepat dari C, itu hanya cukup cepat dan algoritma kami lebih baik, kami telah mengimplementasikannya dengan lebih mudah, kami bisa lebih cepat dan lebih baik menguji dan memperbaiki kode kami.
Saya juga menulis kode pengujian untuk membandingkan hasil perhitungan dengan konten basis data produksi: bukan di C, bukan di Jawa tetapi di Ruby. Sekali lagi, ini cukup cepat dan membutuhkan lebih sedikit kode sehingga lebih mudah diimplementasikan, lebih mudah untuk diuji, lebih mudah untuk diperluas.
Dan saya tidak merasa amatiran apa pun bahasa yang saya gunakan, saya merasa seperti itu hanya jika saya membuat bug bodoh yang seharusnya tidak terjadi.
sumber
Tahun lalu perusahaan tempat saya bekerja adalah rekayasa balik kode CRC komunikasi dengan brute force (akhirnya kami mendapatkannya). 3 Pengembang masing-masing memiliki versi di sana sendiri, Borland C, C # .Net 2008, VB6. VB6 jelas lambat, Borland C cepat tetapi C # .net hanya mencambuknya dengan kecepatan 12 kali lipat. Bukan itu yang kami harapkan sama sekali.
sumber
Itu tergantung pada campuran hal-hal, tetapi pada dasarnya, semuanya sama, ya, kode asli lebih "hardcore" daripada kode yang dikelola.
Saya kira itu biasanya hal yang buruk, untuk aplikasi bisnis normal, karena itu berarti rata-rata pengembang harus memasukkan lebih banyak energi mental ke dalam aspek non-bisnis dari kode mereka.
sumber
Program saya adalah apa yang bisa digambarkan sebagai C ++ seperti Java. Pendapat saya adalah Anda dapat mencapai pemrograman tingkat rendah yang sama di Jawa, tetapi jauh lebih sulit daripada pemrograman tingkat rendah di C ++. Namun, Anda biasanya memerlukan pemrograman tingkat rendah ini dalam sebagian kecil dari kode Anda dan jika tidak diperlukan bahasa yang dikelola lebih produktif.
sumber
Pengembang asli biasanya mendapatkan reputasi sebagai lebih hardcore karena mereka merasa lebih hardcore dan bertindak seperti itu. Pengembang asli dilatih dalam sistem yang tidak toleran terhadap kesalahan karena mereka pasti menyebabkan crash keras atau kebocoran memori yang tidak terbatas. Secara khusus, .NET memungkinkan peretasan malas seperti menempatkan mencoba / menangkap segala sesuatu, menyelamatkan pengembang dari berpikir mereka harus memahami masalah inti (" kadang-kadang, itu hanya melempar InvalidOperationException. Saya tidak bisa menjelaskannya, mari kita tangkap semuanya. Ini kode sangat penting! "). Ini sama sekali bukan hitam dan putih, tetapi pengamatan saya telah tumbuh di dunia yang tidak dikelola dan sekarang bekerja dalam kode yang dikelola penuh waktu.
Selain itu, pengembang yang dikelola juga cenderung memiliki akses ke BCL yang jauh lebih bersih dan lebih terorganisir. Ini sering mendorong mereka untuk mengeksplorasi apa yang sebenarnya terjadi di balik selimut. Benar, hal yang sama dapat dikatakan untuk, katakanlah, STL atau Boost, tetapi perpustakaan kelas .NET sering cukup baik untuk membuat kita malas secara intelektual.
Yang mengatakan, menulis program yang dikelola baik shippable membutuhkan banyak pekerjaan. Itu berarti melakukan memori dan pembuatan profil CPU, pengujian unit, dan analisis kode dengan cara yang sama seperti yang dilakukan pengembang yang tidak dikelola. Pengembang yang tidak dikelola cenderung memahami hal ini, dan pengembang yang dikelola cenderung memasukkan lebih banyak dari mereka yang tidak.
Sekali lagi, bukan hitam dan putih. Ada banyak pengembang tidak terkelola yang malas secara intelektual dan pengembang yang dikelola dengan keras. Baik secara definisi lebih elit daripada yang lain.
sumber
Ada kesenjangan antara dua dunia, dan saya tidak bisa melihat mengapa: sistem yang dikelola ada di suatu tempat yang ditulis dalam kode asli (sebagai final, semuanya berjalan "dalam perakitan"). Apa yang ingin saya lihat (belum dalam hidup saya) adalah sistem membangun aplikasi, di mana semua sub-tugas dari aplikasi akan ditulis dalam jenis bahasa yang tepat.
sumber
Kode asli menjadi lebih mudah sejak Go dirilis. Saya merasa lebih mudah untuk membaca dan menulis daripada Java dan C #. Meskipun pemrograman GUI dengan Go, seperti yang sekarang, tidak terlalu baik (saya melihat opsi-opsi).
Cobalah untuk tidak menghakimi karena kurangnya komunitas yang besar dan berbagai perpustakaan dibandingkan dengan C # (misalnya), karena masih dianggap baru.
sumber