Titik koma opsional

10

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)?

Aber Kled
sumber
1
Anda perlu memikirkan terminator pernyataan (perl, c), dan pembatas pernyataan (javascript, pascal).
5
Dengan Python, titik koma dapat digunakan untuk memisahkan beberapa pernyataan pada baris yang sama. Dan karena pernyataan "kosong" diperbolehkan, titik koma dapat digunakan di akhir sebagian besar pernyataan.
Greg Hewgill
1
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.
Izkata
1
@MichaelT: Saya tidak berpikir klasifikasi Anda benar: Perl bisa dibilang milik kedua kelompok, dan JavaScript sebenarnya di kamp "pernyataan terminator" (karena implementasi diperlukan untuk menyimpulkan tanda titik koma sebelum }atau pada akhir file).
ruakh
Ya, sangat tergantung pada bahasanya. Dugaan pribadi saya adalah bahwa titik koma hanyalah semacam konvensi yang disepakati bersama, yang diikuti oleh sebagian besar perancang bahasa. Setidaknya masuk akal dari sudut pandang bahasa yang lebih alami. Sama dengan {dan} untuk blok, omong-omong: mereka digunakan oleh banyak bahasa, namun tidak semua dan Anda sebenarnya tidak harus melakukan ini. Tidak ada alasan universal di balik ini.
JensG

Jawaban:

24

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.

Robert Harvey
sumber
7
@RobertHarvey Bidat! Seharusnya ada satu, cara yang jelas untuk melakukannya dan hanya satu. Kebetulan, hanya ada satu cara untuk melakukannya di perl.
1
BTW - beberapa bahasa memiliki cukup banyak redundansi dalam tata bahasa pada umumnya, sehingga membuat tanda titik koma hanya kadang-kadang ambigu dalam praktiknya. Yang mengatakan, saya pikir titik koma adalah sedikit redundansi yang salah untuk dijatuhkan - Saya cukup suka Haskell di mana Anda menjatuhkan parens dan koma sebagai argumen. OK, Anda dapat menjatuhkan titik koma juga di Haskell, tetapi itu tidak benar-benar sama dengan Javascript.
Steve314
2
Masalahnya adalah IIRC tidak cocok dengan model formal tetapi generator parser tidak menghasilkan pesan kesalahan yang baik. Yaitu mereka memiliki pengetahuan terbatas tentang kesalahan umum sementara parser tulisan tangan bisa mendapatkan pesan kesalahan yang jauh lebih berguna. Gcc misalnya digunakan untuk menggunakan bison untuk tata bahasa C. Demikian pula masalahnya adalah bahwa 'kasus tepi' bukan kasus tepi formal tetapi yang lunak - yaitu untuk parser AST jelas dan untuk manusia AST 'jelas' tetapi mereka tidak setuju seperti apa AST itu.
Maciej Piechotka
2
@ Maciej Piechotka - Saya tidak bermaksud mengatakan bahwa parens adalah opsional di Haskell. Saya berbicara tentang menjatuhkan sesuatu yang berlebihan sebagai keputusan desain bahasa. Intinya adalah bahwa Anda tidak menggunakan parens atau koma untuk panggilan fungsi di Haskell. Anda bisa melewatkan tuple sebagai argumen, tetapi itu masih sintaksis untuk tuple, bukan untuk meneruskan argumen. Haskell (dan ML dan lainnya) "menjatuhkan" parens dan koma untuk argumen fungsi dalam arti bahwa ada konvensi umum ini dalam bahasa lain (sejak Algol?), Tetapi Haskell tidak melakukan itu.
Steve314
1
@Maciej Piechotka - Tentu saja itu tidak pernah benar-benar sebuah konvensi universal - hanya karena bahasa keluarga Algol yang melakukannya bukan berarti bahasa lain mendefinisikan diri mereka relatif terhadap hal itu, jadi klaim "menjatuhkan" saya salah dalam pengertian itu - tetapi dengan semua bahasa C-family hari ini rasanya agak seperti itu.
Steve314
15

JavaScript telah menunjukkan kepada kita bahwa ini adalah ide yang sangat buruk. Sebagai contoh:

return
0;

Di C, ini mengembalikan nilai 0. Dalam JavaScript, ini mengembalikan undefinedkarena 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.

Mason Wheeler
sumber
1
@delnan: Python tidak dirancang agar terlihat seperti C. Ini dikenal sebagai berbasis lekukan dan dengan demikian sangat berorientasi garis, dan itu tidak memerlukan titik koma. JavaScript secara teknis memang membutuhkannya; itu memasukkan satu ketika menemukan satu yang hilang, yang mengubah apa yang tampak seperti satu pernyataan yang valid secara sintaksis menjadi dua pernyataan berbeda dengan semantik yang sama sekali berbeda.
Mason Wheeler
7
Itu bukan ide yang buruk, itu hanya membingungkan bagi orang yang mencoba menggunakan JavaScript tanpa repot-repot belajar tentang penyisipan titik koma otomatisnya . Mungkin alih-alih mengatakan "ini adalah ide yang sangat buruk" Anda bisa lebih akurat mengatakan "membuat titik koma opsional memperkenalkan jebakan bagi programmer yang tidak keluar dan mempelajari semua detail".
TehShrike
4
@delnan: Alasannya mengejutkan adalah bahwa JavaScript biasanya tidak menyisipkan titik koma di akhir baris, kecuali untuk memperbaiki program yang dinyatakan tidak valid. After returnadalah 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.)
ruakh
6
@TehShrike: Membuat titik koma opsional memperkenalkan jebakan untuk semua programmer, karena itu secara sewenang-wenang mengartikan kesalahan ketik alih-alih menanyakan apa yang Anda maksudkan. Semua orang membuat kesalahan ketik sekarang dan kemudian.
Jan Hudec
1
javascript telah menunjukkan bahwa penerapan titik koma opsionalnya cacat. Itu tidak menunjukkan bahwa titik koma opsional buruk per-se.
CodesInChaos
4

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 whitespacetoken dan parser Anda bisa mengatasinya dengan baik.

Misalnya, coba masukkan titik koma ke dalam rangkaian pernyataan C. berikut ini.

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

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 membuat newline_or_semicolonnon-terminal.

Karl Bielefeldt
sumber
Ketika C awalnya dikembangkan pada awal 1970-an, terminator pernyataan diperlukan untuk menyederhanakan kompiler. Pada pertengahan 90-an, ketika Javascript dikembangkan, itu kurang menjadi perhatian.
Sean McSomething
3

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,

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

bayangkan Anda mengetik satu paren ekstra terbuka:

functionCall((3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

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.

functionCall((3, 4);  <- something is wrong here. emit error and keep going.
                      9 + (3 / 8); variable++; while(1) { printf("Hello, world\n"); }

Sekarang lebih mudah pada parser untuk melaporkan kesalahan, dan lebih mudah untuk menemukan baris / kolom di mana itu terjadi.

Mark Lakata
sumber
1
Fortran dan Basic setidaknya telah memilih penanda kelanjutan garis (dan dan _, masing-masing). Untuk semata-mata "" OMG, apa yang mereka pikirkan ", tidak ada yang mengalahkan FoxPro. Untuk melanjutkan garis, Anda menggunakan titik koma.
DougM
2

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:

--One statement per line
x = 1
y = 2

--Multiple statements per line
x = 1 y = 2

--You can add semicolons if you want but its just for clarity:
x = 1; y = 2
hugomg
sumber
0

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.

HeadphoneHaxZ
sumber