Протель
Protel расшифровывается как «Процедурно-ориентированный язык обеспечения соблюдения типов». Это язык программирования, созданный Nortel Networks и используемый в системах коммутации телекоммуникаций, таких как DMS-100 . [1] [2] Протел-2 — объектно-ориентированная версия Протеля. [3] [4]
Язык PROTEL был разработан для удовлетворения потребностей цифровой телефонии и лежит в основе линейки систем коммутации DMS-100. PROTEL — это строго типизированный язык с блочной структурой, основанный в значительной степени на PASCAL и ALGOL 68 с письмом слева направо. стиль назначения переменных, массивы переменного размера и расширяемые структуры. Разработчики PROTEL значительно расширили тогдашний PASCAL, добавив внешнюю компиляцию и расширив структуры данных, доступные в языке. [3]
Компилятор PROTEL тесно интегрирован с операционной системой (SOS), приложением (CALLP), средой разработки (PLS) и изначально процессором (NT40). PLS, SOS, CALLP и сам компилятор написаны на PROTEL. Любое описание языка PROTEL не может не включать некоторые аспекты других компонентов.
В PROTEL очень строгое соблюдение типов, но тесная связь компонентов создает возможность обойти некоторую проверку типов. для опытных программистов путем непосредственного использования внутренних функций компилятора.
PROTEL считается «многословным», поскольку содержит большое количество зарезервированных слов, а некоторые утверждения читаются как английские.
Исходный код PROTEL не чувствителен к регистру, но по соглашению для зарезервированных слов используется верхний регистр.
Переменные и присвоение
[ редактировать ]Большинство глобальных и все локальные переменные объявляются с использованием зарезервированного слова DECL.
- DECL myvar INT;
Переменные можно инициализировать с помощью ключевого слова INIT.
- DECL myvar INT INIT 42;
В константах используется ключевое слово IS, в шестнадцатеричных — #.
- DECL myconst INT IS #F00D;
Глобальные переменные также могут использовать объявления PROTECTED или PRIVATE для определения данных, защищенных от записи, или локальных данных потока соответственно. Для записи в защищенные данные необходимо использовать встроенные примитивы, которые безопасно изменяют защищенные данные. Защищенные данные выдерживают все перезапуски, за исключением перезагрузки образа системы.
- ЗАЩИТА myprotdata INT;
- write_protected_store(myprotdata, значение);
Примечание. Аргументы WRITE_PROTECTED_STORE не зависят от типа, если типы обоих аргументов совпадают.
PRIVATE предоставляет частную копию данных для каждого процесса, который их использует. Функционала COW нет, каждому процессу выделяется своя копия, и при необходимости она инициализируется при создании.
- ЧАСТНЫЕ мои личные данные INT;
Примечание. Локальные переменные, определенные с помощью DECL, естественно, являются частными.
ГАЗИНТА
[ редактировать ]Газинта — это разговорное название, используемое для оператора присваивания «->». Его название происходит от слова «goes in», что означает переменную gazinta (входит в). Выражения оцениваются строго слева направо без приоритета операторов. Отсутствие приоритета операторов является наследием процессора NT40, который использовал ALU на основе стека с логикой RPN. Круглые скобки используются для определения приоритета подвыражений.
- выражение -> myvar;
Указатели
[ редактировать ]Оператор указателя — @ и располагается после ptr. NULL-указатель — это предопределенное значение, которое гарантированно не указывает на сопоставленный адрес. Это не 0, не -1 и не какой-либо другой предопределенный шаблон неинициализированной памяти (#FDFD). Другими словами, указатель по умолчанию не NULL, он должен быть установлен в коде. Арифметика указателей не поддерживается.
- DECL myptr PTR TO INT INIT NULL;
- DECL мои данные INT;
- myptr@ -> мои данные;
Примечание. Разыменование нулевого указателя приведет к ловушке доступа к данным.
Дескрипторы
[ редактировать ]Дескриптор DESC — это структура, определенная компилятором, содержащая указатель на массив и верхнюю границу массива. Дескрипторизованный массив индексируется с использованием простого синтаксиса массива «MY_DESC[I]», а оператор UPB можно использовать для доступа к верхней границе «UPB MYDESC». Оператор TDSIZE также существует как наследие реализации дескриптора в NT40: TDSIZE = UPB+1. Дескрипторы имеют автоматическую проверку границ времени выполнения для динамически выделяемых массивов. Индексация дескриптора за пределами границ или индексация NULL-дескриптора вызовет ловушку проверки диапазона дескриптора. UPB обычно используется прикладным программным обеспечением для более корректной обработки индекса, выходящего за пределы диапазона.
- DECL my_int_array DESC OF INT INIT NULL;
Примечание. NULL можно использовать для указателей и дескрипторов.
Строки широко используют дескрипторы. Строки имеют определенную длину и не содержат нулевого символа-терминатора.
- DECL foo DESC OF CHAR IS "моя строка с именем foo";
Блоки
[ редактировать ]Область действия блока определяется операторами BLOCK и ENDBLOCK, которые аналогичны BEGIN END в Паскале или { } в C. Блоки могут быть дополнительно помечены для расширенной проверки и функциональности компилятора.
- [метка:] БЛОК
- какой-то код
- ВЫХОД [метка];
- больше кода
- КОНЦЕВОЙ БЛОК [метка]
Процедуры
[ редактировать ]Процедуры и функции различаются только наличием предложения RETURNS и требованием включения оператора RETURN. Оператор RETURN может быть вставлен в любое место функции или процедуры.
Декларация
- PROC myprocname ( список аргументов ) ВПЕРЕД;
- PROC имя_функции( список аргументов ) ВОЗВРАЩАЕТ тип IS FORWARD;
Выполнение
- PROC имя_функции( список аргументов ) ВОЗВРАЩАЕТ тип IS
- БЛОКИРОВАТЬ
- ...код...
- ВОЗВРАТ некоторое_значение;
- КОНЦЕВОЙ БЛОК
Структуры
[ редактировать ]TABLE — это базовая структура массива. TABLE используется только для массивов, размер которых известен во время компиляции. Дескрипторы являются предпочтительным способом ссылки на массивы. Индексация таблицы за пределами диапазона вызовет ловушку проверки диапазона таблицы. Операторы UPB и TDSIZE также применяются к таблицам.
Союзы
[ редактировать ]OVERLAY — это базовая структура объединения. Он объявляется и используется аналогично языкам, произошедшим от Паскаля.
ОБЛАСТИ
[ редактировать ]Области — это блоки памяти, которые можно преобразовать в ТАБЛИЦЫ и НАКЛАДКИ. Они объявляются в байтах и обычно объявляются достаточно большими, чтобы обеспечить возможность расширения в будущем. Это связано с желанием обновить программное обеспечение DMS «вживую», не требуя перезагрузки. Модульная природа PROTEL позволяет загружать относительно небольшие фрагменты кода; если бы AREA планировались разумно, это не повлияло бы на размещение модулей в памяти, тем самым избежав перезапуска.
ПОДСИСТЕМЫ, МОДУЛИ и РАЗДЕЛЫ
[ редактировать ]РАЗДЕЛ — это текстовый файл, содержащий исходный код и директивы для управления различными типами разделов и их положением в иерархии модулей. РАЗДЕЛ — это наименьшая единица компиляции. МОДУЛЬ — это наименьшая единица соединения и нагрузки, состоящая из одной или нескольких секций. ПОДСИСТЕМА — это наименьшая единица упаковки, содержащая один или несколько модулей.
Поток управления
[ редактировать ]Существует две формы оператора case (switch). Использование ключевого слова CASE использует таблицу переходов, а SELECT использует последовательную логику «если-то-иначе». Случаи эксклюзивны, они не проваливаются, как в C.
Ссылки
[ редактировать ]- ^ Кришна, Сандип Сахай, Брайан Николсон, С. (2003). Глобальный ИТ-аутсорсинг: разработка программного обеспечения за рубежом . Кембридж: Издательство Кембриджского университета. п. 7 . ISBN 978-0521816045 .
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ Телесис (3), 1989 г.
{{citation}}
: Отсутствует или пусто|title=
( помощь ) - ^ Jump up to: а б «Опыт работы с модульным типизированным языком: ПРОТЕЛ» , ICSE '81 Материалы 5-й международной конференции по программной инженерии
- ^ Дини, П.; Бутаба, Р.; Логриппо, Л., ред. (1997). Особенности взаимодействия в телекоммуникационных сетях IV . Амстердам: IOS Press. п. 23. ISBN 978-9051993479 .