Оператор (компьютерлік бағдарламалау) - Operator (computer programming)

Жылы компьютерлік бағдарламалау, операторлар ішінде анықталған құрылымдар болып табылады бағдарламалау тілдері әдетте өздерін ұстайтындар функциялары, бірақ олар ерекшеленеді синтаксистік немесе мағыналық жағынан.

Қарапайым мысалдарға арифметика жатады (мысалы, with with +), салыстыру (мысалы, «үлкен») >), және логикалық операциялар (мысалы, ЖӘНЕ, сондай-ақ жазылған && кейбір тілдерде). Бұған қосымша мысалдар жатады тапсырма (әдетте = немесе :=), өріс жазбадағы қол жетімділік немесе объект (әдетте .), және ауқымды анықтау операторы (жиі :: немесе .). Тілдер, әдетте, кіріктірілген операторлар жиынтығын анықтайды, ал кейбір жағдайларда қолданушыларға қолданыстағы операторларға жаңа мағыналар қосуға немесе тіпті мүлдем жаңа операторларды анықтауға мүмкіндік береді.

Синтаксис

Синтаксистік операторлары, әдетте, контраст жасайды функциялары. Көптеген тілдерде функциялар тіркелген префикс операторының арнайы формасы ретінде қарастырылуы мүмкін басымдық деңгей және ассоциативтілік, көбінесе міндетті жақша мысалы Функция (а) (немесе (Функция а) жылы Лисп ). Көптеген тілдер бағдарламашының функцияларын қолдайды, бірақ егер олар префикстен жоғары және бір басымдылық деңгейінен асып кетпесе, бағдарламашымен анықталған операторларға қолдау көрсете алмайды. Операторларды мағыналық тұрғыдан әр түрлі шақыру белгілері бар және функциялардың шектеулі саны бар (әдетте 1 немесе 2) функцияның ерекше формасы ретінде қарастыруға болады.

Оператордың оның операндтарына қатысты жағдайы болуы мүмкін префикс, инфикс немесе постфикс және ан синтаксисі өрнек операторды тарту оған байланысты ақыл-ой (саны операндтар ), басымдық және (егер бар болса), ассоциативтілік. Бағдарламалау тілдерінің көпшілігі қолдайды екілік операторлар және бірнеше біртұтас операторлар сияқты бірнеше операнды қолдайтындар бар, мысалы ?: үштік болып табылатын С тіліндегі оператор. Бірыңғай минус сияқты префикстің унарлы операторлары бар -x, және postfix бірыңғай операторлары, мысалы кейінгі өсім x ++; және екілік амалдар инфикс болып табылады, мысалы x + y немесе x = y. Жоғары дәрежелі инфикс операциялары қосымша белгілерді қажет етеді, мысалы үштік оператор ?: C тілінде, ретінде жазылады а? b: c - шынымен де, бұл жалғыз қарапайым мысал болғандықтан, оны жиі атайды The үштік оператор. Префикс пен постфикс операциялары кез-келген қажетті дауысты қолдай алады, дегенмен, мысалы 1 2 3 4 +.

Кейде[1][2] тілдің бөліктері «матчфикс» немесе «циркумфикс» ретінде сипатталуы мүмкін[3][4] немесе тілді сипаттауды немесе іске асыруды жеңілдету үшін операторлар. Сирфикс операторы оның операндтарын қоршайтын екі немесе одан да көп бөліктен тұрады. Circumfix операторлары басымдыққа ие, олардың мазмұны бағаланады және алынған мән қоршаған өрнекте қолданылады. Ең танымал циркуль операторы - бұл өрнектің қай бөліктерін басқалардан бұрын бағалау керектігін көрсету үшін жоғарыда айтылған жақша. Физикадан тағы бір мысал - ішкі өнім Дирактың белгісі көкірекше белгілері. Circumfix операторлары операндтардың көп немесе әр түрлі сандарын қамтитын операцияларды белгілеу үшін әсіресе пайдалы.

Тілдің спецификациясы ол қолдайтын операторлардың синтаксисін анықтайды, ал сияқты тілдер Пролог бағдарламашымен анықталған операторларды қолдайтын синтаксисті бағдарламашы анықтайтынын талап етеді.

