Кіріспе

Бағдарламалау тілінің синтаксисі пайдаланудың оңайлығы үшін жасалған. Компьютер ғылымында синтаксистік қант – бағдарламалау тіліндегі синтаксис, ол нәрсені оқуды немесе білдіруді жеңілдету үшін құрастырылған. Ол тілді адамдар үшін "әдемірек" етеді: нәрселерді нақтырақ, ықшамдау немесе кейбірлерге ұнайтын басқа стильде беруге болады. Синтаксистік қант әдетте, басқа, көбірек сөздерді қолданатын түрінде де жазыла алатын, жиі қолданылатын операцияның қысқартылған түрі болып табылады: бағдарламашы қысқа немесе ұзын нұсқаны таңдауға құқылы, бірақ көбінесе қысқа нұсқаны қолданады, себебі ол қысқарақ және оқуға және жазуға ыңғайлы. Мысалы, көптеген бағдарламалау тілдері массив элементтерін сілтемелеу және жаңарту үшін арнайы синтаксис ұсынады. Абстракті түрде, массивке сілтеме – екі аргументі бар процедура: массив және индекс векторы, оны get array(Array, vector(i,j)) деп жазуға болады. Бірақ көптеген тілдер Array[i,j] сияқты синтаксис ұсынады. Сол сияқты, массив элементін жаңарту – үш аргументі бар процедура, мысалы, set array(Array, vector(i,j), value), бірақ көптеген тілдер Array[i,j] = value сияқты синтаксиспен де жазуға мүмкіндік береді. Егер тілдегі конструкцияны алып тастағанда тілдің мүмкіндіктеріне ешқандай әсер етпесе, ол синтаксистік қант болып саналады: функционалдылық және экспрессивті күш өзгермейді. Тіл процессорлары, оның ішінде компиляторлар мен статикалық талдаушылар, көбінесе өңдеу алдында қантталған конструкцияларды олардың көбірек сөздерді қолданатын эквиваленттеріне айналдырады, бұл процеске кейде "десугарлау" (қанттан айыру) деп аталады.

Шығу тегі

Синтаксистік қант термині 1964 жылы Питер Ландин бағдарламалау тілінің беткі синтаксисін сипаттау үшін қолданған. Бұл тіл қарапайым ALGOL-ға ұқсас болды және Ламбда есептеуінің аппликативтік өрнектері арқылы семантикалық тұрғыдан анықталды, негізінен λ-ді "қайда" сөзімен ауыстыруға бағытталған. Кейінірек CLU, ML және Scheme сияқты бағдарламалау тілдері бұл терминді тілдің ішіндегі, негізгі құрылымдардан тұратын тілдік өзегі арқылы анықталатын синтаксиске қатысты қолдана бастады. Яғни, ыңғайлы, жоғары деңгейдегі мүмкіндіктерді "қанттан айыруға" болады және оларды осы кіші жиынтыққа жіктеуге болады. Бұл, шындығында, математикада примитивтерден құрудың қалыпты тәсілі. Ландиннің негізгі тілдік құрылымдар мен синтаксистік қант арасындағы айырмашылығын негізге алған Маттиас Феллейзен 1991 жылы "көрініс қуатын" кодтауды ұсынды, бұл әдебиеттегі "жалпы қабылданған сенімдерге" сәйкес келеді. Ол "көбірек көрініс беретін" дегенді, егер сөзді тілдік құрылымдар болмаса, бағдарламаны толығымен қайта құру қажет болады деп түсіндірді.

Белгілі мысалдар

