Back to site

Лімбу

Limbo гэта мова праграмавання прыкладанняў для Inferno. Сінтаксічна падобны на C, яна мае некалькі асаблівасцяў, якія робяць гэта прасцей, бяспечней і яшчэ больш магутным і лепш падыходзіць для развіцця адначасова, размеркаваныя сістэмы. Кампілятар Limbo спараджае незалежныя ад архітэктуры аб'ектны код, які затым інтэрпрэтуецца Inferno віртуальнай машыны або складзеныя толькі да серады, каб павысіць прадукцыйнасць. Гэта гарантуе, што прыкладанні Limbo цалкам партатыўны на ўсіх платформах Inferno.

Жыццё складаецца лягчэй праграміст з такімі функцыямі, як аўтаматычны збор смецця, кампіляцыю і выканання праверкі тыпу і простае стварэнне некалькіх працэсаў (патокаў) і сувязі паміж імі. Inferno таксама пастаўляецца з графічны адладчык, які дазваляе карыстальніку, каб увайсці ў праграму ў любым пункце і праглядаць цяперашні стан.

Limbo прапануе пашыраныя магчымасці выдзялення з прымітыўных тыпаў дадзеных:

  • байт (8-бітнае бяззнакавыя)
  • Int (32-бітнае)
  • вялікі (64-бітнае)
  • рэальныя (64-біт з якая плавае кропкай)
  • Спіс
  • масіў (з нарэзкі)
  • радок
  • набор (спарадкаваны набор тыпаў)
  • канал (для сувязі паміж працэсамі)
  • ADT (C як структуры)
  • выбраць (тып дыскрымінацыі саюза)
  • Модуль
Прыклады праграм
Наступныя праграмы ўзору ілюстрацыі простая праграма, якая бярэ лік параметраў каманднага радка і адлюстроўвае кожны з новай радкі з 1 секунда разрыву паміж імі. Другая праграма прыкладзе выкарыстоўваецца простая шматструменная падыход да ілюстрацыі асноўных выкарыстанне каналаў. (Нумары радкоў былі ўстаўлены для выгоды)

Праграма 1

1:  implement Timer;

2:  include "sys.m";
3:      sys: Sys;
4:  include "draw.m";

5:  Timer: module {
6:      init: fn (nil: ref Draw->Context, argv: list of string);
7:  };

8:  init(nil: ref Draw->Context, argv: list of string)
9:  {
10:     sys = load Sys Sys->PATH;

11:     n := len argv;
12:     sys->print("Command Line Parameters\n");
13:     for (i := 0; i < n; i++) {
14:          sys->sleep(1000);
15:          sys->print("%d: %s\n", i, hd argv);
16:          argv = tl argv;
17:     }
18: }

Лінія 1 вызначае імя модуля (праграмы) з лініямі 05/07 вызначэнні інтэрфейсу яна ўяўляе для знешняга свету. Ініцыялізацыі функцыі патрабуецца інтэрфейс для модуля для запуску з абалонкі Inferno як звычайную праграму. Гэтая функцыя вызначана, то ў радках 8-18.

Лініі 2 і 4 ўключаюць файлы, якія вызначаюць інтэрфейсы для іншых модуляў, што патрабуе таймера. Лінія 3 камплекты модуль Sys ручкі сістэмы для глабальнай зменнай.

У радку 10 загружае модуль Sys (які змяшчае сон і функцыі друку выкарыстоўваліся на лініях 14 і 15) і пачынае спасылку на яго ў глабальнай сістэме пераменнага

Абалонкі Inferno праходзіць каманднага радка параметраў модуля праз спіс зменных ARGV радок у функцыі ініцыялізацыі, якая з'яўляецца часткай модуля інтэрфейсу.

Радок 11 набораў N, каб колькасць элементаў у спісе, ARGV.

Радок 13 паказвае сістэме п раз цыкл па лініі ад 14 да 16, які першым чакае ў працягу адной секунды (сістэмы-> сон функцыя прымае аргумент затрымкі ў мілісекундах), а затым друкаваць наступны параметр ў спісе. Праграма перабор ARGV спіс з дапамогай HD (кіраўнік) і TL (хвост) аператараў.

Праграма 2
У гэтым шматструменнай версіяй папярэдняй праграмы, таймер паток запускаецца, які кантралюе хуткасць, з якой параметры каманднага радка друкуюцца. Гэта паказвае канал выкарыстоўваецца для сувязі паміж рознымі патокамі.

