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ümle MOVE 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 += beş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 + baa
  • In Perl , unless (condition) {...} için sözdizimsel şeker if (not condition) {...}. Ek olarak, herhangi bir ifadenin ardından bir koşul gelebilir, bu statement if conditionnedenle eşdeğerdir if (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->xnotasyon, referans operatörünü kullanarak üyelere erişmek için sözdizimsel şekerdir . (*a).x
  • usingAçı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 = exprizin 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 .xexprauto x = exprvar 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ğerdir f(x,y).
  • Olarak SQL , JOINeşdeğerdir INNER JOINifadesi 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 importdeklarasyon aksi tam nitelikli adlarla belirtilmeyen sınıfları bulmak için derleyici sağlar. Örneğin import javax.swing.*;, programcının daha kısa adı kullanmak gibi bir Swing nesnesine başvurmasına izin verir .javax.swing.JButtonJButton

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 newkelime 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 breakboş olmayan her caseetiketi için switch( goto, return, veya throwkullanı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