Кіріспе

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

Номиналды типтеу

Номиналды типтеу екі айнымалының типтері декларацияларында аталған типтер бірдей болған жағдайда ғана үйлесімді болып саналады. Мысалы, C тілінде бір аударма бірлігінде әртүрлі атаулары бар екі құрылым типі, тіпті олардың өрістері бірдей болса да, үйлесімді деп есептелмейді. Дегенмен, C тілінде `typedef` декларациясын қолдануға болады, ол қолданыстағы тип үшін псевдоним (лақап ат) енгізеді. Бұл тек синтаксистік ерекшелік және типті тексеру кезінде типті оның псевдонимінен ажыратпайды. Көптеген тілдерде кездесетін бұл мүмкіндік, мысалы, бірдей қарапайым бүтін сан типі екі семантикалық түрлі мағынада қолданылған кезде тип қауіпсіздігінің жоғалуына алып келуі мүмкін. Haskell C тіліндегідей синтаксистік псевдонимді `type` декларациясы түрінде, сондай-ақ `newtype` декларациясы түрінде ұсынады, ол қолданыстағы типке изоморфты жаңа, ерекше типті енгізеді.

Номиналды субтиптеу

Сол сияқты, номиналды кіші типтеу дегеніміз, бір тип екіншісінің кіші түрі болып табылады, егер және тек қана оның анықтамасында осылай нақты түрде жарияланған болса. Номиналды типтегі тілдер әдетте жарияланған кіші типтердің құрылымдық үйлесімді болуын талап етеді (бірақ Eiffel үйлесімсіз кіші типтерді жариялауға рұқсат береді). Дегенмен, құрылымдық жағынан үйлесімді, бірақ кіші тип ретінде жарияланбаған типтер кіші типтер деп есептелмейді. C++, C#, Java, Kotlin, Objective C, Delphi, Swift, Julia және Rust негізінен номиналды типтеу және номиналды кіші типтеуді қолданады. Кейбір номиналды кіші типтеу тілдері, мысалы Java және C#, сыныптарды соңғы (немесе C# терминологиясында мөрленген) деп жариялауға мүмкіндік береді, бұл одан әрі кіші типтеуге рұқсат етілмейтінін білдіреді.

Салыстыру

Номиналды типтеу кездейсоқ түр теңдестігінің алдын алуға көмектеседі, бұл құрылымдық типтеуге қарағанда жақсы түр қауіпсіздігін қамтамасыз етеді. Мұның айыбы – икемділіктің төмендеуі, себебі, мысалы, номиналды типтеу қолданыстағы кіші түрлерді өзгертпестен жаңа жоғары түрлер жасауға рұқсат бермейді.