Sparkel
- Русское название:
- Спаркель
- Дата создания:
- 2009
- Создан под влиянием:
- Парадигма:
- Типизация:
- Принятые расширения файлов:
- .ski, .skl
Sparkel — это язык программирования зелёных потоков, созданный по подобию языка SPARK, подмножества языка Ada. По сравнению с аналогичными системами (Erlang, Go, Limbo), имеет большую степень параллельности. Так, в упомянутых системах потоки создаются не средствами операционной системы, а средствами среды времени исполнения, предоставляемой языком программирования, и таких потоков может быть гораздо больше, чем потоков операционной системы, однако создавать зелёные потоки требуется явно. Например, в языке Go нужно явно написать ключевое слово “go” перед вызовом процедуры. По замыслу создателей Sparkel программа должна иметь возможность быть рассечена в любом месте по мере необходимости. Любое выражение, такое как «F(X) + G(Y)», может быть вычислено параллельно, освобождая разработчика от необходимости вручную разбивать вычислительный процесс. Активные потоки конкурируют за работу. Также по сравнению с императивным SPARK изменена семантика циклов. Циклы тоже могут быть автоматически разбиты на параллельно обрабатывающиеся задания, но если это невозможно и нужно строго соблюдать последовательность, это указывается новыми ключевыми словами.
Обратной стороной язвляется, например, отказ от исключений. В обычной императивном языке исключение прерывает исполнение программы в определённом месте, а в Sparkel элементы синтаксиса могут обрабатываться параллельно с разной скоростью, и концепция исключений не вписывается в эту модель исполнения. Также в Sparkel нет явных указателей. Вместо них есть «распахиваемые записи» с одиночными ссылками. Распахиваемая запись — это запись, наличие которой необязательно, то есть, значение таких переменных может отсутствовать, и место под поля записи в этом случае не выделено. Если запись распахнуть, семантически она становится аналогичной обычной записи, а на нижнем уровне выделяется память и присваивается указатель. Счётчика ссылок нет, и новую ссылку на ту же структуру нельзя создать. Можно только скопировать значение, получив полностью независимую реплику. Однако, чтобы всё же воспользоваться знанием о том, что на нижнем уровне используются указатели, вводится новая операция обмена двух переменных. Таким образом, язык остаётся удобным для параллельной обработки, но и острые углы срезаны.
Также от других аналогов Sparkel выгодно отличается тем, что его трансляторы и виртуальная машина реализована на языке Ada, а не на устаревшем C.
От Cyclone язык позаимствовал концепцию регионов. На нижнем уровне используется сегментированная модель памяти, а в каждом сегменте — линейная адресация. Как и SPARK, Sparkel — строго типизированный язык, поэтому у всех типов данных известно их низкоуровневое представление. Концепция регионов используется для установления ссылок между сегментами.
Так же, как и SPARK, Sparkel поддерживает обобщённое программирование, однако явно специализировать пакеты не требуется. Вместо этого обобщённые пакеты транслируются один раз в общий программный код, поведение которого управляется дескрипторами типов.
Текущая реализация компилятора производит байт-код. Далее этот байт-код может либо непосредственно исполняться на виртуальной машине PSVM, либо для повышения производительности быть скомпилирован через LLVM в машинные коды и загружен в таком виде в виртуальную машину. Виртуальная машина в этом случае выполняет роль планировщика и средства взаимодействия с внешним миром.
Аналогично тому, как Sparkel был сделан по подобию SPARK, в лаборатории SofCheck&AdaCore независимыми командами были сделаны Parython (PARallel + pYTHON) и Javallel (Java + paraLLEL). На основе этих трёх языков, собрав удачные решения, был создан новый язык программирования ParaSail (Parallel Specification and Implementation Language), который сейчас продвигается как основной в этой четвёрке. У всех четырёх языков общая виртуальная машина и некоторые другие средства разработки. Трансляторы для всех 4х, как правило, поставляются в одном архиве. Поэтому можно читать блог о ParaSail, скачивать средства разработки с сайта ParaSail, и многое из этого применимо к Sparkel в том числе. На сайте ParaSail средства разработки, например, новее, чем на сайте Sparkel.
Элементы синтаксиса:
Комментарий до конца строки | -- |
---|---|
Регистрозависимость | да |
Регулярное выражение идентификатора переменной | [a-zA-Z](_?[a-zA-Z0-9])* |
Присваивание значения переменной | := |
Объявление переменной | variable : type; |
Объявление переменной с присваиванием значения | variable : type := value; |
Группировка выражений | ( ... ) |
Блок | begin ... end или foo ... end foo where foo in { if, loop, ... } |
Тождественное равенство | = |
Тождественное неравенство | /= |
Сравнение | < > <= >= |
Определение функции | function f(p1 : type1; p2 : in out type2; ... ) return return type3 is begin ... end f; |
Вызов функции | f(a, b, p3 => c, ...) |
Вызов функции без параметров | f |
Последовательность | ; |
Если - то | if condition then ... end if |
Если - то - иначе | if condition1 then ... elsif condition2 then ... else ... end if |
Бесконечный цикл | loop ... end loop |
Цикл с предусловием | while condition loop ... end loop |
Цикл с постусловием | loop ... exit when condition end loop |
Цикл for - next для диапазона целых чисел с инкрементом на 1 | for i in 1 .. 10 loop ... end loop |
Цикл for - next для диапазона целых чисел с декрементом на 1 | for i in reverse 1 .. 10 loop ... end loop |
Комментарии
]]>blog comments powered by Disqus
]]>