Кіріспе
Бағдарламалау тілінің конструкциясы
Компьютерлік ғылымда реляциялық оператор – екі нысан арасындағы қатынасты тексеретін немесе анықтайтын бағдарламалау тілінің конструкциясы немесе операторы. Оларға сандық теңдік (мысалы, =) және теңсіздіктер (мысалы, 4 ≥ 3) жатады. Типтік жүйесіне бульдік дерек типін қамтитын бағдарламалау тілдерінде, мысалы, Паскаль, Ада немесе Java, бұл операторлар әдетте екі операнд арасындағы шартты қатынас орындалса, "ақиқат" (true), орындалмаса "жалған" (false) деп бағаланады. C сияқты тілдерде реляциялық операторлар 0 немесе 1 бүтін санын қайтарады, мұнда 0 – "жалған", ал нөлден өзгеше кез келген сан – "ақиқат" болып есептеледі. Реляциялық операторды қолданып құрылған өрнек реляциялық өрнек немесе шарт деп аталады. Реляциялық операторларды логикалық предикаттардың ерекше жағдайлары ретінде қарастыруға болады.
Қолданылуы
Теңдік көптеген бағдарламалау тілдерінің құрылымдарында және дерек түрлерінде қолданылады. Ол жиынтықтағы элементтің бар-жоғын тексеру үшін, немесе кілт арқылы мәнге қол жеткізу үшін пайдаланылады. Басқару ағынын дұрыс тармаққа бағыттау үшін ауыстыру операторларында (switch statements) және логикалық бағдарламалаудағы біріктіру процесінде қолданылады. Теңдіктің бір мүмкін мағынасы – «егер a, b-ға тең болса, онда a мен b кез келген контексте бір-бірін алмастырып қолданғанда ешқандай айырмашылық байқалмайды». Бірақ бұл тұжырым әрқашан дұрыс болмайды, әсіресе өзгертілгіштік пен мазмұн теңдігін ескергенде.
Түрлі типтегі құндарды салыстыру
JavaScript, PHP, VBScript және басқа да бірнеше динамикалық типтегі тілдерде стандартты теңдік операторы екі мән тең болса, тіпті олардың типтері әртүрлі болса да, `true` мәнін қайтарады. Мысалы, сан 4 мәтіндік жол "4"-ке тең деп салыстырылады. Мұндай тілдерде әдетте типтелген теңдік операторы да қолжетімді, ол бірдей немесе эквивалентті типтегі мәндер үшін ғана `true` мәнін қайтарады (мысалы, PHP-де `4 === "4"` жалған, ал `4 == "4"` – `true`). Сан 0 жалған деп қарастырылатын тілдерде, бұл оператор нөлді тексеру сияқты жағдайларды жеңілдетеді (яғни, `x == 0` түріне қарамастан, `x` 0 немесе "0" болса `true` мәнін қайтарады).
Тапсырыс беру
Сандық емес деректерді үлкен және кіші деп салыстыру, бағдарламалау тіліне кіріктірілген немесе бағдарламашымен конфигурацияланатын сұрыптау конвенциясы бойынша (мысалы, мәтіндік тізбектер үшін лексикографиялық тәртіп) жүзеге асырылады. Екі дерек элементін, мысалы a мен b, салыстыру нәтижесімен сандық мәнді байланыстыру қажет болғанда, әдеттегі конвенция бойынша егер a < b болса -1, егер a = b болса 0, ал егер a > b болса 1 тағайындалады. Мысалы, C тіліндегі strcmp функциясы үш жолды салыстыруды орындайды және осы конвенцияға сәйкес -1, 0 немесе 1 қайтарады, ал qsort функциясы салыстыру функциясы осы конвенцияға сәйкес мәндерді қайтаратынын күтеді. Сорттау алгоритмдерінде салыстыру кодынң тиімділігі маңызды, себебі ол сұрыптау өнімділігіне әсер ететін басты факторлардың бірі болып табылады. Бағдарламашы анықтаған дерек түрлерін (бағдарламалау тілінде түсінігі жоқ дерек түрлері) салыстыру, арнайы жазылған немесе кітапханалық функциялар (мысалы, жоғарыда аталған strcmp) арқылы немесе кейбір тілдерде салыстыру операторын жүктеу арқылы, яғни салыстырылатын дерек түрлеріне байланысты бағдарламашы анықтаған мағына беру арқылы жүзеге асырылуы мүмкін. Тағы бір мүмкіндік – мүшелік салыстыру сияқты белгілі бір конвенцияны қолдану.
Логикалық теңдестік
Алғашында көрінбейтін болса да, XOR, AND, OR және NOT сияқты Буль логикалық операторларындай, реляциялық операторлар да логикалық теңдестікке ие болу үшін құрастырылуы мүмкін, яғни оларды бір-бірі арқылы анықтауға болады. Кез келген берілген x және y мәндері үшін келесі төрт шартты түсініктемелердің барлығы бірдей логикалық теңдестік E-ге (барлығы дұрыс немесе барлығы жалған) ие:
Бұл доменнің жақсы реттелген болуына байланысты.
Стандартты реляциялық операторлар
Бағдарламалау тілдерінде қолданылатын ең көп таралған сандық реляциялық операторлар төменде көрсетілген. Стандартты SQL BASIC-тегі операторларды пайдаланады, ал көптеген деректер базаларында стандарттан өзгеше, <> операторына қосымша != операторына да рұқсат беріледі. SQL қатаң Буль алгебрасын қолданады, яғни көптеген тілдерге тән қысқа тұйықталуды бағалауды қолданбайды. Мысалы, PHP-де мұндай мүмкіндік бар, бірақ басқа жағдайларда көптеген SQL деректер базалары сияқты, бұл екі оператор атаулар ретінде анықталған. + Жалпы реляциялық операторлар Конвенция тең емес тең емес үлкен кішіден үлкен немесе тең кішіден немесе тең Басып шығару = ≠ > < ≥ ≤ FORTRAN EQ. NE. GT. LT. GE. LE. ALGOL 68 = ≠ > < ≥ ≤ /= >= <= eq ne gt lt ge le APL = ≠ > < ≥ ≤ BASIC, ML, Pascal = <> > < >= <= C сияқты == != > < >= <= MUMPS = '= > < '< '> Lua == ~= > < >= <= Erlang == /= > <> == <= :== /= Bourne сияқты қабықшалар eq ne gt lt ge le Batch файлы EQU NEQ GTR LSS GEQ LEQ MATLAB == ~= > < >= <= eq(x,y) ne(x,y) gt(x,y) lt(x,y) ge(x,y) le(x,y) Fortran 90, Haskell == /= > < >= <= Mathematica == != > < >= <= Equal[x,y] Unequal[x,y] Greater[x,y] Less[x,y] GreaterEqual[x,y] LessEqual[x,y]
Басқа конвенциялар жиі қолданылмайды: Common Lisp және Macsyma/Maxima теңсіздік операторын (Common Lisp-те /= және Macsyma/Maxima-да #) басқаша пайдаланып, Basic сияқты операторларды қолданады. Ескі Lisps equal, greaterp және lessp операторларын қолданған, ал қалған операторларды теріске шығару үшін not операторын пайдаланған.
Операторды тізбектеп қою
Математикада реляциялық операторларды тізбектеу кең таралған практика, мысалы 3 < x < y < 20 (яғни 3 < x және x < y және y < 20). Синтаксис анық, өйткені математикадағы бұл реляциялық операторлар транзитивті. Дегенмен, көптеген заманауи бағдарламалау тілдері 3 < x < y сияқты өрнекті екі сол (немесе оң) жақты ассоциативті оператордан тұратын болып қабылдайды, оны (3 < x) < y секілді түсіндіреді. Егер x=4 десек, онда (3 < 4) < y болады, ал есептеу нәтижесінде "true < y" шығады, бұл көбінесе мағынасыз. Алайда, бұл C/C++ және басқа да кейбір тілдерде компиляцияланады, күтпеген нәтиже береді (мұнда "true" 1 санымен бейнеленеді). x < y < z өрнегіне математикалық мағынасын беруге болады, және Python және Raku сияқты кейбір бағдарламалау тілдері солай істейді. C# және Java сияқты тілдер мұны істемейді, себебі бұл C сияқты тілдердегі көптеген инфикс операторлардың жұмыс істеу тәсілінен өзгеше болар еді. D бағдарламалау тілі де мұны істемейді, өйткені ол C-мен үйлесімділікті сақтайды, және "C өрнектеріне рұқсат ету, бірақ сәл өзгеше семантикамен (дегенмен, мүмкін, дұрыс бағытта) ыңғайлылықтан гөрі жаңсақтыққа себеп болар еді". Common Lisp сияқты кейбір тілдер мұны істеу үшін көп аргументті предикаттарды қолданады. Lisp-те (<= 1 x 10) x 1 мен 10 аралығында болғанда ғана "true" мәнін береді.
Тапсыру операторларымен шатасу
Ертедегі FORTRAN (1956–57) өте шектеулі таңбалар жиынтығымен шектелген болатын, онда = жалғыз ғана қатынас операторы қолданылды. < немесе > (сондай-ақ ≤ немесе ≥) белгілері болған жоқ. Бұл дизайнерлерді GT., LT., GE., EQ. сияқты символдарды анықтауға мәжбүр етті және нәтижесінде математикалық қолданысқа қарағанда айқын сәйкессіздік болғанына қарамастан, = таңбасын дерек көшіру үшін пайдалануға итермеледі (X = X + 1 мүмкін болмауы керек еді). Халықаралық алгебралық тіл (IAL, ALGOL 58) және ALGOL (1958 және 1960) тапсырмалау үшін := операторын енгізіп, стандартты = операторын теңдік үшін қолдануға мүмкіндік берді. Бұл конвенция CPL, ALGOL W, ALGOL 68, Basic Combined Programming Language (BCPL), Simula, SET Language (SETL), Pascal, Smalltalk, Modula 2, Ada, Standard ML, OCaml, Eiffel, Object Pascal (Delphi), Oberon, Dylan, VHSIC Hardware Description Language (VHDL) және тағы да бірнеше тілдерде сақталды.
Б және С
Көптеген бағдарламалау тілдері арасындағы бұл де-факто стандарт ақырында B деп аталатын минималистік компиляцияланатын тіл арқылы, жанама түрде өзгертілді. Оның жалғыз мақсаты – (сол кезде өте жайлы) Unix жүйесінің алғашқы портын жасауға көмектесуші құрал болды, бірақ ол өте ықпалды C тіліне айналды. B тілі, CPL тілінің оңайлатылған (және типсіз) нұсқасы болған жүйелік бағдарламалау тілі BCPL-дің синтаксистік өзгертілген түрі ретінде пайда болды. "Төмендету" процесі деп сипатталғанда, BCPL-дің "және" және "немесе" операторлары & және | (кейіннен && және || болады) арқылы ауыстырылды. Мұның себебі белгісіз. Айтқанда, B тілінде айнымалыларды жаңарту үшін ерекше синтаксис болмады (мысалы, let немесе осыған ұқсас) және олар өрнектерде қолданылуына рұқсат етілді, сондықтан теңдік белгісінің бұл стандартты емес мағынасы, теңдік белгісінің дәстүрлі семантикасын енді басқа символмен байланыстыруды талап етті. Кен Томпсон осы мақсатта ad hoc == комбинациясын пайдаланды. Кейіннен шағын типтік жүйе енгізілгеннен кейін B тілі C тіліне айналды. Бұл тілдің танымалдылығы және Unix жүйесімен байланысы Java, C# және көптеген басқа тілдердің де синтаксистік тұрғыдан одан үлгі алуына әкелді, теңдік белгісінің математикалық мағынасымен қажетсіз қайшылыққа қарамастан.