Seed7

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 15:31, 8 июня 2016.
Seed7
fraimed
Парадигма объектно-ориентированный
Спроектировано Томас Мертес
OS Linux, Windows, Mac OS, BSD, Unix
Лицензия GPL, LGPL
Портал: seed7.sourceforge.net
Под влиянием
Pascal, Modula-2, Ada, ALGOL 68, C, C++, Java

Seed7 - (произносится siːd ˈsɛvn) - это язык программирования общего назначения. Это язык уровня выше по сравнению с Ada, C ++ и Java.

Введение

Что такое Seed7?

Seed7 - язык, в котором могут быть легко определены новые выражения и операторы. Функции с типизированными результатами и параметрами более элегантны, чем обычные шаблоны или дженерики. Подход ООП используется только когда он приносит преимущество, а не в местах, когда другие решения более очевидны. Хотя Seed7 содержит несколько концепций других языков программирования, он, как правило, не рассматриваются как потомок какого либо языка. Программист должен сосредоточиться на решении проблем, а не на соответствии или выполнении какой-либо парадигмы. Поэтому Seed7 позволяет программировать в "пространстве проблемы", не ставя узкие синтаксические и семантические рамки. Предопределенные конструкции Seed7 определены таким образом, чтобы быть легко читаемыми и понятными. Этот практичный подход можно резюмировать:

Программирование должно приносить удовольствие

Программы Seed7 могут быть интерпретированы или компилированы, поэтому Seed7 может быть использован для написания скриптов и "реальных" программ.

Зачем нужен новый язык программирования?

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

v1: = v2 cross v3;   write(v1 * v2);

Программы, которые ищут какую то инфомрацию в базе данных, могут стать более понятным с помощью выражения for в цикле по таблицам. Использование подобного выражения for может быть:

 for person1, person2
  where person1.age = person2.age and
      person1.mother = person2.mother and
      person1 <> person2 do
    writeln("Twins: " <&amp; person1.name <&amp; " and " <&amp; person2.name);
 end for;

Такие расширения делают понимание, возможность изменений и отладку программы проще.

Особенности Seed7

У Seed 7 есть ряд особенностей:

  • Структурное Описание Синтаксиса Seed7
Структурное Описание Синтаксиса Seed7 (сокращ.S7SSD) может описывать большую часть синтаксисов языков программирования. Синтаксис идентификаторов, литералов и комментариев не описывается с S7SSD. S7SSD рассматривает программу как большое безтиповое выражение. Синтаксис этого выражения описывается prefix-, infix- и postfix-операторами. Операторы имеют приоритет и ассоциативность. Операторы могут иметь один или более символов. Символы оператора могут быть рядом, а так же между ними могут быть параметры. S7SSD инфиксного +:
$ syntax expr: .(). + .()   is -> 7;
Эта строчка определяет + как левый ассоциативный инфиксный оператор с приоритетом 7. Оператор + является инфиксный, потому что используется шаблон оператора:
() + ()
Место параметров задается (). Любое выражение может быть использовано в качестве параметра. Тип параметров и типа результата + не указаны в S7SSD. Проверки правильности типа не делаются на синтаксическом уровне. Таким образом S7SSD позволяет синтаксис, который не будет разрешен в соответствующем описании EBNF. S7SSD определяет только символы оператора и их приоритет, а так же ассоциативность.
  • Типы являются объектами первого класса и, следовательно, шаблоны и генерики могут быть легко определены без специального синтаксиса.
  • Предопределенные конструкции, такие как массивы или циклы, определяются в самом языке.
  • ООП основано на основе интерфейсах, поддерживает множественную диспетчеризацию и позволяет подключать методы к объектам.
  • Статический контроль типов и отсутствие автоматических приведений.
Вместе с проведением всех проверок, во время компиляции выполняются проверки статических типов. Ошибки типов, например, попытка разделить целое на строку, могут быть обнаружены раньше (если эта необычная операция не была определена). Ключевым моментом является то, что ошибки типа находятся без процесса выполнения программы. Некоторые ошибки типа могут быть скрыты в редко исполняемых ветвях кода. Статический контроль типов легко находит такие ошибки. С динамическим же типом, необходимы более сложные тесты. Даже тестов с 100% покрытием кода не достаточно, так как должны быть приняты во внимания всевозможные сочетания создания и использования различных типов. Это означает, что тестирование не может гарантировать нахождения всех ошибок типа, которые могут найти статические проверки типа. Кроме того, необходимо повторять все тесты после каждого изменения программы. Естественно появятся сомнения, что было проведено достаточно тестов, поэтому можно сказать, что проверка типов при компиляци повышает надежность программы.
Seed7 гарантирует, что значения объекта всегда имеют тип объекта. Эта цель достигается при помощи механизмов обязательной инициализации, проверки выполнения и невозможности изменить произвольные места в памяти. Если мусорные значения не могут быть сгененированны, то можно гарантировать, что только правильные значения с правильным типом используются как значения объектов.
  • Правила перегрузки гораздо проще
