Haruskah bahasa pemrograman ketat atau longgar? [Tutup]


14

Dalam Python dan JavaScript, semi-titik dua adalah opsional.

Dalam PHP, tanda kutip di sekitar kunci-array adalah opsional ( $_GET[key]vs $_GET['key']), meskipun jika Anda menghilangkannya, pertama-tama akan mencari konstanta dengan nama itu. Ini juga memungkinkan 2 gaya berbeda untuk blok (kolon, atau dibatasi kurung).

Saya membuat bahasa pemrograman sekarang, dan saya mencoba memutuskan seberapa ketat saya harus membuatnya. Ada banyak kasus di mana karakter tambahan tidak benar-benar diperlukan dan dapat ditafsirkan secara ambigu karena prioritas, tetapi saya bertanya-tanya apakah saya harus tetap menegakkan mereka atau tidak untuk mendorong konsistensi.

Bagaimana menurut anda?


Oke, bahasa saya bukan bahasa pemrograman seperti bahasa templating yang mewah. Semacam persilangan antara template Haml dan Django . Dimaksudkan untuk digunakan dengan kerangka kerja C # saya, dan seharusnya sangat bisa dikembangkan.


22
Ini adalah topik untuk perang suci.

1
Pythonistas mencegah penggunaan titik koma. Terus terang, saya tidak yakin apakah itu diperlukan sama sekali - hanya untuk memungkinkan beberapa pernyataan per baris, yang dapat sepenuhnya dihindari tanpa penderitaan. Jadi ... Saya mendukung bahasa yang lebih ketat. Namun, terkadang Anda dapat menerapkan hal-hal di luar bahasa dengan alat analisis kode, seperti StyleCop.
Pekerjaan

1
Kutipan untuk kunci array PHP bukan opsional. Mereka berada di PHP2, tetapi kemudian konstanta versi yang ditentukan kemudian. Mereka tidak diizinkan dalam interpolasi string dasar "..$_GET[raw]..".
mario

1
@Ralph: aturannya sedikit lebih rumit. Benar untuk menulis "xx$_GET[raw]xx"- Jika Anda mulai menggunakan kurung kurawal, maka kuncinya harus dilampirkan "xx{$_GET['raw']}xx"dalam tanda kutip. Jika kurung kurawal digunakan maka parser PHP biasa memeriksanya dan sintaksis ketat berlaku. Hanya saja "$_GET[x]"kuncinya diperlakukan sebagai string mentah, dan itu juga aturan yang ketat, PHP akan mengurai kesalahan "$_GET['x']".
mario

2
@ Mario: Fakta bahwa kami bahkan memiliki percakapan ini berarti ada beberapa ambiguitas dan kebingungan dalam cara kunci array ditangani. Tampaknya di dalam string, tidak ambigu tetapi tidak konsisten (Anda tidak dapat menggunakan tanda kutip ketika sudah dalam string, kecuali jika Anda menggunakan kurung kurawal, maka Anda harus melakukannya, tetapi di luar Anda harus). Dan string luar, dalam "normal" PHP ... well, itu omong kosong aneh seperti itu.
mpen

Jawaban:


19

Berbagai jenis bahasa memiliki kegunaan yang berbeda, jadi jawaban untuk pertanyaan ini sangat tergantung pada apa yang akan Anda gunakan.

Sebagai contoh, Perl adalah bahasa yang sangat longgar, dan saya merasa sangat berguna untuk menulis skrip perbaikan cepat atau angka. Untuk proyek padat yang kokoh saya menggunakan C #.

Anda perlu mendapatkan keseimbangan yang tepat untuk penggunaan target. Semakin ketat, semakin lama Anda harus menghabiskan waktu menulis kode, tetapi Anda mendapatkan ketahanan yang lebih besar, usabilitas ulang, dan lebih mudah untuk mempertahankannya.


26

Apa yang saya cari dalam bahasa pemrograman (bukan bahasa scripting) adalah konsistensi dan pengetikan yang kuat.

Dalam bahasa pemrograman saat ini dimungkinkan untuk menghilangkan titik koma misalnya di tempat-tempat tertentu tanpa menjadi ambigu (ekspresi terakhir dalam satu {}blok adalah satu). Jika bahasa pemrograman memungkinkan Anda menghilangkan karakter dalam kasus ini, seorang programmer sekarang memiliki masalah tambahan; di atas sintaksis bahasa umum dia sekarang harus tahu dalam hal apa diizinkan juga untuk menghilangkan sebagian sintaksis.

Pengetahuan ekstra ini bukan masalah bagi programmer yang menulis kode, tetapi itu menjadi beban bagi siapa saja yang harus menafsirkan kode yang ada di kemudian hari (termasuk penulis asli setelah beberapa saat).