Семантика

Операторлардың семантикасы әсіресе мәнге, бағалау стратегиясына және аргументтерді беру режиміне байланысты (мысалы, логикалық қысқа тұйықталу). Жай өрнек операторды тарту қандай-да бір жолмен бағаланады және нәтиже мәні жай мән болуы мүмкін (r мәні) немесе тағайындауға мүмкіндік беретін объект болуы мүмкін (l мәні).

Қарапайым жағдайларда, бұл әдеттегі функционалды қоңыраулармен бірдей; мысалы, қосу x + y әдетте функционалды шақыруға балама қосу (х, у) және салыстыруға қарағанда аз x дейін lt (x, y), яғни аргументтер әдеттегідей бағаланады, содан кейін кейбір функциялар бағаланады және нәтиже мән ретінде қайтарылады. Алайда, семантика айтарлықтай өзгеше болуы мүмкін. Мысалы, тапсырмада a = b мақсат а бағаланады, бірақ оның орнына орналасқан жері (адрес) мәнін сақтау үшін қолданылады б - сәйкес анықтама бойынша шақыру семантика. Әрі қарай, тапсырма оператор болуы мүмкін (ешқандай мән жоқ) немесе өрнектің (мәннің) мәні болуы мүмкін, оның мәні не r-мәні (тек мән) немесе l-мәні (тағайындалуы мүмкін). Тағы бір мысал ретінде ауқымды анықтау операторы :: және элементтерге қол жеткізу операторы. (сияқты Foo :: Bar немесе а) мәндер бойынша емес, жұмыс істейді атаулар, мәні бойынша шақыру семантика, ал олардың мәні - бұл атау.

L мәндерін операторлық операндтар ретінде пайдалану, әсіресе, унарлы режимде ерекше байқалады ұлғайту және азайту операторлары. Мысалы, C тілінде келесі тұжырым заңды және жақсы анықталған және массив индекстеуінің l мәнін қайтаратындығына байланысты:

х = ++а[мен];

Сол жақ ассоциативті екілік оператор өзінің сол жақ аргументін өзгерткенде (немесе жанама эффект тудырғанда), содан кейін сол аргументті l мәні ретінде бағалаған кезде маңызды қолдану болып табылады.[a] Бұл а-ға мүмкіндік беретін барлық операторлардың дәйекті нұсқасына әсер етеді еркін интерфейс, ұқсас каскадтық әдіс. Жалпы мысал << C ++ операторы iostream еркін шығаруға мүмкіндік беретін кітапхана:

cout << «Сәлеметсіз бе» << " " << «әлем!» << соңы;

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

