Limbo

Limbo
Limbo
Семантика:

Конкурентное программирование

Появился в:

1995

Автор(ы):

Шон Дорвард, Фил Винтерботтом, Роб Пайк

Типизация данных:

строгая

Испытал влияние:

C, CSP, Alef

Повлиял на:

Stackless Python, Go

Сайт:

http://www.vitanuova.com/inferno/limbo.html

Limbo — язык программирования в операционной системе Inferno, созданный разработчиками UNIX.

Содержание

Особенности

Язык Limbo близок Си и Java, результатом компиляции является байт-код, что обеспечивает переносимость. Переносимость же лежит в основании самой ОС Inferno (наследницы Plan 9), доведенной до состояния приложения, запускаемого поверх хост-операционной системы: Plan 9, FreeBSD, Irix, Linux, Mac OS X, Solaris, Windows NT.

Limbo имеет встроенный механизм межпроцессного взаимодействия под названием «channels».

Среди встроенных типов:

Типы данных

Помимо обычных числовых типов, структур и union, Limbo поддерживает строки и несколько более специфических типов данных: списки, массивы, tuples и каналы. (Ещё есть специальный тип "модуль", но с точки зрения особенностей языка он интереса не представляет.) Все эти типы данных это first-class variables, т.е. их можно сохранять в переменных, передавать через каналы, etc. Обычные числовые типы можно преобразовывать друг в друга, кроме того строки тоже можно преобразовывать в числа и наоборот. Но все преобразования должны указываться явно, неявных преобразований типов нет.

Строки

Строки можно преобразовывать в массивы байт, и наоборот. Кроме этого строки поддерживают срезы, т.е. можно обратиться к конкретному символу или последовательности символов, например: my_string[5:15].

Списки

list это последовательность элементов одного типа оптимизированная для стеко-подобных операций (добавить элемент в начало списка, получить первый элемент списка, получить остаток списка (кроме первого элемента)).

Для работы со списками есть три оператора:

  • "::" (создание нового списка, левый операнд это один элемент, правый это список элементов того же типа)
  • hd" (возвращает первый элемент списка не меняя сам список)
  • "tl" (возвращает список состоящий из второго и последующих элементов заданного списка - т.е. "выкусывает" первый элемент)

Пример:

l : list of int;
l   = 10 :: 20 :: 30 :: nil; // создаём список из 3-х элементов
l   = 5 :: l;                // добавляем в начало ещё один
i  := hd l;                  // получаем int равный 5, список не изменился
l2 := tl l;                  // получаем новый список 10 :: 20 :: 30 :: nil
l2  = tl l2;                 // удаляем из него первый элемент

Массивы

array содержит фиксированное кол-во элементов одного типа. Размер массива указывается при его создании/инициализации, а не при объявлении типа переменной - т.е. массивы можно динамически создавать в любой момент (когда стал известен требуемый размер массива). Фактически в Limbo только два способа динамически выделить память: создать array указав требуемый размер через переменную, и добавить новый элемент в начало list. Естественно, массивы тоже поддерживают срезы.

Tuples

Tuple - это список из 2-х и более элементов любых типов. И это не просто список, а такой же тип данных, как и другие - тип самого Tuple фактически определяется по тому, каких типов элементы и в каком порядке он содержит. Пример:

i_s : (int, string);
i_s = (5, "five");
// тип i_r_s_s это (int, real, string, string)
i_r_s_s := (5, 0.5, "five", "comment");

Tuple можно раскладывать на составляющие присваивая его в список обычных переменных:

// создаёт переменные i типа int и s типа string и
// инициализирует их значениями 5 и "five"
(i, s) := i_s;

Обмен значений двух переменных на Limbo:

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

Каналы

Каналы (chan) позволяют организовывать IPC между локальными процессами передавая атомарно объекты заданного типа. Чтение/запись канала это блокирующая операция.

c := chan of int;   // создаёт канал
c <-= 10;           // отправить в канал
i := <-c;           // принять из канала int
<-c;                // принять и проигнорировать значение
c = nil;            // уничтожить канал

Каналы бывают буферизированные (размер буфера вы указываете примерно так же, как размер массива). Запись в буферизованные каналы не блокируется пока не будет заполнен буфер. Буфер работает как FIFO очередь. Для мультиплексирования каналов в Limbo есть целых два средства - можно читать из массива каналов, а можно использовать специальный оператор alt для выбора канала.

alt {
    i := <-inchan           =>
        sys->print("received: %d\n", i);
    outchan <-= "message"   =>
        sys->print("message sent\n");
}

Составные типы

array of chan of (int, list of string)

