Кіріспе

Тип жүйелерінің класы

Құрылымдық типтік жүйе (немесе қасиетке негізделген типтік жүйе) – типтік жүйелердің маңызды класы болып табылады, онда типтердің үйлесімділігі мен эквиваленттілігі типтің нақты құрылымы немесе анықтамасымен, атауы немесе жариялану орны сияқты басқа ерекшеліктерімен емес, анықталады. Құрылымдық жүйелер типтердің тең балама екенін және бір типтің екіншісінің ішкі түрі болып табылатынын анықтау үшін қолданылады. Бұл номинативтік жүйелерден, онда салыстырулар типтердің атауларына немесе нақты жарияламаларға негізделген, және динамикалық типтеуден (duck typing), онда үйлесімділік тек орындалу кезінде қол жеткізілетін құрылымның бір бөлігі арқылы тексеріледі, өзгеше.

Сипаттама

Құрылымдық типте, егер екінші элементтің түріндегі әрбір мүмкіндік үшін бірінші элементтің түрінде сәйкес және бірдей мүмкіндік болса, элемент екіншісімен үйлесімді деп есептеледі. Кейбір тілдерде мүмкіндіктердің атаулары сәйкес келуі керек пе, жоқ па, деген сияқты егжей-тегжейлі мәліметтер бойынша айырмашылықтар болуы мүмкін. Бұл анықтама симметриялық емес және субтип үйлесімділігін қамтиды. Егер екі тип бір-бірімен үйлесімді болса, олар бірдей деп саналады. Мысалы, OCaml нысан түрлерінің үйлесімділігі үшін әдістерде құрылымдық типтеуді қолданады. Go әдістерде құрылымдық типтеуді түрдің интерфейспен үйлесімділігін анықтау үшін қолданады. C++ үлгі функциялары тип аргументтерінде құрылымдық типтеуді көрсетеді. Haxe құрылымдық типтеуді қолданады, бірақ сыныптар құрылымдық түрде субтиптелмейді. Субтип полиморфизмін қолдайтын тілдерде субтип қатынасының қалай анықталғанына байланысты ұқсас екіұштылық пайда болуы мүмкін. Бір тип басқасының субтипі болып табылады, егер және тек қана егер ол базалық типтің немесе оның субтипіне тән барлық мүмкіндіктерін қамтитын болса. Субтипте қосымша мүмкіндіктер, мысалы, негізгі типте жоқ мүшелер немесе күшті инварианттар болуы мүмкін. Haskell сияқты кейбір тілдер күтілетін тип жарияланған жағдайда (яғни, қорытындыланбаған жағдайда) құрылымдық түрде алмастырмайды, мысалы, тек типтік қорытындылау арқылы полиморфты қолтаңбалы функцияларды алмастырады. Онда кездейсоқ түрді субтиптеу мүмкін емес, бірақ бұл әлі де жасырын түрде шақырылған, анықталмаған түрге түрлендіруді ұсынуға болады. Құрылымдық субтипілеу номинативтік субтипілеуге қарағанда икемдірек, өйткені ол ad hoc типтері мен протоколдарды жасауға мүмкіндік береді; атап айтқанда, ол қолданыстағы типтің анықтамасын өзгертпей, оның супертипі болып табылатын типті жасауға мүмкіндік береді. Алайда, бағдарламашы жабық абстракцияларды жасағысы келген жағдайда бұл қажет болмауы мүмкін. Құрылымдық типтеудің номинативтік типтеумен салыстырылатын кемшілігі - әр түрлі мақсаттар үшін арналған, бірақ кездейсоқ бірдей қасиеттерге ие екі бөлек анықталған типті (мысалы, екеуі де бүтін сандар жұбынан тұрады) типтік жүйемен бірдей тип деп санауға болады, өйткені олардың құрылымы бірдей. Мұны болдырмаудың бір жолы - әр пайдалану үшін бір алгебралық дерек типін жасау. 1990 жылы Кук және авторлар мұрагерлік құрылымдық типтелген объектіге бағытталған тілдерде субтипізацияланбайтынын дәлелдеді. Екі типтің үйлесімділігін тексеру, құрылымдық типтеу негізінде, тривиальды емес операция болып табылады, мысалы, бұрын тексерілген типтердің стегін сақтауды қажет етеді.