Contoh PHP Anda membuka kemungkinan bug halus dalam sebuah program ketika konstanta keyakan ditambahkan dalam konteks yang sama. Kompiler tidak memiliki cara untuk mengetahui bahwa itu bukan apa yang dimaksudkan, jadi masalahnya hanya menjadi jelas pada saat runtime daripada waktu kompilasi.


1
Setuju, Anda harus membatasi kemungkinan untuk pengembang: lebih banyak kemungkinan => perlu berpikir lebih banyak (harus saya lanjutkan dengan cara ini atau itu) => lebih sedikit waktu untuk melakukan pekerjaan yang sebenarnya
Kemoda

Saya gagal melihat apa yang ada hubungannya dengan tipe casting implisit yang berhubungan dengan sintaksis suatu bahasa.
dan_waterworth

5
Juga, ketika Anda membaca $_GET[key]Anda tidak tahu apa-apa. Anda akhirnya memahami keseluruhan proyek hanya untuk mengetahui apakah keykonstanta atau tidak. Hal seperti ini menghemat 0,5 detik penulisan dan membutuhkan 20 detik untuk membaca.
Moshe Revah

Jika bahasa Anda memberi Anda opsi tanpa perbedaan, gaya pengkodean - apakah dikodifikasi atau tidak - cenderung untuk dibakukan pada salah satu dari mereka ...
Deduplicator

11

Setiap tempat di mana ada beberapa ambiguitas, kompiler perlu memiliki beberapa cara untuk menebak apa yang sebenarnya dimaksud oleh programmer. Setiap kali ini terjadi, ada kemungkinan bahwa programmer benar-benar berarti sesuatu yang berbeda, tetapi tidak memiliki aturan ambiguitas resolusi.

Menulis kode yang benar secara logis sudah cukup sulit. Menambahkan ambiguitas sintaksis mungkin tampak "bersahabat" di permukaan, tetapi ini merupakan undangan terbuka untuk memperkenalkan bug baru yang tidak terduga, sulit di-debug ke dalam basis kode. Intinya, seketat mungkin.

Dari contoh Anda, Anda menyebutkan bahwa titik koma adalah opsional dalam Python dan JavaScript. Untuk Javascript, setidaknya, ini tidak sepenuhnya benar. Titik koma sama seperti yang disyaratkan dalam JS seperti dalam bahasa keluarga C lainnya. Tetapi parser JavaScript diperlukan oleh spesifikasi bahasa untuk menyisipkan titik koma yang hilang dalam kondisi tertentu. Ini secara luas dianggap sebagai hal yang sangat buruk karena cenderung membuat niat Anda salah dan mengacaukan kode Anda.


6

Jawaban untuk seberapa longgar Anda harus membuat bahasa Anda sama dengan jawaban dari pertanyaan yang dikatakan dalam aksen Texas "Seberapa beruntung perasaan Anda, punk?".


Saya tidak mengerti.
mpen

4
Upaya buruk saya pada sebuah lelucon adalah bahwa pengetikan dinamis dapat menggigit Anda saat sistem tumbuh lebih besar dan lebih besar, terutama ketika menambahkan pengembang yang tidak berpengalaman ke dalam campuran. Dalam pengalaman saya, sistem nilai apa pun cenderung tumbuh semakin besar dan semakin banyak pengembang yang mengembangkannya. Memiliki "Temukan semua penggunaan simbol" atau "Ubah nama semua" atau "Hapus Aman" atau "Temukan kesalahan dalam solusi", benar-benar tak ternilai. Pengetikan dinamis dalam arti terbatas bahwa VB terikat lambat dan melakukan pemaksaan tipe yang luas telah menyebabkan banyak bug pada saat ini.
Henrik

Ergo, jika Anda merasa beruntung dengan proyek Anda, misalnya beruntung memiliki pengembang yang baik dan berpengalaman, atau beruntung dalam hal menulis kode yang benar; Anda dapat menggunakan pengetikan dinamis.
Henrik

2
Ah ... tapi pertanyaan ini tidak pernah benar-benar tentang pengetikan dinamis :)
mpen

1
Ah, Raplh sangat benar. Saya hanya cenderung menganggap bahasa dinamis lebih longgar karena biasanya lebih longgar. Anda benar juga.
Henrik

4

Semua orang tidak perlu bekerja keras untuk konsistensi pengkodean jika bahasa tidak memiliki banyak variasi. Kami tidak suka jika pengguna membuat permintaan yang tidak perlu meningkatkan kompleksitas, jadi mengapa harus ditanyakan tentang bahasa pengembangan kami?


+1: Saya sepenuhnya setuju. Saya tidak mengerti mengapa prinsip-prinsip seperti KISS dan YAGNI tidak berlaku untuk desain bahasa.
Giorgio

