Sözdizimsel Şekerin Sıkı Tanımı? [kapalı]


9

Görünüşe göre dil kutsal savaşlarında, insanlar özellikle sadece sözdizimsel şeker olarak yararlı bulmadıkları herhangi bir özelliği sürekli olarak kötüleştiriyorlar. "Gerçek özellikler" ve "sözdizimsel şeker" arasındaki çizgi bu tartışmalarda bulanıklaşma eğilimindedir. Sözdizimsel şekerin, hoparlör / yazarın yararlı bulamadığı herhangi bir özellik olarak tanımlanmasını önleyen makul ve açık bir tanımı olduğuna inanıyorsunuz?

Yanıtlar:


19

Buna ne dersiniz: "sözdizimsel şeker, anlamlı bir soyutlama katmanı getirmeyen bazı işlevler için kolaylık kısayoludur."

Belirttiğiniz a->bgibi, buna eşdeğer olanı alın (*a).b. Bu gösterim, kodu herhangi bir yararlı, aksi takdirde gizli bir şekilde düşünmenize izin veriyor mu? Hayır, bu yüzden sözdizimsel şeker.

Şimdi düşünün a[i] == *(a + i). Dizileri herhangi bir şekilde kullanan herhangi bir C programını düşünün. []Notasyonu olmadan anlamaya çalıştığınızı hayal edebiliyor musunuz? Çok boyutlu dizilerle mi? Dizileri, bitişik bir bellek bloğunun başlangıcına referans olarak değil, tüm birimler olarak kabul etmek anlamlıdır. Onlarla karmaşık şeyler yapmayı planlıyorsanız, dizilerin C'de nasıl çalıştığını bilmek yardımcı olsa da, her zaman "2 hafızasının iki bitini saklamam gerekir." bellek konumu tarafından başvurulan a. " Bir dizinin bütün noktası, bir diziyi tutarlı bir birim olarak saklama sürecini soyutlama yeteneğidir. []Notasyonu bu soyutlama kolaylaştırır. O var değil sözdizimsel şeker.

Bu sözdizimsel şekerin her zaman kötü bir şey olduğu anlamına gelmez. Birçok alliterasyon gibi, bir epitet haline geldi ve "gerçek özelliklere" karşı çekildi. Ancak, örneğin LISP ve Şema, letstenografi (ve diğerleri) için olmasa bile okunamaz olacaktır .

Üçlü operatör, <pred> ? <cnsq> : <alt>başka bir örnektir. Sözdizimsel şeker, programların düzenlenmesine ve yedek kodun kaldırılmasına yardımcı olabilir, bu da bakımdan tasarruf sağlayabilir. Sözdizimsel şeker bazen programlamadaki sözdizimsel engellerin kaldırılmasına yardımcı oluyorsa "gerçek özellikler" üzerine yığılmayı tercih edebilir.

R ^ 5RS'den alıntı yapmak için , "Programlama dilleri, özelliğin üstüne kazma özelliği ile değil, ek özelliklerin gerekli görmesini sağlayan zayıflıkları ve kısıtlamaları kaldırarak tasarlanmalıdır." IMHO, sözdizimi bir zayıflık ve kısıtlama olarak nitelendirilebilir ve böylece programcıların sözdiziminden uzaklaşmasına izin vermek bir dilin ifadesini artırabilir .


7

IMHO Ben sözdizimsel şeker için bir tanım var olabilir sanmıyorum, çünkü ifade BS ve "gerçek işletim sistemleri" üzerinde "gerçek araçları" kullanarak "gerçek programcılar" hakkında konuşan insanlar tarafından kullanılması muhtemeldir

BS'si, çünkü "gerçek özellikler" veya "sözdizimsel şeker" fikri, gerçek Scotsman yanılgısı gibi . İfadeler "mantıksız bir iddiayı korumaya yönelik geçici girişimler" dir. Buradaki iddia, buradaki bir özelliğin önemsiz olmasıdır, çünkü bunun yerine "gerçek bir özellik" kullanabilirsiniz.

