Coded Managed vs Native Coders


19

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 ?

java  .net 

Jawaban:


26

Pekerjaan saya saat ini di C ++, tetapi saya telah memprogram dalam beberapa bahasa cukup lama sehingga saya hampir tidak melihat perbedaan lagi. Berikut pengamatan saya:

  • Banyak dugaan ketidakefisienan dengan bahasa lain sering diimplementasikan ulang oleh programmer C ++ sebagai praktik terbaik. Kami menambahkan cukup pemeriksaan nol, pemeriksaan batas array, pemeriksaan jenis, validasi input, dll. Untuk meniadakan sebagian besar keuntungan kecepatan eksekusi yang diperoleh oleh bahasa yang tidak secara otomatis melakukan hal-hal itu, setidaknya untuk kode yang tidak intensif pemrosesan data.
  • Pelat ekstra itu menjadi kebiasaan yang sudah mendarah daging setelah beberapa saat, sehingga tidak terasa seperti pekerjaan ekstra, dan menonjol seperti ibu jari yang sakit ketika hilang.
  • Ketika saya memprogram dalam bahasa "berhasil" saya masih berpikir tentang alokasi memori, sehingga untuk memastikan saya tidak membuat kebocoran memori. Saya mungkin tidak mengutarakan secara eksplisit delete, tetapi saya masih sadar di benak saya saat pengumpul sampah menganggapnya layak untuk dihapus. Saya memiliki lebih banyak kesulitan untuk menyelesaikan masalah memori rendah mulai di Jawa daripada yang pernah saya lakukan di C ++, mungkin karena di C ++ mereka jauh lebih sulit untuk diabaikan untuk waktu yang lama.
  • Hal yang sama berlaku untuk pengetikan dinamis. Saya masih harus melacak di kepala saya apakah parameter fungsi adalah array, atau int, atau string. Sebenarnya, itu membutuhkan lebih banyak upaya mental karena jenisnya tidak jelas terdaftar di sana untuk saya.
  • Gaya C ++ modern sangat berbeda dari era pra-C #. Daripada mengubah bahasa, orang "menemukan" cara menggunakan fitur C ++ yang ada dengan cara yang unik untuk menghindari banyak manajemen memori kasar di masa lalu. Pola desain yang membebaskan memori secara otomatis sudah sangat umum sekarang.
  • Sejauh yang saya tahu, meskipun memungkinkan untuk membuat aplikasi GUI dengan hanya menulis kode, desainer grafis seperti desainer QT adalah metode yang jauh lebih disukai, dengan kode sebagian besar hanya digunakan untuk event handler atau kustomisasi runtime.
  • Bahasa yang belum Anda gunakan secara luas dalam beberapa saat selalu merasa sedikit canggung, bahkan jika Anda kebanyakan mengingat sintaksisnya. Jika saya tidak menulis python selama setahun, ada banyak keanehan yang saya lupa, dan rasanya lebih canggung daripada C ++ untuk sementara waktu, meskipun secara obyektif kebanyakan orang menganggap python sebagai bahasa yang "lebih mudah".

Dengan kombinasi semua faktor itu, model mental saya tetap cukup konsisten antara ketika saya memprogram dalam bahasa C ++ dan lainnya, dan perbedaannya sebagian besar terasa hanya sintaksis. Memang, banyak yang merupakan hasil dari pelatihan, kebiasaan, standar pengkodean, dan pola desain modern daripada fitur intrinsik untuk bahasa C ++ itu sendiri, tetapi perbandingannya masih berlaku.

Saya kira apa yang saya coba katakan adalah bahwa dalam pengalaman saya, pelatihan programmer membuat jauh lebih banyak perbedaan daripada bahasa yang dia gunakan.


20

Apakah Anda melihat kode terkelola sebagai amatir-ish? Apakah Anda melihat coders asli sebagai lebih hardcore?

Tidak.

Saya melihat perbedaan antara seorang insinyur dan seorang programmer. The hardcore insinyur akan selalu memilih tumpukan bahasa / teknologi yang tepat untuk mendapatkan pekerjaan yang dilakukan dalam waktu paling sedikit pada standar runtime diterima.

Dengan kekuatan prosesor saat ini, frekuensi benar - benar harus mendapatkan sebanyak yang Anda bisa dari mesin dengan menggunakan level yang lebih rendah, bahasa asli semakin berkurang. Biasanya tidak ada kasus bisnis untuk itu. Produktivitas akan selalu melampaui perbedaan waktu beberapa milidetik.


+1 tetapi ingatlah bahwa ini adalah efek ekonomi - jika siklus perhitungan biaya $ 1 juta maka optimasi ekstrim akan memerintah - atau kita tidak akan repot-repot dengan komputer sama sekali ...
Gary Rowe

10
kecuali bahwa kami melihat kinerja yang lebih rendah secara keseluruhan - Word6 berjalan seperti penerangan pada perangkat keras modern, Word2010 hanya membutuhkan waktu satu menit untuk memuat. Hari ini kita membutuhkan perangkat keras supercepat untuk mengikuti programer!
gbjbaanb

