Předpeklí

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 5. června 2022; ověření vyžaduje 1 úpravu .
Předpeklí
Sémantika Soutěžní programování
Jazyková třída programovací jazyk
Objevil se v 1995
Autor Sean Dorward, Phil Winterbottom, Rob Pike
Vývojář Bell Labs
Typový systém přísný
Byl ovlivněn C , CSP , Alef
ovlivnil Stackless Python , Go , Rust
webová stránka vitanuova.com/inferno/li…

Limbo  je programovací jazyk pro operační systém Inferno vytvořený vývojáři UNIX .

Funkce

Jazyk Limbo má blízko k C a Javě , výsledkem kompilace je bytecode , který zajišťuje přenositelnost . Přenositelnost je jádrem samotného operačního systému Inferno (nástupce Plan 9 ), dovedena do stavu aplikace, která běží nad hostitelským operačním systémem: Plan 9 , FreeBSD , Irix , Linux , Mac OS X , Solaris , Windows NT .

Limbo má vestavěný meziprocesový komunikační mechanismus nazývaný „kanály“.

Mezi vestavěné typy:

Datové typy

Kromě obvyklých číselných typů, struktur a sjednocení podporuje Limbo řetězce a několik specifičtějších datových typů: seznamy, pole, n-tice a roury . (Existuje i speciální typ "modul", ale z hlediska jazykových vlastností je to bez zájmu.) Všechny tyto datové typy jsou prvotřídní proměnné, tzn. mohou být uloženy v proměnných, procházet kanály a tak dále.

Obyčejné číselné typy lze převádět na sebe a řetězce lze také převádět na čísla a naopak. Ale všechny konverze musí být specifikovány explicitně, neexistují žádné implicitní konverze typu.

Řetězce

Řetězce lze převést na bajtová pole a naopak. Struny navíc podporují plátky, tzn. můžete odkazovat na konkrétní znak nebo sekvenci znaků, například: můj_řetězec[5:15].

Seznamy

seznam je posloupnost prvků stejného typu, optimalizovaná pro operace typu zásobník (přidat prvek na začátek seznamu, získat první prvek seznamu, získat zbytek seznamu (kromě prvního prvku)).

Pro práci se seznamy existují tři operátory:

Příklad:

l : seznam int ; _ l = 10 :: 20 :: 30 :: nula ; // vytvoření seznamu 3 prvků l = 5 :: l ; // na začátek přidáme ještě jedno i : = hd l ; // dostaneme int rovno 5, seznam nezměněn l2 : = tl l ; // získání nového seznamu 10 :: 20 :: 30 :: nil l2 = tl l2 ; // odebereme z něj první prvek

Pole

pole obsahuje pevný počet prvků stejného typu. Velikost pole se zadává při jeho vytvoření/inicializaci, nikoli při deklaraci typu proměnné – tzn. pole lze dynamicky vytvářet kdykoli (pokud je známa požadovaná velikost pole). Ve skutečnosti v Limbo existují pouze dva způsoby, jak dynamicky alokovat paměť: vytvořit pole zadáním požadované velikosti pomocí proměnné a přidat nový prvek na začátek seznamu. Pole přirozeně také podporují řezy.

N- tice

N-tice je seznam 2 nebo více prvků libovolného typu. A nejde jen o seznam, ale o stejný datový typ jako ostatní – typ samotné Tuple je vlastně dán tím, jaké typy prvků a v jakém pořadí obsahuje. Příklad:

i_s : ( int , řetězec ); i_s = ( 5 , "pět" ); // typ i_r_s_s je (int, real, string, string) i_r_s_s : = ( 5 , 0,5 , "pět" , "komentář" );

Tuple lze rozložit na komponenty přiřazením k seznamu běžných proměnných:

// vytvoří proměnné i typu int a s typu string a // inicializuje je na 5 a "pět" ( i , s ) := i_s ;

Prohození hodnot dvou proměnných na Limbo:

( i , j ) = ( j , i );

Kanály

Kanály (chan) vám umožňují organizovat IPC mezi místními procesy atomickým předáváním objektů daného typu. Čtení/zápis kanálu je operace blokování.

c : = chan of int ; // vytvoří kanál c <-= 10 ; // odeslání na kanál i : = <- c ; // příjem z kanálu int <- c ; // přijme a ignoruje hodnotu c = nil ; // zničit kanál

Kanály lze ukládat do vyrovnávací paměti (zadáte velikost vyrovnávací paměti přibližně stejnou jako velikost pole). Zápisy do kanálů s vyrovnávací pamětí nejsou blokovány, dokud není vyrovnávací paměť plná. Vyrovnávací paměť funguje jako fronta FIFO. Pro multiplexování kanálů v Limbo existují až dva způsoby - můžete číst z řady kanálů, nebo můžete použít speciální alt operátor pro výběr kanálu.

alt { i : = < -inchan => sys -> print ( "received:%d \n " , i ); outchan <-= "zpráva" => sys -> print ( "zpráva odeslána \n " ); }

Kompozitní typy

pole chan of ( int , seznam řetězců ) _ _

Toto je pole, které ukládá kanály, kterými jsou předávány n-tice skládající se z int a seznamu řetězců. Velikost pole zde není definována, nastaví se při provádění, kdy je pole inicializováno.

Unicode

Limbo používá UTF8 pro I/O a UTF16 pro reprezentaci řetězců v paměti. To znamená, že například při čtení zdrojového kódu modulu z disku může používat UTF8 v komentářích, řetězcích a znakových konstantách. Pokud existuje pole bajtů (pole bajtů) a je převedeno na řetězec, pak jsou bajty z pole považovány za UTF8 a převedeny v řetězci na UTF16; a při převodu řetězce na pole bajtů dojde k obrácenému převodu a pole je UTF8.

Funkce

Funkce lze předávat jako parametry odkazům funkcí.

OOP

V obvyklém chápání pojmu OOP neexistuje. Abstraktní datové typy (adt) však mohou jako členy kromě běžných datových typů obsahovat i související funkce.

Streamy

Ke spuštění dané funkce v samostatném vláknu používá Limbo vestavěný příkaz spawn.

Chyby a výjimky

Existuje podpora výjimek, jak běžných řetězců, tak vlastních typů. Většina systémových a knihovních funkcí používá k vracení chyb n-tice: (errcode, result) místo výjimek.

Příklad programu

Program, který vytiskne „ Ahoj, světe “.

implementovat příkaz; zahrnout "sys.m"; zahrnout "draw.m"; sys: sys; Příkaz:modul { init: fn (ctxt: ref Draw->Context, argv: seznam řetězců); }; init(ctxt: ref Draw->Context, argv: seznam řetězců) { sys = načíst Sys Sys->PATH; sys->print("ahoj světe\n"); pro (; argv!=nula; argv = tl argv) sys->print("%s", hd argv); sys->print("\n"); }

Poznámky

Odkazy