Menurut Anda, bahasa apa yang memungkinkan programmer rata-rata menampilkan fitur dengan jumlah bug yang paling sulit ditemukan? Ini tentu saja, pertanyaan yang sangat luas, dan saya tertarik pada jawaban dan kebijaksanaan yang sangat luas dan umum.
Secara pribadi saya menemukan bahwa saya menghabiskan sedikit waktu mencari bug aneh di program Java dan C #, sedangkan kode C ++ memiliki set bug berulang yang berbeda, dan Python / serupa memiliki set bug umum dan konyol yang akan dideteksi oleh kompiler dalam bahasa lain.
Juga saya merasa sulit untuk mempertimbangkan bahasa fungsional dalam hal ini, karena saya belum pernah melihat program besar dan kompleks yang ditulis dalam kode yang sepenuhnya fungsional. Masukan Anda.
Sunting: Klarifikasi yang sepenuhnya arbitrer terhadap bug yang sulit ditemukan: Membutuhkan lebih dari 15 menit untuk mereproduksi, atau lebih dari 1 jam untuk menemukan penyebab dan perbaikan.
Maafkan saya jika ini adalah duplikat, tetapi saya tidak menemukan apa pun pada topik khusus ini.
sumber
Jawaban:
Semakin kuat jenis sistem bahasa, semakin banyak bug akan ditangkap pada waktu kompilasi itu sendiri.
Gambar berikut membandingkan beberapa bahasa pemrograman yang terkenal dalam hal kekuatan, kesederhanaan, dan keamanan sistem tipenya. [ Sumber ]
* Anjak kemampuan untuk menggunakan konstruksi yang tidak aman.
sumber
(let ((itbe '())) ... )
...Menurut pendapat saya, Haskell membantu Anda menghindari beberapa sumber kesalahan:
null
bukan bagian dari definisi tipe nilai: dengan ini Anda menghindari kesalahan miliar dolarsumber
null
, adaundefined
, yang merupakan anggota dari setiap jenis.)Secara tradisional, bug yang paling sulit ditemukan adalah kondisi ras dalam aplikasi multi-utas sebagaimana adanya
Karenanya, Anda membutuhkan bahasa yang mengatur parallisme untuk Anda sebanyak dan sesederhana mungkin. Ini belum umum. Java melakukan beberapa, tetapi meninggalkan Anda dengan bagian yang sulit.
Untuk pemahaman saya, Anda memerlukan bahasa fungsional karena "tidak ada efek samping" adalah hal yang pada awalnya membuat dua poin peluru hilang. Saya telah melihat bahwa pekerjaan sedang berlangsung secara transparan menjadikan Haskell bahasa multi-utas yang efisien, dan saya percaya Fortress dirancang dari bawah ke atas untuk menjadi bahasa paralel yang efisien.
Sunting: Di Jawa,
Executors
menangani lebih banyak lagi bagian yang sulit. Anda perlu membuat tugas individu sesuai denganCallable
antarmuka.sumber
Ada dirancang sedemikian rupa sehingga sebanyak mungkin ditangkap pada waktu kompilasi daripada pada saat dijalankan. Apa artinya ini adalah bahwa sering dibutuhkan sekitar 10x lebih lama untuk mendapatkan program di Ada untuk dikompilasi daripada yang setara di Jawa katakan, tetapi ketika itu mengkompilasi Anda bisa jauh lebih yakin bahwa seluruh kelas bug tidak akan memanifestasikan diri ketika program itu Lari.
sumber
Pertama definisi: bug yang sulit ditemukan, seperti yang saya mengerti, adalah bug yang dapat direproduksi tetapi penyebabnya sulit ditemukan.
Mungkin aspek yang paling penting adalah apa yang saya sebut sempit , yaitu seberapa jauh bug dapat lolos, seberapa besar cakupan bug yang berpotensi memengaruhi. Dalam bahasa seperti C, bug, misalnya indeks array negatif atau pointer tidak diinisialisasi, dapat memengaruhi semua hal di seluruh program, sehingga dalam kasus terburuk, Anda harus memeriksa semuanya di mana saja untuk menemukan sumber masalah Anda.
Bahasa yang baik dalam hal itu mendukung pengubah akses dan menegakkannya dengan cara yang membuatnya sulit atau tidak mungkin untuk melewati mereka. Bahasa yang baik mendorong Anda untuk membatasi ruang lingkup variabel Anda, alih-alih membuatnya terlalu mudah untuk memiliki variabel global (mis. "Segala sesuatu yang tidak dinyatakan secara eksplisit adalah variabel global dengan jenis dan nilai default").
Aspek penting kedua adalah konkurensi . Kondisi ras umumnya sulit direproduksi dan karenanya sulit ditemukan. Bahasa yang baik menawarkan mekanisme sinkronisasi yang mudah digunakan, dan lib standar mereka aman jika diperlukan.
Ini sudah melengkapi daftar saya; hal-hal lain seperti pengetikan yang kuat membantu menangkap bug pada waktu kompilasi, tetapi bug itu mungkin tidak akan sulit ditemukan nanti.
Mempertimbangkan semua itu, saya akan mengatakan bahwa Java dan C #, dan banyak bahasa lain di dunia JVM dan .net, cocok untuk menghindari bug yang sulit ditemukan.
sumber
Karena Excel adalah DSL yang paling banyak digunakan, saya akan menggunakan Excel. (tidak termasuk VBA tentu saja)
Ini sesuai dengan tagihan:
sumber
123
atauABC
) atau fungsi (=SUM(A2:A5)
). Excel kemudian mengevaluasi semua variabel, mencari tahu urutan apa untuk menyelesaikan dependensi, dll. Ini tentu saja bukan hanya data.Ini adalah pertanyaan yang sulit karena sebagian besar bug bukan kesalahan bahasa itu sendiri - melainkan kesalahan pengembang yang membuat kesalahan dalam cara mereka menggunakan bahasa itu.
Saya percaya ada beberapa aspek fitur bahasa yang memengaruhi kemungkinan bug:
Interaktivitas - bahasa dinamis dengan REPL mendorong interaksi / eksperimen dengan program yang sedang berjalan dan siklus kode / tes yang jauh lebih kecil. Jika Anda percaya bahwa iterasi adalah cara yang baik untuk menemukan solusi sederhana yang bersih dan mendeteksi / menghilangkan bug maka ini akan cenderung mendukung bahasa interaktif.
Ekspresivitas - jika kode lebih pendek dan memiliki kompleksitas boilerplate / insidental lebih sedikit maka lebih mudah untuk melihat bug / kesalahan logika.
Jenis keamanan - semakin banyak kompilasi memeriksa waktu, semakin banyak bug akan ditangkap oleh kompiler sehingga pada umumnya keamanan jenis adalah hal yang baik. Namun ini biasanya tidak sulit untuk menemukan bug - bahkan dalam bahasa yang sepenuhnya dinamis jenis yang salah dalam struktur data biasanya akan menyebabkan kesalahan runtime yang sangat jelas, dan TDD hampir selalu mengambil bug semacam ini.
Kekekalan - banyak bug keras disebabkan oleh interaksi kompleks dari keadaan yang bisa berubah. Bahasa-bahasa yang menekankan kekekalan (Haskell, Clojure, Erlang) memiliki keuntungan yang sangat besar dengan menghindari mutabilitas
Pemrograman fungsional - pendekatan fungsional untuk menulis kode cenderung lebih "terbukti benar" daripada kode berorientasi objek dengan urutan efek / interaksi yang kompleks. Pengalaman saya adalah bahwa FP membantu menghindari bug yang rumit - Saya percaya ada beberapa penelitian akademik di suatu tempat yang saat ini saya tidak dapat menemukan yang mendukung hal ini.
Dukungan konkurensi - masalah konkurensi sangat sulit dideteksi dan didebug yang merupakan alasan mengapa hal ini sangat penting. Apa pun yang membutuhkan penguncian manual pada akhirnya akan gagal (dan ini mencakup hampir semua pendekatan berorientasi objek untuk konkurensi). Bahasa terbaik yang saya tahu dalam hal ini adalah Clojure - ia memiliki pendekatan unik untuk mengelola konkurensi yang menggabungkan memori transaksional perangkat lunak dengan struktur data yang tidak berubah untuk mendapatkan kerangka kerja konkurensi yang baru, andal, dan dapat dikomposisikan. Lihat http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey untuk wawasan lebih lanjut
sumber
Bahasa yang kurang kuat adalah, semakin sedikit pilihan yang diberikan untuk menembak kaki Anda sendiri.
Bahasa tingkat tinggi seperti Java dan C # akan menghasilkan lebih sedikit bug daripada bahasa tingkat rendah seperti C ++.
Karena itu saya percaya Java lebih aman daripada C #. Java secara artifisial terbatas sehingga programmer rata-rata tanpa pengetahuan lanjutan dapat menguasainya dan menghasilkan program yang stabil.
sumber
Menurut saya, Delphi. Berbasiskan pada Pascal, bahasanya sederhana dan intuitif bagi programmer rata-rata (atau bahkan coders yang tidak berpengalaman) untuk mengambilnya dengan mudah, dan alat yang kaya dan dukungan perpustakaan membuat sebagian besar bug mudah ditemukan.
if (alert = RED) {LaunchNukes;}
, tidak akan dikompilasi, misalnya.)sumber
var I: Integer; Pointer(I)^ := $00;
Satu hal yang harus diperhatikan adalah pergantian waktu.
Selama lima tahun terakhir, saya terutama mengembangkan aplikasi web di java (JSF, Seam, dll.). Baru-baru ini saya mendapat pekerjaan baru, dan kami menggunakan Perl (dengan Catalyst dan Moose).
Saya jauh lebih produktif di Perl, daripada di Jawa.
Tidak perlu mengkompilasi dan menyebarkan (panas), adalah salah satu alasannya. Saya juga menemukan bahwa penulisan use case lebih mudah, karena dapat dilakukan dengan cara yang lebih iteratif. Dan kerangka kerja di Jawa tampaknya tidak perlu rumit, setidaknya untuk proyek-proyek yang pernah saya ikuti.
Saya kira jumlah bug dalam kode Perl saya kurang lebih sama dengan jumlah bug dalam kode Java saya, bahkan mungkin lebih tinggi. Tapi, saya menemukan lebih mudah dan lebih cepat untuk menemukan dan memperbaiki bug ini.
sumber
Mungkin mensurvei jumlah alat yang tersedia untuk analisis kode statis dan dinamis untuk setiap bahasa pemrograman dapat memberikan ide. Semakin banyak alat untuk bahasa, semakin besar kemungkinan bahasanya sangat populer di kalangan pengguna atau sangat populer dalam menghasilkan bug yang sulit ditemukan. Tapi saya tidak bisa mengarahkan Google ke studi apa pun yang dibuat tentang hal ini. Perlu juga dicatat bahwa beberapa bahasa seperti C dapat digunakan untuk mengatasi bug perangkat keras yang mendasarinya serta mengatasi masalah keausan perangkat keras seiring bertambahnya usia.
sumber
Alih-alih berbicara tentang bahasa, bagaimana dengan berbicara tentang fitur-fitur bahasa
sumber