2
@ gbjbaanb: Tidak peduli apa yang programmer pilih, basis kode yang cukup besar akan lambat. IIRC, Firman masih ditulis dalam C ++ (dan saya bersedia untuk bertaruh bahwa signifikan sebagian dari semua warisan Firman 6 kode masih ada).
Steven Evers

2
@ gbjbaanb, Word 2010 bukanlah penulisan ulang langsung dari Word 6 di .NET. Ia menambahkan lebih banyak fitur dan harus menangani lebih banyak skenario penggunaan. Ini aplikasi yang jauh lebih besar daripada Word 6.
Mircea Chirea

6

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.

  1. Pustaka .Net keren.

  2. 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.

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.

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.


Beri +1 untuk "cari tahu apa yang mereka gunakan", tapi terus terang saya pikir ini tidak terlalu bagus untuk hewan yang menggunakan alat, atau hewan yang kebetulan mengenakan celana pada kesempatan tertentu.
Ian Pugsley

@Ian Pugsley: Hewan yang memakai celana tetapi tidak menggunakan alat mungkin baik-baik saja dengan status mereka sebagai hewan. Tapi Anda benar bahwa hewan yang menggunakan alat tanpa celana mungkin menjadi kesal. Istri saya, misalnya, lebih suka tidak memakai celana, dan memang menggunakan alat. Mungkin dia tidak akan membaca pertanyaan ini.
S.Lott

Kami hanya bisa berharap (dan bertaruh pada peluang yang cukup tinggi). Yang saya katakan adalah saya tidak akan memandang rendah binatang yang cukup pintar untuk mengenakan celana ... untuk berjaga-jaga.
Ian Pugsley

Ya, tidak seperti perpustakaan standar C #, C ++ sudah tua dan tidak memiliki kebutuhan modern (GUI, antarmuka jaringan yang keren, dll).
Moshe Revah

Microsoft sekali lagi membantu Anda dengan C ++ di Windows 8 (seluruh permukaan pengembangan Windows 8 adalah kode asli, dan C ++ adalah warga negara kelas satu bersama dengan C # dan JavaScript): msdn.microsoft.com/en-us/library/windows/ apps / ...
Zach

5

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,

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.

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.


Ada lebih banyak perbedaan antara prosesor dari SIMD - meskipun kompiler C ++ Anda mungkin mempertimbangkan pipeline seperti halnya JIT Anda.
Peter Taylor

Lingkungan runtime di mana dimungkinkan untuk memeriksa status sistem dan mengidentifikasi setiap referensi objek tanpa pin yang dapat dijangkau dapat mengamortisasi banyak biaya terkait GC dengan cara yang tidak mungkin dilakukan dalam C ++. Dalam Java atau C #, diberikan String foo,bar;pernyataan foo=bar;akan menjalankan dua instruksi - beban register dan toko register. Waktu eksekusi konstan terlepas dari panjang string. Bisakah C ++ mendekati?
supercat

2

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.


2

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.


1

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.


1
Apakah mereka menggunakan algoritma yang sama selangkah demi selangkah? Mereka bisa menghitung output yang sama tetapi langkah-langkah matematika dasar yang digunakan untuk sampai pada output mungkin berbeda, dan kinerja ditentukan oleh jumlah mentah langkah-langkah dasar, yang pada gilirannya ditentukan dari bagaimana "formula" diuraikan menjadi mereka.
rwong

Kompiler C yang lebih lama mungkin tidak menggunakan instruksi prosesor terbaru (yaitu, SSE2 dan yang lebih baru)
GrandmasterB

1
Ketiga bahasa mengkompilasi ke kode asli yang dioptimalkan (VB6 / C ++ selama kompilasi, .NET selama JIT). Jadi Anda mungkin mengukur perbedaan antara programmer Anda dan bukan antara bahasa pemrograman.
nikie

@nikie JIT! = kompilasi. Dan kualitas kompiler berbeda. Saya telah melihat persis algoritma yang sama mengeksekusi lebih cepat ketika ditulis dalam C ++ (tidak ada panggilan API, hanya referensi array, loop dan aritmatika sederhana) daripada di Jawa, terlepas dari semua pembicaraan tentang JIT.
quant_dev

1
@quant_dev: Dalam pengalaman saya di sana adalah tidak ada peluru perak ;-) Pengalaman saya dengan NET JIT adalah bahwa perbedaan antara JIT dan MSVC ++ sangat kecil. Saya sangat meragukan 12x baik cara untuk kode yang sama.
nikie

1

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.


1

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.


1

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.


0

Apakah Anda melihat kode terkelola sebagai amatir-ish? Apakah Anda melihat coders asli sebagai lebih hardcore?

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.


Sistem pembuatan aplikasi seperti yang Anda gambarkan hanyalah bahasa pemrograman lain (dan semoga lebih baik).
David Thornley

Saya tidak terbiasa dengan .NET, tetapi AFAIK itu adalah sistem bahasa campuran, yang memiliki format yang dapat dieksekusi umum dijalankan oleh VM dan perpustakaan besar yang dapat digunakan dengan bahasa .NET. Sistem yang sama akan bagus di dunia asli / kompilasi. Platform-independen, tentu saja.
ern0

0

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.

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.