Podle jedné z klasifikací jsou programovací jazyky neformálně rozděleny na silně a slabě typované , to znamená, že mají systém silného nebo slabého typu . Tyto pojmy nejsou vykládány jednoznačně a nejčastěji se používají k označení výhod a nevýhod konkrétního jazyka. Existují specifičtější pojmy, které vedou k pojmenování určitých typových systémů „ silný “ nebo „ slabý “.
V ruskojazyčné literatuře se často používá termín „ silné psaní “ [1] [2] ; běžná varianta " silné psaní " se používá pouze při kontrastu " slabé psaní ". Všimněte si, že používání termínu „ přísný “ ve vztahu k typovému systému jazyka může způsobit zmatek s přísnou sémantikou hodnocení jazyka .
V roce 1974 Liskov a Zilles nazývali silně typované jazyky, ve kterých „ když je objekt předán z volající funkce do volané funkce, typ tohoto objektu musí být kompatibilní s typem definovaným ve volané funkci “ [3] . Jackson napsal: „ V silně typizovaném jazyce bude mít každá datová buňka jedinečný typ a každý proces bude deklarovat své požadavky na vztah z hlediska těchto typů “ [4] .
V článku Lucy Cardelliho " Full Type Programming " 5] se typový systém nazývá "silný", pokud eliminuje možnost chyby při shodě typu za běhu. Jinými slovy, nepřítomnost nekontrolovaných chyb za běhu se nazývá bezpečnost typu ; Hoareova raná práce tomu říká zabezpečení majetku .
„Silné“ a „slabé“ psaní je výsledkem mnoha rozhodnutí učiněných při návrhu jazyka. Přesněji řečeno, jazyky se vyznačují přítomností nebo nepřítomností bezpečnosti typové konzistence a bezpečnosti přístupu do paměti , jakož i charakteristickým načasováním takového ovládání ( statické nebo dynamické ).
Jasnými příklady systému slabého typu jsou například systémy, které jsou základem jazyků C a C++ . Jejich charakteristickým rysem jsou koncepty typového lití a typizačních hříček . Tyto operace jsou podporovány na úrovni kompilátoru a jsou často volány implicitně. Operace reinterpret_castv C++ vám umožňuje reprezentovat datový prvek jakéhokoli typu jako náležející k jakémukoli jinému typu, za předpokladu, že délka jejich nízkoúrovňové implementace (bitová reprezentace) je stejná. a změňte jeho stav způsobem, který je pro daný typ zdroje neplatný. Neopatrné používání takových operací je často zdrojem pádů programu . Navzdory tomu učebnice C++ popisují jeho typový systém jako „ silný “, který by měl být vzhledem k tezi Lucy Cardelliho [5] a dalších chápán jako „ silnější než v C “. Naproti tomu v jazycích psaných podle Hindley-Milnera koncept typového odlévání v zásadě chybí. Jediný způsob, jak „převést“ typ, je napsat funkci, která algoritmicky zkonstruuje hodnotu požadovaného typu z hodnoty původního typu. Pro triviální případy, jako je „převod“ celého čísla bez znaménka na celé číslo se znaménkem a naopak, jsou takové funkce obvykle součástí standardních knihoven. Nejčastěji používaným případem tohoto druhu funkcí jsou speciálně definované funkce s prázdným tělem, nazývané konstruktorové funkce nebo jednoduše konstruktory .
Systém typu Hindley-Milner zároveň poskytuje extrémně vysokou míru opětovného použití kódu díky parametrickému polymorfismu . Silný, ale ne polymorfní typový systém může ztížit řešení mnoha algoritmických problémů, jak bylo uvedeno v souvislosti s jazykem Pascal [6] .
Existuje názor, že silné psaní je nepostradatelným prvkem pro zajištění spolehlivosti vyvinutého softwaru. Při správném použití (to znamená, že program deklaruje a používá samostatné datové typy pro logicky nekompatibilní hodnoty) chrání programátora před jednoduchými, ale těžko dohledatelnými chybami spojenými se sdílením logicky nekompatibilních hodnot, které někdy vznikají jednoduše pouhým překlepem.
Takové chyby jsou detekovány již ve fázi kompilace programu, přičemž při možnosti implicitní konverze téměř libovolných typů na sebe (jako např. v klasickém jazyce C) jsou tyto chyby detekovány pouze při testování, nikoli všechny a ne hned, což je ve fázi průmyslového provozu někdy velmi nákladné.
Python je jedním příkladem jazyka se silným dynamickým psaním [7] .