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 .
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:
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 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].
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í prvekpole 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 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 (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álKaná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 " ); }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.
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 lze předávat jako parametry odkazům funkcí.
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.
Ke spuštění dané funkce v samostatném vláknu používá Limbo vestavěný příkaz spawn.
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.
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"); }
Programovací jazyky | |
---|---|
|
Rob Pike | |
---|---|
Operační systémy | |
Programovací jazyky | |
Software | |
Publikace |
|
jiný |
|