Выражение может быть понято без вызова его контекста.
Ошибки, вызванные незапланированными автоматическими преобразованиями типов не могут произойти.
Так как вы должны делать преобразования типов явным, вы более осведомлены о происодящем во время работы
  • Интерфейсные типы могут быть использованы, если объект может иметь несколько типов во время выполнения.
В этом случае тип интерфейса объекта может быть определен во время компиляции и значение может варьироваться во время выполнения. Статическая проверка типов по-прежнему можете проверяет тип интерфейса и наличие интерфейсных функций. Кроме того, компилятор может также проверить, что все функции, предоставленные по типу интерфейса определяются для реализованного типа.
  • Различные предопределенные типы, такие как массивы с изменяемыми размерами, хэши, bitsets, структуры, и т.д.
Новый язык программирования отличается не только от существующих новыми функциями. Реальное преимущество приходит от удаления особенности, которые устарели.

Понятия, которые используются другими языками, но не Seed7

  • Нет goto выражений. Скрытые goto, как break и continue-операторы также убраны из языка.
  • Нет выражения return.
  • Нет автоматического преобразования типа. Если подпрограмма вызывается для работы с различными типами, она должна быть перегружена.
  • Нет списков с неизменяемой длиной. Вместо этого, можно использовать массивы в качестве параметров.
  • Нет параметров по умолчанию. Но это легко реализовать при помощи двух подпрограмм: одной с, и один без дополнительного параметра.
  • Нет специального "параметра" называемого self" или "this". В процедуре принимающим объектом является формальный параметр с заданным пользователем именем.
  • Нет макро-определений, поскольку этот механизм слишком похож на функцию подпрограммы. Вместо этого, подпрограммы могут быть использованы в более гибком виде.
  • Нет зарезервированных слов.
  • Нет концептуального различия между функциями, операторами, процедурами и выражениями.
  • Механизм вызывающий процедуры не основывается на концепции с парой объект-сообщения (объект получает сообщение). Вместо этого, ищется соответствие в списке объектов. Этот более общий (и мощный) механизм называется множественная диспетчеризация и включает в себя простой механизм объект-сообщение как особый случай.

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

  • Блочные комментарии начинаются (* и заканчиваются *) и могут быть вложенными.
  • Строчные комментарии начинаются с # и заканчиваются в конце строки.

Новые концепции

  • Переменные и константы должны быть инициализированы при определении.
  • Каждое выражение имеет ровно один тип. Это означает, что перегруженные функции решаются с их фактическими параметрами, а не с точки зрения места их вызова. (Это отличается от механизма перегрузки, используемым ADA)
  • С определеннием синтаксиса, могут быть определены новые операторы и выражения.
  • Не только предопределенные символы операторов могут быть перегружены, можно придумать совершенно новые символы оператора.

Снятые ограничения по сравнению с другими языками

  • Не существует никаких ограничений по длине идентификатора, и всее символы идентификатора не являются существенными.
  • Выражения и круглые скобки могут быть вложенными без ограничения по глубине.
  • Количество параметров и локальных переменных не ограничено.
  • Строки могут содержать любые символы (также NUL символ) Это позволяет хранить двоичную информацию в строках.
  • Хотя строки не завершаются NUL-терминатором, они не имеют ограничение размера (Если на это хватает памяти)
  • Строковые литералы могут иметь любую длину.
  • Нет ограничений по длине исходного кода.
  • Нет ограничений уровня вложенности для include.

Объявления

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

  • Обычные объявления
  • Синтаксические объявления
  • Системные декларации

Обычные объявления

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

 const integer: ONE is 1;

Определяет целочисленную константу 'ONE' и инициализирует ее значением 1. Так же возможно определение и переменных:

 var integer: number is 0;

Определяет integer переменную 'number' со значением 0. Объявления типов сделаны как объявления констант где тип объявляемой константы "type":

const type: myChar is char;

Объявление функций так же является вариантом объявления константы:

 const func boolean: flipCoin is
  return rand(FALSE, TRUE);

Каждый объект, объявленный с 'const' или 'var', получает начальное значение. Не возможно использовать 'const' или 'var' без первоначальной инициализации. Так же возможна инициализация при помощи выражения. Например

var string: fileName is NAME &amp; ".txt";

Выражение вычисляется и результат присваивается новому объекту. Это делается в фазе анализа интерпритатора или компилятора, до исполнения программы. Выражения инициализации могут содержать любой вызов функции (или оператора). Таким образом, определяемые пользователем функции также могут быть использованы для инициализации константой или переменной:

const boolean: maybe is flipCoin;

Объявление констант и переменных может быть глобальным или локальным.

const func float: inverse (in float: x) is
   return 1/x;

Параметры функции, такие как параметр "выражение" в примере ниже, работают по принципу call-by-name:

 const proc: possiblyDo (in proc: statement) is func
   begin
     if flipCoin then
       statement;
     end if;
   end func;

Абстрактные типы данных, такие как подтипы, структуры, подстроки, массивы, хэши, множества, интерфейсы и перечисления реализованы как функции, которые возвращают тип. Например: Тип array определен в библиотеке seed7_05.s7i со следующим заголовком:

const func type: array (in type: baseType) is func

Так же допускаются пользовательские абстрактные типы данных.

При инициализации, используется операция создания (:: =). Явные вызовы операции создания не нужны.

Жизненный цикл объекта выглядит как:

  1. Резервируется память для нового объекта (на стеке или в куче - не имеет значения)
  2. Содержание новой памяти не определено (может содержать мусорные значения), поэтому необходимо выражение создания вместо простого присваивания.
  3. Выражение создания копирует правую часть в левую, принимая во внимание то, что левая часть неопределена.
  4. Если объект является переменной, то другие значения могут быть заданы с оператором :=. Присваивание может происходить с учетом того, что в левой части находятся нужные значения. Это позволяет строкам и некоторым другим типам, которые просто ссылаются на память, освобождать только нужные участки памяти.
  5. В конце жизни объекта вызывается выражение-деструктор. Для строк (и некоторых других видов, которые содержат просто ссылки на области памяти), удаляется значение строки (а не сам объект).
  6. Память объекта освобождается.
  7. Первые три шага, как правило, скрыты в операторе объявления.

Выражение

ONE . ::= . 1

присваивает 1 объекту ONE. Существует две причины иипользовать  ::= вместо := для инициализации нового значения

Оператор (: =) может быть использован только для присвания значение переменной и инициализация констант. Иногда инициализация нового объекта отличается от простого присваивания. Для всех предопределенных типов оператор создания (:: =) уже определен.

Объявление синтаксиса

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

$ syntax expr: .(). + .()   is ->  7;

Большая часть определений синтаксиса может быть найдена в файле syntax.s7i.

Системные объявления

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

$ system "integer" is integer;

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

Существуют следующие системные объявления

 $ system "type" is type;
 $ system "expr" is expr;
 $ system "integer" is integer;
 $ system "bigInteger" is bigInteger;
 $ system "char" is char;
 $ system "string" is string;
 $ system "proc" is proc;
 $ system "float" is float; $ system "true" is TRUE;
 $ system "false" is FALSE;
 $ system "empty" is empty; $ system "memory_error" is MEMORY_ERROR;
 $ system "numeric_error" is NUMERIC_ERROR;
 $ system "range_error" is RANGE_ERROR;
 $ system "file_error" is FILE_ERROR;
 $ system "illegal_action" is ILLEGAL_ACTION; $ system "assign" is := ;
 $ system "create" is ::= ;
 $ system "destroy" is destroy;
 $ system "ord" is ord;
 $ system "in" is in;
 $ system "prot_outfile" is PROT_OUTFILE;
 $ system "flush" is flush;
 $ system "write" is write;
 $ system "writeln" is writeln;
 $ system "main" is main;

Hello world

Программа Seed7 состоит из последовательности объявлений. С каждым объявлением, тип и имя прикрепляется к новым объектам. Кроме того, каждый новый объект получает начальное значение.

Пример объявления объекта:

 const proc: main is func
  begin
    writeln("hello world");
  end func;

Объект "main" объявлен как константа и proc имеет тип ьфшт. Объявляя main с типом proc, получаем процедуру из него. Объект "main" получает

func ... end func

структуру как значение. Конструкция 'func' похожа на begin ... end в PASCAL и { ... } в C. Внутри 'func' находится writeln выражение с "hello world" строкой. Выражение writeln используется для вывода строки. Для подобного использования, мы должны добавить несколько вещей:

 $ include "seed7_05.s7i";

 const proc: main is func
  begin
    writeln("hello world");
  end func;

Первая строчка включает все стандартные определения. В отличие от других стандартных библиотек, seed7_05.s7i содержит не только объявления функций, но также объявления выражений и операторов. Дополнительно, seed7_05.s7i определяет 'main' функцию как точку входа.

Если вы написали эту программу в файл с именем hello.sd7, то можете выполнить команду:

s7 hello

Интерпритатор Seed7 выдаст результат похожий на:

SEED7 INTERPRETER Version 5.0.4  Copyright (c) 1990-2013 Thomas Mertes
hello world

Ссылки