Inferno Programmer's Guide / Руководство программиста по ОС Inferno: Chapter 5 - The Limbo Language Definition

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Описание языка Limbo

Введение

rapidfx 04.06.09 в 15:40

0

Limbo - язык общего назначения, предназначенный для приложений запущенных на распределенных системах малых компьютеров. Он поддерживает модульное программирование, строгую проверку типа во время компиляции и во время исполнения, межпроцессное взаимодействие через типизированные каналы, автоматическая сборка мусора, и простые абстрактные типы данных.
Начальной реализацией являлся режим интерпретации, который был спроектирован для предоставления безопасного исполнения программ даже на машинах без аппаратной защиты памяти.

rapidfx 04.06.09 в 15:48

0

Приложение Limbo состоит из одного или более модулей, каждый из которых поддерживает объявление интерфейса и часть с реализацией. Модуль который использует другой модуль, включает часть объявления другого модуля. Во время выполнения, модуль динамически связывается с другим модулем при помощи заявления идентификатора типа модуля и указания местоположения из которого загружается объектный код для этой реализации.
Объявление модуля определяет функции которые она желает сделать видимыми, а так же их тип данных, константы и объекты данных. В части реализации определяются функции видимые через ее интерфейс и любые функции связанные с ее типом данных, она так же содержит определения функций используемых только внутри модуля и локальные данные.

rapidfx 04.06.09 в 16:07

0

Пример Модуля
Здесь представлен простой модуль иллюстрирующий особенности языка.

rapidfx 04.06.09 в 16:08

0

1 implement command;
2 include "sys.m";
3 include "draw.m";
4 sys : sys;
5 command : module {
6 init: fn(ctxt: ref Draw->context, argv: list of string);
7 };
8 # The canonical "Hello world" program, enhanced
9 init(ctxt : ref Draw->context, argv: list of string)
10 {
7 7 sys = load sys Sys->PATH;
12 sys->print("he~l~lo world\n");
13 for (; argv != nil; argv = tl argv)
14 sys->print("%s ", hd argv);
75 sys->print("\n");
16 }

rapidfx 04.06.09 в 16:08

0

Замечание: Номера строк в левой части показаны только для облегчения обсуждения программы. Они не являются частью исходного кода.

rapidfx 04.06.09 в 16:09

0

На первый взгляд программа показывает слияние на Limbo языка C, его выражений, операторов и некоторых соглашений (например, взгляните на строки 13-14), а так же языка Pascal и его потомков (объявления в строках 4, 6). Но он отличается от них обоих. Когда программа выполняется в среде Inferno/Limbo , она выводит "hello world" и затем отображает аргументы.

rapidfx 04.06.09 в 16:14

0