2

Preferensi pribadi saya adalah kemampuan untuk memiliki keketatan yang cukup untuk menangkap kesalahan ketik saya, tetapi dengan pelat tambahan sesedikit mungkin. Saya berbicara tentang masalah ini di http://www.perlmonks.org/?node_id=755790 .

Yang mengatakan, Anda sedang merancang bahasa Anda untuk diri sendiri. Anda harus membuatnya menjadi apa pun yang Anda inginkan.


+1: ... Kemampuan untuk memiliki keketatan yang cukup untuk menangkap kesalahan pengetikan saya, tetapi dengan pelat tambahan sesedikit mungkin. - Iya. Apakah Anda terbiasa dengan rencana Anders Hejlsberg untuk C #? Dia membuat keputusan sadar untuk menekankan "esensi daripada upacara". channel9.msdn.com/Blogs/matthijs/…
Jim G.

@ jim-g: Terima kasih atas pemikirannya. Saya tidak terbiasa dengan banyak hal tentang C #. Saya belum pernah bekerja di dunia Microsoft selama bertahun-tahun.
btilly

1

Saya suka bahasa saya untuk melakukan apa yang saya maksud. Umumnya yang bersandar cukup keras menuju longgar. Saya juga ingin dapat menandai "ketat" pada elemen atau blok untuk dapat men-debug / menganalisis area terbatas itu.


1

Saya biasanya cenderung jatuh ke sisi "Apa yang akan membuatnya lebih mudah bagi saya sebagai seorang programmer". Tentu saja itu bisa berarti lebih dari satu hal. Di Javascript hampir tidak ada pengecekan tipe, yang berfungsi dengan baik sampai Anda menemukan bug aneh. Di sisi lain di Haskell ada banyak jenis pengecekan yang menempatkan lebih banyak pekerjaan di depan tetapi clobbers beberapa kelas bug.

Sejujurnya saya akan memeriksa banyak bahasa untuk melihat apa yang mereka lakukan dan mencoba untuk menemukan ceruk yang tidak ada satupun yang berhasil!

Saya tidak berpikir ada satu cara yang jelas benar untuk melakukannya, atau setidaknya jika tidak ada sesuatu yang orang telah menemukan konsensus. Jadi dengan menciptakan bahasa dengan sistem tipe yang berbeda, kami belajar.

Semoga berhasil.


1

Saya akan menyarankan bahwa bahasa pemrograman yang baik harus memiliki aturan yang ketat, implementasi mana yang diharapkan akan ditegakkan secara konsisten, tetapi aturan tersebut harus ditulis sedemikian rupa sehingga dapat membantu. Saya lebih lanjut menyarankan bahwa seseorang harus mempertimbangkan merancang bahasa untuk menghindari kasus-kasus di mana "jarak Hamming" antara dua program yang secara substansial berbeda hanya satu. Jelas seseorang tidak dapat mencapai hal seperti itu dengan numerik atau string literal (jika seorang programmer yang berarti 123 bukan tipe 1223 atau 13, kompiler tidak dapat mengetahui apa yang dimaksud dengan program tersebut). Di sisi lain, jika bahasa digunakan :=untuk penugasan dan ==untuk perbandingan kesetaraan, dan tidak menggunakan satu= untuk tujuan hukum apa pun, maka akan sangat mengurangi kemungkinan untuk penugasan yang tidak disengaja yang seharusnya menjadi perbandingan, dan perbandingan tidak melakukan apa-apa yang disengaja yang seharusnya menjadi penugasan.

Saya akan menyarankan bahwa sementara ada tempat-tempat yang berguna bagi penyusun untuk menyimpulkan hal-hal, kesimpulan seperti itu seringkali paling berharga dalam kasus-kasus yang paling sederhana, dan kurang berharga dalam kasus-kasus yang lebih rumit. Misalnya, memungkinkan penggantian:

  Kamus <rumitType1, rumitType2> item =
    Kamus baru <komplikasiType1, rumitType2 ()>;

dengan

  var item = Kamus baru <komplikasiType1, rumitType2 ()>;

tidak memerlukan jenis inferensi yang rumit, tetapi membuat kode jauh lebih mudah dibaca (antara lain, menggunakan sintaksis yang lebih banyak hanya dalam skenario di mana itu diperlukan, misalnya karena jenis lokasi penyimpanan tidak tepat sesuai dengan jenis ekspresi menciptakannya, akan membantu menarik perhatian ekstra ke tempat-tempat yang mungkin memerlukannya).

