Definisi Gula Sintaksis yang Ketat? [Tutup]

9

Sepertinya dalam perang suci bahasa, orang terus-menerus merendahkan fitur apa pun yang mereka anggap tidak berguna sebagai "gula sintaksis saja". Garis antara "fitur nyata" dan "gula sintaksis" cenderung menjadi kabur dalam perdebatan ini. Apa yang Anda yakini adalah definisi yang wajar dan tidak ambigu tentang sintaksis gula yang menghindarinya didefinisikan sebagai fitur apa pun yang menurut pembicara / penulis bermanfaat?

dsimcha
sumber

Jawaban:

19

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 letsteno (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.

Hoa Long Tam
sumber
7

IMHO Saya tidak berpikir Anda dapat memiliki definisi untuk gula sintaksis, karena frasa ini BS dan kemungkinan akan digunakan oleh orang-orang yang berbicara tentang "programmer nyata" menggunakan "alat nyata" pada "sistem operasi nyata"

BS karena ide "fitur nyata" atau "gula sintaksis" seperti fallacy Skotman sejati . Karena frasa tersebut adalah "upaya ad hoc untuk mempertahankan pernyataan yang tidak beralasan". Pernyataan di sini adalah bahwa fitur di sini sepele karena Anda dapat menggunakan "fitur nyata" sebagai gantinya.

BS-nya karena beberapa berpendapat penggunaan gula harus dihindari karena Anda dapat menulis bug tetapi Anda harus tetap menggunakannya karena lebih sulit untuk menulis bug. Bukankah itu luar biasa. Ungkapan yang sama mengarah pada kesimpulan yang berlawanan persis menggunakan logika yang sama.

BS karena tidak ada yang mengutip studi kegunaan atau studi jumlah cacat, untuk mendukung keterbacaan atau pemeliharaannya atau kemungkinan argumen cacat.

Ini BS karena orang sering salah atau menjadi salah tentang kesetaraan. Sebagai contoh , pertanyaan ini menyatakan bahwa string C # adalah gula untuk array char. Mereka bukan .

Namun, jika Anda ingin mengatakan dua hal adalah gula jika mereka secara semantik setara dan itu membantu maju dan menentukan apa pun yang Anda inginkan.

Jika Anda ingin mengabaikan seseorang, Anda juga dapat menggunakan frasa tersebut.

Conrad Frix
sumber
2
"Jika kamu ingin mengabaikan seseorang, kamu juga bisa menggunakan frasa itu." - Seperti dalam: "Apakah Anda bertemu Barbara? Dia adalah gula sintaksis kami."
Molf
@molf. Itu sangat lucu. Saya kira saya maksud ide seseorang atau pekerjaan atau alat. Seperti: "Apakah Anda belum bertemu Barbara, dia pikir dia pembuat kode sungguhan tetapi dia menggunakan terlalu banyak gula." Atau "Barbra ahli dalam Bar ++ v8.0, tetapi 8.0 itu benar-benar hanya 7.0 dengan banyak gula."
Conrad Frix
7

Berikut adalah definisi yang sangat ketat untuk konsep terkait: ekspresif , oleh
Matthias Felleisen:

Tentang Kekuatan Ekspresif Bahasa Pemrograman [Catatan tambahan adalah satu-satunya bentuk gratis yang dapat saya temukan.]

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 letbentuk khusus daripada harus membuat fungsi anonim baru dan kemudian menerapkannya, yang akan melakukan hal yang sama. Tujuannya adalah untuk membuat kode lebih jelas.

Macneil
sumber
5
+1: gula sintaksis itu penting. Notasi aljabar modern hanyalah gula sintaksis untuk prosa Latin yang digantikannya, tetapi itu membuat perbedaan besar dalam kemampuan kita untuk bernalar secara matematis.
kevin cline
3

Saya pikir istilah sintaksis gula menunjukkan sintaks alternatif untuk mengekspresikan semantik dasar yang sama.

Ambil contoh bahasa pemrograman A yang memiliki operasi sumyang dapat menambahkan daftar bilangan bulat panjang sewenang-wenang. Dalam bahasa ini kita bisa menulis ungkapan

sum []
sum [3, 4, 5, 1]
sum [2, 7]

yang hasilnya adalah 0, 13, dan 9, masing-masing.

Sekarang, anggaplah kita menyadari bahwa 90% dari waktu yang kita gunakan sumdengan dua argumen, dan karena itu kami memperkenalkan, untuk kenyamanan, notasi baru

2 + 7

yang 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 sintaks

2 + 7

yang menambahkan angka seperti biasa.

Dalam konteks bahasa A, +notasi adalah gula sintaksis ( notasi alternatif, disederhanakan, dan ad-hoc yang dapat digunakan sebagai pengganti sum [...]notasi). Demikian pula, seperti yang telah ditunjukkan dalam jawaban Hoa Long Tam, dalam C notasi p->fieldadalah 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 notasi p->fieldtidak 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:

  • Semantik suatu program adalah apa yang dihitung oleh suatu program.
  • Kekuatan ekspresif bahasa pemrograman diwakili oleh perhitungan yang dapat dijelaskan dalam bahasa itu.
  • Dua bahasa pemrograman yang dapat menggambarkan semua fungsi yang dapat dihitung (sebagaimana didefinisikan menggunakan mesin Turing) memiliki kekuatan ekspresif yang sama ...
  • ... dan oleh karena itu hanya berbeda dalam sintaksis.
  • Akibat wajar: ekstensi apa pun dari bahasa lengkap Turing hanya sintaksis (gula sintaksis) karena Anda tidak mengubah kekuatan ekspresif bahasa tersebut.

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.

Giorgio
sumber
0

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.

Lorenzo Stella
sumber
0

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?

dsimcha
sumber
3
Overloading operator bukan gula sintaksis. Inilah yang memungkinkan C ++ memiliki templat yang berfungsi untuk tipe dasar (mis. Int) dan kelas saya sendiri.
Kate Gregory
@KateGregory: Jika seseorang menerima bahwa kelebihan fungsi bukan gula sintaksis, kelebihan operator mungkin dianggap sebagai gula sintaksis hanya dengan memanggil fungsi kelebihan muatan pada nilai yang ditunjukkan.
supercat
0

"Gula sintaksis" bukanlah istilah yang didefinisikan secara ketat. Bergantung pada siapa Anda bertanya, kemungkinan besar Anda akan mendapatkan salah satu dari definisi berikut:

  1. Tidak ada pendekatan orang Skotlandia sejati. Hal yang saya sukai adalah pemrograman nyata, dan hal yang saya tidak suka adalah gula sintaksis.
  2. Segala sesuatu setelah MIPS adalah gula sintaksis, dan bahkan beberapa dari instruksi itu mungkin tidak diperlukan.
  3. Apa pun yang membuat pemrograman lebih mudah bagi seseorang di suatu tempat berguna dan bukan gula sintaksis. Karena fitur tidak akan ditambahkan jika tidak ada yang merasa berguna dalam keadaan apa pun, maka setiap fitur yang ada bukanlah gula sintaksis. Fitur hipotetis mungkin gula sintaksis, sampai seseorang memutuskan bahwa fitur itu berguna bagi mereka.
Patrick87
sumber
-3

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".

cwchambers
sumber