Sözdizimsel şeker - Syntactic sugar
Gelen bilgisayar bilimleri , sözdizimsel şeker olan sözdizimi bir dahilinde programlama dili okumak için veya ifade etmek işleri kolaylaştırmak için tasarlanmıştır. Dili insan kullanımı için "daha tatlı" hale getirir: şeyler daha açık, daha özlü veya bazılarının tercih edebileceği alternatif bir tarzda ifade edilebilir.
Örneğin, birçok programlama dili, dizi öğelerine başvurmak ve güncellemek için özel sözdizimi sağlar . Özet olarak, bir dizi başvurusu iki argümandan oluşan bir prosedürdür: bir dizi ve olarak ifade edilebilecek bir alt simge vektörü get_array(Array, vector(i,j))
. Bunun yerine, birçok dil gibi sözdizimi sağlar Array[i,j]
. Benzer şekilde bir dizi öğesi güncellemesi, örneğin üç bağımsız değişkenden oluşan bir prosedürdür set_array(Array, vector(i,j), value)
, ancak birçok dil, Array[i,j] = value
.
Bir dildeki yapı, dilin yapabileceklerini etkilemeden dilden kaldırılabiliyorsa sözdizimsel şekerdir: işlevsellik ve ifade gücü aynı kalacaktır.
Derleyiciler ve statik analizciler de dahil olmak üzere dil işlemcileri, genellikle şekerli yapıları işlemeden önce daha temel yapılara genişletir, bazen "şekersizleştirme" olarak adlandırılan bir süreç.
kökenler
Sözdizimsel şeker terimi , 1964'te Peter J. Landin tarafından , λ'nın sözcüksel olarak "nerede" ile değiştirilmesine odaklanan lambda hesabının uygulamalı ifadeleri açısından anlamsal olarak tanımlanan basit bir ALGOL benzeri programlama dilinin yüzey sözdizimini tanımlamak için icat edildi .
CLU , ML ve Scheme gibi sonraki programlama dilleri, terimi, temel yapıların bir dil çekirdeği olarak tanımlanabilecek bir dil içindeki sözdizimine atıfta bulunacak şekilde genişletti; uygun, üst düzey özellikler "şekerinden arındırılabilir" ve bu alt kümeye ayrıştırılabilir. Bu, aslında, ilkellerden oluşturmanın olağan matematiksel uygulamasıdır.
Landin'in temel dil yapıları ve sözdizimsel şeker arasındaki ayrımına dayanarak , 1991'de Matthias Felleisen , literatürde "genel olarak kabul edilen inançlar" ile uyum sağlamak için bir "ifade gücü" kodlaması önerdi. "Daha anlamlı" ifadesini, söz konusu dil yapıları olmadan, bir programın tamamen yeniden düzenlenmesi gerektiği anlamına gelecek şekilde tanımladı.
Önemli örnekler
- Gelen COBOL , ara anahtar kelimelerin çoğu isteğe bağlı olarak gözardı edilebilir sözdizimsel şeker bulunmaktadır. Örneğin, cümle
MOVE A B.
ve cümleMOVE A TO B.
tam olarak aynı işlevi görür, ancak ikincisi yapılacak eylemi daha net hale getirir. -
Artırılmış atama veya bileşik atama operatörleri: Örneğin, C ve benzeri dillerde
a += b
eşdeğerdir , sanki normal bir değişken gibi hiçbir yan etkisi yoktur . Python gibi bazı diller, artırılmış atama operatörlerinin aşırı yüklenmesine izin verebilir , bu nedenle standart olanlardan farklı davranabilirler.a = a + b
a
a
- In Perl ,
unless (condition) {...}
için sözdizimsel şekerif (not condition) {...}
. Ek olarak, herhangi bir ifadenin ardından bir koşul gelebilir, bustatement if condition
nedenle eşdeğerdirif (condition) {statement}
, ancak ilki daha doğal olarak tek bir satırda biçimlendirilir. - In C dili ,
a[i]
gösterim için sözdizimsel şeker*(a + i)
. Benzer şekilde,a->x
notasyon, referans operatörünü kullanarak üyelere erişmek için sözdizimsel şekerdir .(*a).x
using
Açıklamada C # belirli nesneler doğru şekilde bertaraf edilmesini sağlamaktadır. Derleyici, ifadeyi bir try-finally bloğuna genişletir.- C# dili, değişkenlerin olarak bildirilmesine
var x = expr
izin verir, bu da derleyicinin açık bir tür bildirimi gerektirmek yerine ifadenin türünü çıkarmasına olanak tanır . Benzer şekilde, C++, C++11'den beri izin verir ve Java, Java 11'den beri izin verir .x
expr
auto x = expr
var x = expr
- Python liste kavrayışları (örneğin
[x*x for x in range(10)]
bir kareler listesi için) ve dekoratörler (örneğin@staticmethod
). - In Haskell , tırnak içinde gösterilen bir dize, bir karakter listesine semantik olarak eşdeğerdir.
- Gelen tidyverse toplanması R paketleri, boru ile gösterilen,
%>%
, boru, önceki veri (ya da fonksiyonunun çıkışı) boru aşağıdaki fonksiyon için ilk bağımsız değişken olarak hizmet beyan eder. Yani,x %>% f(y)
eşdeğerdirf(x,y)
. - Olarak SQL ,
JOIN
eşdeğerdirINNER JOIN
ifadesi katılmasını ikinci aydınlatıcı bir iç, bir dış karşıt olarak birleştirme işlemi birleştirme işlemi spesifik olarak,. -
Yöntem arama şeklinde OOP dillerinde
myObject.myMethod(parameter1, parameter2, parameter3)
olduğu gibi küresel bir işlevi çağırmak için sözdizimsel şeker . Nesneye yapılan başvuru, gizli bir argüman olarak iletilir ve genellikle yöntemin içinden şu şekilde erişilebilir .myMethod(myObject, parameter1, parameter2, parameter3)
this
- Referans olarak adlandırılan parametreler, teknik olarak bir işaretçiyi parametreye geçirmek için bir sözdizimi şekeridir, ancak işlev içindeki kodda işaretçinin sürekli olarak referanstan çıkarılmasını önlemek için onu değişkenin kendisi olarak sözdizimsel olarak ele alır.
- In Java , bir
import
deklarasyon aksi tam nitelikli adlarla belirtilmeyen sınıfları bulmak için derleyici sağlar. Örneğinimport javax.swing.*;
, programcının daha kısa adı kullanmak gibi bir Swing nesnesine başvurmasına izin verir .javax.swing.JButton
JButton
eleştiri
Bazı programcılar, bu sözdizimi kullanılabilirlik özelliklerinin ya önemsiz ya da tamamen anlamsız olduğunu düşünüyor. Özellikle, özel sözdizimsel biçimler, bir dili daha az tekdüze ve belirtimini daha karmaşık hale getirir ve programlar büyüyüp karmaşıklaştıkça sorunlara neden olabilir. Lisp çok basit ve düzenli sözdizimine sahip olduğundan ve yüzey sözdizimi kolayca değiştirilebilir olduğundan, bu görüş özellikle Lisp topluluğunda yaygındır . Örneğin, Alan Perlis bir keresinde " Epigrams on Programming "de köşeli ayraçla ayrılmış dillere atıfta bulunarak "Sözdizimsel şeker noktalı virgüllerin kanserine neden olur" şeklinde bir espri yaptı .
türev terimler
sözdizimsel tuz
Metafor, kötü kod yazmayı zorlaştırmak için tasarlanmış bir özelliği belirten sözdizimsel tuz terimi türetilerek genişletilmiştir . Spesifik olarak, sözdizimsel tuz, programcıların bir program eylemini ifade etmek yerine sadece neler olduğunu bildiklerini kanıtlamak için atlamaları gereken bir çemberdir. Örneğin, Java ve Pascal'da , ek sözdizimi olmadan int olarak bildirilen bir değişkene bir kayan nokta değeri atamak , niyetin bir derleme hatasıyla sonuçlanacağını açıkça belirtirken, C ve C++ , bir int'ye atanan tüm kayan noktaları otomatik olarak kesecektir. Ancak bu sözdizimi değil, anlambilimdir.
In C # Kalıtsal sınıf üyesi gizleme zaman sürece, bir derleyici uyarı verilir new
kelime gizleme kasıtlı olduğunu belirtmek için kullanılır. switch deyimi sözdiziminin C veya C++ ile benzerliği nedeniyle olası hataları önlemek için , C#, örtük düşüşe izin vermese de a öğesinin break
boş olmayan her case
etiketi için switch
( goto
, return
, veya throw
kullanılmadığı sürece) bir a gerektirir . ( Sonraki etiketi kullanmak ve belirtmek, C/C++ benzeri bir düşüş üretir .)
goto
Sözdizimsel tuz, kodu okunamaz hale getirerek amacını bozabilir ve bu nedenle kalitesini kötüleştirebilir - aşırı durumlarda, kodun temel kısmı, dil gereksinimlerini karşılamak için eklenen ek yükten daha kısa olabilir.
Sözdizimsel tuza bir alternatif, kodun bir hatanın sonucu olma olasılığının yüksek olduğu durumlarda derleyici uyarıları oluşturmaktır - modern C/C++ derleyicilerinde yaygın olan bir uygulama.
sözdizimsel sakarin
Diğer uzantılar sözdizimsel sakarin ve sözdizimsel şuruptur ; bu, programlamayı daha kolay hale getirmeyen gereksiz sözdizimi anlamına gelir.
şekerli türleri
Çekirdek sözdizimsel desteği olan veri türlerinin "şekerli türler" olduğu söylenir. Yaygın örnekler arasında tırnakla ayrılmış dizeler, nesne ve kayıt türleri için küme parantezleri ve diziler için köşeli parantezler bulunur.
Notlar
Referanslar
- Abelson, Harold ; Sussman, Gerald Jay ; Sussman, Julie (1996) [1984]. Bilgisayar Programlarının Yapısı ve Yorumlanması . Cambridge, MA: MIT Basını . ISBN'si 0-262-51087-1.
- Landin, Peter J. (Şubat-Mart 1965). "ALGOL 60 ve Church'ün Lambda-Notasyonu Arasında Bir Yazışma: Kısım I ve II". ACM'nin İletişimi . 8 (2.3): 89–101, 158–165. doi : 10.1145/363744.363749 . S2CID 6505810 .
- Landin, Peter J. (Mart 1965). "Zorunlu Olmayan Programlama – Bir Örnek". UNIVAC Sistem Programlama Araştırması .
- Landin, Peter J. (Temmuz 1965). "Etiketlerden Kurtulmak". UNIVAC Sistem Programlama Araştırması .
-
Landin, Peter J. (Ağustos 1965). "Sıçramalar ve Etiketlerin Genelleştirilmesi". UNIVAC Sistem Programlama Araştırması ., " Yüksek Dereceli ve Sembolik Hesaplama " bölümünde yeniden basılmıştır . 11 . 1998: 125–143. CiteSeerX 10.1.1.85.2610 . Alıntı günlüğü gerektirir
|journal=
( yardım ) - Perlis, AJ (Eylül 1982). "Programlama üzerine epigramlar" . ACM SIGPLAN Bildirimleri . New York, NY, ABD: Bilgisayar Makineleri Derneği. 17 (9): 7-13. doi : 10.1145/947955.1083808 . S2CID 20512767 . Arşivlenmiş orijinal 17 Ocak 1999 tarihinde.