Postupné psaní - Gradual typing
Typové systémy |
---|
Obecné pojmy |
Hlavní kategorie |
Menší kategorie |
Viz také |
Postupné psaní je typový systém ve kterém někteří proměnné a výrazy mohou být uvedeny typy a správnost psaní je kontrolována na čas kompilace (který je statické psaní ) a některé výrazy mohou být ponechány netypické a eventuální chyby typu jsou hlášeny v runtime (který je dynamické psaní ). Postupné psaní umožňuje vývojářům softwaru zvolit si podle potřeby buď paradigma typu, a to z jediného jazyka.[1] V mnoha případech se k existujícímu dynamickému jazyku přidává postupné psaní, čímž se vytváří odvozený jazyk, který umožňuje, ale nevyžaduje použití statického psaní. V některých případech jazyk používá postupné psaní od začátku.
Dějiny
Termín vytvořil Jeremy Siek. Jeremy Siek a Walid Taha začali zkoumat postupné psaní na stroji v roce 2006.[1]
Implementace
Zejména postupné psaní používá speciální typ s názvem dynamický reprezentovat staticky neznámé typy a postupné psaní nahrazuje pojem rovnosti typů novou volanou relací konzistence který spojuje dynamický typ se všemi ostatními typy. Vztah konzistence je symetrický, ale nikoli tranzitivní.[2]
Předchozí pokusy o integraci statického a dynamického psaní se snažily, aby byl dynamický typ v horní i dolní části hierarchie podtypu. Nicméně proto podtypování je tranzitivní, což má za následek, že se každý typ stane příbuzným každému druhému typu, a tak by subtypování již nevylučovalo chyby statického typu. Přidání druhé fáze kontroly věrohodnosti do typového systému tento problém zcela nevyřešilo.[3][4]
Postupné psaní lze snadno integrovat do typového systému objektově orientovaného jazyka, který již používá subsumpce pravidlo povolit implicitní upcasts s ohledem na subtypizaci. Hlavní myšlenkou je, že konzistence a podtyp jsou ortogonální nápady, které se pěkně skládají. Chcete-li přidat podtyp do jazyka s postupným zadáváním, jednoduše přidejte pravidlo subsumption a přidejte pravidlo podtypu, díky kterému se dynamický typ stane podtypem sebe samého, protože podtyp má být reflexivní. (Ale nedělejte horní část pořadí podtypů dynamickou!)[5]
Příklady
Mezi příklady postupně zadávaných jazyků odvozených ze stávajících dynamicky zadávaných jazyků patří Uzávěr kompilátor, Strojopis (oba pro JavaScript[6]),[7] Zaseknout (pro PHP), PHP (od 7.0[8]), Typed Racket (pro Raketa ), Typed Clojure (pro Clojure ),[9] Cython (A Krajta překladač), mypy (kontrola statického typu pro Krajta ),[10] hranice (alternativní kontrola statického typu pro Python),[11] nebo cperl (napsaný Perl 5 ). ActionScript je postupně psaný jazyk[12] to je nyní implementace ECMAScript, ačkoli původně vznikl samostatně jako sourozenec, oba ovlivněni společností Apple HyperTalk.
Systém pro J programovací jazyk byl vyvinut,[13] přidání nátlaku, šíření chyb a filtrování k normálním ověřovacím vlastnostem typového systému a také použití typových funkcí mimo definice funkcí, čímž se zvyšuje flexibilita definic typů.
Naopak, C# začal jako staticky zadaný jazyk, ale od verze 4.0 se postupně zadává, což umožňuje explicitně označit proměnné jako dynamické pomocí dynamický
typ.[14] Mezi jazyky s postupným zadáváním, které nejsou odvozeny z dynamicky zadávaného jazyka, patří Šipka, Dylan, a Raku.
Raku (dříve Perl6) má od začátku implementováno postupné psaní. Kontroly typu se vyskytují na všech místech, kde jsou hodnoty přiřazeny nebo vázány. "Netypovaná" proměnná nebo parametr je zadán jako Žádný
, který bude odpovídat (téměř) všem hodnotám. Kompilátor označí konflikty kontroly typu v době kompilace, pokud může v době kompilace určit, že nikdy nebudou úspěšné.
Cíl-C má postupné psaní pro ukazatele objektu s ohledem na volání metod. Statické psaní se používá, když se proměnná zadává jako ukazatel na určitou třídu objektu: při volání metody na proměnnou kompilátor staticky zkontroluje, zda je třída deklarována pro podporu takové metody, nebo vygeneruje varování nebo chybu . Pokud však proměnná typu id
je použit, překladač umožní na něj volat jakoukoli metodu.
The JS ++ programovací jazyk, který byl vydán v roce 2011, je nadmnožinou JavaScript (dynamicky psané) se systémem postupného typu, který je zvuk pro ECMAScript a DOM Rohové případy API.[15]
Reference
- ^ A b Siek, Jeremy. „Co je to postupné psaní?“.
- ^ Siek, Jeremy; Taha, Walid (září 2006). Postupné psaní pro funkční jazyky (PDF). Schéma a funkční programování 2006. University of Chicago. 81–92.
- ^ Thatte, Satish (1990). Kvazi-statické psaní. POPL 1990: ACM Principles of Programming Languages. ACM. 367–381. doi:10.1145/96709.96747. ISBN 978-0897913430.
- ^ Oliart, Alberto (1994). Algoritmus pro odvození kvazi-statických typů (Technická zpráva). Bostonská univerzita. 1994-013.
- ^ Siek, Jeremy; Taha, Walid (srpen 2007). Postupné psaní pro objekty. ECOOP 2007: Evropská konference o objektově orientovaném programování. Přednášky z informatiky. 4609. Springer. s. 2–27. doi:10.1007/978-3-540-73589-2_2. ISBN 978-3-540-73588-5.
- ^ Feldthaus, Asger; Møller, Anders (2014). "Kontrola správnosti rozhraní TypeScript pro knihovny JavaScriptu". Sborník mezinárodní konference ACM 2014 o objektově orientovaných programovacích systémech jazyky a aplikace - OOPSLA '14. Portland, Oregon, USA: Tisk ACM: 1–16. doi:10.1145/2660193.2660215. ISBN 978-1-4503-2585-1.
- ^ Swamy, N .; Fournet, C .; Rastogi, A .; Bhargavan, K .; Chen, J .; Strub, P. Y .; Bierman, G. (2014). "Postupné psaní bezpečně vložené do JavaScriptu". Sborník 41. sympozia ACM SIGPLAN-SIGACT o zásadách programovacích jazyků - POPL '14 (PDF). str. 425–437. doi:10.1145/2535838.2535889. ISBN 9781450325448.
- ^ "PHP: Argumenty funkcí - manuální» Přísné psaní ".
- ^ Chas Emerick. „Uživatelská příručka pro zadaný Clojure“.
- ^ Jukka Lehtosalo. "mypy - volitelné statické psaní pro Python".
- ^ „Pyre - A performant type-checker for Python 3“.
- ^ Aseem Rastogi; Avik Chaudhuri; Basil Hosmer (leden 2012). „Vstupy a výstupy postupného odvozování typu“ (PDF). Sdružení pro výpočetní techniku (ACM). Citováno 2014-09-23.
- ^ "type-system-j".
- ^ "dynamický (C # reference)". Knihovna MSDN. Microsoft. Citováno 14. ledna 2014.
- ^ „Systém typů JS ++, dodatek B: Problémy (Proč bylo těžké to vyřešit?)“. Citováno 10. února 2020.
Další čtení
- Siek, Jeremy G .; Vitousek, Michael M .; Cimini, Matteo; Boyland, John Tang (2015). Ball, Thomas; Bodik, Rastislav; Krishnamurthi, Shriram; Lerner, Benjamin S .; Morrisett, Greg (eds.). Upřesněná kritéria pro postupné psaní. 1. summit o pokroku v programovacích jazycích (SNAPL 2015). Leibniz International Proceedings in Informatics (LIPIcs). 32. Dagstuhl, Německo: Schloss Dagstuhl – Leibniz-Zentrum fuer Informatik. str. 274–293. doi:10.4230 / lipics.snapl.2015.274. ISBN 9783939897804.