Charm (programovací jazyk) - Charm (programming language)
Paradigma | Strukturované programování |
---|---|
Navrhl | P. Nowosad |
Poprvé se objevil | 1996 |
OS | RISC OS |
webová stránka | kouzlo |
Ovlivněno | |
RTL / 2, C, Pascal |
Kouzlo je počítač programovací jazyk vytvořená na počátku 90. let se podobností s RTL / 2, Pascal a C kromě toho, že obsahuje některé své vlastní jedinečné vlastnosti. Jazyk kouzla je definován a bezkontextová gramatika lze zpracovat analyzátor rekurzivního sestupu jak je popsáno v klíčových knihách o překladač design.[1][2]
Sada nástrojů Charm včetně kompilátoru, assembleru a linkeru vydaného pro trh Acorn byla přezkoumána v Uživatel žaludu časopis[3] v kategorii programovacího softwaru. Přepracováno kouzlo pro RISC OS platformy byly následně přezkoumány v časopise Archive.[4]
Kouzlo je dále popsáno v elektronické knize Programování v Charm na Raspberry Pi.[5]
Gramatika
Definice gramatiky kouzla v Backus – Naurova forma spolu s popisnými příklady konstruktů Charm je definován na Charm stránka jazyka.[6]
Jazyk má strukturu bloku, přičemž každý blok je představen klíčovým slovem jazyka, které popisuje operaci prováděnou v bloku, např. pro, zatímco, opakovat (opakování), případ, -li (výběr). Každý blok je ohraničen { a } oddělovače. Kromě toho jsou jazykové řádky v rámci bloku kvůli jasnosti obvykle odsazeny, i když to není nutné, protože mezery jsou ignorovány.
Každý gramaticky vyhovující text představuje kolekci spustitelného kódu a přidružených dat, která lze použít sadou nástrojů Charm jako komponenta při sestavování programu, který lze spustit pod operačním systémem využívajícím poskytované služby k provádění užitečné práce, jako je zpracování dat nebo interakce s uživateli prostřednictvím grafické uživatelské prostředí (GUI).
Typy dat
Charm je jazyk se silným typem, ale umožňuje některé implicitní převody mezi číselnými a plovoucími typy. Jsou podporovány následující základní typy proměnných:
- int - celá čísla
- char - postavy
- booleovský - logické hodnoty (skutečný nebo Nepravdivé)
- nemovitý - čísla s plovoucí desetinnou čárkou
Datové agregáty stejného typu lze deklarovat a staticky inicializovat pomocí pole klíčové slovo a ty mohou být vícerozměrné. Agregáty různých typů lze deklarovat pomocí záznam klíčové slovo a je možné, aby takové prohlášení definovalo a svaz polí záznamu, která se navzájem překrývají, pokud jde o alokaci úložiště. Moduly mohou také agregovat směs statických a dynamických datových členů. Instance záznamů i modulů (pouze dynamický obsah) lze vytvořit na instanci na zásobníku nebo na haldě pomocí Nový operátor. Moduly mohou také definovat konstruktor ~ nový postup inicializace dynamických dat a odpovídající ~ smazat postup dekonstruktoru k uvolnění prostředků podobným způsobem jako v jazyce C ++.
Odkazování
Data nebo postupy v rámci modulu mohou být pro konečnou aplikaci globalizovány pomocí vývozní klíčové slovo. Pokud si modul přeje odkazovat na postup nebo data z jiného modulu Charm, učiní to pomocí import klíčové slovo. Moduly mohou obsahovat instance proměnných členů, které jsou přístupné prostřednictvím procedur deklarovaných s dynamický klíčové slovo prostřednictvím implicitního prvního parametru tento ukazatel.
Odkazy na datové konstrukce a postupy lze provést pomocí ref klíčové slovo. Ty lze dereferencovat pomocí val klíčové slovo. Při použití referenčních proměnných jsou k dispozici operátory porovnání, které kontrolují, zda dvě referenční proměnné odkazují na stejnou položku dat ( :=: ) nebo zda jsou data, na kterou odkazují, stejná ( = ).
Příklad
Originální klasika Program Hello world napsáno v Charm je:
ext proc write_string (ref pole char); modul ahoj; ent proc start (); write_string ("Hello world"); end_proc; end_module;
a ekvivalentní nejnovější verze po změnách evolučního syntaktického jazyka je:
import lib.Out; modul Hello {export proc ~ start () {Out.vdu.str ("Hello world"). nl (); }}
Sada nářadí
Očekává se, že implementace sady nástrojů poskytnou kompilátoru a assembleru ke generování objektových souborů ze zdrojového kódu Charm a zdrojového kódu assembleru, které pak mohou být propojeny spolu s knihovnou a soubory podpory běhu pro vygenerování spustitelného programu.
V době psaní pouze jedna sada nástrojů Charm instalace je k dispozici (zdarma) ke stažení. Samotné nástroje jsou psány v jazyce Charm a zdrojový kód je k dispozici v souladu s podmínkami GNU General Public License. Běží dál RISC OS Počítače a platformy s CPU ARM (například Raspberry Pi ) a na emulátorech pro RISC OS, které jsou hostovány na platformách Windows nebo Linux (např RPCEmu ). Generování kódu pro hardwarově asistované operace s plovoucí desetinnou čárkou s dvojitou přesností je podporováno pro platformy založené na čipech ARM, které podporují architekturu koprocesoru VFP verze 2.
Překladač
Kompilátor Charm je kompilátor rekurzivního sestupu s jedním průchodem, který analyzuje zdrojový kód Charm a generuje čtyřnásobky formuláře výsledek: = lhs op rhs v intermediálním jazyce, který podporuje aritmetické, logické a tok řídících operací. Data jsou uložena v dočasných položkách, které jsou přiřazeny registrům a paměťovým umístěním v zadní části překladače. V současné době existují dva zadní konce, jeden generuje Motorola 68000 montážní jazyk a další generující ARM architektura.[7]
Čtyřnásobný výstup z příkladu hello world je:
param l1 $ call write_string [proc (ref array char) void]
a výstup assembleru je:
tětiva "Ahoj" xdef _Start sladit_Start xref _write_string stmfd sp!,{rp} adr r0,_l1 $ bl _write_string ldmfd sp!,{ks} adresa sladit_l1 $ tětiva "Ahoj světe" Přímo konec
V novějších vydáních Charm, I / O postupy byly rozděleny do vlastních modulů v a Ven. Další standardní knihovní postupy jsou uspořádány do sady záznamů s odkazy na procedury jako pole. V rámci této reorganizace write_string
metoda je nyní vyvolána prostřednictvím modulu knihovny run time Ven
prostřednictvím statické reference člena .vdu
jako postup str
tj. v příkladu hello world výše write_string ("Hello world")
se stává Out.vdu.str („Hello world“)
.
Assembler
Assembler přijímá instruktážní mnemotechnické pomůcky, deklarace dat a směrnice a sestavuje soubor objektů obsahující informace snadno srozumitelné CPU cílového procesoru, zejména kódové instrukce kódované v binárním formátu.
1 0000: 6D795F6D 2 3 4 5 6 0000: E92D4000 7 0004: 8 000C: EBFFFFFE 9 0010: E8BD800010 11 12 13 0000: 48656C6C | tětiva "Ahoj" xdef _Start sladit_Start xref _write_string stmfd sp!,{rp} adr r0,_l1 $ bl _write_string ldmfd sp!,{ks} adresa sladit_l1 $ tětiva "Ahoj světe" Přímo konec |
Linker
Jeden a pouze jeden z modulů Charm propojených k vytvoření spustitelného programu musí obsahovat proceduru odpovídající jednomu z podpisů:
export proc ~ start () export proc ~ start (int argc, ref pole ref pole char argv)
To je analogické s hlavní funkcí v C a Jáva jazyky. Tady argc
obsahuje počet parametrů předaných na příkazovém řádku a argv
obsahuje odkaz na pole argc + 1
řetězce (jeden řetězec na poziční parametr v pořadí a zakončení nula
).
Moduly mohou navíc volitelně obsahovat statické spouštěcí a vypínací procedury vyvolané během spouštění a vypínání programu, které odpovídají podpisům:
export proc ~ spuštění () export proc ~ vypnutí ()
Linker přidá všechny potřebné informace o záhlaví vyžadované operačním systémem za účelem spuštění programu a zajistí spuštění podpůrného kódu knihovny běhu běhu, který nastaví běhové prostředí (data a ukazatele zásobníku) a předá řízení startovací proceduře aplikace.
Volitelně se vytvoří mapový soubor zobrazující názvy všech modulů propojených s vytvořením programu spolu s globálními daty a odkazy na kódy, které mohou používat debuggery a profilovače.
Reference
- ^ ISBN D-201-10073-8 Aho, Ullman Principy návrhu překladače
- ^ ISBN D-201-10194-7 Aho, Sethi, Ullman Principy, techniky a nástroje překladačů
- ^ Červen 1996 Stephen Wade Magazín uživatele žaludu, kouzlo nebo cetka?
- ^ Gavin Wraith (leden – únor 2012). „Archivní časopis“. Archivovány od originál dne 04.03.2016. Citováno 2012-03-18.
- ^ Červen 2013 E-kniha Kindle Programování kouzla na Raspberry Pi
- ^ Charm RISC OS, stránka jazyka
- ^ ISBN 0-9512579-0-0 Peter Cockerell Programování jazyka ARM Assembly