Latar Belakang
Halaman Wikipedia di Syntactic Sugar menyatakan:
Dalam ilmu komputer, gula sintaksis adalah sintaksis dalam bahasa pemrograman yang dirancang untuk membuat segala sesuatu lebih mudah dibaca atau diungkapkan. Itu membuat bahasa "lebih manis" untuk digunakan manusia: hal-hal dapat diekspresikan lebih jelas, lebih ringkas, atau dengan gaya alternatif yang mungkin disukai beberapa orang.
Saya tidak begitu mengerti apa perbedaan antara Gula Sintaksis dan Sintaksis.
Saya menghargai poin bahwa versi manis bisa lebih jelas, lebih ringkas, mungkin mendidih. Tapi saya merasa pada tingkat tertentu, semua sintaksis pada dasarnya melakukan itu untuk membentuk abstraksi atas apa kode dikompilasi ke bawah.
Dari halaman Wikipedia yang sama:
Pengolah bahasa, termasuk kompiler, penganalisa statis, dan sejenisnya, sering memperluas konstruksi bergula menjadi konstruksi yang lebih mendasar sebelum diproses, suatu proses yang kadang-kadang disebut "desugaring".
Sebagai latihan pemikiran, jika saya mengambil "sering" dalam pernyataan ini berarti "selalu": Jika perbedaannya hanya apakah kompiler "keinginan" sintaksis sebelum pindah ke tahap berikutnya, bagaimana mungkin seorang programmer yang tidak tahu jeroan dari kompiler tahu (atau peduli) apa itu Sintaks Gula atau tidak?
Pertanyaan yang sangat terkait di situs ini "Definisi Ketat Gula Sintaksis?" memiliki jawaban yang dimulai:
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"
Yang mungkin menunjukkan kepada saya bahwa mungkin tidak ada perbedaan besar bagi pembuat kode menggunakan bahasa? Mungkin perbedaannya hanya dapat dilihat oleh penulis kompiler? Meskipun mungkin ada contoh di mana itu membantu bagi pembuat kode menggunakan bahasa untuk mengetahui apa yang ada di balik tudung Gula Sintaksis? (Tapi mungkin dalam kenyataannya setiap wacana tentang subjek cenderung menggunakan istilah ini sebagai umpan api?)
Inti dari pertanyaan
Jadi ... versi singkat dari pertanyaan:
- Apakah ada perbedaan nyata antara Sintaks dan Gula Sintaksis?
- Kepada siapa itu penting?
Makanan Ekstra untuk Dipikirkan
Bonus pada kontradiksi topik:
Pada halaman Wikipedia diberikan contoh:
Misalnya, dalam bahasa C
a[i]
notasi adalah gula sintaksis untuk*(a + i)
Sedangkan jawaban lain pada pertanyaan terkait di atas berbicara tentang contoh yang sama:
Sekarang pertimbangkan
a[i] == *(a + i)
. Pikirkan tentang setiap program C yang menggunakan array dengan cara substantif apa pun.
Dan merangkum bahwa:
The
[]
notasi memfasilitasi abstraksi ini. Ini bukan gula sintaksis.
Kesimpulan sebaliknya untuk contoh yang sama!
sumber
Jawaban:
Perbedaan utama adalah bahwa sintaks adalah tata bahasa yang didefinisikan dalam bahasa untuk memungkinkan Anda mengekspos beberapa fungsionalitas. Segera setelah Anda bisa mendapatkan fungsionalitas itu, sintaks lain yang memungkinkan Anda melakukan hal yang sama dianggap gula. Itu tentu saja berjalan ke dalam skenario aneh tentang yang mana dari dua sintaksis adalah gula, terutama karena itu tidak selalu jelas yang datang lebih dulu.
Dalam praktiknya, gula sintaksis hanya digunakan untuk menggambarkan sintaks yang ditambahkan ke bahasa untuk memudahkan kemudahan penggunaan, seperti membuat
lhs + rhs
peta infikslhs.Add(rhs)
. Saya akan menganggap pengindeksan array C menjadi gula sintaksis.Itu penting terutama karena desain yang elegan cenderung membatasi jumlah duplikasi. Membutuhkan (atau setidaknya menginginkan) gula sintaksis dilihat oleh beberapa orang sebagai tanda kegagalan desain.
sumber
if (a) return blah; ...
bertentanganresult_type res; if (a) res = blah; else {...}; return res;
. Anda perlu mengasumsikan bahasa tertentu, dan mendapatkan sangat bahasa-pengacara-y (sering ke titik semantik operasional langkah kecil), untuk menemukan perbedaan antara program-program tersebut.Sintaks adalah apa yang digunakan oleh pengolah bahasa untuk memahami apa arti dari suatu bahasa. Konstruk yang dianggap sebagai gula sintaksis juga harus ditafsirkan oleh pengolah bahasa dan dengan demikian merupakan bagian dari sintaksis bahasa.
Apa yang membedakan gula sintaksis dari sintaksis bahasa lainnya adalah bahwa adalah mungkin untuk menghilangkan gula sintaksis dari bahasa tanpa mempengaruhi program yang dapat ditulis dalam bahasa tersebut.
Untuk memberikan definisi yang lebih formalistik, saya akan mengatakan
Ini sama sekali tidak dimaksudkan untuk merendahkan gula sintaksis, atau bahasa yang memilikinya, karena penggunaan gula sintaksis sering mengarah ke program yang maksudnya lebih dimengerti.
sumber
->
operator C dan saya tidak melihat bagaimana operator itu kurang umum daripada yang lain.Jawaban lain belum menyebutkan konsep utama: sintaksis abstrak ; tanpanya, istilah "gula sintaksis" tidak masuk akal.
Sintaksis abstrak mendefinisikan elemen-elemen dan struktur bahasa, dan bagaimana frasa-frasa bahasa itu dapat digabungkan untuk membangun frasa yang lebih besar. Sintaks abstrak tidak tergantung pada sintaksis konkret. Istilah "gula sintaksis", seperti yang saya mengerti, merujuk pada sintaksis konkret.
Secara umum, saat mendesain bahasa, Anda akan ingin membuat sintaksis konkret untuk setiap istilah sintaksis abstrak Anda, sehingga orang dapat menulis kode dalam bahasa Anda menggunakan teks biasa.
Sekarang katakanlah Anda membuat sintaks beton canggung untuk foo . Pengguna mengeluh, dan Anda menerapkan sintaksis konkret baru untuk mewakili sintaksis abstrak yang sama . Hasilnya adalah sintaksis abstrak dan semantik Anda tidak berubah, tetapi Anda sekarang memiliki dua sintaksis konkret untuk istilah sintaksis abstrak yang sama.
Ini, saya percaya, adalah apa yang orang maksud ketika mereka mengatakan "gula sintaksis" - perubahan yang hanya mempengaruhi sintaksis konkret, tetapi yang tidak mempengaruhi sintaksis abstrak atau semantik.
Dan perbedaan antara "sintaksis gula" dan "sintaksis konkret" sekarang jelas. Untuk saya. :)
Interpretasi ini juga membantu menjelaskan apa arti Alan Perlis ketika ia mengatakan "gula sintaksis menyebabkan kanker titik koma": semua gula sintaksis konkret di dunia tidak dapat memperbaiki sintaksis abstrak yang lemah, dan semua upaya yang Anda habiskan menambahkan bahwa gula adalah usaha Anda tidak menghabiskan berurusan dengan masalah nyata - sintaksis abstrak.
Saya juga harus mencatat bahwa ini hanya pendapat saya; Saya hanya percaya karena hanya interpretasi yang dapat saya pikirkan yang masuk akal bagi saya.
sumber
p
ke struct yang berisi bidangx
, melakukan ekspresi(*p).x
danp->x
memiliki sintaksis abstrak yang sama? Tapi saya pikir akan lebih baik jika semuanya dirubah menjadi sintaksis abstrak versus konkret..
akar. Subnode kiri dari root adalah a*
, dan anaknya adalahp
. Subnode kanan dari root adalahx
. Untuk ekspresi kedua, pohon sintaksis abstrak memiliki->
di root dan root memiliki dua anakp
danx
. Saya mencoba mencari tahu apakah masuk akal untuk mem-parsing kedua ekspresi secara berbeda sehingga mereka memiliki pohon sintaksis abstrak yang sama, tetapi saya tidak melihat bagaimana saat ini.x
)(
atau;
) untuk menghasilkan pohon yang mencerminkan struktur sebenarnya dari suatu program (lihat en.wikipedia.org/wiki/Abstract_syntax_tree ). Namun, dalam sintaksis abstrak tidak ada yang dikatakan (belum) tentang semantik program.Gula sintaksis adalah bagian dari sintaks bahasa. Ide dasarnya adalah bahwa ada lebih dari satu cara untuk mengatakan hal yang sama.
Apa yang membuat sulit untuk mengatakan potongan mana yang merupakan gula sintaksis dan potongan mana yang "sintaks murni" adalah pernyataan seperti "sulit untuk mengatakan bentuk mana yang didahulukan" atau "sulit untuk mengetahui ke arah mana penulis bahasa itu bermaksud" atau "itu agak arbitrer untuk memutuskan bentuk mana yang lebih sederhana ".
Apa yang membuatnya mudah untuk memutuskan bagian mana yang murni atau manis adalah untuk mengajukan pertanyaan dalam kerangka kompiler atau juru bahasa tertentu. Sintaksis murni adalah hal-hal yang dikompilasi langsung oleh kompiler ke kode mesin atau yang ditanggapi langsung oleh penerjemah. Gula adalah hal-hal yang pertama kali diubah menjadi beberapa hal sintaksis lainnya sebelum hal-hal langsung ini terjadi. Bergantung pada implementasinya, ini mungkin atau mungkin tidak sama dengan apa yang dimaksudkan oleh penulis atau bahkan apa yang dinyatakan oleh spesifikasi bahasa.
Dalam praktiknya, inilah cara realitas masalah diputuskan.
sumber
Sungguh, kutipan pertama Anda dari Wikipedia mengatakan itu semua "... membuat semuanya lebih mudah dibaca ...", ".... lebih manis bagi manusia untuk digunakan ....".
Secara tertulis, bentuk singkat seperti "jangan" atau "belum" bisa dianggap sebagai gula sintaksis.
sumber
Biasanya sintaksis gula adalah bagian dari bahasa yang dapat diekspresikan oleh bagian bahasa yang ada (sintaksis) tanpa kehilangan keumuman tetapi dengan kemungkinan hilangnya kejelasan. Terkadang kompiler memiliki langkah desugaring eksplisit yang mengubah AST yang dibuat oleh kode sumber dan menerapkan langkah-langkah sederhana untuk menghapus node yang berkaitan dengan gula.
Misalnya Haskell memiliki sintaksis gula untuk monad dengan aturan berikut diterapkan secara berulang
Saat ini tidak masalah apa artinya sebenarnya - namun Anda dapat melihat bahwa sintaks khusus pada LHS dapat diubah menjadi sesuatu yang lebih mendasar pada RHS (yaitu aplikasi fungsi, lambdas dan
let
's). Langkah-langkah ini memungkinkan untuk mempertahankan yang terbaik dari kedua dunia:Demikian pula dalam C Anda dapat membayangkan desugaring aturan penulisan ulang (karena operator kelebihan beban dll. Itu tidak benar untuk C ++):
Anda dapat membayangkan menulis semua program tanpa menggunakan
->
atau[]
dalam C yang menggunakan konstruksi ini hari ini. Namun akan lebih sulit bagi programmer untuk menggunakannya karena itu disediakan sintaksis gula (saya kira di 70-an itu mungkin disederhanakan bekerja untuk kompiler juga). Mungkin kurang jelas karena Anda dapat secara teknis menambahkan aturan penulisan ulang berikut yang sahih:Apakah sintaksinya buruk? Tidak harus - ada bahaya bahwa itu akan digunakan sebagai pemujaan kargo tanpa memahami makna yang lebih dalam. Misalnya fungsi berikut ini setara di Haskell namun banyak pemula akan menulis bentuk pertama tanpa memahami bahwa mereka terlalu banyak menggunakan sintaksis gula:
Selain itu, sintaksis gula mungkin memperumit bahasa atau terlalu sempit untuk memungkinkan kode idiomatis umum. Juga itu mungkin berarti bahwa bahasa tidak cukup kuat untuk melakukan hal-hal tertentu dengan mudah - mungkin dengan desain (jangan berikan pengembang alat tajam atau bahasa khusus yang sangat spesifik yang menambahkan konstruk yang lebih kuat akan melukai tujuan lain) atau dengan kelalaian - yang terakhir form memberikan sintaks gula nama yang buruk. Jika bahasanya cukup kuat untuk menggunakan konstruksi lain tanpa menambahkan gula sintaksis dianggap lebih elegan untuk menggunakannya.
sumber
Saya pikir contoh yang paling jelas adalah sintaks "+ =" dalam C.
dan
lakukan hal yang persis sama dan kompilasi untuk set instruksi mesin yang persis sama. Bentuk kedua menyimpan beberapa karakter mengetik, tetapi, yang lebih penting membuatnya sangat jelas bahwa Anda memodifikasi nilai berdasarkan nilai saat ini.
Saya akan mengutip operator pos / awalan "++" sebagai contoh kanonik tetapi menyadari bahwa ini lebih dari sekadar gula sintaksis. Tidak ada cara untuk mengekspresikan perbedaan antara ++ i dan i ++ dalam satu ekspresi menggunakan
i = i + 1
sintaks.sumber
a[f(x)] += 1
.Pertama, saya akan membahas beberapa jawaban lain dengan contoh nyata. Rentang berbasis C ++ 11 untuk loop (seperti loop foreach dalam berbagai bahasa lain)
persis sama dengan (yaitu, versi bergula)
Sekarang, meskipun tidak menambahkan sintaksis abstrak atau semantik baru ke bahasa, itu memang memiliki utilitas nyata.
Versi pertama membuat maksud (mengunjungi setiap item dalam wadah) eksplisit. Ini juga melarang perilaku yang tidak biasa seperti memodifikasi wadah selama traversal, atau memajukan
iterator
tubuh loop lebih lanjut , atau membuat kondisi loop salah. Ini menghindari kemungkinan sumber bug dan, dengan demikian, mengurangi kesulitan membaca dan menimbang tentang kode.Misalnya, kesalahan satu karakter di versi kedua:
memberikan kesalahan satu masa lalu dan perilaku yang tidak terdefinisi.
Jadi, versi gula bermanfaat justru karena lebih membatasi, dan dengan demikian lebih mudah untuk dipercaya & dimengerti.
Kedua, pertanyaan awal:
Tidak, "gula sintaksis" adalah sintaksis bahasa (konkret), dianggap "gula" karena tidak memperpanjang sintaksis abstrak atau fungsionalitas inti bahasa. Saya suka jawaban Matt Fenwick tentang ini.
Itu penting bagi pengguna bahasa, seperti halnya sintaksis lainnya, dan dalam hal itu gula disediakan untuk mendukung (dan dalam beberapa hal memberkati) idiom tertentu.
Akhirnya, pada pertanyaan bonus
ini terdengar sangat mirip dengan definisi gula sintaksis: ia mendukung (dan menyediakan berkat bagi penulis bahasa) menggunakan pointer sebagai array. The
p[i]
bentuk tidak benar-benar lebih ketat daripada*(p+i)
, sehingga satu-satunya perbedaan adalah komunikasi yang jelas dari niat (dan keuntungan mudah dibaca sedikit).sumber
Apa pun konotasi asli dari frasa itu, saat ini ia terutama bersifat merendahkan, hampir selalu diucapkan sebagai "hanya" atau "hanya" gula sintaksis. Cukup penting bagi programmer yang suka melakukan hal-hal dengan cara yang tidak dapat dibaca dan ingin cara yang ringkas untuk membenarkan hal itu kepada kolega mereka. Definisi oleh mereka yang terutama menggunakan istilah hari ini, dari sudut pandang mereka, akan menjadi sesuatu seperti:
Itu sebabnya Anda mendapatkan dua kesimpulan yang berlawanan untuk elemen sintaksis yang sama. Contoh pertama Anda tentang notasi array menggunakan makna positif asli dari istilah tersebut, sesuatu yang mirip dengan jawaban Bart. Contoh kedua Anda adalah membela notasi array terhadap tuduhan menjadi sintaksis gula dalam arti merendahkan. Dengan kata lain, ini berpendapat bahwa sintaksis adalah abstraksi yang berguna daripada kruk.
sumber