Specifikace programovacího jazyka - Programming language specification

v výpočetní, a specifikace programovacího jazyka (nebo Standard nebo definice) je artefakt dokumentace, který definuje a programovací jazyk aby uživatelů a implementátoři se mohou shodnout na tom, co znamenají programy v daném jazyce. Specifikace jsou obvykle podrobné a formální a používají je především implementátoři, přičemž uživatelé na ně odkazují v případě nejednoznačnosti; specifikace C ++ je často citována uživateli, například kvůli složitosti. Související dokumentace obsahuje a reference programovacího jazyka, který je určen výslovně pro uživatele, a zdůvodnění programovacího jazyka, což vysvětluje, proč je specifikace napsána tak, jak je; jsou obvykle neformálnější než specifikace.

Standardizace

Ne všechny hlavní programovací jazyky mají specifikace a jazyky mohou existovat a být populární po celá desetiletí bez specifikace. Jazyk může mít jednu nebo více implementací, jejichž chování funguje jako de facto standard, aniž by toto chování bylo dokumentováno ve specifikaci. Perl (přes Perl 5 ) je pozoruhodný příklad jazyka bez specifikace, zatímco PHP bylo specifikováno až v roce 2014, poté, co bylo používáno po dobu 20 let.[1] Jazyk může být implementován a poté specifikován, nebo specifikován a následně implementován, nebo se mohou vyvíjet společně, což je dnes běžná praxe. Důvodem je, že implementace a specifikace poskytují vzájemnou kontrolu: psaní specifikace vyžaduje přesné uvedení chování implementace a implementace kontroluje, zda je specifikace možná, praktická a konzistentní. Psaní specifikace před implementací se od té doby do značné míry vyhnulo ALGOL 68 (1968), kvůli neočekávaným obtížím při implementaci, když je implementace odložena. Jazyky jsou však stále příležitostně implementovány a získávají na popularitě bez formální specifikace: implementace je pro použití nezbytná, zatímco specifikace je žádoucí, ale není nezbytná (neformálně, „rozhovory o kódu“).

ALGOL 68 byl prvním (a možná jedním z posledních) hlavních jazyků, pro které byla před jeho zavedením provedena úplná formální definice.

formuláře

Specifikace programovacího jazyka může mít několik podob, včetně následujících:

  • Explicitní definice syntax a sémantika jazyka. I když je syntaxe běžně specifikována pomocí formální gramatiky, lze psát sémantické definice přirozený jazyk (např. přístup zvolený pro Jazyk C. ), nebo a formální sémantika (např Standardní ML[3] a Systém[4] Specifikace). Pozoruhodným příkladem je jazyk C, který si získal popularitu bez formální specifikace, místo toho byl popsán jako součást knihy, Programovací jazyk C. (1978) a teprve mnohem později jsou formálně standardizovány ANSI C. (1989).
  • Popis chování a překladač (někdy nazývaný "překladatel") pro jazyk (např. C ++ jazyk a Fortran ). Z tohoto popisu, který může být napsán v přirozeném nebo formálním jazyce, lze odvodit syntaxi a sémantiku jazyka.
  • A Modelka implementace, někdy napsané ve specifikovaném jazyce (např. Prolog ). Syntaxe a sémantika jazyka jsou v chování implementace modelu explicitní.

Syntax

The syntax programovacího jazyka se obvykle popisuje pomocí kombinace následujících dvou komponent:

Sémantika

Formulování přísné sémantiky velkého, složitého a praktického programovacího jazyka je skličujícím úkolem i pro zkušené odborníky a výsledná specifikace může být těžko pochopitelná pro kohokoli kromě odborníků. Následuje několik způsobů, jak lze popsat sémantiku programovacího jazyka; všechny jazyky používají alespoň jednu z těchto metod popisu a některé jazyky kombinují více než jednu[5]

Přirozený jazyk

Nejčastěji používané jazyky jsou specifikovány pomocí popisů jejich sémantiky v přirozeném jazyce. Tento popis má obvykle formu a referenční příručka pro jazyk. Tyto příručky mohou obsahovat stovky stránek, např. Tištěnou verzi Specifikace jazyka Java, 3. vydání. je 596 stran dlouhý.

Nepřesnost přirozeného jazyka jako prostředku pro popis sémantiky programovacího jazyka může vést k problémům s interpretací specifikace. Například sémantika Jáva vlákna byly specifikovány v angličtině a později bylo zjištěno, že specifikace neposkytovala adekvátní vodítko pro implementátory.[6]

Formální sémantika

Formální sémantika vychází z matematiky. Ve výsledku mohou být přesnější a méně nejednoznačné než sémantika uvedená v přirozeném jazyce. Často jsou však zahrnuty doplňkové popisy sémantiky přirozeného jazyka, které pomáhají porozumět formálním definicím. Například The ISO Standard pro Modula-2 obsahuje jak formální, tak přirozenou jazykovou definici na protilehlých stránkách.

