Apa perbedaan antara "Sintaks" dan "Gula Sintaksis"


45

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!


9
Dalam jawaban saya terhadap pertanyaan yang dikutip, saya menjelaskan bahwa gula sintaksis adalah sintaksis alternatif (untuk beberapa sintaksis yang sudah ada dalam bahasa) yang membuatnya lebih mudah untuk mengekspresikan beberapa idiom umum tetapi tidak memperkenalkan semantik baru. Dalam pengertian ini, gula sintaksis bergantung pada konteks (pada bahasa yang digunakannya): notasi yang sama dapat berupa sintaksis normal dalam satu bahasa, dan gula sintaksis dalam bahasa lain. Apakah penjelasan ini membantu Anda?
Giorgio

7
Satu masalah adalah bahwa beberapa orang tampaknya berpikir "gula sintaksis" adalah kata yang kotor, padahal sebenarnya tidak. Setiap fungsi atau kelas yang Anda tambahkan ke sistem dapat dianggap "gula sintaksis", karena mereka membuat ide-ide yang jelas sudah dapat diekspresikan dalam bahasa sedikit (atau banyak) lebih mudah untuk diekspresikan.
Joris Timmermans

Tampaknya, itu penting bagimu.
SShaheen

11
Pada akhirnya, itu semua hanyalah gula sintaksis daripada listrik.
Anthony Pegram

Jawaban:


34

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 + rhspeta infiks lhs.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.


"Segera setelah Anda dapat mencapai fungsi itu, sintaks lain yang memungkinkan Anda melakukan hal yang sama dianggap gula.": Ini tidak cukup untuk memiliki gula sintaksis, karena dengan demikian program lain yang menghitung fungsi yang sama akan menjadi gula sintaksis . Program gula dan program gula harus memiliki semantik yang sama .
Giorgio

3
@Giorgio Bagaimana "kedua program ini menghitung fungsi yang sama" berbeda dari "kedua program ini memiliki semantik yang sama"? Selain itu, Anda berfokus pada program, bukan pada elemen sintaksis. Seluruh program tidak bisa menjadi gula sintaksis. Seorang operator, semacam pernyataan, dll. Dapat berupa gula sintaksis.

@Iorgio - Memang, saya sedang mempertimbangkan fungsi yang sama dengan semantik yang berbeda untuk fungsi yang berbeda. Dan ya, mungkin ada loncatan melompat seperti menulis kompiler Anda sendiri yang memiliki semantik yang sama dan menyebutnya "gula". Terus terang, definisi formal tidak akan terjadi untuk konsep informal semacam itu.
Telastyn

1
@Iorgio Sekali lagi, daging sapi saya tidak sesuai dengan pendapat Anda tentang kesetaraan, tetapi Anda mencoba dan menerapkan konsep gula sintaksis pada program. Istilah ini tidak merujuk ke seluruh program! Tergantung pada definisi Anda, itu hanya blok bangunan atom, atau hanya fragmen program pendek (yang pertama tampaknya mencakup> 80%, tapi saya tidak yakin bahwa itu mencakup segala sesuatu yang biasanya dianggap sebagai gula sintaksis).

3
@Giorgio Misalnya, seluruh program ;-) Atau sesuatu yang cukup besar yang kedua formulasi melibatkan beberapa kata kunci bahasa yang tidak terkait. Sesuatu yang saya tidak pernah diperlakukan sebagai gula sintaksis if (a) return blah; ...bertentangan result_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.

10

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

Gula sintaksis adalah bagian-bagian dari sintaks suatu bahasa yang efeknya didefinisikan dalam bentuk konstruksi sintaksis lain dalam bahasa.

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.


"Tidak ada cara untuk secara definitif mengatakan 'ini adalah gula sintaksis dan itu adalah sintaksis', karena gula sintaksis adalah bagian dari sintaksis suatu bahasa.": Salah. Ini adalah perancang bahasa yang memperkenalkan beberapa sintaksis sebagai gula sintaksis untuk beberapa konstruksi yang sudah ada dalam bahasa dan memiliki sintaksis. Gula sintaksis biasanya bersifat ad-hoc (kurang umum) tetapi lebih mudah dibaca / nyaman digunakan.
Giorgio

@Iorgio: Saya mengulangi paragraf pertama saya karena agak canggung. Tetapi saya tidak setuju bahwa gula sintaksis biasanya ditambahkan ad-hoc. Gula sintaksis yang paling banyak dikenal mungkin adalah ->operator C dan saya tidak melihat bagaimana operator itu kurang umum daripada yang lain.
Bart van Ingen Schenau

