Saya saat ini bermain-main dengan ide memulai sebuah proyek yang jauh melebihi kemampuan pemrograman saya saat ini dalam bahasa yang saya miliki sangat sedikit pengalaman dunia nyata di (C). Apakah akan berharga untuk membuat prototipe dalam bahasa tingkat yang lebih tinggi yang lebih saya kenal (seperti Perl / Python / Ruby / C #) supaya saya bisa menjalankan desain secara keseluruhan?
Pada akhirnya, produk akhir adalah kinerja sensitif (ini adalah mesin basis data), maka pilihan C, tapi saya khawatir tidak tahu C dengan baik akan membuat saya kehilangan hutan untuk pohon-pohon.
Saat mencari pertanyaan serupa, saya perhatikan seorang rekan menyebutkan bahwa programmer dulu membuat prototipe di Prolog, lalu memutar engkolnya di assembler.
programming-languages
design
productivity
c
prototyping
Mark Canlas
sumber
sumber
Jawaban:
Menggunakan C tidak secara otomatis membuat aplikasi Anda lebih cepat. Ketika Anda memiliki kemampuan untuk memilih bahasa pemrograman yang berbeda untuk platform Anda, saya sangat merekomendasikannya.
Seperti yang dikatakan Bill Harlan :
Jika Anda benar-benar dapat memprediksi masalah kinerja, pertimbangkan untuk menggunakan C ++. kata cprogramming.com sangat baik :
Untuk lebih menjawab pertanyaan Anda yang sebenarnya: Saya akan menulis kode dalam bahasa tingkat yang lebih tinggi, bukan hanya membuat prototipe, dan hanya mengoptimalkan dalam bahasa tingkat yang lebih rendah ketika Anda mengalami masalah kinerja.
sumber
Tidak akan bernilai untuk melakukan itu, karena a) bagian-bagian dari bahasa-bahasa yang menerjemahkan langsung ke C tidak akan lebih sederhana, dan b) bagian-bagian yang tidak menerjemahkan langsung ke C akan lebih sulit untuk menulis ulang dalam C daripada jika Anda menulisnya dalam C di tempat pertama.
sumber
Ini bukan pertanyaan dengan jawaban ya atau tidak. Izinkan saya menimbang dengan anekdot.
Contoh 1
Saya ditugaskan untuk porting game yang ditulis dalam Java ke Flash, AS3. Di permukaan, ini memiliki potensi untuk berjalan relatif lancar. Bagaimanapun, Anda bisa menganggap pekerjaan seperti itu lebih jelas daripada pekerjaan rata-rata klien Anda, karena Anda sudah memiliki spesifikasi fungsional yang sepenuhnya dibangun dalam bentuk game sumber. Java dan AS 3 keduanya bahasa tingkat tinggi, dan AS3 memiliki banyak kesamaan dengan Java, seperti struktur paket, pewarisan tunggal / multi-antarmuka, pengetikan kuat (opt-in), dan gagasan variabel publik / dilindungi / pribadi dan deklarasi fungsi. Pada saat itu saya masih sangat hijau di Jawa, dan benar-benar baru dengan basis kode sumber asli. Jadi saya hanya menyelam untuk melihat apa yang bisa saya temukan dengan berharap itu akan cepat dan mudah.
Ternyata, pembuat kode telah berusaha untuk membuat mesin abstrak yang dapat dipindahkan dari Jawa ke beberapa lingkungan lain yang tidak ditentukan. Ini memberi saya harapan bahwa itu akan langsung ke port. Sayangnya, yang saya temukan adalah bahwa saya sedang melihat prospek menciptakan kembali Flash itu sendiri di atas Flash, tanpa manfaat dari Threads. Sebuah port literal, ternyata, adalah ide yang buruk ... mimpi buruk kinerja. Selain itu, game ini mengimplementasikan bahasa skrip eksternal eksternal kustomnya sendiri, yang berarti membuat parser dan lexer untuk bahasa itu jika saya berharap dapat menggunakan semua file data sumber asli.
Pada akhirnya, mengingat keterbatasan waktu dan anggaran, kode sumber asli tidak terlalu membantu. Bagian yang paling membantu tentang memilikinya adalah saya tahu bagaimana cara meniru dengan tepat alur kontrol dari logika permainan ... tetapi apakah saya benar-benar membutuhkan sumber asli untuk itu? Mungkin tidak.
Tetapi contoh itu mungkin tidak relevan karena ini semacam kebalikan dari situasi Anda. Saya berharap untuk menggunakan basis kode yang tidak saya tulis, dalam bahasa yang saya tidak tahu untuk mempercepat pengembangan di lingkungan yang saya sangat kenal. Jadi inilah contoh yang berbeda
Contoh 2
Memperhatikan apa yang dilakukan pengembang Java dalam mencoba membuat basis kode portabel, saya mulai melakukan sesuatu yang serupa untuk diri saya sendiri dalam pekerjaan Flash saya ... menulis kode yang tidak terlalu bergantung pada perluasan flash.display. * Kelas misalnya, misalnya, dan menggunakan komposisi untuk membuat tampilan. Tidak terlalu mengandalkan flash.event. * Dan malah menulis sistem passing pesan saya sendiri, tidak terikat terutama pada bahasa atau platform. Saya baru-baru ini menyelesaikan permainan menggunakan kerangka kata dan ingin melihat apakah akan mudah untuk porting ke C # (Bahasa yang saya tahu sebanyak itu mirip dengan Java dan AS3) sebagai proyek 3D Unity. Ternyata, ini jauh lebih sukses! Karena saya berpikir lebih lancar dalam AS3 daripada di C #, memiliki algoritma yang sudah ditulis menghemat waktu satu ton. Yang harus saya lakukan hanyalah mengubah sintaks, yang bukan
Jadi, hanya dalam pengalaman pribadi saya, saya tidak bisa mengatakan jawabannya selalu ya atau tidak. Anda harus memperhitungkan seberapa tergantung pada idiom bahasa tertentu Anda kebetulan berada dalam bahasa pilihan tingkat tinggi Anda, dan apakah menciptakan kembali itu akan mudah atau sulit di C.
sumber
Saya pikir akan sangat berharga untuk memulai dengan pseudocode. Menulis prototipe dalam bahasa lain sepertinya membuang-buang waktu, karena bahasa tingkat tinggi Anda tidak mungkin diterjemahkan ke 'C' hampir seperti halnya pseudocode.
Selain itu, dengan menggunakan pseudocode, Anda akan mengembangkan pemahaman yang lebih baik tentang bagaimana sebenarnya sistem Anda bekerja.
Selama periode waktu yang sama ketika Anda mengerjakan pseudocode, Anda harus mempelajari C. Kemudian, pada saat Anda selesai dengan perencanaan Anda, Anda mungkin siap untuk benar-benar mengimplementasikannya.
Karena alasan yang Anda usulkan untuk menulisnya dalam bahasa lain adalah untuk membantu agar desainnya berjalan, Anda mungkin ingin menggunakan beberapa diagram UML atau semacamnya untuk Anda mulai.
sumber
Anda dapat membuat prototipe algoritme - memperbaiki kesalahan desain logika inti, menggunakan bahasa yang pasti "sangat tinggi" (katakanlah, Matlab, mungkin Ruby). Gunakan untuk membuktikan bahwa algoritma Anda berfungsi, dan berfungsi dengan benar, lalu implementasikan dari awal dalam bahasa "tingkat rendah".
Anda tidak akan mendapatkan banyak jika Anda memilih C ++ atau bahkan Java atau C # sebagai "tingkat tinggi" dan C sebagai "tingkat rendah" karena keuntungan dalam keterbacaan tidak akan signifikan dan "terjemahan" akan tetap sangat menyakitkan dan cukup bug- Rentan. Idenya adalah intinya, mesin proyek Anda dalam implementasi tingkat tinggi tidak boleh menempati lebih dari satu atau dua layar, mudah dipahami, mudah dibaca, dan semua peringatan menjadi jelas menyakitkan - pada dasarnya, sebuah blok kerja, runnable diagram.
sumber
Mesin basis data kebanyakan menangani penanganan I / O tingkat rendah secara optimal dan menangani struktur kompleks seperti b-tree dan daftar terkait secara efisien.
Jadi ini jelas merupakan masalah C / C ++, walaupun ada beberapa implementasi Java yang cukup bagus di luar sana.
Mengembangkan algoritma yang benar yang berkinerja baik jauh lebih mudah dalam bahasa tingkat yang lebih tinggi. Ini biasanya kasus mencoba beberapa variasi dan membandingkan hasilnya. Anda kemudian bisa menerjemahkan algoritme "menang" menjadi C.
Solusi kompromi dapat dengan menulis implementasi awal di salah satu bahasa JVM tingkat yang lebih tinggi (Jython, Groovy datang ke pikiran) dan kemudian memindahkan kelas demi kelas ke Jawa ketika implementasi stabil.
sumber
Saya tidak berpikir itu biasa, tetapi sudah dilakukan. Salah satu arsitek paling tajam yang pernah bekerja dengan saya melakukan pemodelannya dengan Python dan kemudian mengimplementasikan kode itu dalam C ++.
Secara umum untuk membuat ini bermanfaat, saya pikir Anda benar-benar harus melakukan algoritma yang kompleks dan sangat dioptimalkan yang tidak mudah diungkapkan secara langsung dalam bahasa target. Untuk sebagian besar situasi "dunia nyata / bisnis", relatif mudah untuk mengekspresikan maksud tingkat tinggi dalam bahasa yang sama yang kita targetkan, dan implementasi dalam bahasa tersebut memenuhi persyaratan kinerja kita sehingga tidak perlu / keinginan untuk membuat model dalam bahasa yang lebih tinggi. bahasa tingkat
Mengingat situasi Anda, di mana Anda memiliki pengetahuan yang lebih baik tentang bahasa tingkat yang lebih tinggi, saya bisa melihat metodologi ini bekerja dengan baik dalam jangka pendek. Itu tidak hanya akan memberi Anda peta jalan untuk menjaga segala sesuatunya tetap berada di jalurnya, tetapi jika Anda memiliki pertanyaan, Anda akan dapat bertanya dengan lebih teliti.
sumber
Saat ini saya sedang mengerjakan proyek yang ditulis dalam C "karena kinerja" (ini adalah motivasi asli), tetapi memang jika diprofilkan itu mengungkapkan bahwa ia menghabiskan sebagian besar waktunya menunggu sistem lain (DB, aplikasi lain yang ditulis dalam Java, "acara" pada soket).
Jika Anda menggunakan algoritma yang salah Anda mendapatkan kinerja yang buruk di C juga (misalnya jika Anda melakukan pencarian linear untuk kunci, "karena C tidak memiliki tabel hash dan kami tidak ingin menggunakan perpustakaan lain", Anda menjadi lebih lambat daripada jika Anda lakukan dengan bahasa yang memiliki tabel hash atau sejenisnya seperti C ++, Java, C #, Python ... dan seterusnya).
Jika Anda dipaksa untuk melakukannya di C untuk alasan apa pun, maka prototyping dalam bahasa lain yang Anda tahu bagi saya bukan ide yang buruk hanya jika Anda prototipe mengetahui "masalah" mana yang akan Anda lakukan dalam implementasi C yang sebenarnya, itu sulit jika Anda tidak percaya diri dengan C. (Anda akan segera menemukan misalnya bahwa C / C std libs tidak memiliki wadah, hanya array "biasa"; Anda memerlukan pustaka non-std). Apalagi C bukan OO, jadi jika Anda membuat prototipe dengan gaya OO, itu akan lebih sulit.
Ringkasnya, hal terbaik yang harus dilakukan adalah melakukan implementasi aktual dalam bahasa "prototyping" Anda, dan kemudian, jika benar-benar diperlukan, tulis fungsi intensif CPU dalam C, tetapi jika hanya C yang dapat diterima, pelajari lebih baik sebelum melakukan prototipe dalam bahasa lain bahasa dan tentu saja sebelum menulis implementasinya.
sumber
Ada banyak aplikasi penting kinerja yang ditulis dalam bahasa tingkat yang lebih tinggi.
Saya telah memprogram di Assembler dan C di masa lalu, dan walaupun rasanya agak keren dekat dengan logam, penggunaannya sangat terbatas saat ini.
Ada begitu banyak hal yang akan menghambat kinerja, sehingga saya ragu Anda akan mencapai bagian di mana bahasa itu sendiri adalah faktor pembatas. Ini mengingat itu adalah C vs C #.
Misalnya Anda mendapatkan peningkatan kinerja 10% -15% berdasarkan bahasa. Ini tidak seberapa dibandingkan dengan peningkatan pesanan dalam mendapatkan algoritma yang benar diimplementasikan.
Ketika Anda memprogram dalam C #, Anda akan memiliki lebih banyak waktu untuk berkonsentrasi pada arsitektur dan implementasi algoritma / struktur data sehingga mengarah pada optimasi tingkat yang lebih tinggi.
Di dunia nyata Anda selalu dibatasi waktu, jadi habiskan waktu Anda di bagian kanan proyek.
sumber
Saya ingin tahu apa rencana Anda untuk benar-benar membuatnya di C? Apakah Anda akan prototipe dan kemudian belajar C, dan kemudian kembali kode dalam C? Bagi saya, ini agak mirip dengan pepatah "mata menjadi lebih besar daripada perut" yang saya pikir banyak programmer terjebak ketika belajar teknologi baru (saya tahu saya punya). Maksud saya adalah Anda mencoba mendesain sesuatu yang jelas-jelas sensitif terhadap kinerja tanpa mengetahui seluk beluk bahasa yang menurut Anda perlu ditulis, pada dasarnya Anda ingin sudah mulai merancang aplikasi C sebelum Anda tahu C kapan waktu lebih baik dihabiskan untuk belajar C dan kemudian Anda dapat memperoleh lebih banyak wawasan tentang cara menulis aplikasi yang Anda inginkan. Mungkin saya salah mengira pertanyaan dan Anda bermaksud menyerahkan ini ke programmer lain untuk membangun program di C,
sumber
Prototyping dilakukan, kadang-kadang, untuk mendapatkan pemahaman tentang masalah yang Anda coba selesaikan. Dan terkadang, untuk mengenal teknologi yang mendasari jika Anda belum terbiasa dengannya.
Untuk kasus yang disebutkan, Anda mempertimbangkan untuk membuat prototipe dalam bahasa scripting, katakanlah, python dan untuk membuat kode aktual dalam C.
Mengevaluasi beberapa kemungkinan:
1 . Anda membuat prototipe dengan python dan menulis perangkat lunak dalam C.
Prototyping dalam bahasa scripting dapat membantu di mana Anda ingin memeriksa output terhadap input dengan cepat . Ini berguna jika Anda terutama perlu menguji logika Anda untuk menyelesaikan masalah. Juga berguna jika Anda ingin cepat membuat demo untuk orang lain.
Kode apa pun yang Anda tulis dengan python tidak akan digunakan dalam perangkat lunak akhir. Tetapi, ini dapat membantu jika Anda memberikan prototipe kepada seseorang yang dapat membaca python dan menulis dalam C. Di sini, prototipe dapat membantu mengomunikasikan ide .
Metode ini sesuai untuk menguji kelayakan logis dari solusi.
2 . Anda membuat prototipe dalam C dan menulis perangkat lunak dalam C.
Prototyping dalam C, yang baru bagi Anda, memiliki dua keunggulan. Satu, saat Anda menulis prototipe, Anda bisa memahami bagian-bagian yang relevan dari bahasa , perpustakaan, API, perangkap, dll. Dua, saat Anda membangun perangkat lunak akhir, Anda dapat mulai dari prototipe itu sendiri yang menghemat waktu Anda dan menggunakan kembali kode .
Metode ini cocok untuk menguji kelayakan logis dan teknologi dari solusi.
3 . Anda dapat mempertimbangkan cara non-coding untuk membuat prototipe tergantung pada masalah yang dihadapi.
Jika itu sepotong logika dan ide yang ingin Anda prototipe; kode pseudo , diagram alur , dan blok diagram di atas kertas juga bagus.
Jika ini adalah prototipe UI, pertimbangkan beberapa alat mock-up UI atau kertas.
sumber
Saya pikir Anda harus membuat prototipe dalam bahasa yang Anda kenal (Pytho / Ruby / C # apa yang tidak) sehingga:
Kemudian, Anda dapat menggunakan alat profil untuk menemukan area leher botol. Implement ulang dalam C / C ++. Ulangi langkah di atas beberapa kali, siapa tahu prototipe Anda mungkin 'cukup cepat'!
sumber
Saya tidak berpikir Anda mendapatkan apa pun dengan pendekatan yang Anda jelaskan, dan beberapa orang telah menjelaskan alasannya secara mendetail.
Salah satu proyek yang saya telah terlibat, menggunakan pendekatan semacam ini: pengembangan perpustakaan matematika untuk arsitektur Cell / BE dan Power7. Fungsi-fungsi dimodelkan dalam Haskell (menggunakan CoCoNUT), dan fungsi output dalam perakitan yang dioptimalkan untuk arsitektur target tertentu.
Dalam hal ini tujuannya adalah kinerja tinggi dengan instruksi perakitan yang disesuaikan dan kemampuan untuk menargetkan beberapa arsitektur.
Makanan untuk meskipun, saya harap Anda tidak kelaparan :)
sumber
Untuk mesin basis data berkinerja tinggi, Anda mungkin perlu:
Algoritma yang Anda pilih sangat penting untuk kinerja.
Saran umum adalah mulai dengan bahasa tingkat tinggi, kemudian bermigrasi hanya bit yang perlu dioptimalkan ke bahasa tingkat rendah.
Namun , bahasa tingkat tinggi yang Anda pilih harus dapat mendukung algoritma yang Anda butuhkan untuk menulis: dan algoritma yang efisien di sini pada akhirnya mungkin didominasi oleh kontrol threading, penggunaan memori yang efisien, dan penggunaan operasi sistem file tingkat rendah terbaik. tersedia. Jadi, jika tujuan akhirnya adalah kinerja, Anda tidak dapat membuat prototipe dalam bahasa yang tidak mendukung primitif yang perlu Anda gunakan.
Jika Anda perlu menguji prototipe Anda (atau orang lain perlu mengembangkan perangkat lunak terhadap antarmuka-nya), Anda juga perlu bekerja dalam bahasa yang mendukung API yang dimaksud. Anda kemudian dapat mengizinkan orang lain untuk menguji kode mereka dan melakukan tes regresi Anda sendiri sambil mengoptimalkan.
Pertimbangan ini mungkin mengesampingkan banyak bahasa untuk prototipe tingkat tinggi dalam kasus ini - dan mungkin semua yang Anda sebutkan (kecuali mungkin C #). Tetapi Anda tentu saja dapat, pseudo-code dalam bahasa apa pun (termasuk bahasa Inggris) dan, jika perlu, Anda dapat membuat prototipe bagian-bagian proyek (misalnya mengurutkan fungsi) dalam bahasa pilihan Anda.
Hubungan yang erat antara C ++ dan C (dan perbedaan kinerja yang dapat diabaikan) berarti bahwa ada sangat sedikit alasan untuk tidak memilih C ++ daripada C dalam produk akhir.
(Saya menjawab dengan asumsi bahwa Anda memerlukan mesin database berkinerja tinggi untuk tujuan tertentu: jika niat Anda lebih sederhana maka mungkin Anda akan mengambil mesin yang ada dari rak).
sumber
Saya pikir ketenaran C sangat layak, karena produk Unix yang luar biasa ditulis dalam C. Namun, dibandingkan dengan orang yang tahu C terbaik, saya cukup skeptis tentang mengapa itu harus digunakan. Dikatakan bahwa Ken Thompson (setelah menulis versi pertama Unix dalam bahasa assembly) mulai menulis Unix dalam Fortran, tetapi menyerah setelah seminggu atau sebulan, dan mulai menggunakan C yang sedang dikembangkan oleh rekannya Ken Ritchie di waktu yang sama.
Saya terkejut membaca baru-baru ini bahwa Fortran lebih cepat daripada C dan C ++.
Richard Mullins
sumber