У програмским језицима, систем типова је збирка правила који додељује правилно названи тип различитим конструкцијама програма од кога се састоји, као што су променљиве, експресије, функције или модули. Главна сврха система типизирања је да смањи могућности за багове у рачунарским програмима дефинисањем сучеља између различитих делова компјутерског програма, и онда да провери да ли су делови повезани на доследан начин. Ова провера се може десити статично (при компилираном времену), динамично (при рантајму), или као комбинација статичке и динамичке провере. Системи типизирања имају остале сврхе такође, као што је омогућавање одређених оптимизација компилатора, дозвола за вишеструку опрему, пружање форме документације, итд.
Систем типизирања сарађује са типом од сваке израчунате вредности и, провером протока ових вредности, покушава да осигура или докаже да се ниједна грешка у типизирању неће појавити. Посебни систем типизирања у питању одлучује тачно шта чини грешку типизирања, али углавном циљ је да се спрече операције од којих се очекује одређени тип вредности који користи вредности за које те операције немају смисла (логичке грешке); грешке меморије ће такође бити спречене. Системи типизирања су често део програмских језика, и уграђени у интерпретаторе и компилаторе; иако систем типизирања језика може бити надограђен опционим алаткама који одрађују додатне врсте провере користећи се оригиналном синтаксом језика или граматиком.
Преглед употребе Пример једноставног система типова се налазу у С језику. Делови С програма су дефиниције функција. Једна функција је позвана другом функцијом. Сучеље функције наводи име функције и листу вредности које се прослеђују до кода функције. Код позване функције наводи име позваног, заједно са именима променљивих који чувају вредности да би га проследили. Током извршења, вредности су стављење у привремено складиште, онда извршење скочи до кода позване функције. Код позване функције приступа вредностима и користи их. Ако су инструкције унутар функције исписане са претпоставком да примају целобројну вредност, али позвани код је проследио децималну вредност, онда ће нетачни резултат бити израчунат од стране позване функције. С компилатор проверава декларисани тип за сваку послату променљиву, против декларисаног типа за сваки променљиву у сучељу позване функције. Ако типови нису исти, компилатор избацује грешку.
Компилатор може такође користити статички тип вредности да оптимизује складиште које му је потребно и избор алгоритама за операције над вредностима. У многим С компилаторима децимални тип података, на пример, је представљен у 32 бита, у сагласности са IEEE 754. Они ће тако користити специфичну-децималну-тачку скупа операција над тим вредностима (адиција децималне-тачке, множење, итд. ).
Дубина типа ограничења и манир њихове процене утиче на типизирање језика. Програмски језик може даље помагати операцији са различитим конкретним алгоритмима над сваким типом у случају типа полиморфизма. Теорија типизирања је студија система типизирања, иако конкретни системи типизирања програмских језика потичу од делова проблема компјутерске архитектуре, компилаторске имплементације, и дизајна језика.
Основе Формално, теорије типизирања проучавају системе типизирања. Програмски језик мора имати догађај да би проверио типизирање користећи се системом типизирања или при компилаторском времену или рантајму, ручно забележен или аутоматски закључен. Као што је Марк Манасе рекао:
Додела типа података—типизирање— даје значење секвенцама битова као што је вредност у меморији или неки објекат као што је променљива. Хардвер рачунара генералне сврхе није у могућности да разлике између на пример меморијске адресе и инструкциског кода, или између карактера, целог броја, или децималне тачке, зато што га не чини унутрашњу разлику између било које могуће вредности које би секвенце битова могле да "значе"". Повезивање секвенци битова са типом преноси то значење хардверу како би се формирао симболични систем сачињен од хардвера и неког програма.
Програм потпомаже свакој вредност са најмање једним одређеним типом, али се такође може стартовати једну вредност која је повезана са многох подтиповима. Други ентитети, као што су објекти, модули, канали комуникације, зависности могу се повезати са типизирањем. Чак и типизирање се може повезати са типизирањем. Имплементација система типизирања може у теорији повезати идентификације назване тип података (тип вредности), класа (тип објектна), и врста (тип типа, или метатип). Ово су апстракције кроз које типизирање пролази, над хијерархијом нивоа који се налазе у систему.
Када програмски језик укључује разрађен систем типизирања, добија фино зрнастији сет правила од класичне провере типизирања, али ово долази по са ценом да када закључци типизирања (и остале особине) постану неодлучив задатак, и када више пажње мора да се посвети од стране програмера да забележи код или да размотри операције које се односе на рачунар и функционисање. Изазов је наћи довољно изражајан систем типизирања који задовољава све вежбе програмирања у маниру сигурног типизирања.
Што је више рестрикција типизирања наметнуто од стране компилатора, биће јаче укуцан програмски језик. Јако укуцани језици често захтевају од програмера да направе екплицитне конверзије у контексту где имплицитна конверзија не би шкодила. Паскалов систем типизирања је описан као "прејак" зато што, на пример, величина низа или ниске је део типизирања, што чини неки програмерски задатак тешким. : Why Pascal is not my favorite language Хаскел је такође јако укуцан али његова типизирања су аутоматски закључена тако да су експлицитне конверзије често (али не и увек) беспотребне.
Компилатор програмског језика може такође имплементовати зависно типизирање или ефектни систем, што омогућава још програмских спецификација који треба да буду потврђени од стране контролора типизирања. Осим једноставних вредности-типизирања парова, виртуелни "регион" кода сарађује са "ефектном" компонентом описујући шта је урађено са чим, и дозвољавајући на пример да се "одбаци" извештај грешке. Тако симболични систем може бити систем типизирања и ефекта, што чини сигурнију проверу него самосталну проверу.
Да ли је аутоматизован од стране компилатора или спецификован од стране програмера, систем типизирање чини понашање програма илегалним што је ван правила система типизирања. Предности које су пружене од стране програмера укључују : Апстракција (или модуларност) – типизирања која омогућују програмерима да размишљају на вишем нивоу од бита или бајта, недосађујући се са ниско-нивоим имплементацијама. На пример, програмери могу почети да размишљају о ниски као п збирци карактера вредности уместо као чист низ бајтова. Високо идаље, типизирања омогућавају програмерима да размишљају и да изразе сучеља између било која два подсистема. Ово омогућава више нивоа локализације тако да захтеване дефиниције за компатибилност подсистема остају доследне када та два подсистема комуницирају. Документација– У изражајнијим типовима типизирања, типизирање може служити као форма документације која разјашњава намеру програмера. На пример, ако програмер декларише функцију као поврато време типизирања, ово документује функцију када временско типизирање може бити екпслицитно декларисано дубље у коду да би постао целобројни тип.
Предности које пружа компилатор система типизирања укључују: Оптимизација – Статични тип провере типизирања може пружити корисну комплитаорску информацију. На пример, ако тип захтева да вредност мора бити поравната у меморију као дељив са четири бајта, компилатор може бити у могућности да користи ефикацније инструкције машина. Сигурност – Систем типизирања омогућује компилатору да детектује нејасноће или вероватно нетачни код. На пример, можемо идентификовати експресију 3 / "Hello, World" као нетачну, када правила не говоре како да поделимо цео број са ниском. Јако типизирање пружа већу сигурност, али не може гарантовати комплетну сигурност у типизирању.
Сигурносту у типизирању доприносу програмској тачности, али може гарантовати само тачност на рачун прављења провере типизирања неодлучивог задатка. У систему типизирања са аутоматском провером типизирања програм се може показати да ради нетачно иако је укуцан сигурно, и да не пружа компилторске грешке. Дељење нулом је несигурна и нетачна операција, али контролор типизирања ради само на компилаторском времену који не скенира за дељење нулом у многим програмским језицима, и онда остаје као рантајм грешка. Да би се доказало одсуство ових више-генералних-него-куцаних дефекта, других типова формалних метода, колективно познатих као програмске анализе, се често користе. Алтернативно, довољно експресивни систем типизирања, као у зависним језицима типизирања, може спречити овде типове грешака (на пример, изражавајући "тип не-нултих борјева" ). Као додатак софтверско тестирање је емпирични метод за проналажење грешака које контролор типизирања не може наћи.
Провера типизирања Процес потврде и спровођења ограничења типизирања – провера типизирања –може се десити или при компилираном времену (статичка провера) или рантајм (динамчка провера). Ако језичка спецификација тражи јако типизирање правила (тј, више или мање дозвољава само оне аутоматске конверзије типизирања које не губе информацију), један може да се односи на процес као јако искуцан, ако не, онда слабо искуцан. Термини се не користе често буквално.
Статичка провера типизирања Статичка провера типизирања је процес провере сигурности типизирања програма базираног на анализи програмског текста (изворног кода). Ако програм прође контролора типизирања, онда програм гарантује да задовољи неки скуп карактеристика сигурнусног типизирања за могуће уносе.
Због тога што статичка провера типизирања оперише над текстом програма, то дозвољава многим баговима да буду ухваћени раније у циклусу развитка.
За статичну проверу типизирања може се сматрати као ограничена форма верификације програма (видети сигурно типизирање). У језику сигурног типизирања, за статичну проверу типизирања се такође може сматрати као оптимизација. Ако компилатор може да докаже да је програм добро откуцан, онда не мора да емитује динамичке провере сигурности, што дозвољава бинарном компилираном резултату да ради брже.
Статичка провера типизирања за Тјурингову-комплетност језика је инхерентно конзервативна. То је, ако је систем типизирања и звук (значи да одвија све нетачне програме) и одлучив (значи да је могуће написати алгоритам који одлучује да ли је програм добро откуцан), онда увек ће бити могуће да се дефинише програм који је добро откуцас али који не задовољава контролора типизирања.R´emy, Didier. На пример, размотрити програм који садржи овај код:
if <complex test> then <do something> else <generate type error>
Чак иако експресија <complex test> увек има вредност true при рантајму, већина контролора типизирања ће одбити програм као лоше укуцан, зато што је тешко (ако не и немогуће) за статички анализатор да одлучи да ли else грана неће бити узета. С друге стране, статични контролор типизирања ће брзо детектовати грешке типизирања у ретко коришћеним путевима кода. Без статичке провере типизирања, чак и тестови покривености кода са 100% покривеношћу можда неће бити у могућности да пронађу овакве грешке. Тестови можда неће успети да детектују овакве грешке, зато што комбинација свих места где су вредности креиране и свих места где је одређена вредност коришћена мора бити узета у обзир.
Број корисних и честих карактеристика порграмског језика не може бити проверен статички, као што може даункестинг. Због тога, многи језици ће имати и статичку и динамичку проверу типизирања; статички контролор типизирања проверава шта може, и динамички провера остатак.