1
@Iorgio: Dalam hal ini, segala sesuatu yang tidak memetakan langsung ke instruksi perakitan tunggal harus dianggap sebagai gula sintaksis, karena itu selalu dapat dipecah menjadi potongan-potongan yang lebih sederhana (ini termasuk fungsi). Saya rasa Anda tidak akan menemukan banyak orang yang berbagi pandangan itu.
Bart van Ingen Schenau

1
"Ad-hoc" artinya digunakan dalam situasi khusus dan terbatas. Istilah ini tidak memiliki konotasi negatif secara umum. Istilah solusi ad-hoc memang memiliki konotasi negatif, karena orang biasanya menginginkan solusi umum, bukan solusi tertentu (untuk menghindari penyelesaian masalah yang sama berulang-ulang).
Giorgio

1
Karena "solusi ad-hoc" sering buruk, mungkin tampak bahwa "ad-hoc" itu sendiri berarti buruk. Tetapi ada juga "ad-hoc polymorphism" fungsi overloading AKA ( en.wikipedia.org/wiki/Ad_hoc_polymorphism ), yang tidak buruk. Setidaknya dalam bahasa Italia (bahasa ibu saya), penggunaan bahasa Latin "ad-hoc" tidak negatif dalam dirinya sendiri. Jika memang memiliki konotasi negatif dalam bahasa Inggris, maka maafkan ketidaktahuan saya.
Giorgio

6

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.


1
Saya juga sudah memikirkan perbandingan abstrak dengan sintaksis beton, tetapi saya tidak yakin bahwa ini selalu menjelaskan gula sintaksis. Misalnya, dalam C, diberi pointer pke struct yang berisi bidang x, melakukan ekspresi (*p).xdan p->xmemiliki sintaksis abstrak yang sama? Tapi saya pikir akan lebih baik jika semuanya dirubah menjadi sintaksis abstrak versus konkret.
Giorgio

