Az egyik osztályozás szerint a programozási nyelveket informálisan erősen és gyengén tipizáltra osztják , vagyis erős vagy gyenge típusú rendszerrel rendelkeznek . Ezeket a kifejezéseket nem értelmezik egyértelműen, és leggyakrabban egy adott nyelv előnyeinek és hátrányainak jelzésére használják. Vannak specifikusabb fogalmak, amelyek bizonyos típusú rendszerek " erős " vagy " gyenge " elnevezéséhez vezetnek.
Az orosz nyelvű irodalomban gyakran használják az " erős gépelés " [1] [2] kifejezést ; gyakori változat " erős gépelés " csak akkor használatos, ha a " gyenge gépelés " kontrasztja van. Megjegyzendő , hogy a " szigorú " kifejezés használata egy nyelv típusrendszerével kapcsolatban összetévesztheti a nyelv szigorú értékelési szemantikáját .
1974 -ben Liskov és Zilles erősen tipizált nyelveket neveztek , amelyekben " ha egy objektumot a hívó függvényből egy meghívott függvénybe adnak át, az objektum típusának kompatibilisnek kell lennie a hívott függvényben meghatározott típussal " [3] . Jackson ezt írta: " Egy erősen tipizált nyelvben minden adatcellának egyedi típusa lesz, és minden folyamat kimondja a kapcsolati követelményeit ezeknek a típusoknak megfelelően " [4] .
Luca Cardelli " Full Type Programming " 5] cikkében a típusrendszert "erősnek" nevezik, ha kiküszöböli a futásidejű típusillesztési hiba lehetőségét. Más szavakkal, az ellenőrizetlen futásidejű hibák hiányát típusbiztonságnak nevezzük ; Hoare korai munkája ezt ingatlanbiztonságnak nevezi .
Az „erős” és „gyenge” gépelés a nyelv tervezése során hozott számos döntés eredménye. Pontosabban, a nyelveket a típuskonzisztencia - biztonság és a memóriaelérés biztonságának megléte vagy hiánya , valamint az ilyen vezérlés jellegzetes időzítése ( statikus vagy dinamikus ) jellemzi.
Például a gyenge típusú rendszerek egyértelmű példái azok, amelyek a C és C++ nyelvek mögött állnak . Jellegzetes attribútumuk a típusöntés és a gépelési szójáték fogalma . Ezeket a műveleteket fordítói szinten támogatják, és gyakran implicit módon hívják őket. Egy művelet reinterpret_casta C++ nyelvben lehetővé teszi, hogy bármilyen típusú adatelemet bármely más típushoz tartozóként ábrázoljon, feltéve, hogy az alacsony szintű megvalósításuk (bitreprezentációjuk) hossza egyenlő , és módosítsa az állapotát oly módon, hogy az érvénytelen a forrástípushoz. Az ilyen műveletek gondatlan használata gyakran a program összeomlásának forrása . Ennek ellenére a C++ tankönyvek „ erősnek ” írják le a típusrendszerét , amely Luca Cardelli [5] és mások tézisei alapján „ erősebb, mint C-ben ” értendő. Ezzel szemben a Hindley-Milner szerint gépelt nyelvekben a típusöntés fogalma elvileg hiányzik. Egy típus "konvertálásának" egyetlen módja egy olyan függvény írása, amely algoritmikusan összeállítja a kívánt típusú értéket az eredeti típus értékéből. Triviális esetekben, például egy előjel nélküli egész szám "konvertálása" előjeles egész számmá és fordítva, az ilyen függvények általában szerepelnek a szabványos könyvtárakban. Az ilyen típusú függvények leggyakrabban használt esetei a speciálisan definiált, üres törzsű függvények, amelyeket konstruktor függvényeknek vagy egyszerűen konstruktoroknak neveznek .
Ugyanakkor a Hindley-Milner típusú rendszer a paraméteres polimorfizmus miatt rendkívül magas kód-újrafelhasználási arányt biztosít . Egy erős, de nem polimorf típusú rendszer megnehezítheti számos algoritmikus probléma megoldását, amint azt a Pascal nyelv kapcsán megjegyeztük [6] .
Az a vélemény, hogy az erős gépelés elengedhetetlen eleme a kifejlesztett szoftverek megbízhatóságának biztosításának. Helyes használat esetén (ami azt jelenti, hogy a program külön adattípusokat deklarál és használ a logikailag inkompatibilis értékekhez), megvédi a programozót a logikailag inkompatibilis értékek megosztásával kapcsolatos egyszerű, de nehezen fellelhető hibáktól, amelyek néha egyszerűen egy elírásból erednek.
Az ilyen hibákat még a programfordítási szakaszban is észlelik, míg a szinte bármilyen típus implicit konverziójának lehetőségével (mint például a klasszikus C nyelvben) ezeket a hibákat csak a tesztelés során észlelik, és nem minden és nem azonnal, ami néha nagyon drága az ipari üzemeltetés szakaszában.
A Python egy példa az erős dinamikus gépeléssel rendelkező nyelvekre [7] .