BS'si, çünkü bazıları şeker kullanmaktan kaçınılmalıdır çünkü bir hata yazabilirsiniz, ancak hata yazmanız daha zor olduğu için buna bağlı kalmalısınız . Harika değil mi? Aynı ifade, aynı mantığı kullanarak tam tersi sonuçlara yol açar.

BS'si, okunabilirliğini veya sürdürülebilirliğini veya olası kusur argümanlarını yedeklemek için hiç kimse kullanılabilirlik çalışmalarını veya kusur sayısı çalışmalarını göstermemektedir.

BS'si, çünkü insanlar genellikle yanlış ya da denklik konusunda yanlış olurlar. Örneğin bu soru , bir C # dizesinin bir char dizisi için şeker olduğunu iddia eder. Onlar değil .

Bununla birlikte, semantik olarak eşdeğerse iki şeyin şeker olduğunu söylemek istiyorsanız ve bu devam etmenize ve istediğiniz şekilde tanımlamanıza yardımcı olur.

Birini küçümsemek istiyorsanız bu ifadeyi de kullanabilirsiniz.


2
Diyerek şöyle devam etti: "Birini küçümsemek istiyorsanız bu ifadeyi de kullanabilirsiniz." - İçinde olduğu gibi: "Henüz Barbara ile tanıştın mı? Bizim sözdizimsel şekimiz."
molf

@molf. Çok komik. Sanırım birinin fikirlerini, işlerini veya araçlarını kastediyorum. "Barbara ile henüz tanıştın mı, onun gerçek bir kodlayıcı olduğunu düşünüyor ama çok fazla şeker kullanıyor." Ya da "Barbra Bar ++ v8.0'da bir uzman, ancak 8.0 gerçekten çok fazla şekerle 7,0."
Conrad Frix

7

İşte ise çok : İlgili bir konsept için titiz tanım anlamlılık tarafından
Matthias Felleisen:

Programlama Dillerinin Etkileyici Gücü Hakkında [Postscript bulabildiğim tek serbest formdu.]

Ayrıca , Java dili ve kapanışları hakkındaki bu girişe bakın .

Etkili bir şekilde, sadece yerel değişiklikler yaparak sözdizimi olmadan bir forma dönüştürülebilirse, bir şey sözdizimsel şekerdir. Örneğin, sözdizimsel form olmadan, birkaç farklı kod konumunu değiştirmeniz veya parçaları başka konumlara taşımanız gerekiyorsa, şeker değildir.

Bununla birlikte, uygun şekilde kullanıldığında sözdizimsel şeker iyidir. Bence herhangi bir Şema programcısı, letyeni bir anonim işlev oluşturmak ve daha sonra aynı şeyi yapacaktır uygulamak daha özel bir form olacağını düşünüyorum. Amaç kodu daha net hale getirmektir.


5
+1: sözdizimsel şeker önemlidir. Modern cebirsel notasyon, yerini aldığı Latin nesiri için sadece sözdizimsel şekerdir, ancak matematiksel akıl yürütme yeteneğimizde büyük bir fark yaratır.
kevin cline

3

Bence sözdizimsel şeker terimi aynı temel anlambilimi ifade etmek için alternatif bir sözdizimini belirtir.

Örneğin sum, keyfi uzunluktaki tamsayıların bir listesini toplayabilen bir işleme sahip bir programlama dili A'yı ele alalım . Bu dilde ifadeleri yazabiliriz

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

sonuçları sırasıyla 0, 13 ve 9'dur.

Şimdi, sumiki argümanla kullandığımız zamanların% 90'ının farkında olduğumuzu varsayalım ve bu nedenle, kolaylık sağlamak için yeni gösterimi sunuyoruz

2 + 7

hangi adildir sözdizimsel şeker için sum [2, 7].

