Разработка программ в среде операционной платформы Inferno


Limbo: коммуникация каналов и основные графические возможности


Будучи предложенным новичком "комнаты Unix" (the Unix room) Шоном Дорвардом (Sean Dorward), язык Limbo суть безусловно интегральная составляющая часть Inferno. Перед обсуждением языка не помешает ознакомится с рядом фундаментальных императивов, который был выдвинут при его проектировании:

  • Малый размер - язык не должен требовать большого компилятора/runtime-системы.
  • Портабельность - скомпилированный код должен выполняться на различных машинных архитектурах.
  • Скорость - время исполнения должно приближаться к таковому в C.
  • Динамичность - чтобы минимизировать использование памяти и увеличить гибкость, части кода и данных должны быть загружаемыми и выгружаемыми во время исполнения.
  • Безопасность - проверки типов во время компиляции и исполнения должны использоваться с тем, чтобы предотвратить запуск некорректных программ.
  • Многозадачность - необходима легкость в написании программ, содержащих несколько процессов (в терминологии Inferno - нитей), которые коммуникатируют между собой и/или совместно используют данные.
  • Высокоуровневая сборка мусора - программисты должны сбросить с плеч бремя явного освобождения памяти.

Что же получилось в результате? Прежде всего удачный инструмент, язык простой, но мощный, и незаменимый при разработки параллельных, распределенных систем. Чтобы бегло ознакомиться с особенностями языка, рассмотрим пару примеров (замечание: номера строк введены для удобства ссылок). Полагаем, что можно безболезненно обойтись без "Hello World!" и ей подобных, поэтому приводим примеры более серьезных программ.

01 implement Targ1; 02 03 include "sys.m"; 04 sys: Sys; 05 include "draw.m"; 06 07 Targ1: module { 08 init: fn (nil: ref Draw->Context, argv: list of string); 09}; 10 11 init (nil: ref Draw->Context, argv: list of string) 12 { 13 sys = load Sys Sys->PATH; 14 n:= len argv; 15 sync:= chan of int; 16 spawn targ (sync, n); 17 # Вывод параметров командной строки с секундной задержкой 18 for (i:= 0; i < n; i++) { 19 sys->print ("%d: %s\n", i, hd argv); 20 argv = tl argv; 21 <-sync; 22 } 23} 24 25 targ (sync: chan of int, n: int) 26 { 27 for (;;) { 28 sys->sleep (1000); 29 sync <-= 1; 30 } 31}




Начало  Назад  Вперед