Enligt en av klassificeringarna är programmeringsspråk informellt uppdelade i starkt och svagt typat , det vill säga att ha ett starkt eller svagt typsystem . Dessa termer tolkas inte entydigt och används oftast för att indikera fördelar och nackdelar med ett visst språk. Det finns mer specifika begrepp som leder till att vissa typsystem benämns " starka " eller " svaga ".
I ryskspråkig litteratur används ofta termen " stark typning " [1] [2] ; vanlig variant " starkt skrivande " används endast vid kontrast av " svag typ ". Observera att användning av termen " strikt " i relation till ett språks typsystem kan orsaka förvirring med språkets strikta utvärderingssemantik .
1974 kallade Liskov och Zilles starkt skrivna språk där " när ett objekt överförs från en anropande funktion till en anropad funktion, måste typen av det objektet vara kompatibel med den typ som definieras i den anropade funktionen " [ 3] . Jackson skrev: " I ett starkt skrivet språk kommer varje datacell att ha en unik typ, och varje process kommer att proklamera sina relationskrav i termer av dessa typer " [4] .
I Luca Cardellis artikel " Full Type Programming " 5 ] kallas ett typsystem "starkt" om det eliminerar möjligheten för ett typmatchningsfel vid körning. Med andra ord, frånvaron av okontrollerade körtidsfel kallas typsäkerhet ; Hoares tidiga arbete kallar denna fastighetssäkerhet .
"Stark" och "svag" skrivning är produkten av många beslut som fattas i utformningen av ett språk. Mer exakt kännetecknas språk av närvaron eller frånvaron av typkonsistenssäkerhet och minnesåtkomstsäkerhet , såväl som den karakteristiska timingen för sådan kontroll ( statisk eller dynamisk ).
Till exempel är tydliga exempel på ett system med svag typ de som ligger bakom språken C och C++ . Deras karakteristiska attribut är begreppen typgjutning och maskinskrivning . Dessa operationer stöds på kompilatornivå och kallas ofta implicit. En operation reinterpret_casti C++ låter dig representera ett dataelement av vilken typ som helst som tillhörande någon annan typ, förutsatt att längden på deras lågnivåimplementering (bitrepresentation) är lika och ändra dess tillstånd på ett sätt som är ogiltigt för källtypen. Slarvig användning av sådana operationer är ofta källan till programkrascher . Trots detta beskriver C++-läroböcker dess typsystem som " starkt ", vilket, med tanke på Luca Cardellis [5] och andras tes, bör förstås som " starkare än i C ". I motsats till språk som skrivits enligt Hindley-Milner saknas konceptet med typgjutning i princip. Det enda sättet att "konvertera" en typ är att skriva en funktion som algoritmiskt konstruerar ett värde av den önskade typen från värdet på den ursprungliga typen. För triviala fall, som att "konvertera" ett osignerat heltal till ett signerat heltal och vice versa, är sådana funktioner vanligtvis inkluderade i standardbiblioteken. Det vanligaste fallet med denna typ av funktioner är specialdefinierade funktioner med en tom kropp, kallade konstruktorfunktioner eller helt enkelt konstruktorer .
Samtidigt ger Hindley-Milner-systemet en extremt hög grad av kodåteranvändning på grund av parametrisk polymorfism . Ett starkt men inte polymorft system kan göra det svårt att lösa många algoritmiska problem, vilket noterades i relation till Pascal- språket [6] .
Det finns en åsikt att stark typning är ett oumbärligt element för att säkerställa tillförlitligheten hos utvecklad programvara. När det används på rätt sätt (vilket innebär att programmet deklarerar och använder separata datatyper för logiskt inkompatibla värden) skyddar det programmeraren från enkla men svåra att hitta fel som är associerade med att dela logiskt inkompatibla värden, som ibland bara beror på ett enkelt stavfel.
Sådana fel upptäcks även vid programkompileringsstadiet, medan med möjligheten till implicit konvertering av nästan alla typer till varandra (som till exempel i det klassiska C-språket), upptäcks dessa fel endast under testning, och inte alla och inte omedelbart, vilket ibland är mycket dyrt vid industriell drift.
Python är ett exempel på ett språk med stark dynamisk typning [7] .