Şimdi hiçbir ek işlemi olmayan ikinci bir B dili alın . Biz operatörler gibi olabilir <, =bize numaralarını karşılaştırmak için izin, ancak hiçbir şekilde eklemek numaralar. B dilinin 2. sürümünde , sözdizimi ile yeni bir ekleme işlemi sunuyoruz

2 + 7

her zamanki gibi sayı ekler.

A dili bağlamında, +gösterim sözdizimsel şekerdir (gösterim yerine kullanılabilen alternatif, basitleştirilmiş ve geçici bir sum [...]gösterimdir). Benzer şekilde, Hoa Long Tam'ın cevabında da belirtildiği gibi, C'de gösterim p->fieldsözdizimsel şekerdir (*p).field.

B dili bağlamında, +gösterim sözdizimsel şeker değildir (toplam işlemi için kullanılan tek geçerli sözdizimidir). Benzer şekilde, C, yapı üyelerine yalnızca işaretçilerle erişebiliyorsa (*p).fieldve gösterime sahip p->fieldolmasaydı , gösterim sözdizimsel şeker olmazdı.

Kanımca, sözdizimsel şeker konusunda programlama dili anlambilimiyle ilgili bir karışıklığa kadar izlenebilen yanlış anlaşılmalar var. Akıl yürütme şöyle gider:

  • Bir programın anlambilimi, bir programın hesapladığı şeydir.
  • Bir programlama dilinin ifade gücü, o dilde tanımlanabilecek hesaplamalar ile temsil edilir.
  • Tüm hesaplanabilir işlevleri (Turing makineleri kullanılarak tanımlandığı gibi) tanımlayabilen iki programlama dili aynı ifade gücüne sahiptir ...
  • ... ve bu yüzden sadece sözdiziminde farklılık gösterir.
  • Sonuç: Turing-complete dilinin herhangi bir uzantısı sadece sözdizimidir (sözdizimsel şeker) çünkü dilin ifade gücünü değiştirmezsiniz.

Yukarıdaki akıl yürütme çizgisi, "sözdizimsel şeker doğru bir şekilde tanımlanamaz", "bir zevk meselesi" veya "her programlama dili özelliği her şeyden önce sadece sözdizimsel şeker" gibi genel iddialara yol açar.

Yukarıdaki argümandaki temel problem, anlambilimin sadece bir program tarafından neyin hesaplanabileceği değil, aynı zamanda nasıl hesaplandığı , yani hangi ilkel yapıların kullanıldığı ve bunların nasıl birleştirildiği ile ilgili olduğudur.

Örneğin, nesneler altta yatan bit konfigürasyonları ve bit dönüşümleri için sözdizimsel şeker değildir, veri ve işlemleri modellemeye ve hesaplamaları tanımlamaya izin veren bir yapıdır. Nesneler, yöntemler, yöntem çağrıları ile hesaplama, baytlarla, işlemci kayıtlarıyla, bellek adresleriyle hesaplama ile aynı değildir (iki hesaplama aynı sonuca sahip olsa ve ilk hesaplama için ikinci hesaplama kullanılsa bile).

Bu açıklamayı biraz uzun yaptım, ancak diğer cevaplarda ele alınmadığını gördüğüm önemli bir unsur olduğunu düşünüyorum.

Alt satır: sözdizimsel şeker, zaten bir dilde olan ve zaten iyi tanımlanmış bir sözdizimi ve semantiğe sahip bir yapı için alternatif (muhtemelen daha uygun) bir sözdizimidir. Yeni sözdizimi (sözdizimsel şeker) mevcut olandan farklıdır, ancak aynı semantiğe sahiptir . Bir dilde yeni bir yapı ve bunun için yeni bir sözdizimi eklerseniz, sözdizimsel şekeriniz yoktur.


0