Programovací jazyky, jejichž sémantika jsou formálně popsány, mohou těžit z mnoha výhod. Například:

  • Formální sémantika umožňuje matematické důkazy o správnosti programu;
  • Formální sémantika usnadňuje návrh systémy typu a důkazy o spolehlivosti těchto typů systémů;
  • Formální sémantika může zavést jednoznačné a jednotné standardy pro implementaci jazyka.

Automatická podpora nástrojů může pomoci realizovat některé z těchto výhod. Například an automatizovaný testovací teorém nebo kontrola věty může zvýšit důvěru programátora (nebo návrháře jazyka) ve správnost důkazů o programech (nebo samotném jazyce). Síla a škálovatelnost těchto nástrojů se velmi liší: plná formální ověření je výpočetně náročná, málokdy přesahuje programy obsahující několik stovek řádků[Citace je zapotřebí ] a může vyžadovat značnou manuální pomoc od programátora; lehčí nástroje jako model dáma vyžadují méně zdrojů a byly použity v programech obsahujících desítky tisíc řádků; mnoho překladačů používá statické kontroly typu na jakýkoli program, který sestaví.

Referenční implementace

A referenční implementace je jediná implementace programovacího jazyka, který je označen jako autoritativní. Chování této implementace slouží k definování správného chování programu napsaného v jazyce. Tento přístup má několik atraktivních vlastností. Za prvé, je přesný a nevyžaduje žádnou lidskou interpretaci: spory o význam programu lze urovnat pouhým provedením programu na referenční implementaci (za předpokladu, že se implementace chová pro daný program deterministicky).

Na druhou stranu má definování jazykové sémantiky prostřednictvím referenční implementace také několik potenciálních nevýhod. Mezi nimi je hlavně to, že spojuje omezení implementace reference s vlastnostmi jazyka. Například pokud má referenční implementace chybu, musí být tato chyba považována za autoritativní chování. Další nevýhodou je, že programy napsané v tomto jazyce se mohou v referenční implementaci spoléhat na vtípky, což znemožňuje přenositelnost napříč různými implementacemi.

Několik jazyků nicméně úspěšně využilo přístup k referenční implementaci. Například Perl Tlumočník definuje autoritativní chování programů Perl. V případě Perlu, open-source model distribuce softwaru přispělo k tomu, že nikdo nikdy neprodukoval další implementaci jazyka, takže problémy spojené s použitím referenční implementace k definování sémantiky jazyka jsou diskutabilní.

Testovací sada

Definování sémantiky programovacího jazyka z hlediska a testovací sada zahrnuje napsání řady ukázkových programů v jazyce a poté popis toho, jak by se tyto programy měly chovat - možná zapsáním jejich správných výstupů. Programy a jejich výstupy se nazývají „testovací sada“ jazyka. Jakákoli správná implementace jazyka pak musí v programech testovací sady vyprodukovat přesně správné výstupy.

Hlavní výhodou tohoto přístupu k sémantickému popisu je, že je snadné určit, zda jazyková implementace projde testovací sadou. Uživatel může jednoduše spustit všechny programy v testovací sadě a porovnat výstupy s požadovanými výstupy. Pokud je však přístup k testovací sadě použit sám o sobě, má také hlavní nevýhody. Například uživatelé chtějí spouštět své vlastní programy, které nejsou součástí testovací sady; skutečně jazyková implementace, která by mohla pouze spouštět programy v jeho testovací sadě by bylo do značné míry zbytečné. Ale testovací sada sama o sobě nepopisuje, jak by se měla jazyková implementace chovat v jakémkoli programu, který není v testovací sadě; určení, že chování vyžaduje určitou extrapolaci ze strany implementátora, a různé implementátory mohou nesouhlasit. Kromě toho je obtížné použít testovací sadu k testování chování, které je zamýšleno nebo dovoleno nedeterministické.

V běžné praxi se proto testovací sady používají pouze v kombinaci s jednou z dalších technik specifikace jazyka, jako je popis přirozeného jazyka nebo referenční implementace.

Viz také

externí odkazy

Specifikace jazyka

Několik příkladů specifikací úředních nebo návrhových jazyků:

Poznámky

  1. ^ Oznámení specifikace pro PHP, 30. července 2014, Joel Marcey
  2. ^ „Kratší historie Algol68“. Archivovány od originál 10. srpna 2006. Citováno 15. září 2006.
  3. ^ Milner, R.; M. Tofte; R. Harper; D. MacQueen (1997). Definice standardního ML (revidovaná). MIT Stiskněte. ISBN  0-262-63181-4.
  4. ^ Kelsey, Richard; William Clinger; Jonathan Rees (únor 1998). „Oddíl 7.2 Formální sémantika“. Revidováno5 Zpráva o schématu algoritmického jazyka. Citováno 2006-06-09.
  5. ^ Jones, D. (2008). Formy jazykové specifikace (PDF). Citováno 2012-06-23.
  6. ^ William Pugh. Model paměti Java je fatálně vadný. Souběžnost: Praxe a zkušenosti 12 (6): 445-455, srpen 2000