Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Компьютерлік ғылымда типтік жүйе номиналды (немесе атаулы, атауға негізделген) деп аталады, егер дерек типтерінің үйлесімділігі мен теңдестігі нақты жариялаулармен және/немесе типтердің аты арқылы анықталса. Номиналды жүйелер типтердің тең екендігін, сондай-ақ бір типтің екінші типтің ішкі түрі болып табылатынын анықтау үшін қолданылады. Номиналды типтік жүйелер құрылымдық жүйелерден өзгеше, онда салыстырулар типтердің құрылымына негізделеді және нақты жариялаулар қажет болмайды.
In computer science, a type system is nominal (also called nominative or name based) if compatibility and equivalence of data types is determined by explicit declarations and/or the name of the types. Nominal systems are used to determine if types are equivalent, as well as if a type is a subtype of another. Nominal type systems contrast with structural systems, where comparisons are based on the structure of the types in question and do not require explicit declarations.
Номиналды типтеу
Номиналды типтеу екі айнымалының типтері декларацияларында аталған типтер бірдей болған жағдайда ғана үйлесімді болып саналады. Мысалы, C тілінде бір аударма бірлігінде әртүрлі атаулары бар екі құрылым типі, тіпті олардың өрістері бірдей болса да, үйлесімді деп есептелмейді. Дегенмен, C тілінде `typedef` декларациясын қолдануға болады, ол қолданыстағы тип үшін псевдоним (лақап ат) енгізеді. Бұл тек синтаксистік ерекшелік және типті тексеру кезінде типті оның псевдонимінен ажыратпайды. Көптеген тілдерде кездесетін бұл мүмкіндік, мысалы, бірдей қарапайым бүтін сан типі екі семантикалық түрлі мағынада қолданылған кезде тип қауіпсіздігінің жоғалуына алып келуі мүмкін. Haskell C тіліндегідей синтаксистік псевдонимді `type` декларациясы түрінде, сондай-ақ `newtype` декларациясы түрінде ұсынады, ол қолданыстағы типке изоморфты жаңа, ерекше типті енгізеді.
Nominal typing means that two variables are type compatible if and only if their declarations name the same type. For example, in C, two struct types with different names in the same translation unit are never considered compatible, even if they have identical field declarations. However, C also allows a typedef declaration, which introduces an alias for an existing type. These are merely syntactical and do not differentiate the type from its alias for the purpose of type checking. This feature, present in many languages, can result in a loss of type safety when (for example) the same primitive integer type is used in two semantically distinct ways. Haskell provides the C style syntactic alias in the form of the type declaration, as well as the newtype declaration that does introduce a new, distinct type, isomorphic to an existing type.
Номиналды субтиптеу
Сол сияқты, номиналды кіші типтеу дегеніміз, бір тип екіншісінің кіші түрі болып табылады, егер және тек қана оның анықтамасында осылай нақты түрде жарияланған болса. Номиналды типтегі тілдер әдетте жарияланған кіші типтердің құрылымдық үйлесімді болуын талап етеді (бірақ Eiffel үйлесімсіз кіші типтерді жариялауға рұқсат береді). Дегенмен, құрылымдық жағынан үйлесімді, бірақ кіші тип ретінде жарияланбаған типтер кіші типтер деп есептелмейді. C++, C#, Java, Kotlin, Objective C, Delphi, Swift, Julia және Rust негізінен номиналды типтеу және номиналды кіші типтеуді қолданады. Кейбір номиналды кіші типтеу тілдері, мысалы Java және C#, сыныптарды соңғы (немесе C# терминологиясында мөрленген) деп жариялауға мүмкіндік береді, бұл одан әрі кіші типтеуге рұқсат етілмейтінін білдіреді.
In a similar fashion, nominal subtyping means that one type is a subtype of another if and only if it is explicitly declared to be so in its definition. Nominally typed languages typically enforce the requirement that declared subtypes be structurally compatible (though Eiffel allows non compatible subtypes to be declared). However, subtypes which are structurally compatible "by accident", but not declared as subtypes, are not considered to be subtypes. C++, C#, Java, Kotlin, Objective C, Delphi, Swift, Julia and Rust all primarily use both nominal typing and nominal subtyping. Some nominally subtyped languages, such as Java and C#, allow classes to be declared final (or sealed in C# terminology), indicating that no further subtyping is permitted.
Салыстыру
Номиналды типтеу кездейсоқ түр теңдестігінің алдын алуға көмектеседі, бұл құрылымдық типтеуге қарағанда жақсы түр қауіпсіздігін қамтамасыз етеді. Мұның айыбы – икемділіктің төмендеуі, себебі, мысалы, номиналды типтеу қолданыстағы кіші түрлерді өзгертпестен жаңа жоғары түрлер жасауға рұқсат бермейді.
Nominal typing is useful at preventing accidental type equivalence, which allows better type safety than structural typing. The cost is a reduced flexibility, as, for example, nominal typing does not allow new super types to be created without modification of the existing subtypes.