Yhden luokituksen mukaan ohjelmointikielet jaetaan epävirallisesti vahvasti ja heikosti tyypitettyihin , eli niillä on vahva tai heikko tyyppinen järjestelmä . Näitä termejä ei tulkita yksiselitteisesti, ja niitä käytetään useimmiten osoittamaan tietyn kielen etuja ja haittoja. On olemassa tarkempia käsitteitä, jotka johtavat tiettyjen tyyppisten järjestelmien nimeämiseen " vahvaksi " tai " heikoksi ".
Venäjänkielisessä kirjallisuudessa käytetään usein termiä " vahva kirjoitus " [1] [2] ; yleinen muunnelma " voimakas kirjoitus " käytetään vain vastakkain " heikko kirjoitus ". Huomaa, että termin " tiukka " käyttäminen kielen tyyppijärjestelmän yhteydessä voi aiheuttaa sekaannusta kielen tiukan arviointisemantiikan kanssa .
Vuonna 1974 Liskov ja Zilles kutsuivat voimakkaasti kirjoitettuja kieliä, joissa " kun objekti siirretään kutsuvasta funktiosta kutsuttuun funktioon, objektin tyypin on oltava yhteensopiva kutsutussa funktiossa määritellyn tyypin kanssa " [3] . Jackson kirjoitti: " Vahvasti kirjoitetussa kielessä jokaisella tietosolulla on ainutlaatuinen tyyppi, ja jokainen prosessi julistaa suhdevaatimukset näiden tyyppien suhteen " [4] .
Luca Cardellin artikkelissa " Full Type Programming " 5] tyyppijärjestelmää kutsutaan "vahvaksi", jos se eliminoi ajonaikaisen tyyppisovitusvirheen mahdollisuuden. Toisin sanoen tarkistamattomien ajonaikaisten virheiden puuttumista kutsutaan tyyppiturvalliseksi ; Hoaren varhainen työ kutsuu tätä omaisuuden turvaksi .
"Vahva" ja "heikko" kirjoittaminen on tulosta monista kielen suunnittelussa tehdyistä päätöksistä. Tarkemmin sanottuna kielille on ominaista tyyppiyhdenmukaisuuden turvallisuuden ja muistin käyttöturvallisuuden olemassaolo tai puuttuminen sekä tällaisen ohjauksen tyypillinen ajoitus ( staattinen tai dynaaminen ).
Esimerkiksi selkeitä esimerkkejä heikon tyyppisestä järjestelmästä ovat ne, jotka ovat C- ja C++-kielten taustalla . Niiden tunnusomaisia ominaisuuksia ovat käsitteet tyyppivalu ja kirjoitussanapelit . Näitä toimintoja tuetaan kääntäjätasolla, ja niitä kutsutaan usein implisiittisesti. C++ :n toiminnon reinterpret_castavulla voit esittää minkä tahansa tyyppisen tietoelementin kuuluvaksi mihin tahansa muuhun tyyppiin edellyttäen, että niiden matalan tason toteutuksen pituus (bittiesitys) on yhtä suuri. ja muuta sen tilaa tavalla, joka ei kelpaa lähdetyypille. Tällaisten toimintojen huolimaton käyttö aiheuttaa usein ohjelman kaatumisen . Tästä huolimatta C++-oppikirjat kuvaavat sen tyyppijärjestelmää " vahvammaksi ", joka Luca Cardellin [5] ja muiden opinnäytetyön perusteella tulisi ymmärtää " vahvemmaksi kuin C ". Sitä vastoin Hindley-Milnerin mukaan kirjoitetuissa kielissä tyyppivalun käsite puuttuu periaatteessa. Ainoa tapa "muuntaa" tyyppi on kirjoittaa funktio, joka muodostaa algoritmisesti vaaditun tyypin arvon alkuperäisen tyypin arvosta. Triviaalisissa tapauksissa, kuten etumerkittömän kokonaisluvun "muuntaminen" etumerkilliseksi kokonaisluvuksi ja päinvastoin, tällaiset funktiot sisältyvät yleensä vakiokirjastoihin. Tällaisten funktioiden yleisimmin käytetty tapaus ovat erikoismääritellyt funktiot, joissa on tyhjä runko, joita kutsutaan konstruktorifunktioiksi tai yksinkertaisesti konstruktoreiksi .
Samanaikaisesti Hindley-Milner-tyyppinen järjestelmä tarjoaa erittäin suuren koodin uudelleenkäytön parametrisen polymorfismin vuoksi . Vahva, mutta ei polymorfinen tyyppinen järjestelmä voi vaikeuttaa monien algoritmisten ongelmien ratkaisemista, kuten Pascal -kielen yhteydessä todettiin [6] .
On olemassa mielipide, että vahva konekirjoitus on välttämätön osa kehitetyn ohjelmiston luotettavuuden varmistamista. Oikein käytettynä (eli ohjelma ilmoittaa ja käyttää eri tietotyyppejä loogisesti yhteensopimattomille arvoille), se suojaa ohjelmoijaa yksinkertaisilta mutta vaikeasti löydettäviltä virheiltä, jotka liittyvät loogisesti yhteensopimattomien arvojen jakamiseen ja jotka joskus johtuvat yksinkertaisesta kirjoitusvirheestä.
Tällaiset virheet havaitaan jopa ohjelman käännösvaiheessa, kun taas lähes minkä tahansa tyypin implisiittinen muuntaminen toisilleen on mahdollista (kuten esimerkiksi klassisessa C-kielessä), nämä virheet havaitaan vain testauksen aikana, eivätkä kaikki ja ei heti, mikä on joskus erittäin kallista teollisen toiminnan vaiheessa.
Python on yksi esimerkki kielestä, jossa on vahva dynaaminen kirjoitus [7] .