COBOL-да көптеген аралық кілт сөздер синтаксистік қант болып табылады, оларды қажет болмаған жағдайда жоюға болады. Мысалы, `A B-ны жылжыту` және `A Б-ға ауысу` сөйлемдері бірдей функцияны орындайды, бірақ екіншісі орындалатын әрекетті анық көрсетеді. Көбейтілген немесе құрама тапсырма операторлары: мысалы, `a += b` C және басқа ұқсас тілдерде `a = a + b` тең, егер `a` тұрақты айнымалы болмаса және қосымша әсерлерге ие болмаса. Кейбір тілдер, мысалы Python, кеңейтілген тапсырма операторларын жүктеуге мүмкіндік береді, сондықтан олар стандартты операторлардан өзгеше болуы мүмкін. Perl-де `unless (condition) { }` конструкциясы `if (not condition) { }` синтаксистік қанты болып табылады. Сонымен қатар, кез келген оператордан кейін шарт келтірілуі мүмкін, сондықтан `statement if condition` конструкциясы `if (condition) { statement }` тең, бірақ біріншісі бір жолда жазылғанда ыңғайлырақ болады. C тілінде `a[i]` жазуы `*(a + i)` синтаксистік қанты болып табылады. Сол сияқты, `a > x` жазуы дерекке қол жеткізу үшін `(*a).x` операторының синтаксистік қанты болып табылады. C# тіліндегі `using` операторы белгілі бір нысандардың дұрыс жойылуын қамтамасыз етеді. Компилятор бұл операторды `try...finally` блогына айналдырады. C# тілінде айнымалыларды `var x = expr` түрінде жариялауға болады, бұл компиляторға `x` айнымалысының түрін `expr` өрнегінен анықтауға мүмкіндік береді, түрін тікелей көрсетудің қажеті болмайды. Сол сияқты, C++ тілінде C++11 нұсқасынан бастап `auto x = expr` және Java тілінде Java 11 нұсқасынан бастап `var x = expr` қолданылады. Python тіліндегі тізім түсініктемелері (мысалы, `[x*x for x in range(10)]` квадраттар тізімін жасау үшін) және декораторлар (мысалы, `@staticmethod`). Haskell тілінде, тырнақшаға алынған жол семантикалық жағынан әріптер тізіміне тең. `OverloadedStrings` тіл кеңейтімдері жолдарды басқа типтерге, мысалы `Text` түріне айналдыруға мүмкіндік береді. R пакеттері жинағында `%>%` символымен белгіленетін құбыр операторы, құбырдың сол жағындағы деректердің (немесе функцияның нәтижесінің) құбырдан кейінгі функцияның бірінші аргументі ретінде қолданылатынын көрсетеді. Яғни, `x %>% f(y)` өрнегі `f(x, y)` өрнегіне тең. SQL тілінде қарапайым `JOIN` операторы `INNER JOIN` операторына тең, соңғысы бұл оператордың ішкі қосылу операциясы екенін нақтылайды, сыртқы қосылу операциясы емес. Сол сияқты, `LEFT OUTER JOIN`, `RIGHT OUTER JOIN` және `FULL OUTER JOIN` операторларынан `OUTER` сөзін жоюға болады. Объектіге бағытталған тілдердегі `myObject.myMethod(parameter1, parameter2, parameter3)` әдіс шақыруы `myMethod(myObject, parameter1, parameter2, parameter3)` жалпы функциясын шақырудың синтаксистік қанты болып табылады. Объектіге сілтеме жасырын аргумент ретінде беріледі және әдетте әдіс ішінде `this` арқылы қол жетімді болады. Сілтеме арқылы берілген параметр техникалық тұрғыда параметр ретінде көрсеткішті берудің синтаксистік қанты болып табылады, бірақ функция ішіндегі кодта көрсеткіштің үнемі дереференциялануын болдырмау үшін айнымалы ретінде қарастырылады. Java тілінде `import` декларациясы компиляторға толық аттарымен көрсетілмеген сыныптарды табуға мүмкіндік береді. Мысалы, `import javax.swing.*;` декларациясы бағдарламалаушыға `javax.swing.JButton` нысанына `JButton` қысқа аты арқылы сілтеме жасауға мүмкіндік береді. JavaScript тілінің ES6 нұсқасында жебе функциялары `(x) => x + 1` сияқты қысқаша түріне ие, бұл `(x) => { return x + 1; }` ұзын түріне тең. Scala тілінде үш сұрақ белгісі `???` `throw new NotImplementedError` өрнегіне тең. Бұл әлі жазылмаған кодты белгілеу үшін пайдалы.

Сын

Кейбір бағдарламашылар осы синтаксистің қолдануға ыңғайлылығын маңызсыз немесе тіпті әсте-кесте деп санайды. Ерекше синтаксистік формалар тілді біртектіліксіз етеді, оның сипаттамасын күрделендіреді және бағдарламалардың көлемі мен күрделілігі артқан сайын проблемалар тудыруы мүмкін. Бұл көзқарас әсіресе Lisp қауымдастығында кең таралған, себебі Lisp өте қарапайым және реттелген синтаксиске ие, ал оның синтаксисін өзгерту оңай. Мысалы, Алан Перлис бірде "Бағдарламалау туралы афоризмдер" еңбегінде, жақшамен шектелген тілдер туралы айта келіп, "Синтаксистік қант жартылай нүктелердің қатерлі ісігіне себеп болады" деп әзілдеген.

Синтаксистік тұз

Бұл метафора кеңейтіліп, «синтаксистік тұз» термині пайда болды, ол жаман код жазуды қиындатуға арналған мүмкіндікті көрсетеді. Нақтырақ айтқанда, синтаксистік тұз – бағдарламашылар бағдарламалық амалды білдірудің орнына, не болып жатқанын білетіндерін көрсету үшін ғана аттап өтуге тиіс кедергі. C# тілінде мұрагерлікпен алынған сынып мүшесін жасырғанда, егер «new» кілт сөзі жасырудың қасақана екенін көрсету үшін қолданылмаса, компилятор ескерту шығарады. C немесе C++ тілдерімен салыстырғандағы «switch» операторының синтаксисіндегі ұқсастықтар тудыратын қателерден сақтану үшін C# тілінде «switch» операторының әрбір бос емес «case» таңбасы үшін міндетті түрде «break» операторы қолданылуы керек (егер «goto», «return» немесе «throw» қолданылмаса), тіпті ол автоматты түсуге рұқсат бермесе де. («goto» операторын пайдаланып, келесі таңбаны көрсету C/C++ тілдеріндегідей автоматты түсуді қамтамасыз етеді.) Синтаксистік тұз кодты түсініксіз ету арқылы оның сапасын нашарлатуы мүмкін – ерекше жағдайларда кодтың маңызды бөлігі тілдік талаптарды орындау үшін енгізілген қосымшадан қысқа болуы мүмкін. Синтаксистік тұзға балама ретінде, кодтың қатеге байланысты жасалған болуы мүмкін деген жоғары ықтималдық болғанда компилятор ескертулерін шығару қарастырылады – бұл қазіргі заманғы C/C++ компиляторларында кең таралған тәжірибе.

Синтаксистік сахарин

Басқа кеңейтімдер — синтаксистік сахарин және синтаксистік сироп, яғни бағдарламалауды жеңілдетпейтін артық синтаксис.

Қантпен қаныққан түрлері

Негізгі синтаксистік қолдауға ие дерек түрлері "әсемделген типтер" деп аталады. Көне мысалдарға тырнақшамен белгіленген жолдар, нысандар мен жазбалар үшін жиін жақшалар және массивтер үшін тіктөртбұрыш жақшалар жатады.