Bagaimana dengan ini: "gula sintaksis adalah istilah praktis untuk beberapa fungsi yang tidak memperkenalkan lapisan abstraksi yang berarti."
Ambil a->b
, yang, seperti yang Anda tunjukkan, setara dengan (*a).b
. Apakah notasi ini memungkinkan Anda untuk mempertimbangkan kode itu dengan cara apa pun yang berguna, atau tersembunyi? Tidak, jadi itu gula sintaksis.
Sekarang pertimbangkan a[i] == *(a + i)
. Pikirkan tentang setiap program C yang menggunakan array dengan cara substantif apa pun. Bisakah Anda bayangkan mencoba memahaminya tanpa []
notasi? Dengan array multidimensi? Penting untuk mempertimbangkan array sebagai unit keseluruhan, bukan sebagai referensi untuk awal blok memori yang berdekatan. Meskipun memang membantu untuk mengetahui bagaimana array bekerja di C jika Anda berencana melakukan hal-hal rumit dengan mereka, itu tidak produktif untuk selalu harus berpikir "Saya perlu menyimpan dua bit memori 2 * i byte di sebelah kanan lokasi memori yang dirujuk oleh a
. " Inti dari sebuah array adalah kemampuan untuk menghilangkan proses penyimpanan urutan sebagai unit yang koheren. The []
notasi memfasilitasi abstraksi ini. Ini bukan gula sintaksis.
Ini tidak berarti bahwa gula sintaksis selalu merupakan hal yang buruk. Seperti banyak aliterasi, ini telah menjadi julukan dan diadu dengan "fitur nyata." Tetapi LISP dan Skema, misalnya, tidak akan dapat dibaca jika bukan karena let
steno (dan lainnya).
Operator ternary <pred> ? <cnsq> : <alt>
,, adalah contoh lain. Gula sintaksis dapat membantu untuk mengatur program dan menghapus kode yang berlebihan, yang dapat menghemat dalam pemeliharaan di telepon. Gula sintaksis kadang-kadang lebih disukai daripada menumpuk di "fitur nyata" jika itu membantu menghilangkan hambatan sintaksis untuk pemrograman.
Mengutip R ^ 5RS , "Bahasa pemrograman harus dirancang bukan dengan menumpuk fitur di atas fitur, tetapi dengan menghilangkan kelemahan dan batasan yang membuat fitur tambahan tampak perlu." IMHO, sintaksis dapat dikualifikasikan sebagai kelemahan dan batasan sehingga membiarkan programmer menjauh dari sintaksis dapat meningkatkan ekspresifitas bahasa.
Berikut adalah definisi yang sangat ketat untuk konsep terkait: ekspresif , oleh
Matthias Felleisen:
Lihat juga entri ini pada bahasa dan penutupan Java .
Secara efektif, sesuatu adalah gula sintaksis jika dapat diubah menjadi bentuk tanpa sintaksis dengan hanya membuat perubahan lokal. Jika, misalnya, tanpa bentuk sintaksis, Anda perlu mengubah beberapa lokasi kode yang berbeda, atau memindahkan fragmen ke lokasi lain, maka itu bukan gula.
Yang mengatakan, gula sintaksis baik-baik saja jika digunakan dengan tepat. Saya pikir setiap programmer Skema lebih suka ada
let
bentuk khusus daripada harus membuat fungsi anonim baru dan kemudian menerapkannya, yang akan melakukan hal yang sama. Tujuannya adalah untuk membuat kode lebih jelas.sumber
Saya pikir istilah sintaksis gula menunjukkan sintaks alternatif untuk mengekspresikan semantik dasar yang sama.
Ambil contoh bahasa pemrograman A yang memiliki operasi
sum
yang dapat menambahkan daftar bilangan bulat panjang sewenang-wenang. Dalam bahasa ini kita bisa menulis ungkapanyang hasilnya adalah 0, 13, dan 9, masing-masing.
Sekarang, anggaplah kita menyadari bahwa 90% dari waktu yang kita gunakan
sum
dengan dua argumen, dan karena itu kami memperkenalkan, untuk kenyamanan, notasi baruyang hanya gula sintaksis untuk
sum [2, 7]
.Sekarang ambil bahasa kedua B yang tidak memiliki operasi penambahan apa pun. Kami mungkin memiliki operator seperti
<
,,=
memungkinkan kami untuk membandingkan angka, tetapi tidak ada cara untuk menambah angka. Dalam rilis 2 bahasa B, kami memperkenalkan operasi penambahan baru dengan sintaksyang menambahkan angka seperti biasa.
Dalam konteks bahasa A,
+
notasi adalah gula sintaksis ( notasi alternatif, disederhanakan, dan ad-hoc yang dapat digunakan sebagai penggantisum [...]
notasi). Demikian pula, seperti yang telah ditunjukkan dalam jawaban Hoa Long Tam, dalam C notasip->field
adalah gula sintaksis untuk(*p).field
.Dalam konteks bahasa B,
+
notasi tersebut bukan gula sintaksis (itu adalah satu-satunya sintaks yang valid yang digunakan untuk operasi penjumlahan). Demikian pula, jika C hanya bisa mengakses anggota struct melalui pointer dan jika tidak memiliki notasi(*p).field
, maka notasip->field
tidak akan menjadi gula sintaksis.Menurut pendapat saya, ada beberapa kesalahpahaman tentang gula sintaksis yang dapat ditelusuri kembali ke kebingungan tentang semantik bahasa pemrograman. Alasannya seperti ini:
Garis penalaran di atas mengarah pada pernyataan umum seperti "gula sintaksis tidak dapat didefinisikan dengan benar", itu adalah "masalah selera", atau "setiap fitur bahasa pemrograman, setelah semua, hanya gula sintaksis".
Saya pikir masalah utama dalam argumen di atas adalah bahwa semantik tidak hanya tentang apa yang dapat dihitung oleh suatu program, tetapi juga tentang bagaimana itu dihitung , yaitu apa konstruksi primitif yang digunakan dan bagaimana mereka digabungkan.
Jadi misalnya, objek bukan gula sintaksis untuk konfigurasi bit yang mendasari dan transformasi bit, mereka adalah konstruk yang memungkinkan untuk memodelkan data dan operasi dan untuk menggambarkan komputasi. Komputasi dengan objek, metode, pemanggilan metode, tidak sama dengan komputasi dengan byte, register prosesor, alamat memori (bahkan jika kedua komputasi memiliki hasil yang sama, dan bahkan jika komputasi kedua digunakan untuk mengimplementasikan yang pertama).
Saya membuat deskripsi ini agak lama tapi saya pikir ini adalah aspek penting yang belum saya lihat dalam jawaban lain.
Intinya: gula sintaksis adalah sintaks alternatif (mungkin lebih mudah) untuk konstruksi yang sudah dalam bahasa dan sudah memiliki sintaks dan semantik yang terdefinisi dengan baik. Sintaksis baru (gula sintaksis) berbeda dari yang ada tetapi memiliki semantik yang sama . Jika Anda memperkenalkan konstruksi baru dalam bahasa dan sintaksis baru untuk itu, maka Anda tidak memiliki gula sintaksis.
sumber
gula sintaksis adalah fitur yang tidak memperpanjang ekspresivitas bahasa itu sendiri, karenanya menjadi berlebihan dan kadang-kadang penyalahgunaan notasi, tetapi keduanya menyederhanakan kehidupan penulis dan memberi pembaca lebih banyak wawasan.
sumber
Untuk menjawab pertanyaan saya sendiri, sebuah fitur adalah gula sintaksis jika dan hanya jika itu dimasukkan terutama untuk meningkatkan estetika dan keterbacaan dan dapat diterjemahkan secara sepele dalam mode satu-ke-satu ke dalam versi de-sugared. (Secara kasar satu-ke-satu yang saya maksud modulo hal-hal sepele seperti urutan operasi komutatif, nama variabel dan spasi putih.)
Fitur apa pun yang hanya bisa dihapuskan dengan sejumlah besar disipliner programmer bukanlah gula sintaksis. Sebagai bagian dari ini, setiap fitur yang meningkatkan keamanan jenis bukanlah gula sintaksis, karena menegakkan keamanan jenis secara manual melalui disiplin programmer sangat tidak sepele. Sebagai contoh, sistem objek C ++ lebih dari gula sintaksis di atas polimorfisme cor penunjuk C.
Setiap fitur yang akan membutuhkan duplikasi kode yang signifikan atau desain ulang besar jika dihapus bukan gula sintaksis, karena tidak satu pun dari ini adalah tugas sepele. Sebagai contoh, template bukan hanya gula sintaksis karena mendapatkan fungsi yang setara tanpa mereka akan membutuhkan banyak klon-dan-modifikasi.
Contoh hal-hal yang bersifat sintaksis gula:
a[i]
dari pada*(a + i)
a -> b
dari pada(*a).b
foreach
sintaks bukannya mengetik secara manual sintaks iterator.Semua overloading operator adalah gula sintaksis murni.
Apakah ini terdengar seperti definisi yang adil dan tidak ambigu?
sumber
"Gula sintaksis" bukanlah istilah yang didefinisikan secara ketat. Bergantung pada siapa Anda bertanya, kemungkinan besar Anda akan mendapatkan salah satu dari definisi berikut:
sumber
Saya tidak yakin tentang bidang-bidang ilmu komputer, tetapi dengan bidang logika ada konsep konservatif dan eliminasi definisi [ 1 ] tampaknya berada di jalur yang sama.
Menerapkan korespondensi Curry-Howard, orang mungkin bisa datang dengan konsep paralel tentang "gula sintaksis".
sumber