@Giorgio sayangnya, saya tidak cukup tahu C untuk dengan yakin menyatakan apakah salah satu dari itu adalah gula sintaksis untuk yang lain, atau seperti apa bentuk pohon sintaksis abstrak mereka. Atau bahkan jika spec C benar-benar mendefinisikan sintaksis abstrak. :(

1
Ekspresi pertama dapat diurai sebagai pohon dengan .akar. Subnode kiri dari root adalah a *, dan anaknya adalah p. Subnode kanan dari root adalah x. Untuk ekspresi kedua, pohon sintaksis abstrak memiliki ->di root dan root memiliki dua anak pdan x. 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.
Giorgio

3
Saya tidak berpikir pohon parse ini, bahkan jika sering digambarkan sebagai AST, sama dengan sintaksis abstrak yang dibicarakan Matt. Kedua ekspresi memiliki tindakan yang sama ( konversi tipe pointer ke tipe referensi, lalu dapatkan referensi ke anggotax )
Useless

1
"Kedua ekspresi memiliki aksi yang sama (konversi tipe pointer ke tipe referensi, lalu dapatkan referensi ke anggota x)": Ini adalah semantik, bukan sintaksis abstrak. Sintaks abstrak merujuk pada meninggalkan detail sintaksis yang tidak berguna (seperti (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.
Giorgio

4

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.


Jawaban ini salah menghubungkan implementasi sintaks ke apakah itu gula atau tidak. Saya belum pernah melihat argumen = tentang apakah suatu elemen bahasa adalah "gula" atau tidak yang berkaitan dengan bagaimana elemen tersebut diimplementasikan. Ini murni tentang apakah itu menduplikasi elemen yang berbeda, lebih jelek, secara sintaksis.
GreenAsJade

3

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.


Pertimbangkan (1) "Aku harus pergi sekarang" versus (2) "Aku harus pergi sekarang": Apakah (1) gula sintaksis untuk (2)?
Giorgio

1
@Iorgio saya akan mengatakan tidak.
ozz

Karena keterbacaan ("harus" tidak lebih mudah dibaca daripada "seharusnya") atau karena maknanya ("harus" dan "harus" memiliki makna yang berbeda).
Giorgio

@Iorgio cukup adil :)
ozz

1
Ah saya mengerti :) lebih banyak firasat saya rasa, saya tidak berpikir satu lebih mudah dibaca daripada yang lain dalam contoh itu
ozz

3

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

do { f }            ~> f
do { g; h }         ~> g >> do h
do { x <- f; h }    ~> f >>= \x -> do h
do { let x = f; h } ~> let x = f in do h

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:

  1. Sintaks pada LHS lebih mudah bagi programmer (sintaksis gula) mengekspresikan ide-ide yang ada secara lebih jelas
  2. Namun karena dukungan dalam kompiler untuk konstruksi RHS sudah ada dalam kompiler, maka tidak perlu memperlakukannya sebagai sesuatu yang istimewa di luar parser dan desugaring (kecuali untuk pelaporan kesalahan).

Demikian pula dalam C Anda dapat membayangkan desugaring aturan penulisan ulang (karena operator kelebihan beban dll. Itu tidak benar untuk C ++):

f->h ~> (*f).h
f[h] ~> *(f + h)

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:

*f ~> f[0] -- * and [] have the same expressiveness 

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:

f1 = do x <- doSomething
        return x
f2 = doSomething

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.


3

Saya pikir contoh yang paling jelas adalah sintaks "+ =" dalam C.

i = i + 1;

dan

 i +=  1;

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 + 1sintaks.


+ = dapat berguna dalam kasus seperti a[f(x)] += 1.
Florian F

1

Pertama, saya akan membahas beberapa jawaban lain dengan contoh nyata. Rentang berbasis C ++ 11 untuk loop (seperti loop foreach dalam berbagai bahasa lain)

for (auto value : container) {
    do_something_with(value);
}

persis sama dengan (yaitu, versi bergula)

for (auto iterator = begin(container); iterator != end(container); ++iterator) {
    do_something_with(*iterator);
}

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 iteratortubuh 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:

for (auto iterator = begin(container); iterator <= end(container); ++iterator) {
    do_something_with(*iterator);
}

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:

Apakah ada perbedaan nyata antara Sintaks dan Gula Sintaksis?

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.

Kepada siapa itu penting?

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

Notasi [] memfasilitasi abstraksi ini.

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


Pertama Anda mengatakan "[rentang berdasarkan untuk loop] persis sama dengan (yaitu, versi bergula) [beberapa hal lain]". Tapi kemudian Anda mengatakan itu berbeda, karena melarang memodifikasi wadah selama traversal ... dan ada perbedaan lain yang membuatnya lebih dari sekadar transformasi sintaksis sederhana yang Anda gambarkan (misalnya perilaku ketika "wadah" bersifat sementara). Perbedaan-perbedaan ini menyiratkan bahwa itu bukan hanya gula sintaksis, bukan? Jadi menurut saya mungkin ini bukan contoh yang baik dari gula sintaksis.
Don Hatch

Saya tidak mengatakan itu setara dengan beberapa loop umum , saya mengatakan itu setara dengan loop tertentu yang diberikan. The spesifik loop tidak memodifikasi kontainer, dan merupakan idiom yang sangat umum - tapi Anda masih perlu membaca setiap lingkaran umum hati-hati untuk mengatakan apakah itu berikut bahwa idiom umum, atau jika sesuatu yang tidak biasa yang bersembunyi di tubuh loop. Loop yang lebih baru adalah gula untuk idiom umum itu , karena keduanya kurang bertele-tele dan berkomunikasi dengan lebih jelas idiom yang digunakan. Bukan, dan saya tidak pernah mengklaim itu, entah bagaimana gula untuk ide umum loop.
Useless

0

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:

Sintaks yang berlebihan dengan sintaksis lain yang lebih luas berlaku, untuk memberikan penopang bagi programmer yang tidak benar-benar mengerti bahasa.

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.


Saya pikir makna merendahkan istilah ("itu hanya gula sintaksis") berasal dari kenyataan bahwa gula sintaksis tidak menambahkan informasi apa pun.
Giorgio

1
Mungkin berasal dari gagasan bahwa sintaksis tidak menambahkan informasi apa pun , tetapi gagasan itu bukan fakta. Informasi tentang niat (misalnya, untuk menggunakan idiom terkenal) masih merupakan informasi.
berguna

@Useless: Dengan informasi yang saya maksudkan sebuah program berperilaku sama dengan atau tanpa gula sintaksis. Tentu saja bisa lebih mudah dibaca dengan gula sintaksis (ini menambahkan informasi / dokumentasi untuk pembaca) yang merupakan keuntungan.
Giorgio

Palsu. Gula sintaksis bukan bersifat merendahkan. Setiap programmer yang menghargai garamnya akan membuat perpustakaan yang merangkum dan menyederhanakan tugas yang lebih kompleks, daripada menyalin dan menempelkan kode yang sama di semua tempat. Ini mengarah pada kode yang berperilaku lebih baik, lebih dapat dikelola. Ini pada dasarnya adalah apa yang dicapai oleh sintaksis gula dengan mengabstraksi pola umum, meskipun kompleks, menjadi sintaksis yang lebih sederhana.
Craig

Saya mengatakan bahwa orang biasanya mengartikan istilah ini sebagai penghinaan, saya tidak mengomentari praktik yang mendasarinya itu sendiri. Mengucapkan kata "idiot" adalah sumpah serapah tidak berarti semua orang idiot. Ketika orang ingin berbicara tentang praktik secara positif, mereka biasanya menggunakan istilah seperti "abstraksi" atau "enkapsulasi."
Karl Bielefeldt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.