Здесь представлена статья о языке программирования, разработанном в 1998 году. Статью о языке программирования для симуляции аналоговых цепей, разработанном в 1972 году, см. здесь SPICE (язык программирования, 1972).
Spice | |
---|---|
Семантика | мультипарадигмальный: выражение-ориентированное, процедурное, объектно-ориентированное |
Класс языка | язык программирования |
Тип исполнения | компилируемый |
Появился в | 1998 |
Автор | Дейв Регетт, Крис Доллин и Стива Лич |
Система типов | статическая, динамическая, |
Spice — язык программирования, схожий с Common Lisp, но использующий синтаксис в стиле Алгол. Создан с учетом ускорения и упрощения обработки XML. Поддерживается довольно необычное смешение статической и динамической типизации, то есть поддерживается динамическая типизация с дополнительной возможностью статической типизации. Выражение-ориентированный язык с поддержкой множества типов данных, автоматическим управлением хранением данных и несколькими методами управления (multiply-dispatched methods).
Философия языка
правитьОриентирован на не слишком опытных программистов, время от времени работающих с текстом, HTML и XML, и использующих среднего размера проекты.
История
правитьЯзык был разработан на основе идеи Дейва Регетта, Криса Доллина и Стива Лича. Первоначальная работа была закончена осенью 1998 года, после чего было сделано несколько модификаций, в результате чего реализация языка существенно развивалась, а разработчики получили некоторый опыт.
Первая версия языка использовала таблицы стилей, а его синтаксис был близок к ECMAScript. В версии языка от 2002 года таблицы стилей уже не использовались, так как у разработчиков возникли проблемы с привязкой их к основному фреймворку, а синтаксис языка потерял Си-основу, приблизившись скорее к POP-11. Ядро языка осталось тем же самым, а разработчики продолжили эксперименты с добавлением поддержки регулярных выражений.
Технический обзор
правитьЯзык поддерживает автоматическое управление размещением в памяти: программы выделяют память под новые данные, которые удаляются, когда на них больше нет ссылок. Это освобождает программиста от рутинного контроля освобождения памяти.
Spice поддерживает динамическую типизацию: по умолчанию, типы являются сущностями времени исполнения (то есть их тип определяется во время исполнения, а не во время компиляции), а не сущностями времени компиляции, привязанными к выражениям. Это обеспечивает гибкость при разработке программ, за счет уменьшения обнаружения открытых ошибок и некоторых накладных расходов во время исполнения. Указание типов могут быть добавлены к объявлению переменных, и компилятор будет их использовать при проверке на ошибки и оптимизации.
Spice — выражение-ориентированный язык: (почти) все конструкции языка возвращают значения, даже циклы. Язык поддерживает многозначность: выражения различают ряд из нуля или более значений. Число значений выражения не относится к свойству, определяемому на стадии компиляции.
Язык относится к высокоуровневым языкам: он поддерживает функции как значения, полную лексическую поддержку, и обладает синтаксисом для использования символов функция (то есть лямбда-выражений).
Spice поддерживает многоуправляемость: функции могут быть определены частями («перегружены») для различных комбинаций типов аргументов, а при вызове функции выполняется наиболее подходящий по описанным параметрам кусок. Обычное однозначное динамическое управление объектно-ориентированных языков (Smalltalk, C++, Java) — частный случай мультиметодов Spice, созданных под влиянием CLOS и ObjectClass.
Spice — классово-нейтральный: новая перегрузка любой обобщенной функции может присутствовать в любом пакете, где данная функция входит в область видимости, причем специальный синтаксис для различения вызова перегруженной функции от неперегруженной не требуется. Классы не поддерживают пространства имен.
Языком поддерживается несколько типов процедур: функции, методы, конструкторы и прочие. Для оформления вызова процедуры используется синтаксис вида F(X), в котором F — имя вызываемой процедуры, а X — передаваемый ей аргумент.
При использовании переменных их объявление является обязательным.
Строки представляют собой последовательности символов Unicode в каноническом виде. Являются неизменяемыми и могут рассматриваться как массивы с использованием стандартной нотации s[i].
Стандартная библиотека
правитьДля языка Spice разработана довольно богатая библиотека стандартных значений и процедур.
Примеры стандартных процедур:
- x.typeOf — тип x
- x.print — сокращение от x.printOn(standardOutput)
- x.toString — конвертирует x в строку, аналогичным образом как это делает print
Реализовано несколько типов чисел: малые целые (Small), большие целые (BigInt), короткие и длинные числа с плавающей запятой (Float, Double), отношения (дроби) (Ratio) и комплексные числа (Complex).
Операторы: +, -, *, /, div, rem, % работают как и в большинстве других языков. Div — деление нацело, операторы должны быть целыми числами, а результат округляется в сторону нуля. Rem — остаток от деления, операторы должны быть целыми числами, результат представляет собой соответствующий остаток от деления. / в результате дает число с плавающей запятой, если операторы не делятся нацело. Оператор /: выполняет точное деление: результат содержит отношение для обозначения составляющих, не относящихся ни к целым числам, ни к числам с плавающей запятой (собственно, это является основным способом получения подобных значений). Функционал операторов отношения <=, <, >=, >, ==, /== реализован схожим образом, как в других языках (единственное, операторы == и /== не рекомендуется применять к числам с плавающей запятой).
Примеры программ
правитьПример традиционной программы «Hello, world!» на языке Spice:
# Простейший пример
println( "Hello, world!" );
Здесь знак #
означет начало строчного комментария, а процедура println
печатает строку. Символ ;
используется для разделения инструкций, означая конец одной строки и возможное начало другой. Не всегда является необходимым, но рекомендуется его всегда использовать.
См. также
правитьСсылки
править- The Spice language manual (англ.)
На эту статью не ссылаются другие статьи Википедии. |