Inferno Programmer's Guide / Руководство программиста по ОС Inferno: Chapter 5 - The Limbo Language Definition
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Описание языка Limbo rapidfx 04.06.09 в 15:40 |
|
|
Limbo - язык общего назначения, предназначенный для приложений запущенных на распределенных системах малых компьютеров. Он поддерживает модульное программирование, строгую проверку типа во время компиляции и во время исполнения, межпроцессное взаимодействие через типизированные каналы, автоматическая сборка мусора, и простые абстрактные типы данных.
rapidfx 04.06.09 в 15:48 |
||
|
Приложение Limbo состоит из одного или более модулей, каждый из которых поддерживает объявление интерфейса и часть с реализацией. Модуль который использует другой модуль, включает часть объявления другого модуля. Во время выполнения, модуль динамически связывается с другим модулем при помощи заявления идентификатора типа модуля и указания местоположения из которого загружается объектный код для этой реализации. rapidfx 04.06.09 в 16:07 |
||
|
Пример Модуля rapidfx 04.06.09 в 16:08 |
||
|
1 implement command; rapidfx 04.06.09 в 16:08 |
||
|
Замечание: Номера строк в левой части показаны только для облегчения обсуждения программы. Они не являются частью исходного кода. rapidfx 04.06.09 в 16:09 |
||
|
На первый взгляд программа показывает слияние на Limbo языка C, его выражений, операторов и некоторых соглашений (например, взгляните на строки 13-14), а так же языка Pascal и его потомков (объявления в строках 4, 6). Но он отличается от них обоих. Когда программа выполняется в среде Inferno/Limbo , она выводит "hello world" и затем отображает аргументы. rapidfx 04.06.09 в 16:14 |
||
|
Давайте посмотрим на программу строка за строкой. Она начинается (Строка 1) высказываением, что это реализация модуля Command. rapidfx 04.06.09 в 16:17 |
||
|
sys : module { rapidfx 04.06.09 в 16:18 |
||
|
Эти строки объявляют Sys типом модуль, содержащих различные вещи, среди них функцию print; первый аргумент print является строкой. Звездочка (*) в списке аргументов указывает на то, что все последующие аргументы могут быть переданы неустановленного типа. rapidfx 06.06.09 в 07:13 |
||
|
Строка 3 включает файл draw.m . Только одна часть информации из него используется, что будет показано ниже. Строка 4 объявляет переменную sys типом Sys; это имя будет видимым посредством файла описывающего этот модуль. Она будет использована позднее для ссылки на экземпляр модуля Sys. Это объявление инициализируется в nil; это требуется для установки пригодного значения. rapidfx 10.06.09 в 08:53 |
||
|
Строки 5-7 вводят в силу объявление реализации модуля Command. Оно состоит только из функции с именем init с двумя аргументами ref Draw->Context и список строк, и не возвращает никакого значения. rapidfx 10.06.09 в 08:59 |
||
|
В модуле разработтаном для использования с другими модулями в приложении, было бы мудрым вынести объявление Command, поместив в отдельный файл названный command.m и пользоваться затем incluse "command.m" давая возможность самому модулю и другим ссылаться на него. rapidfx 10.06.09 в 09:05 |
||
|
Строка 8 является комментарием. Все что появляется после знака # до конца строки - игнорируется. rapidfx 10.06.09 в 09:06 |
||
|
Строка 9 начинает определение функции init которая была обещана в объявлении модуля (Строка 6). Аргументом является список строк названный argv. rapidfx 10.06.09 в 09:11 |
||
|
Строка 11 соединяет написанную программу и модуль Sys. Первый токен после load имя целевого модуляопределенного его интерфейсом (смотри Строку 2 c директивой include). Следующий токен это место где код модуля может быть найден, эта строка обычно имя файла. По соглашению, в системе Inferno каждый модуль содержит объявление константы PATH как строку с именем файла где объектный модуль может быть найден. Загрузка файла производится динамечески во время выполнения за исключением нескольких модулей встроенных в окружение выполнения (Они включают и модуль Sys; он хранит особый файл названный "$Sys"). rapidfx 15.06.09 в 17:18 |
||
|
Значением load является ссылка на имя модуля. Строка 11 присваивает ее переменной sys для последующего использования. Оператор load загружает динамически код модуля если он еще не загружен и создает его новый экземпляр. rapidfx 15.06.09 в 17:25 |
||
|
12-ая строка начинает свою работу печатая схожее сообщение используя, конструкции предоставленные модулем Sys через указатель sys. Запись sys->print(..) означает вызов функции print модуля, на который ссылается sys. Интерфейс модуля Sys напоминает связывание с некоторым механизмом в Unix или в библиотеке ISO/ANSI C. wuffur 16.06.09 в 07:11 |
||
|
Цикл в строках 13-14 доставляет список аргументов строки в оператор init и запускает в них итерацию используя операторы hd(head) или tl(tail). Когда он выполнется, модуль сочетает строку "hello world" и эхо. wuffur 16.06.09 в 07:14 |
||
|
Лексические соглашения rapidfx 04.06.09 в 16:21 |
||
|
Есть несколько видов лексем: ключевые слова, идентификаторы, константы, строки, операторы выражения, и другие разделители. Незаполненное пространство (пробелы, позиции табуляции, новые строки) игнорируется за исключением того случая, когда они служат для разделения лексем. Если ввод был обработан от лексем до какого-то определенного символа, то следующая лексема берется для использования строки символов, которая может сложить определенную лексему. wuffur 16.06.09 в 10:48 |
||
|
Родная кодировка для Limbo - Unicode, которая идентична первому 16-битному плоскому стандарту ISO 10646. Любой символ Unicode может быть использован для комментариев или в строковых или символьных константах. Реализации предполагает, что файлы исходники использующие представление UTF-8, в которых 16-битные Unicode символы представлены как последовательности из одного, двух или трех байт. wuffur 16.06.09 в 11:08 |
||
|
Комментарии rapidfx 04.06.09 в 16:20 |
||
|
Комментарии начинаются со знака # и продолжаются до конца строки. Комментарии игнорируются компилятором. rapidfx 14.06.09 в 07:43 |
||
|
Идентификаторы rapidfx 04.06.09 в 16:21 |
||
|
Идентификатор - это последовательность букв и цифр, вначале которой стоит буква.
wuffur 16.06.09 в 11:13 |
||
|
Ключевые слова rapidfx 04.06.09 в 16:22 |
||
|
Константы rapidfx 04.06.09 в 16:23 |
||
|
Существует несколько типов констант для обозначения базовых типов данных. rapidfx 04.06.09 в 16:24 |
||
|
Целые константы rapidfx 04.06.09 в 16:25 |
||
|
Целочисленные константы имеют тип int или big. Они могут быть представлены несколькими способами. Десятичная целая константа состоит из последовательности дисятичных цифр. Константа с неявным основанием системы счисление имеет десятичную основания сопровождающееся буквами R или r сопрождающееся тремя цифрами числа.Основание системы счисления находится между 2 и 36 включительно; цифры выше 10 в числе выражены с помощью символов от A до Z или от a до z. Например значение 16r20 - 32. wuffur 16.06.09 в 17:30 |
||
|
Тип десятичного числа с неявной системой счисления - big, если его значение превышает 2^31-1, в другом случае - int.
wuffur 17.06.09 в 07:34 |
||
|
// Table 2 col rapidfx 04.06.09 в 16:25 |
||
|
Вещественные константы rapidfx 04.06.09 в 16:25 |
||
|
Вещественные константы содержат последовательность десятичных чисел содержащих одну точку (.) и не обязательный символ e или E, и далее возможно знаковое целое. Если это явно заданная экспонента, знак точки не обязателен. Вещественные константы имеют тип real. rapidfx 04.06.09 в 16:29 |
||
|
Строки rapidfx 04.06.09 в 16:25 |
||
|
Строки содержат последовательность символов Unicode заключенных в двойные кавычки. Они не могут выходить за границы одной строки файла с исходным кодом. Те же самые Esc-последовательности перечисленные выше можно использовать в строковых константах. Строковые константы имеют тип string. rapidfx 04.06.09 в 16:32 |
||
|
Константа nil rapidfx 04.06.09 в 16:26 |
||
|
Операторы и другие разделители rapidfx 04.06.09 в 16:32 |
||
|
// Table 7 col rapidfx 04.06.09 в 16:33 |
||
|
Типы и Объекты rapidfx 10.06.09 в 09:09 |
||
|
В Limbo существуют три типа объектов: rapidfx 10.06.09 в 09:09 |
||
|
Объекты данных существуют в хранилище связанном с модулем. Над ними можно производить арифметические операции, операции присваивания, выбирать сущности компонент, и другие конкретные операции. Каждый объект данных имеет тип, который определяет, что может быть храниться внутри него и операции которые к нему могут быть прикреплены. wuffur 17.06.09 в 16:55 |
||
|
Другой тип объекта - это функция. Функция характеризуется теми типами аргументов, которые она принимает и значениями, которые она возвращает и ассоциируется с модулями, в которых определена. Ее имена могут стать видимыми в модулях, где она определена. Их имена могут стать видимыми в объявлении модуля, или они могут быть инкапсулированы с помощью adt(абстрактных типов данных) их модулей, или могут быть закрытыми внутри модуля. wuffur 18.06.09 в 15:17 |
||
|
В конечном счете, Limbo-программы организованы в модули: именованная коллекция объектов данных, констант, абстрактных типов данных и функций может быть доступна через этот модуль. Объявление модуля выводить модули-члены в видимую для модулей область; определение модуля определяет открытую область видимости членов и его закрытые части, включая те объекты данных, которые она использует. Модуль, в котором хотят использовать структуры других модулей включает его объявление по порядку, чтобы понять, что он экспортирует, но перед их использованием он явно загружает новый модуль. wuffur 18.06.09 в 15:20 |
||
|
Типы rapidfx 05.06.09 в 11:28 |
||
|
В Limbo есть несколько основных типов, некоторые встроенные высокоуровневые абстракции и другие типы - смещение нескольких типов. В объявлении и некоторых других местах, конструкции именуют тип который используется. Синтаксис такой: wuffur 18.06.09 в 15:29 |
||
|
type: rapidfx 10.06.09 в 09:10 |
||
|
Обсуждение функции будет в главе Определение Функций. Во-первых будут рассмотрены типы данных. wuffur 19.06.09 в 12:03 |