1:  implement Timer2;

2:  include "sys.m";
3:      sys: Sys;
4:  include "draw.m";

5:  Timer2: module {
6:      init: fn (nil: ref Draw->Context, argv: list of string);
7:  };

8:  init(nil: ref Draw->Context, argv: list of string)
9:  {
10:     sys = load Sys Sys->PATH;

11:     sync := chan of int;
12:     n := len argv;
13:     spawn timer(sync, n);

14:     sys->print("Command Line Parameters\n");
15:     for (i := 0; i < n; i++) {
16:         <-sync;
17:         sys->print("%d: %s\n", i, hd argv);
18:         argv = tl argv;
19:     }
20: }

21: timer(sync: chan of int, n: int)
22: {
23:     for (i := 0; i < n; i++) {
24:         sys->sleep(1000);
25:         sync <-= 1;
27:     }
26: }

Першыя 10 радкоў выконваюць тую ж функцыю, што і ў першай праграме, вызначыць і загрузіць неабходныя модулі.

Радок 11 вызначае канал, сінхранізацыі, які будзе выкарыстоўвацца для сувязі паміж рознымі плынямі (працэсамі), якія вызначаюць тып канала дадзеных, якія могуць быць перададзены яе, напрыклад, Чэн з Int можа быць выкарыстаны для перадачы лікаў.

У радку 13 пачынаецца паток таймера з дапамогай каманды ікру. З гэтага пункту гледжання, функцыі ініцыялізацыі і функцыю таймера будуць праводзіцца адначасова ў розных плынях.

Праграма ў цяперашні час уваходзіць у цыкл, гэтак жа, як і папярэднія праграмы. Аднак, замест выкарыстання сістэмы-> сон чакаць на працягу адной секунды, ён чакае значэнне, якое будзе адпраўлена па сінхранізацыі канала. Значэнні могуць быць аднесены да зменнай з дапамогай

     VariableName: = <сінхранізацыі; 
а як значэнне не выкарыстоўваецца, прызначэнне можа быць апушчаны.

У таймер нітку, завесы заява першага паўзы ў працягу адной секунды (радок 24), а затым адпраўляе значэнне '1 'ўніз сінхранізацыі канала (радок 25). Калі паток выконваецца п раз пятлю, яна будзе выхаду.

Пашыраны Каналы
Гэта ўсяго толькі просты прыклад выкарыстання каналаў для сувязі і сінхранізацыі паміж патокамі. Пашыраныя функцыі, такія як прайграванне музыкі на некалькіх каналаў, якія праходзяць абстрактных тыпаў дадзеных (уключаючы каналы) праз каналы і выкарыстоўваючы буфер каналы могуць усе быць выкарыстаны як частка складаных адначасовых сераду, якая прадстаўляецца Limbo.

Лімбу
Прастата ў навучанні
Limbo сінтаксіс падобны на З і прызначаны, каб лёгка прачытаць і зразумець

Абсалютна партатыўны
Зыходны код кампілюецца ў архітэктурна-незалежныя код байт, які будзе працаваць аднолькава на ўсіх платформах Inferno

Пашыраны паралелізм
Танныя працэсаў, магутных камунікацыйных міжпрацэснага і сінхранізацыі

Дынамічныя модулі
Падгружаецца падчас выканання, як і ў выпадку неабходнасці, загружаных модуляў ніколі не дублююцца ў памяці

Бяспечнай
Абагульненне і праверка выканання тыпу і выканання праверкі межаў масіва

Аўтаматычная зборка смецця
Не трэба памятаць, каб вызваліць памяць, калі больш не выкарыстоўваецца

Limbo модулі
Бяспека
Зашыфраваныя, праверку сапраўднасці падлучэнняў, шыфраваньнем і хэш-алгарытму

Сетка
Падтрымка TCP/IP, UDP, FTP і SMTP

Limbo/Tk
Магутны графічны інструментарый карыстальніцкага інтэрфейсу, ствараць складаныя акна прыкладання хутка і лёгка

Матэматыка
аперацый з якая плавае кропкай, пачатковай і лінейных функцый алгебры

Маляваць
нізкі ўзровень 32 біт графічнай бібліятэкі з выявай кампазіцыі і альфа-змешванне
Popular Links
Published (Last edited): Apr 30 , source: http://www.vitanuova.com/inferno/limbo.html