Silné a slabé psaní - Strong and weak typing

V programování počítače , jeden z mnoha způsobů, jak programovací jazyky jsou hovorově klasifikovány je, zda jazyk je typ systému umožňuje důrazně zadali nebo slabě napsaný ( volně zadali ). Neexistuje však přesná technická definice toho, co tyto termíny znamenají, a různí autoři nesouhlasí s implikovaným významem termínů a relativním hodnocením „síly“ typových systémů hlavních programovacích jazyků.

Obecně platí, že silně typovaný jazyk má v době kompilace přísnější pravidla pro psaní , což znamená, že během kompilace se častěji vyskytují chyby a výjimky. Většina těchto pravidel ovlivňuje přiřazení proměnných, návratové hodnoty funkcí, argumenty procedur a volání funkcí. Jazyky s dynamickým zadáváním (kde se kontrola typu provádí za běhu ) lze také silně zadávat. Všimněte si, že v dynamicky psaných jazycích mají hodnoty typy, nikoli proměnné.

Slabý typ jazyka má volnější pravidla pro psaní a může vytvářet nepředvídatelné nebo dokonce chybné výsledky nebo může provádět implicitní převod typů za běhu. Zastánci dynamicky typovaných (obecně „slabě typovaných“) jazyků považují takové obavy za přehnané a domnívají se, že statické psaní ve skutečnosti přináší exponenciálně větší soubor problémů a neefektivností. Jiným, ale souvisejícím konceptem je latentní psaní .

Dějiny

V roce 1974 Liskov a S. Zilles definovali silně typizovaný jazyk jako jazyk, ve kterém „kdykoli je objekt předán z volající funkce do volané funkce, její typ musí být kompatibilní s typem deklarovaným ve volané funkci“. V roce 1977 K. Jackson napsal: „V silně typizovaném jazyce bude mít každá datová oblast odlišný typ a každý proces bude uvádět své komunikační požadavky, pokud jde o tyto typy.“

Definice „silných“ nebo „slabých“

Řada různých jazykových návrhových rozhodnutí byla označována jako důkaz „silného“ nebo „slabého“ psaní. Mnohé z nich se přesněji rozumí přítomnosti nebo nepřítomnosti bezpečnosti typu , bezpečnostní paměti , statické typu kontroly , nebo dynamického typu kontroly .


„Silné psaní“ obecně označuje použití typů programovacích jazyků za účelem zachycení invarianty kódu a zajištění jeho správnosti a definitivního vyloučení určitých tříd chyb v programování. K dosažení těchto cílů se tedy používá mnoho disciplín „silného psaní“.

Konverze implicitního typu a „typování“

Některé programovací jazyky usnadňují použití hodnoty jednoho typu, jako by to byla hodnota jiného typu. Někdy je to popisováno jako „slabé psaní“.

Například Aahz Maruch poznamenává, že „K nátlaku dochází, když máte staticky napsaný jazyk a pomocí syntaktických rysů jazyka vynucujete použití jednoho typu, jako by šlo o jiný typ (vezměte v úvahu běžné použití neplatnosti* v jazyce C ). Nátlak je obvykle příznakem slabého psaní. Konverze naopak vytváří zbrusu nový objekt příslušného typu. “

Jako další příklad to GCC popisuje jako typ-punning a varuje, že to přeruší přísné aliasing . Thiago Macieira pojednává o několika problémech, které mohou nastat, když typování způsobí, že kompilátor provede nevhodné optimalizace .

Existuje mnoho příkladů jazyků, které umožňují implicitní převody typů , ale způsobem bezpečným pro typ. Například C ++ i C# umožňují programům definovat operátory pro převod hodnoty z jednoho typu na jiný s dobře definovanou sémantikou. Když kompilátor C ++ narazí na takovou konverzi, zachází s operací stejně jako s voláním funkce. Naproti tomu převod hodnoty na typ C void* je nebezpečná operace, která je pro kompilátor neviditelná.

Ukazatele

