Кіріспе

Компьютерлік бағдарламалаудағы операторлар – компьютерлік бағдарламаларда математикалық операциямен байланысты құрылымдар. Компьютерлік бағдарламалауда операторлар – бағдарламалау тілдерінде анықталатын, функциялар сияқты әрекет ететін, бірақ синтаксистік немесе семантикалық тұрғыдан ерекшеленетін конструкциялар. Көбінесе қарапайым мысалдарға арифметикалық операциялар (мысалы, қосу + арқылы), салыстыру (мысалы, “үлкен” > арқылы) және логикалық операциялар (мысалы, AND, кейбір тілдерде && деп те жазылады) жатады. Күрделірек мысалдарға міндеттеу (әдетте = немесе :=), жазбадағы немесе объектідегі өріске қол жеткізу (әдетте . ), және ауқымды анықтау операторы (көбінесе :: немесе . ) кіреді. Тілдер әдетте операторлар жиынтығын анықтайды, ал кейбір жағдайларда пайдаланушыларға қолданыстағы операторларға жаңа мағыналар қосуға немесе тіпті толығымен жаңа операторларды құруға мүмкіндік береді.

Синтаксисі

Синтаксистік операторлар әдетте функциялардан өзгеше болады. Көптеген тілдерде функцияларды белгілі бір басымдық деңгейі мен ассоциативтілігі бар, міндетті жақшалары бар префикс оператордың ерекше түрі ретінде қарастыруға болады, мысалы, Lisp-те Func(a) (немесе (Func a)). Көптеген тілдер бағдарламашы анықтаған функцияларды қолдайды, бірақ олар префикс нотациясынан және бір басымдық деңгейінен артық болмаса, бағдарламашы анықтаған операторларды қолдаймын деп айта алмайды. Семантикалық тұрғыдан операторларды әртүрлі шақыру нотациясымен және шектеулі сандағы параметрлермен (әдетте 1 немесе 2) функцияның ерекше түрі ретінде қарастыруға болады. Оператордың операндарға қатысты орны префикс, инфикс немесе постфикс болуы мүмкін, ал операторды қамтитын өрнектің синтаксисі оның ариттігіне (операндар саны), басымдығына және (қажет болған жағдайда) ассоциативтілігіне байланысты. Көптеген бағдарламалау тілдері екілік операторларды және бірнеше бірлік операторларды қолдайды, ал кейбірлері көбірек операндарды қолдайды, мысалы, C тіліндегі ? : операторы, ол үштік оператор болып табылады. Бірлік минус x сияқты префикс бірлік операторлары бар, сондай-ақ x++ сияқты постфикс бірлік операторлары бар, ал x + y немесе x = y сияқты екілік операциялар инфикс болып келеді. Жоғары ариттігі бар инфикс операциялары қосымша символдарды қажет етеді, мысалы, C тіліндегі үштік оператор ? : a : b : c деп жазылады – шындығында, бұл жалғыз кең таралған мысал болғандықтан, оны көбінесе үштік оператор деп атайды. Префикс және постфикс операциялары кез келген қалаулы ариттікті қолдауы мүмкін, мысалы, 1 2 3 4 +. Кейде тілдің кейбір бөліктері тілдің сипаттамасын немесе іске асыруын жеңілдету үшін "matchfix" немесе "circumfix" операторлары ретінде сипатталуы мүмкін. Circumfix операторы екі немесе одан көп бөліктен тұрады, олар оның операндарын қоршайды. Circumfix операторлары ең жоғары басымдыққа ие, олардың ішкі мазмұны бағаланып, нәтижесі айналадағы өрнекте қолданылады. Ең таныс circumfix операторы – жоғарыда аталған жақшалар, олар өрнектің қай бөліктері басқалардан бұрын бағаланатынын көрсету үшін қолданылады. Физикадан келген тағы бір мысал – Дирактың бра-кет нотациясының ішкі көбейтіндісі. Circumfix операторлары көптеген немесе әр түрлі операндарды қатыстыратын операцияларды белгілеу үшін өте пайдалы. Тілдің сипаттамасы қолдайтын операторлардың синтаксисін анықтайды, ал Prolog сияқты бағдарламашы анықтаған операторларды қолдайтын тілдер синтаксисті бағдарламашымен анықталуын талап етеді.