Это массив хранящий каналы, по которым передаются tuple состоящие из int и списка строк. Размер массива здесь не определяется, он будет задан в процессе выполнения, при инициализации массива.

Unicode

Limbo использует UTF8 для I/O, и UTF16 для представления строк в памяти. Т.е., например при считывании исходника модуля с диска в нём может использоваться UTF8 в комментариях, строках и символьных константах. Если есть массив байт (array of byte) и он конвертируется в строку, то байты из массива обрабатываются как UTF8 и конвертируются в строке в UTF16; а при преобразовании строки в массив байт происходит обратное преобразование и в массиве оказывается UTF8.

Функции

Функциям можно передавать параметрами ссылки на функции.

ООП

В привычном понимании концепции ООП нет. Однако абстрактные типы данных (adt) помимо обычных типов данных в качестве элементов могут содержать связанные функции.

Нити

Для запуска заданной функции в отдельной нити в Limbo используется встроенный оператор spawn.

Ошибки и исключения

Поддержка исключений есть, как обычных строковых, так и пользовательских типов. Большинство системных и библиотечных функций вместо исключений для возврата ошибок используют tuple: (errcode, result).

Пример программы

Программа, выводящая «Hello, World».

implement Command;
include "sys.m";
include "draw.m";
sys:    Sys;
Command: module
{
    init: fn (ctxt: ref Draw->Context, argv: list of string);
};
init(ctxt: ref Draw->Context, argv: list of string)
{
        sys = load Sys Sys->PATH;
        sys->print("hello world\n");
        for (; argv!=nil; argv = tl argv)
               sys->print("%s ", hd argv);
        sys->print("\n");
}  

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Полезное


Смотреть что такое "Limbo" в других словарях:

  • Limbo — • A word of Teutonic derivation, meaning literally hem or border, as of a garment, or anything joined on Catholic Encyclopedia. Kevin Knight. 2006. Limbo     Limbo      …   Catholic encyclopedia

  • Limbo — Lim bo (l[i^]m b[ o]), Limbus Lim bus (l[i^]m b[u^]s), n. [L. limbus border, edge in limbo on the border. Cf. {Limb} border.] 1. (Scholastic Theol.) An spiritual region where certain classes of souls were supposed to await the last judgment.… …   The Collaborative International Dictionary of English

  • limbo — lim‧bo [ˈlɪmbəʊ ǁ boʊ] noun be in limbo to be in an uncertain situation in which it is not clear what will happen next: • Investors in the shares have been left in limbo since the market tailed off. * * * limbo UK US /ˈlɪmbəʊ/ noun [U] ► an… …   Financial and business terms

  • limbo — m. anat. Borde. Medical Dictionary. 2011. limbo borde, ribete Diccionario ilustrad …   Diccionario médico

  • limbo — limbo, estar en el limbo expr. no saber, ignorar, no estar al tanto. ❙ «Estar tonto: estar en Babia, estar en el limbo.» DTE. ❙ «...está en el limbo desde hace más de diez años...» Luis Mateo Díez, El expediente del náufrago, RAE CREA. ❙ «Estuve… …   Diccionario del Argot "El Sohez"

  • limbo — (Del lat. limbus). 1. m. Lugar o seno donde, según la Biblia, estaban detenidas las almas de los santos y patriarcas antiguos esperando la redención del género humano. 2. Lugar adonde, según la doctrina tradicional cristiana, van las almas de… …   Diccionario de la lengua española

  • limbo — Ⅰ. limbo [1] ► NOUN 1) (in some Christian beliefs) the supposed abode of the souls of unbaptized infants, and of the just who died before Christ. 2) an uncertain period of awaiting a decision or resolution. ORIGIN from Latin limbus hem, border,… …   English terms dictionary

  • limbo — s. m. Dança, originária de Trindade e Tobago (América Central), em que o executante dança e tenta passar por baixo de uma vara horizontal, cuja altura em relação ao solo vai diminuindo.   ‣ Etimologia: inglês limbo limbo s. m. 1. Orla, borda,… …   Dicionário da Língua Portuguesa

  • limbo — sustantivo masculino 1. Área: religión Según la Biblia, lugar donde los Patriarcas y las personas buenas antiguas esperaban la redención de Cristo. 2. Área: religión Según algunos teólogos católicos, lugar adonde van las almas de los niños que… …   Diccionario Salamanca de la Lengua Española

  • limbo — limbo1 [lim′bō] n. pl. for 2 & 3 limbos [ME < L, abl. of limbus, edge, border (in in limbo, in or on the border) < IE * (s)lemb , to hand down: see LIMP1] 1. [usually L ] in some Christian theologies, the eternal abode or state, neither… …   English World dictionary


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»