Conform uneia dintre clasificări, limbajele de programare sunt împărțite informal în tip puternic și slab tip , adică având un sistem de tip puternic sau slab . Acești termeni nu sunt interpretați fără ambiguitate și sunt folosiți cel mai adesea pentru a indica avantajele și dezavantajele unei anumite limbi. Există concepte mai specifice care duc la denumirea anumitor sisteme de tip „ puternic ” sau „ slab ”.
În literatura de limbă rusă, termenul „ dactilografiere puternică ” [1] [2] este adesea folosit ; varianta comuna " dactilografiere puternica " este utilizat numai când contrastează " tastare slabă ". Rețineți că folosirea termenului " strict " în relație cu sistemul de tip al unei limbi poate provoca confuzie cu semantica strictă de evaluare a limbii .
În 1974, Liskov și Zilles au numit limbaje puternic tipizate în care „ când un obiect este trecut de la o funcție de apelare la o funcție apelată, tipul acelui obiect trebuie să fie compatibil cu tipul definit în funcția apelată ” [3] . Jackson a scris: „ Într-un limbaj puternic tipizat, fiecare celulă de date va avea un tip unic și fiecare proces își va proclama cerințele de relație în ceea ce privește aceste tipuri ” [4] .
În articolul lui Luca Cardelli „ Full Type Programming ” 5] , un sistem de tip este numit „puternic” dacă elimină posibilitatea unei erori de potrivire a tipului de rulare. Cu alte cuvinte, absența erorilor de rulare neverificate se numește siguranță de tip ; Lucrările timpurii ale lui Hoare numesc această proprietate de securitate .
Tastarea „puternică” și „slabă” este produsul multor decizii luate în proiectarea unei limbi. Mai precis, limbile se caracterizează prin prezența sau absența siguranței de consistență a tipului și a siguranței accesului la memorie , precum și sincronizarea caracteristică a unui astfel de control ( static sau dinamic ).
De exemplu, exemple clare de sistem de tip slab sunt cele care stau la baza limbajelor C și C++ . Atributele lor caracteristice sunt conceptele de turnare de tip și jocuri de cuvinte dactilografiere . Aceste operațiuni sunt suportate la nivel de compilator și sunt adesea numite implicit. O operație reinterpret_castîn C++ vă permite să reprezentați un element de date de orice tip ca aparținând oricărui alt tip, cu condiția ca lungimea implementării lor la nivel scăzut (reprezentarea biților) să fie egală și modificați starea într-un mod care nu este valid pentru tipul de sursă. Folosirea neglijentă a unor astfel de operațiuni este adesea sursa blocărilor programului . În ciuda acestui fapt, manualele C++ descriu sistemul său de tip ca fiind „ puternic ”, care, având în vedere teza lui Luca Cardelli [5] și alții, ar trebui înțeles ca „ mai puternic decât în C ”. În schimb, în limbile tipizate conform Hindley-Milner , conceptul de turnare a tipului este absent în principiu. Singura modalitate de a „converti” un tip este să scrieți o funcție care construiește algoritmic o valoare a tipului necesar din valoarea tipului original. Pentru cazuri banale, cum ar fi „conversia” unui întreg fără semn într-un întreg cu semn și invers, astfel de funcții sunt de obicei incluse în bibliotecile standard. Cel mai frecvent utilizat caz al acestui tip de funcții sunt funcțiile speciale definite cu un corp gol, numite funcții de constructor sau pur și simplu constructori .
În același timp , sistemul de tip Hindley-Milner oferă o rată extrem de mare de reutilizare a codului datorită polimorfismului parametric . Un sistem de tip puternic, dar nu polimorf, poate face dificilă rezolvarea multor probleme algoritmice, așa cum sa observat în legătură cu limbajul Pascal [6] .
Există opinia că tastarea puternică este un element indispensabil pentru asigurarea fiabilității software-ului dezvoltat. Când este utilizat corect (însemnând că programul declară și utilizează tipuri de date separate pentru valori incompatibile din punct de vedere logic), protejează programatorul de erori simple, dar greu de găsit asociate cu partajarea valorilor incompatibile din punct de vedere logic, uneori decurgând dintr-o simplă greșeală de scriere.
Astfel de erori sunt detectate chiar și în etapa de compilare a programului, în timp ce cu posibilitatea conversiei implicite a aproape oricăror tipuri între ele (ca, de exemplu, în limbajul clasic C), aceste erori sunt detectate numai în timpul testării și nu toate și nu imediat, ceea ce uneori este foarte costisitor în stadiul de operare industrială.
Python este un exemplu de limbaj cu tastare dinamică puternică [7] .