Тілде кіріктірілген операторлардың белгіленген саны болуы мүмкін (мысалы, +, -, *, <, <=, !, =және т.б. C және C ++, PHP ) немесе ол бағдарламашымен анықталған операторларды құруға мүмкіндік береді (мысалы. Пролог[5], 7. Тұқым[6], F #, OCaml, Хаскелл ). Кейбір бағдарламалау тілдері оператор таңбаларын арнайы символдармен шектейді + немесе := басқалары сияқты аттарға рұқсат береді див (мысалы, Паскаль ).

Көптеген тілдерде кіріктірілген операторлар жиынтығы бар, бірақ қолданушы анықтайтын операторларға мүмкіндік бермейді, өйткені бұл талдауды едәуір қиындатады.[b] Көптеген тілдер операторларды тек кіріктірілген типтер үшін пайдалануға мүмкіндік береді, ал басқалары қолданыстағы операторларды пайдаланушы анықтаған типтер үшін пайдалануға мүмкіндік береді; бұл белгілі оператордың шамадан тыс жүктелуі. Кейбір тілдер жаңа операторларды анықтауға мүмкіндік береді, бірақ компиляция кезінде немесе жұмыс уақытында. Бұл мета-бағдарламалауды (операторларды бөлек тілде көрсету) немесе тілдің өзінде қамтуы мүмкін. Жаңа операторлардың анықтамасы, әсіресе жұмыс уақытының анықтамасы жиі дұрыс болады статикалық талдау бағдарламалардың мүмкін еместігі, өйткені тілдің синтаксисі Тюрингте толық болуы мүмкін, сондықтан синтаксис ағашын құру үшін тоқтату мәселесін шешу қажет болуы мүмкін, бұл мүмкін емес. Бұл үшін пайда болады Перл, мысалы, және кейбір диалектілері Лисп.

Мысалдар

Синтаксистік жағынан ерекшеленетін жалпы мысалдар математикалық болып табылады арифметикалық амалдар, мысалы. «>» үшін «қарағанда үлкен », көбінесе тіл жиынтығынан тыс атаулармен идентификаторлар функциялар үшін және функцияларды шақыруға арналған синтаксистен өзгеше синтаксиспен аталады. Функция ретінде «үлкен» әдетте идентификатормен аталды, мысалы gt немесе үлкен_ден және функция ретінде шақырылады gt (x, y). Оның орнына операция арнайы таңбаны қолданады > (бұл кезінде бөлек токенизирленген лексикалық талдау ), және инфикс жазбасы, сияқты x> y.

Семантикалық тұрғыдан ерекшеленетін жалпы мысалдар (аргументтерді беру режимі бойынша) бульдік операциялар, олар жиі кездеседі қысқа тұйықталуды бағалау мысалы: тек қысқа дәлелденетін конъюнктура (X ЖӘНЕ), егер кейінірек аргументтер жалған болмаса, кейінірек аргументтерді бағалайтын қатаң функциялары бар тілде ғана бағаланады. Мұның орнына if / then / else сияқты әрекет етеді.

Аз таралған операторларға мыналар жатады:

Жинақ

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

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

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

Мысалда IF ORDER_DATE> «31.12.2011» ЖӘНЕ ORDER_DATE <«01/01/2013» БОЛСА, БАСҚА ТОҚТАДЫ, операторлары: «>» (үлкен), «AND» және «<» (кіші).

Операнды мәжбүрлеу

Кейбір тілдер оператордың операндаларын жанама түрде түрлендіруге мүмкіндік береді немесе мәжбүрледі, операцияның орын алуы үшін қолайлы деректер түрлеріне. Мысалы, in Перл мәжбүрлеу ережелері әкеледі 12 + "3.14" нәтижесін шығарады 15.14. Мәтін "3.14" қосу орын алғанға дейін 3.14 санына ауыстырылады. Әрі қарай, 12 бүтін сан және 3.14 немесе өзгермелі немесе тіркелген нүкте саны (ондық таңбасы бар сан), сондықтан бүтін сан өзгермелі нүктеге немесе тұрақты нүктеге ауыстырылады.

JavaScript қарама-қарсы ережелерге сәйкес - жоғарыдағы бірдей өрнекті тауып, ол бүтін санды түрлендіреді 12 жіпке "12", содан кейін қалыптастыру үшін екі операнды біріктіріңіз "123.14".

Тілдегі мәжбүрлеу болған жағдайда, бағдарламалаушы қате бағдарламалау қателіктерін болдырмау үшін операнд типтеріне және операция нәтижесінің түріне қатысты нақты ережелерді білуі керек.

Бағдарламалау тілдеріндегі оператордың ерекшеліктері

Келесі кестеде бірнеше бағдарламалау тілдеріндегі оператордың мүмкіндіктері көрсетілген:

Бағдарламалау тіліСандық емес операторлық шартты белгілерОператордың әріптік-сандық белгілеріПрефиксИнфиксПостфиксБасымдықАссоциативтілікШамадан тыс жүктемеБағдарламашымен анықталған шамадан тыс жүктемеБағдарламалаушы анықтаған оператор таңбалары
ALGOL 68+* ** * / % %* %× - + < <= >= > = /= & -:= +:= *:= /:= %:= %*:= +=: :=: :/=:

(Барлық операторларда бар батыл Әріптік-эквиваленттер, б.ғ.д. келесі баған. Кейбіреулерінде жоқ ASCII баламалары, б.ғ.к. төменде.)¬ +× ⊥ ↑ ↓ ⌊ ⌈ × ÷ ÷× ÷* □ ≤ ≥ ≠ ∧ ∨ ×:= ÷:= ÷×:= ÷*:= %×:= :≠:

емес абс аргумент қоқыс жәшігі толығымен ленг деңгей тақ қайта дөңгелек қысқарту мен шл шр жоғары төмен lwb upb лт ле ге gt экв не және немесе аяқталды мод елем минусаб плюс timesab диваб артық modab плюсто болып табылады емесИәИәЖоқИә (префикс операторлары әрдайым 10 басымдыққа ие)Инфикс операторлары сол жақ ассоциативті, префикс операторлары - оң ассоциативтіИәИәИә
APL+ - × ÷ ⌈ ⌊ * ⍟ | ! ○ ~ ∨ ∧ ⍱ ⍲ < ≤ = ≥ > ≠ . @ ≡ ≢ ⍴ , ⍪ ⍳ ↑ ↓ ? ⍒ ⍋ ⍉ ⌽ ⊖ ∊ ⊥ ⊤ ⍎ ⍕ ⌹ ⊂ ⊃ ∪ ∩ ⍷ ⌷ ∘ → ← / ⌿ \ ⍀ ¨ ⍣ & ⍨ ⌶ ⊆ ⊣ ⊢ ⍠ ⍤ ⌸ ⌺ ⍸Әріптік-сандық белгілерге кілт сөзінен бұрын ⎕ керекИә (тек бірінші ретті функциялар үшін)ИәИә (тек жоғары ретті функциялар үшін)Жоғары ретті функциялар бірінші ретті функциялардан бұрынЖоғары ретті функциялар сол жақ ассоциативті, бірінші ретті функциялар оң ассоциативтіИәИәИә (тек әріптік-сандық)
C() [] -> . ! ~ ++ -- + - * & / % << >> < <= > >= == != ^ | && || ?: = += -= *= /= %= &= ^=өлшеміИәИәИәИәИәИәЖоқЖоқ
C ++ (Көбірек )өлшемі типид жаңа жою лақтыру деклип статикалық_каст динамикалық құрам reinterpret_cast const_castИәИәИәИәИәИәИәЖоқ
C # (Көбірек )C / C ++ сияқты, бірге ?.  ?[] ??өлшемі жаңа стекалок күтілуде лақтыру тексерілмеген, делегат әдепкі ретінде жалған
LINQ: қай жерден топты таңдаңыз ... топ бойынша ... бойынша ... қосылу ... жылы ... бойынша ... тең ... тапсырыс бойынша ... қосылу ... мен ... бойынша ... тең ... тәртіп бойынша. .. төмендеу
Розлин - тек: __makeref __refvalue __reftype
ИәИәИәИәИәИәИәЖоқ
JavaC / C ++ сияқтыжаңа лақтыру тұрақты емесИәИәИәИәИәИәЖоқЖоқ
Эйфель[] + - * / // = /=емес, немесе «немесе» содан кейін «немесе»ИәИәЖоқИәИәЖоқИәИә
Хаскелл+ - * / ^ ^^ ** == /= > < >= <= && || >>= >> $ $! . ++ !! : Жалпы кітапханаларда тағы басқаларыФункцияның атауын кері сілтемелерге енгізу керекИәИәЖоқИәИәИя, пайдалану Сабақ типіИә
Паскаль* / + - = < > <> <= >= :=емес див мод және немесе жылыИәИәЖоқИәИәИәЖоқЖоқ
Перл-> ++ -- ** ! ~ \ + - . =~ !~ * / % < > <= >= == != <=> ~~ & | ^ && || ' басып шығару сұрыптау chmod chdir rand және жоқ, немесе xor lt gt le ge eq ne cmp xИәИәИәИәИәИәИәЖоқ
Раку++ -- ** ! ~ ~~ * / + - . < > <= >= == != <=> & | ^ && || // [7]басып шығару сұрыптау chmod chdir rand және жоқ xor lt gt le ge eq ne leg cmp x xxИәИәИәИәИәИәИәИә[8]
PHP[] ** ++ -- ~ @![9] * / % + - . << >> < <= > >= == != === !== <> <=> & ^ | && || ?? ?: = += -= *= **= /= .= %= &= |= ^= <<= >>=жаңа орнатылмаған басып шығару эхохабетін клондау тұрақты емес және немесе xorИәИәИәИәИәЖоқЖоқЖоқ
PL / I( ) -> + - * / ** > ¬> >= = ¬= <= < ¬< ¬ & | ||ИәИәЖоқИәИәЖоқЖоқЖоқ
Пролог:- ?- ; , . =.. = \= < =< >= > == \== - + / *шпиондық шпион емесИәИәИәИәИәЖоқЖоқИә
7. Тұқым{} [] -> ** ! + - * / << >> & >< | = <> > >= < <= <& := +:= -:= *:= /:= <<:= >>:= &:= @:=conv varConv талдау біріктіру див рем mdiv мод рет көп емес және немесе lpad rpad lpad0 сандарыИәИәИәИәИәИәИәИә
Smalltalk(иә - екі таңбаға дейін[10])Әріптік-сандық шартты белгілерге кілт сөзінен кейін көп нүкте қою керекЖоқИәИәЖоқЖоқИәИәИә
СвифтЮникодтың кез-келген символдық жолынан басқа ., оның ішінде ! ~ + - * / % =+ =- =* =/ =% &+ &- &* =&+ =&- =&* && || << >> & | ^ == != < <= > >= ?? ... ..< стандартты кітапханадасияқты?ИәИәИәИә (басымдық топтарындағы ішінара ретімен анықталған)Иә (басымдық топтарының бөлігі ретінде анықталған)ИәИәИә
Visual Basic .NET() . ! ?() ?. ?! + - * / \ & << >> < <= > >= ^ <> = += -= *= /= \= &= ^= <<= >>=Жаңа күту режимі сияқты емес, сонымен қатар OrElse Xor емес, егер (..., ...) If (..., ..., ...) GetXmlNamespace (...) GetType (...) NameOf ( ...) TypeOf ... TypeOf ... IsNot DirectCast (..., ...) TryCast (..., ...) CType (..., ...) CBool ​​(...) CByte (...) CChar (...) CDate (...) CDec (...) CDbl (...) CInt (...) CLng (...) CObj (...) CSByte ( ...) CShort (...) CSng (...) CStr (...) CUInt (...) CULng (...) CUShort (...)
LINQ: Агрегаттан ... Айқын жерді таңдау үшін <Тапсырыс бойынша> ... [жоғарылауы | төмендеуі] Ал <Take While> Өткізіп жіберу <Skip While> Топқа ... By ... Қосылуға ... <Топқа қосылуға ... On ... Into> мүмкіндік беріңіз
ИәИәИәИәИәИәИәЖоқ

Сондай-ақ қараңыз

Ескертулер

  1. ^ Керісінше, оң ассоциативті оператор өзінің дұрыс аргументімен, бірақ бұл сирек.
  2. ^ Жаңа операторды енгізу өзгертеді лексикалық спецификация өзгертетін тілдің лексикалық талдау. Оператордың икемділігі мен басымдылығы сол кезде тілдің сөздік синтаксисінің бөлігі болып табылады, ол фраза деңгейіндегі талдауды өзгертеді. Мысалы, операторды қосу @ лексика мен токенизацияны қажет етеді, ал фраза құрылымы (синтаксис ағашы) осы оператордың икемділігі мен басымдылығына байланысты.

Әдебиеттер тізімі

  1. ^ «Оператордың енгізу формалары - Wolfram тіліндегі құжаттама». сілтеме.wolfram.com.
  2. ^ «Maxima 5.42.0 нұсқаулығы: 7. Операторлар». maxima.sourceforge.net.
  3. ^ «Префикс, Постфикс және Циркумфикс операторлары». mythryl.org.
  4. ^ «Операторлар». doc.perl6.org.
  5. ^ «SWI-Prolog - op / 3». www.swi-prolog.org.
  6. ^ «Операторды жарияла». seed7.sourceforge.net.
  7. ^ «Операторлар». docs.perl6.org.
  8. ^ «Функциялар». docs.perl6.org.
  9. ^ «PHP: қателерді басқару операторлары - нұсқаулық». php.net.
  10. ^ Голдберг, Адель. «Smalltalk-80: Тіл және оны енгізу, 27 бет, ISBN 0-201-11371-6» (PDF).