sözdizimsel şeker, dil ifadesinin kendisini genişletmeyen, dolayısıyla gereksiz ve bazen gösterimin kötüye kullanıldığı, ancak her ikisinin de yazarın hayatını basitleştiren ve okuyucuya daha fazla fikir veren bir özelliktir.


0

Kendi soruya cevap vermek için bir özellik ve ancak bunun eğer estetik ve okunabilirliği artırmak için öncelikle dahil eğer sözdizimsel şeker ve trivially de-şekerli sürüm içine kabaca bire-bir şekilde tercüme edilebilir. (Kabaca bire bir, değişmeli işlemlerin sırası, değişken adları ve boşluk gibi modulo önemsiz şeyleri kastediyorum.)

Sadece önemli miktarda programcı disiplini ile şekerden arındırılabilen herhangi bir özellik sözdizimsel şeker değildir. Bunun bir alt kümesi olarak, tip güvenliğini artıran herhangi bir özellik sözdizimsel şeker değildir, çünkü programcı disiplini yoluyla tip güvenliğini manuel olarak uygulamak son derece önemsiz değildir. Örneğin, C ++ 'ın nesne sistemi, C pointer cast polimorfizminin üstündeki sözdizimsel şekerden daha fazlasıdır.

Önemli kod çoğaltması veya kaldırılması durumunda büyük bir yeniden tasarım gerektiren herhangi bir özellik sözdizimsel şeker değildir, çünkü bunların hiçbiri önemsiz bir girişim değildir. Örneğin, şablonlar sadece sözdizimsel şeker değildir, çünkü onlarsız eşdeğer işlevselliği elde etmek tonlarca klonla ve değiştir gerektirir.

Şeylerin Örnek şunlardır sözdizimsel şeker:

a[i] onun yerine *(a + i)

a -> b onun yerine (*a).b

foreach yineleyici sözdizimini elle yazmak yerine sözdizimi.

Operatörün aşırı yüklenmesi, saf sözdizimsel şekerdir.

Bu adil ve makul derecede net olmayan bir tanım gibi mi geliyor?


3
Operatörün aşırı yüklenmesi sözdizimsel şeker değildir. C ++ 'ın hem temel türler (örneğin int) hem de kendi sınıflarım için çalışan şablonlara sahip olmasını sağlar.
Kate Gregory

@KateGregory: Eğer kişi aşırı yüklenmenin sözdizimsel şeker olmadığını kabul ederse, operatör aşırı yüklemesi belirtilen değerlerde aşırı yüklenebilir işlevleri çağırmak için sözdizimsel şeker olarak kabul edilebilir.
supercat

0

"Sözdizimsel şeker" titizlikle tanımlanmış bir terim değildir. Kime sorduğunuza bağlı olarak, büyük olasılıkla aşağıdaki tanım türlerinden birini alırsınız:

  1. Gerçek Scotsman yaklaşımı yok. Sevdiğim şeyler gerçek programlama ve sevmediğim şeyler sözdizimsel şeker.
  2. MIPS'tan sonraki her şey sözdizimsel şekerdi ve bu talimatların bazıları bile muhtemelen gerekli değildir.
  3. Bir yerde birileri için programlamayı kolaylaştıran her şey yararlıdır ve sözdizimsel şeker değildir. Kimse herhangi bir durumda yararlı bulamazsa bir özellik eklenmeyeceğinden, mevcut her özellik sözdizimsel şeker değildir. Birisi bu özelliğin kendileri için yararlı olduğuna karar verene kadar varsayımsal özellikler sözdizimsel şeker olabilir.

-3

Bilgisayar bilimleri alanlarında emin değilim, ama mantık alanında, tanımların muhafazakarlığı ve ortadan kaldırılabilirliği kavramları vardır [ 1 ] aynı damarda gibi görünmektedir.

Curry-Howard yazışmasını uygulayarak, “sözdizimsel şeker” ile ilgili paralel bir kavram ortaya çıkabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.