Пайдаланушы анықтаған операторлар

Тілде белгілі бір санда кіріктірілген операторлар болуы мүмкін (мысалы, C және C++, PHP тілдеріндегідей), немесе бағдарламашы анықтаған операторларды жасауға рұқсат етуі мүмкін (мысалы, Prolog, Seed7, F#, OCaml, Haskell). Кейбір бағдарламалау тілдері оператор белгілерін арнайы таңбалармен ғана шектейді, ал басқалары div (мысалы, Pascal) сияқты атауларға да рұқсат береді. Көптеген тілдерде кіріктірілген операторлар жиынтығы бар, бірақ пайдаланушы анықтаған операторларға рұқсат берілмейді, себебі бұл синтаксистік талдауды күрделендіреді. Көптеген тілдерде операторларды тек кіріктірілген типтер үшін ғана пайдалануға рұқсат етіледі, бірақ басқалары пайдаланушы анықтаған типтер үшін де қолданыстағы операторларды пайдалануға рұқсат етеді; мұндай жағдай операторлық жүктеме деп аталады. Кейбір тілдерде жаңа операторларды компиляция кезінде немесе орындалу кезінде анықтауға болады. Бұл метабағдарламалауды (операторларды бөлек тілде көрсетуді) немесе тілдің өзінде іске асырылуы мүмкін. Жаңа операторларды анықтау, әсіресе орындалу кезінде анықтау, бағдарламалардың дұрыс статикалық талдауын мүмкін емес етеді, өйткені тілдің синтаксисі Тьюринг толық болуы мүмкін, сондықтан тіпті синтаксистік ағашты құру үшін де тоқтату мәселесін шешу қажет болуы мүмкін, ал мұндай шешім мүмкін емес. Бұл, мысалы, Perl және Lisp тілінің кейбір диалектілерінде кездеседі.

Жинақтау

Компилятор операторлар мен функцияларды суброутина шақырулары арқылы немесе тікелей кодпен іске асыра алады. Тіл қолдайтын кейбір операторлар орталық процессорларда жиі кездесетін аз ғана нұсқауларға тікелей сәйкес келеді, бірақ басқалары (мысалы, тізбектерді біріктіру үшін қолданылатын "+" сияқты) күрделірек іске асырылуы мүмкін.

Оператордың жүктемесі

Кейбір бағдарламалау тілдерінде оператор ad hoc полиморфты болуы мүмкін, яғни, бірнеше түрлі дерек үшін анықтамалары болуы мүмкін (мысалы, Java-да оператор сандарды қосу және жолдарды біріктіру үшін де қолданылады). Мұндай операторға жүктеме берілген деп айтылады. Бағдарламашы операторларды жүктеуге мүмкіндік беретін (мысалы, C++) бірақ операторлар жиынтығы шектеулі тілдерде, операторларды жүктеу көбінесе операторлардың арнайы қолданылуын анықтау үшін пайдаланылады. Мысалда операторлар: > (үлкен) және < (кішкентай) болып табылады.

Операциялық және мәжбүрлеу

Кейбір тілдер оператордың операндарын операция орындалуы үшін сәйкес дерек түрлеріне автоматты түрлендіруге немесе мәжбүрлеуге мүмкіндік береді. Мысалы, Perl тілінде мәжбүрлеу ережелері 12 + "3.14" амалын 15.14 нәтижесіне жеткізеді. "3.14" мәтіні қосу амалы орындалуынан бұрын 3.14 санына түрлендіріледі. Бұдан әрі, 12 – бүтін сан, ал 3.14 – қалқыма немесе қатаң нүктелі сан (ондық бөлігі бар сан), сондықтан бүтін сан да сәйкесінше қалқыма немесе қатаң нүктелі санға түрлендіріледі. JavaScript кері ережелерді қолданады: осыған ұқсас өрнекті қарастырғанда, ол 12 бүтін санын "12" жолына түрлендіреді, содан кейін екі операндты біріктіріп "123.14" жолын құрайды. Тілде мәжбүрлеулер болған жағдайда, бағдарламашы операндар түрлеріне және амал нәтижесінің түріне қатысты нақты ережелерді білуі керек, себебі бұл бағдарламалаудағы қателерді болдырмау үшін маңызды.