Paling sering, dalam bahasa imperatif tujuan umum - tanda titik koma sebagai pembatas pernyataan diperlukan, atau sama sekali tidak diizinkan (misalnya C dan Python).
Namun, beberapa bahasa, seperti JavaScript, memungkinkan Anda memilih untuk tidak membatasi pernyataan Anda dengan tanda titik koma, demi pembatas lainnya (seperti baris baru).
Apa keputusan desain di balik ini? Saya mengerti bahwa titik koma sangat penting saat menulis beberapa pernyataan pada baris yang sama, tetapi apakah ada alasan lain untuk membuatnya wajib (kecuali mengikuti C)?
programming-languages
syntax
Aber Kled
sumber
sumber
I understand that semicolons are essential when writing multiple statements on the same line
- Tergantung pada bahasanya. Yang disukai saya tidak memiliki pembatas sama sekali, pernyataan berikutnya dimulai ketika semua argumen fungsi telah digunakan.}
atau pada akhir file).Jawaban:
Membuatnya wajib (atau melarangnya sama sekali) mengurangi jumlah kasing sudut, menghilangkan sumber potensial bug yang tidak jelas, dan menyederhanakan desain kompiler / juru bahasa.
Desainer bahasa yang telah memilih untuk menjadikannya opsional, memilih untuk hidup dengan ambiguitas dengan imbalan fleksibilitas sintaksis yang lebih besar.
sumber
JavaScript telah menunjukkan kepada kita bahwa ini adalah ide yang sangat buruk. Sebagai contoh:
Di C, ini mengembalikan nilai 0. Dalam JavaScript, ini mengembalikan
undefined
karena tanda titik koma dimasukkan setelah pernyataan pengembalian, dan itu tidak segera jelas mengapa kode Anda rusak kecuali Anda kebetulan tahu tentang detail penyisipan titik koma otomatis.sumber
return
adalah salah satu dari segelintir kasus di mana JavaScript akan menyisipkan titik koma bahkan jika program tersebut akan valid tanpa itu. (Tapi tentu saja, ini merongrong poin Mason Wheeler. Masalahnya bukan bahwa titik koma adalah opsional, melainkan bahwa aturannya tidak konsisten.)Ini menyederhanakan tata bahasa dan pengurai Anda untuk membuat titik koma wajib. Pada dasarnya, ini memungkinkan lexer untuk membuang semua spasi putih, termasuk baris baru, dan pengurai tidak perlu khawatir sama sekali.
Di sisi lain, begitu Anda mulai ingin memberi tahu parser tentang spasi putih, tidaklah sulit untuk membuat titik koma opsional. Anda bisa sering hanya menyatukannya dengan
whitespace
token dan parser Anda bisa mengatasinya dengan baik.Misalnya, coba masukkan titik koma ke dalam rangkaian pernyataan C. berikut ini.
Meskipun ada beberapa hal aneh yang tidak dapat Anda lakukan lagi, seperti
while(1);
, sebagian besar, itu relatif mudah dengan teknik penguraian modern untuk menentukan di mana pernyataan berakhir tanpa pembatas tertentu. Bahkan jika Anda masih ingin membiarkan hal-hal aneh, tidak sulit untuk membuatnewline_or_semicolon
non-terminal.sumber
Titik koma berguna dalam tata bahasa karena 2 alasan. Pertama, ini memungkinkan Anda membagi pernyataan panjang menjadi beberapa baris tanpa memiliki karakter kelanjutan yang luar biasa (saya berbicara tentang Anda, Fortran dan Basic). Kedua, mari kita parser memiliki cara untuk "menyerah" parsing ketika sintaks menjadi benar-benar berbelit-belit karena kesalahan ketik. Mencuri dari contoh Karl Bielefeldt,
bayangkan Anda mengetik satu paren ekstra terbuka:
sekarang dimana kesalahannya? Jika Anda memiliki titik koma, lebih mudah bagi parser untuk menyerah di titik koma pertama. Bahkan bisa melanjutkan penguraian setelah titik koma jika mau.
Sekarang lebih mudah pada parser untuk melaporkan kesalahan, dan lebih mudah untuk menemukan baris / kolom di mana itu terjadi.
sumber
Titik koma tidak selalu semua atau tidak sama sekali seperti yang Anda sebutkan dalam pertanyaan Anda. Sebagai contoh, tata bahasa Lua dirancang dengan hati-hati untuk menjadi bentuk bebas (semua spasi putih, termasuk baris baru, dapat diabaikan) tetapi juga tanpa perlu menggunakan titik koma. Misalnya, program-program berikut ini setara:
sumber
Terlepas dari semua desain dan konstruksi, saya percaya bahwa banyak programmer datang dari latar belakang yang berbeda dan beberapa belajar menggunakan semi-colon dan sebagian tidak. Banyak bahasa baru yang muncul tidak memerlukan semi-kolon tetapi masih memungkinkan untuk ada. Saya pikir itu mungkin hanya cara mendapatkan lebih banyak programmer untuk belajar bagaimana kode dalam bahasa-bahasa baru ini tanpa harus melepaskan kebiasaan mereka dari saat mereka mulai.
sumber