Některé programovací jazyky vystavují ukazatele, jako by to byly číselné hodnoty, a umožňují uživatelům provádět na nich aritmetiku. Tyto jazyky jsou někdy označovány jako „slabě napsané“, protože k obejití systému typů jazyka lze použít aritmetiku ukazatele.

Neoznačené odbory

Některé programovací jazyky podporují neoznačené svazky , které umožňují zobrazení hodnoty jednoho typu, jako by to byla hodnota jiného typu.

Statická kontrola typu

V článku Luca CardellihoTypické programování “ je „systém silného typu“ popsán jako systém, ve kterém neexistuje možnost nekontrolované chyby typu runtime. Jiným písmem je absence nekontrolovaných chyb běhu označována jako bezpečnost nebo bezpečnost typu ; První noviny Tonyho Hoare tomu říkají zabezpečení majetku .

Dynamická kontrola typu

Některé programovací jazyky nemají statickou kontrolu typu. V mnoha takových jazycích je snadné psát programy, které by většina statických kontrolorů typu odmítla. Proměnná může například ukládat buď číslo, nebo booleovskou hodnotu „false“.

Variace napříč programovacími jazyky

Všimněte si, že některé z těchto definic jsou protichůdné, jiné jsou pouze koncepčně nezávislé a další jsou speciální případy (s dalšími omezeními) jiných, „liberálnějších“ (méně silných) definic. Vzhledem k velké odlišnosti těchto definic je možné obhájit tvrzení o většině programovacích jazyků, že jsou buď silně nebo slabě napsané. Například:

  • Java , Pascal , Go , Ada a C vyžadují, aby všechny proměnné měly deklarovaný typ, a podporují použití explicitních přetypování aritmetických hodnot na jiné aritmetické typy. O jazycích Java, C#, Ada a Pascal se někdy říká, že jsou silněji napsané než C, což je tvrzení, které je pravděpodobně založeno na skutečnosti, že C podporuje více druhů implicitních převodů a C také umožňuje explicitní obsazení hodnot ukazatelů, zatímco Java a Pascal ne. Java sama může být považována za silněji napsanou než Pascal, protože způsoby obcházení systému statického typu v Javě jsou řízeny typovým systémem virtuálního stroje Java . C# a VB.NET jsou v tomto ohledu podobné Javě, i když umožňují deaktivaci kontroly dynamického typu explicitním zařazením segmentů kódu do „nebezpečného kontextu“. Systém typu Pascal byl popsán jako „příliš silný“, protože velikost pole nebo řetězce je součástí jeho typu, takže některé úkoly programování jsou velmi obtížné.
  • Smalltalk , Perl , Ruby , Python a Self jsou všechny „silně napsané“ v tom smyslu, že se za běhu zabrání chybám při psaní a málo převádějí implicitní typy , ale tyto jazyky nevyužívají statickou kontrolu typu: kompilátor nekontroluje nebo vynutit omezení typu. Termín psaní kachen se nyní používá k popisu paradigmatu dynamického psaní používaného jazyky v této skupině.
  • Lisp rodina jazyků jsou „důrazně zadali“ v tom smyslu, že překlepy jsou bráněno v běhu. Některé dialekty Lispu, jako je Common Lisp nebo Clojure , podporují různé formy deklarací typu a některé kompilátory ( CMUCL a podobné) používají tyto deklarace společně s odvozením typu k umožnění různých optimalizací a také omezených forem kontrol typu kompilace času.
  • Standardní ML , F# , OCaml , Haskell a Rust jsou staticky zkontrolovány, ale kompilátor pro většinu hodnot automaticky odvodí přesný typ.
  • Jazyk montáže a Forth lze charakterizovat jako netypové . Neexistuje žádná kontrola typu; je na programátorovi, aby zajistil, že data daná funkcím budou příslušného typu. Jakýkoli požadovaný typ převodu je explicitní.

Z tohoto důvodu se autoři, kteří chtějí psát jednoznačně o typových systémech, často vyhýbají výrazu „silné psaní“ ve prospěch konkrétních výrazů, jako je „ bezpečnost písma “.

Viz také

Reference