Specifikace programovacího jazyka - Programming language specification

Ve výpočetní technice je specifikace programovacího jazyka (nebo standard nebo definice ) dokumentačním artefaktem, který definuje programovací jazyk , aby se uživatelé a implementátoři mohli dohodnout 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 odkaz na programovací jazyk , který je určen výslovně pro uživatele, a odůvodnění programovacího jazyka , které 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 zdokumentová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. 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 ALGOL 68 (1968) z velké části vyhnulo kvůli neočekávaným potížím při implementaci při odložení implementace. 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:

Syntax

Syntaxe programovacího jazyka je obvykle popisován s použitím kombinace těchto dvou složek:

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 jiného než pro odborníky. 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

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 podobu referenční příručky pro daný jazyk. Tyto příručky mohou běžet na stovky stránek, např. Tištěná verze The Java Language Specification, 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 vláken Java byla specifikována v angličtině a později bylo zjištěno, že specifikace neposkytla adekvátní vodítko pro implementátory.

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 norma ISO pro Modula-2 obsahuje formální i přirozenou definici jazyka 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 typových systémů a důkazy o spolehlivosti těchto typových 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 automatizovaný tester teorémů nebo kontrola teorémů 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é, zřídka se rozšiřuje nad rámec programů obsahujících několik stovek řádků a může vyžadovat značnou manuální pomoc od programátora; lehčí nástroje, jako jsou modely modelů, vyžadují méně zdrojů a byly použity v programech obsahujících desítky tisíc řádků; mnoho překladačů aplikuje kontroly statického typu na jakýkoli program, který kompilují.

Referenční implementace

Referenční implementace je jednoduchá 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ž brání přenositelnosti napříč různými implementacemi.

Několik jazyků nicméně úspěšně využilo přístup k referenční implementaci. Například je považován za překladače Perl definovat autoritativní chování programů Perl. V případě Perlu model open source distribuce softwaru přispěl k tomu, že nikdo nikdy nevytvořil jinou 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 ve smyslu testovací sady zahrnuje napsání řady ukázkových programů v jazyce a následný 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á jazyková implementace pak musí v programech testovací sady vytvářet 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 použit samostatně, má přístup k testovací sadě také velké nevýhody. Například uživatelé chtějí spouštět své vlastní programy, které nejsou součástí testovací sady; jazyková implementace, která by mohla spouštět pouze programy v jeho testovací sadě, by byla 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 určeno nebo dovoleno být 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