Кіріспе

Кейбір бағдарламалау тілдерінің ерекшелігі

Компьютерлік бағдарламалауда операторды жүктеу, кейде оператордың арнайы полиморфизмі деп те аталады, бұл полиморфизмнің нақты бір түрі. Онда әртүрлі операторлар өз аргументтеріне қарай әртүрлі іске асырылуы мүмкін. Операторды жүктеуді бағдарламалау тілі, бағдарламашы немесе олардың екеуі де анықтай алады.

Сындар

Операторды артық жүктеу жиі сынға ұшырайды, өйткені ол бағдарламашыларға операторлардың семантикасын олардың операндарының түрлеріне байланысты өзгертуге мүмкіндік береді. Мысалы, C++-да `a << b` операторының қолданылуы, егер `a` және `b` бүтін сан түрінде болса, `a` айнымалысының біттерін `b` санымен солға жылдырады, ал егер `a` шығыс ағыны болса, онда аталған код ағынға `b` жазуға тырысады. Операторды артық жүктеу бастапқы бағдарламашыға оператордың қалыпты семантикасын өзгертуге және кейінгі бағдарламашыларды күтпеген жағдайға түсіруге мүмкіндік беретіндіктен, операторды артық жүктеуді сақтықпен пайдалану жақсы тәжірибе саналады (Java жасаушылары осы мүмкіндікті пайдаланбауға шешім қабылдады, бірақ бұл себептің нәтижесі емес). Операторлармен байланысты тағы бір, одан да күрделі мәселе – математикадан белгілі бір ережелерді дұрыс емес күту немесе қасақана қабылдау мүмкіндігі. Мысалы, `+` операторының (яғни `a + b = b + a`) коммутативтілігі әрқашан орындалмайды; операндтар жолдар болғанда осыған мысал келтіруге болады, себебі `+` операторы көбінесе жолдарды біріктіру үшін артық жүктеледі (яғни, `“abc” + “def”` нәтижесі `“abcdef”`, ал `“def” + “abc”` нәтижесі `“defabc”`). Бұл пікірге қарсы математикадан нақты аргумент келеді: `+` операторы бүтін сандар үшін (және жалпы алғанда, кез келген комплекс сандар үшін) коммутативті болса да, басқа "түрдегі" айнымалылар үшін коммутативті емес. Іс жүзінде, `+` операторы тіпті әрқашан ассоциативті болып табылмайды, мысалы, дөңгелектеу қателігіне байланысты қозғалмалы нүктелік мәндермен. Тағы бір мысал: математикада көбейту нақты және комплекс сандар үшін коммутативті, бірақ матрица көбейтуде коммутативті емес.

1980 жылдар

Ada тілінің 83 жылғы стандарты жарияланғаннан бастап-ақ операторларды жүктеуді қолдайды. Дегенмен, тілді жасаушылар жаңа операторларды анықтау мүмкіндігін қарастырмады. Тілдегі бар операторларды ғана "+", "*", "&" сияқты идентификаторлармен жаңа функцияларды анықтап жүктеуге болады. Тілге енгізілген кейінгі өзгерістер (1995 және 2005 жылдары) бар операторларды жүктеуге қатысты шектеуді сақтап келеді. C++ тілінде операторларды жүктеу ALGOL 68 тіліне қарағанда күштірек дамыған.

1990 жылдар

Sun Microsystems компаниясының Java тілін жасаушылары жүктемені (overloading) қолданудан бас тартты. Python тілінде операторларды жүктеуге арнайы атаулары бар әдістерді іске асыру арқылы болады. Мысалы, қосу (+) операторын жүктеу үшін тиісті әдіс іске асырылады. Ruby тілі операторларды жүктеуді әдіс шақыруларын жеңілдету үшін синтаксистік қант ретінде қолданады. Lua тілі де операторларды әдіс шақыруларын жеңілдету үшін синтаксистік қант ретінде жүктеуге мүмкіндік береді, сондай-ақ егер бірінші операндта бұл оператор анықталмаса, екінші операндтың әдісі қолданылады.