Satu kesulitan utama dalam mencoba inferensi tipe yang lebih canggih adalah bahwa situasi ambigu mungkin muncul; Saya akan menyarankan bahwa bahasa yang baik harus memungkinkan seorang programmer untuk memasukkan informasi ke kompiler dapat digunakan untuk menyelesaikan ambiguitas seperti itu (misalnya dengan menganggap beberapa typecast lebih disukai daripada yang lain), menentukan bahwa mereka tidak masalah (misalnya karena meskipun ada dua kemungkinan overload dapat mengeksekusi kode yang berbeda, programmer telah menunjukkan bahwa mereka harus berperilaku identik dalam kasus-kasus di mana salah satu dapat digunakan), atau menandai mereka (dan hanya mereka) yang tidak dapat ditangani dengan salah satu cara di atas.


1

Bagi saya, keterbacaan adalah yang paling penting.

Bagi seseorang yang berpengalaman dengan bahasa tersebut, makna sebuah fragmen kode harus jelas tanpa harus menganalisis konteksnya secara mendalam.

Bahasa harus mampu menandai kesalahan sesering mungkin. Jika setiap urutan karakter acak membuat program yang benar secara sintaksis, itu tidak membantu. Dan jika variabel secara otomatis dibuat pertama kali mereka digunakan, maka salah mengeja clientkarena cleinttidak akan memberi Anda kesalahan kompilasi.

Selain sintaks, bahasa harus memiliki semantik yang jelas, dan mungkin itu lebih sulit daripada memutuskan sintaksis yang layak ...

Contoh yang bagus:

  • Di Jawa, "1"adalah string, 1int, 1.0ganda, dan 1Lpanjang. Sekali lihat dan Anda tahu apa itu.

  • Di Jawa, =adalah tugas. Ini memberikan nilai untuk tipe primitif dan referensi untuk tipe referensi. Itu tidak pernah menyalin data yang kompleks atau membandingkan.

  • Di Jawa, memanggil metode membutuhkan tanda kurung dan cara ini jelas dibedakan dari variabel - jadi, jika tidak ada tanda kurung, Anda tidak perlu mencari definisi metode, itu hanya membaca data.

Contoh buruk:

  • Di Jawa, simbol seperti clientbisa hampir apa saja: elemen jalur paket, nama kelas atau antarmuka, nama kelas dalam, nama bidang, nama metode, variabel lokal, dan bahkan lebih. Terserah kepada pengguna untuk memperkenalkan atau mematuhi konvensi penamaan atau tidak.

  • Di Jawa, titik .terlalu banyak digunakan. Itu bisa menjadi pemisah dalam nama paket, pemisah antara paket dan kelas, pemisah antara kelas luar dan dalam, konektor antara instance instance dan metode yang akan dipanggil pada instance, dan banyak lagi.

  • Dalam banyak bahasa, kurung kurawal dari ifblok adalah opsional, yang mengarah ke kesalahan buruk jika seseorang menambahkan satu pernyataan lagi ke blok (tidak benar-benar ada).

  • Operator infiks: kadang-kadang saya harus berhenti pada ekspresi numerik dan berpikir keras apa artinya, langkah demi langkah. Kita semua terbiasa menulis ekspresi matematika dalam notasi infix like a * b / c * d + e. Sebagian besar waktu kita ingat diutamakan multiplikasi dan pembagian daripada penambahan dan pengurangan (tetapi apakah Anda menyadari bahwa kita tidak membaginya dengan c*d, tetapi membaginya hanya dengan cdan kemudian mengalikan dengan d?). Tetapi ada begitu banyak operator infiks tambahan dengan aturan prioritas mereka sendiri dan dalam beberapa bahasa kelebihan sehingga sulit untuk dilacak. Mungkin menegakkan penggunaan tanda kurung adalah pendekatan yang lebih baik ...


Anda sebagian besar berbicara tentang ambiguitas, tetapi mungkin ada banyak cara untuk melakukan hal yang sama tanpa menciptakan ambiguitas. Mungkin kita dapat memiliki dua operator perkalian, *dan ×. Keduanya 5*3dan 5 × 3 berarti hal yang sama, dan seorang programmer yang berpengalaman tahu persis apa artinya tanpa harus melihat-lihat konteks sekitarnya. Masalahnya, bagaimanapun, adalah bahwa sekarang ada dua cara untuk melakukan hal yang sama dan seseorang mungkin bertukar di antara mereka di seluruh program. Saya percaya ini adalah apa yang saya lebih perhatikan ketika saya mengajukan pertanyaan.
mpen

-2

Anda mungkin mempertimbangkan analogi dengan bahasa alami. Dalam email, apakah Anda seorang Tata Bahasa Nazi? Atau apakah Anda baik-baik saja dengan beberapa kesalahan tata bahasa, seperti membagi infinitif, konjungsi yang hilang, atau pengubah salah tempat. Jawabannya bermuara pada preferensi pribadi.

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.