Давайте посмотрим на программу строка за строкой. Она начинается (Строка 1) высказываением, что это реализация модуля Command.
Строка 2 включает файл (который ищется аналогично директиве #include языка C) названный sys m. Этот файл определяет интерфейс модуля Sys. Это говорится в части,

rapidfx 04.06.09 в 16:17

0

sys : module {
PATH : con "$sys";
print : fn (s : string, *): int;
};

rapidfx 04.06.09 в 16:18

0

Эти строки объявляют Sys типом модуль, содержащих различные вещи, среди них функцию print; первый аргумент print является строкой. Звездочка (*) в списке аргументов указывает на то, что все последующие аргументы могут быть переданы неустановленного типа.

rapidfx 06.06.09 в 07:13

0

Строка 3 включает файл draw.m . Только одна часть информации из него используется, что будет показано ниже. Строка 4 объявляет переменную sys типом Sys; это имя будет видимым посредством файла описывающего этот модуль. Она будет использована позднее для ссылки на экземпляр модуля Sys. Это объявление инициализируется в nil; это требуется для установки пригодного значения.

rapidfx 10.06.09 в 08:53

0

Строки 5-7 вводят в силу объявление реализации модуля Command. Оно состоит только из функции с именем init с двумя аргументами ref Draw->Context и список строк, и не возвращает никакого значения.
Аргумент ref Draw->Context используется если программа работает с графикой, этот тип данных определен в draw.m и ссылается на display. Поскольку программа просто выводит текст, оно не используется (и таким образом аргумент мог быть назван nil).

rapidfx 10.06.09 в 08:59

0

В модуле разработтаном для использования с другими модулями в приложении, было бы мудрым вынести объявление Command, поместив в отдельный файл названный command.m и пользоваться затем incluse "command.m" давая возможность самому модулю и другим ссылаться на него.
Функция init не является особенной в языке Limbo, однако оговорена в окружении. Например, она вызывается из программы-загрузчика системы Inferno для начала выполнения приложения.

rapidfx 10.06.09 в 09:05

0

Строка 8 является комментарием. Все что появляется после знака # до конца строки - игнорируется.

rapidfx 10.06.09 в 09:06

0

Строка 9 начинает определение функции init которая была обещана в объявлении модуля (Строка 6). Аргументом является список строк названный argv.

rapidfx 10.06.09 в 09:11

0

Строка 11 соединяет написанную программу и модуль Sys. Первый токен после load имя целевого модуляопределенного его интерфейсом (смотри Строку 2 c директивой include). Следующий токен это место где код модуля может быть найден, эта строка обычно имя файла. По соглашению, в системе Inferno каждый модуль содержит объявление константы PATH как строку с именем файла где объектный модуль может быть найден. Загрузка файла производится динамечески во время выполнения за исключением нескольких модулей встроенных в окружение выполнения (Они включают и модуль Sys; он хранит особый файл названный "$Sys").

rapidfx 15.06.09 в 17:18

0

Значением load является ссылка на имя модуля. Строка 11 присваивает ее переменной sys для последующего использования. Оператор load загружает динамически код модуля если он еще не загружен и создает его новый экземпляр.

rapidfx 15.06.09 в 17:25

0

12-ая строка начинает свою работу печатая схожее сообщение используя, конструкции предоставленные модулем Sys через указатель sys. Запись sys->print(..) означает вызов функции print модуля, на который ссылается sys. Интерфейс модуля Sys напоминает связывание с некоторым механизмом в Unix или в библиотеке ISO/ANSI C.

wuffur 16.06.09 в 07:11

0

Цикл в строках 13-14 доставляет список аргументов строки в оператор init и запускает в них итерацию используя операторы hd(head) или tl(tail). Когда он выполнется, модуль сочетает строку "hello world" и эхо.

wuffur 16.06.09 в 07:14

0

Лексические соглашения

rapidfx 04.06.09 в 16:21

0

Есть несколько видов лексем: ключевые слова, идентификаторы, константы, строки, операторы выражения, и другие разделители. Незаполненное пространство (пробелы, позиции табуляции, новые строки) игнорируется за исключением того случая, когда они служат для разделения лексем. Если ввод был обработан от лексем до какого-то определенного символа, то следующая лексема берется для использования строки символов, которая может сложить определенную лексему.

wuffur 16.06.09 в 10:48

0

Родная кодировка для Limbo - Unicode, которая идентична первому 16-битному плоскому стандарту ISO 10646. Любой символ Unicode может быть использован для комментариев или в строковых или символьных константах. Реализации предполагает, что файлы исходники использующие представление UTF-8, в которых 16-битные Unicode символы представлены как последовательности из одного, двух или трех байт.

wuffur 16.06.09 в 11:08

0

Комментарии

rapidfx 04.06.09 в 16:20

0

Комментарии начинаются со знака # и продолжаются до конца строки. Комментарии игнорируются компилятором.

rapidfx 14.06.09 в 07:43

0

Идентификаторы

rapidfx 04.06.09 в 16:21

0

Идентификатор - это последовательность букв и цифр, вначале которой стоит буква.
Буквы - это символы Unicode от a до I и от A до z вместе с символом подчеркивания (_), и все символы Unicode вместе с закодированными значениями больше 160(A0 в шестнадцатеричном формате, начало диапазона соответствует Латинскому-1).
Только первые 256 символов важны в идентификаторах.

wuffur 16.06.09 в 11:13

0

Ключевые слова

Следующие идентификаторы зарезервированы в качестве ключевых слов, и не могут быть переопределены:

{|
|-
adt alt
byte case
cyclic do
for hd
include int
module nil
real ref
string tagof
while
// Table 3 col
array big break
chan con continue
else exit fn
if implement import
Ten list load
of or pick
return self spawn
tl to type
|}

rapidfx 04.06.09 в 16:22

0

Константы

rapidfx 04.06.09 в 16:23

0

Существует несколько типов констант для обозначения базовых типов данных.

rapidfx 04.06.09 в 16:24

0

Целые константы

rapidfx 04.06.09 в 16:25

0

Целочисленные константы имеют тип int или big. Они могут быть представлены несколькими способами. Десятичная целая константа состоит из последовательности дисятичных цифр. Константа с неявным основанием системы счисление имеет десятичную основания сопровождающееся буквами R или r сопрождающееся тремя цифрами числа.Основание системы счисления находится между 2 и 36 включительно; цифры выше 10 в числе выражены с помощью символов от A до Z или от a до z. Например значение 16r20 - 32.

wuffur 16.06.09 в 17:30

0

Тип десятичного числа с неявной системой счисления - big, если его значение превышает 2^31-1, в другом случае - int.
У символьных констант тип int и они насчитывают один Unicode символ, заключенный в одинарные кавычки ('). Внутри кавычек следующие escape-последовательности представляются специальными символами:

wuffur 17.06.09 в 07:34

0

// Table 2 col
V single quote
\" double quote
w backslash
\t tab
\n newline
\r carriage return
\b backspace
\a alert character (bell)
\v vertical tab
\udddd Unicode character named by 4 hexadecimal digits
\0 NULL

rapidfx 04.06.09 в 16:25

0

Вещественные константы

rapidfx 04.06.09 в 16:25

0

Вещественные константы содержат последовательность десятичных чисел содержащих одну точку (.) и не обязательный символ e или E, и далее возможно знаковое целое. Если это явно заданная экспонента, знак точки не обязателен. Вещественные константы имеют тип real.

rapidfx 04.06.09 в 16:29

0

Строки

rapidfx 04.06.09 в 16:25

0

Строки содержат последовательность символов Unicode заключенных в двойные кавычки. Они не могут выходить за границы одной строки файла с исходным кодом. Те же самые Esc-последовательности перечисленные выше можно использовать в строковых константах. Строковые константы имеют тип string.

rapidfx 04.06.09 в 16:32

0

Константа nil

rapidfx 04.06.09 в 16:26

0

Операторы и другие разделители

rapidfx 04.06.09 в 16:32

0

// Table 7 col
The operators are :
+ * / V 7a & 1 A
< > <= >= ! = « »
&& 11 <-
+= - = * = /= 7o= &= 1 =
A= «= »= ! ~ ++ : =
The other separators are:
j ( ) { } [ ]
j -> =>

rapidfx 04.06.09 в 16:33

0

Типы и Объекты

rapidfx 10.06.09 в 09:09

0

В Limbo существуют три типа объектов:
* Данные
* Функции
* Модули

rapidfx 10.06.09 в 09:09

0

Объекты данных существуют в хранилище связанном с модулем. Над ними можно производить арифметические операции, операции присваивания, выбирать сущности компонент, и другие конкретные операции. Каждый объект данных имеет тип, который определяет, что может быть храниться внутри него и операции которые к нему могут быть прикреплены.

wuffur 17.06.09 в 16:55

0

Другой тип объекта - это функция. Функция характеризуется теми типами аргументов, которые она принимает и значениями, которые она возвращает и ассоциируется с модулями, в которых определена. Ее имена могут стать видимыми в модулях, где она определена. Их имена могут стать видимыми в объявлении модуля, или они могут быть инкапсулированы с помощью adt(абстрактных типов данных) их модулей, или могут быть закрытыми внутри модуля.

wuffur 18.06.09 в 15:17

0

В конечном счете, Limbo-программы организованы в модули: именованная коллекция объектов данных, констант, абстрактных типов данных и функций может быть доступна через этот модуль. Объявление модуля выводить модули-члены в видимую для модулей область; определение модуля определяет открытую область видимости членов и его закрытые части, включая те объекты данных, которые она использует. Модуль, в котором хотят использовать структуры других модулей включает его объявление по порядку, чтобы понять, что он экспортирует, но перед их использованием он явно загружает новый модуль.

wuffur 18.06.09 в 15:20

0

Типы

rapidfx 05.06.09 в 11:28

0

В Limbo есть несколько основных типов, некоторые встроенные высокоуровневые абстракции и другие типы - смещение нескольких типов. В объявлении и некоторых других местах, конструкции именуют тип который используется. Синтаксис такой:

wuffur 18.06.09 в 15:29

0

type:
data-type function-type

rapidfx 10.06.09 в 09:10

0

Обсуждение функции будет в главе Определение Функций. Во-первых будут рассмотрены типы данных.

wuffur 19.06.09 в 12:03

0
Минутку...

Следующая страница →