در علوم کامپیوتر و طراحی کامپایلر، سینتکس قندی (به انگلیسی: Syntactic sugar) نوعی سینتکس یا نحو خاص است که به یک زبان برنامهنویسی اضافه میشود تا نوشتن کد و گاهی فهمیدن آن را برای دیگران راحتتر و سریعتر کند. این نحو اضافه شده با ساختاری واضح تر و مختصر، در کنار نحو اصلی، باعث به اصطلاح «شیرین تر» شدن آن زبان برنامهنویسی برای انسان میشود. معمولا سینتکس قندی روشی مختصرتر برای بیان یک دستور رایج و نسبتاً طولانیتر است. در واقع برنامهنویس میتواند هم سینتکس قندی و کوتاهتر و هم نحو اصلی و طولانیتر را استفاده کند، اما معمولاً از شکل کوتاهتر استفاده میشود که نوشتن و خواندن و فهمیدن آن برای همه سریع تر و راحت تر است.
مثلاً در خیلی از زبانهای برنامهنویسی، روشهای متفاوتی برای بررسی و ایجاد و تغییر عناصر یک آرایه، ارائه میشود که اگر بخواهیم کلی تر نگاه کنیم، واکشی مقدار یک عنصر میتواند یک تابع با دو آرگومان ورودی باشد: یکی خود آرایه و دیگری اندیس عنصر مدنظر در همان آرایه که میتواند به صورت get_array(Array, vector(i,j))
بیان شود. ولی بسیاری از زبانها در کنار این، نحو دیگری مانند Array[i,j]
هم ارائه میکنند که نمونه ای از سینتکس قندی است.
در عمل هم میتوان سینتکس قندی را کاملاً از زبان حذف کرد و این کار هیچ تأثیری در عملکرد و قدرت زبان نمیگذارد، فقط حذف شدن سینتکسهای قندی باعث طولانیتر شدن و ناخواناتر شدن کدها میشود، ولی تواناییها، همان است.
بیشتر کامپایلرها و مفسرها، ساختار سینتکسهای قندی را قبل از پردازش، به معادلهای اصلی زبان تبدیل میکنند. به این فرایند گاهی اوقات به آن «قند زدایی» یا «desugaring» هم میگویند.
به عنوان مثال در خیلی از زبانهای برنامهنویسی به این صورت داریم:[۲]
int i = 2
i = i + 3
// Sugar
i += 3
i -= 3
//Sugar
i++ // i += 1 --===> i = i + 1
i-- // i -= 1 --===> i = i - 1
نمونه بالا بسیار رایج است و میشود آن را در خیلی از زبان های برنامه نویسی دید[۳]
در زبان سی شارپ، استنتاج نوع (Type Inference) از طریق کلمه کلیدی var
هم نوعی سینتکس قندی است :
int y = 4 // Base Syntax
var x = 8 // Syntactic Sugar
همین فرایند در ++C با استفاده از کلمه کلیدی auto
یک نمونه سینتکس قندی است :
int x = 16 // Base syntax
auto y = 8 // Syntactic Sugar
به عنوان مثال در جاوا اسکریپت تعرف یک شئ از طریق class
که در ES6 اضافه شده است، به شکل زیر یک سینتکس قندی است:
class ClassA {
constructor(foo, bar) {
this.Foo = foo
this.Bar = bar
}
}
const bux = new ClassA("Hello", "World")
// bux.Foo is "Hello"
// bux.Bar is "World"
نمونه پایین حالت واقعی همین مثال بالاست که از ES5 به قبل استفاده میشد[۴] :
const ClassA = function (foo, bar) {
this.Foo = Foo;
this.Bar = bar;
}
const bux = new ClassA("Hello", "World")
// bux.Foo is "Hello"
// bux.Bar is "World"
جاوا اسکریپت در واقع ارثبری را در میان اشیاء از طریق پروتوتایپها انجام میدهند . constructor
تعریف شده در هر دو مثال، پروتوتایپ شئ تولید شده خواهد بود.[۴]
در پایتون، دکوراتورها یک سینتکس قندی هستند. در واقع حالت زیر حالت واقعی سینتکس زبان است:[۳]
# pre-decorators
def Y():
pass
Y = X(Y)
که سینتکس قندی آن به این صورت است :
@X
def Y():
pass
دستور زیر در زبان گو، نوعی سینتکس قندی است[۵] :
var m map[string]int = map[string]int{} //Base syntax
m := map[string]int{} //Syntactic sugar
بطور ویژه هرگونه استنتاج نوع در زبان های برنامه نویسی مثل سی شارپ، سی پلاس پلاس، تایپ اسکریپت، پایتون و... یک سینتکس قندی است.
همانطور که گفته شد، سینتکس قندی را میتوان حذف کرد و هیچ تأثیری در کارایی زبان ندارد فقط کد را خواناتر و تمیزتر میکند.
این استعاره با ابداع اصطلاح سینتکس شور معروف شده است، که شاره آن به سینتکسی است که باعث سختتر شدن کار و بدتر نوشته شدن کد است.
مثلاً در سی شارپ برای جلوگیری از مشکلاتی که احتمالاً بخاطر شباهت سینتکس دستور switch با C یا C++ بوجود میآید، برنامهنویس ملزم است که از عبارت break
(یا عبارتهای goto
،return
یا throw
) در انتهای هر case
استفاده کند.
|first2=
بدون |last2=
در Authors list وارد شدهاست (کمک)