Magik (язык программирования) - Magik (programming language)
Magik - это объектно-ориентированный язык программирования, который поддерживает множественное наследование и полиморфизм и имеет динамическую типизацию . Он был разработан и реализован в 1989 году Артуром Ченсом из Smallworld Systems Ltd. как часть географической информационной системы Smallworld (GIS). После приобретения Smallworld в 2000 году Magik теперь предоставляется GE Energy , по-прежнему как часть ее технологической платформы Smallworld.
Magik (Вдохновляющая магия) была впервые представлена в 1990 году и с годами совершенствовалась и обновлялась. Его текущая версия - 5.2.
В июле 2012 года разработчики Magik объявили, что они находятся в процессе портирования языка Magik на виртуальную машину Java . Успешный перенос был подтвержден корпорацией Oracle в ноябре того же года.
Сходства со Smalltalk
Сам Magik имеет некоторое сходство с Smalltalk с точки зрения его языковых возможностей и архитектуры: язык Magik компилируется в байтовые коды, интерпретируемые виртуальной машиной Magik . Виртуальная машина Magik доступна на нескольких платформах, включая Microsoft Windows , различные разновидности Unix и Linux .
Magik работает на консоли, и код можно изменять на лету, даже когда приложение запущено. Консоль также может использоваться для выполнения кода Magik и просмотра результатов.
Скомпилированный код хранится в одном файле, который называется файлом изображения. Каждый файл изображения содержит скомпилированные байтовые коды и состояние сеанса (например, значения переменных), когда изображение было в последний раз сохранено.
Особенности языка
Комментарии
Мэджик использует #
токен, чтобы пометить разделы кода как комментарии:
# This is a comment.
Задания
Мэджик использует <<
оператор для выполнения назначений :
a << 1.234 b << b + a c << "foo" + "bar" # Concat strings
Для ясности это обозначение читается как «a становится 1,234» или «b становится b плюс a». Эта терминология отделяет присвоение от сравнения .
Magik также поддерживает сжатый вариант этого оператора, который работает аналогично оператору C :
b +<< a # Equivalent to b << b + a
Чтобы распечатать переменную, вы можете использовать следующую команду
a << "hello" write(a)
Символы
Помимо обычных типов данных, таких как целые числа, числа с плавающей запятой и строки, Magik также реализует символы. Символы - это особый тип данных токена, который широко используется в Magik для уникальной идентификации объектов. Они представлены двоеточием, за которым следует строка символов. Символы могут быть экранированы с помощью символа вертикальной черты. Например:
a << :hello # whenever :hello is encountered, it is the same instance b << :|hello world|
Динамический набор текста
Переменные Magik не типизированы, как в C #, и могут ссылаться на разные объекты во время выполнения. Все в Magik является объектом (нет различий между объектами и примитивными типами, такими как целые числа):
a << 1.2 # a floating point number is assigned to variable 'a' a << "1.2" # later, a string is assigned to variable 'a'
- Объекты
Объекты реализованы в Magik на экземплярах. Образцы имеют сходство с классами других языков программирования, таких как Java , но с важными различиями. Magik поддерживает множественное наследование и миксины (которые реализуют функциональность без данных). Новые экземпляры создаются путем клонирования существующего экземпляра (который обычно будет образцом, но не обязательно).
Новые экземпляры создаются с помощью оператора def_slotted_exemplar()
, например:
def_slotted_exemplar(:my_object, { {:slot_a, 34}, {:slot_b, "hello"} }, {:parent_object_a, :parent_object_b})
Этот фрагмент кода будет определять новый вызываемый экземпляр my_object
, у которого есть два слота (или поля), вызываемые slot_a
(предварительно инициализированные до 34) и slot_b
(предварительно инициализированные как «hello»), которые наследуются от двух существующих экземпляров, называемых parent_object_a
и parent_object_b
.
Сравнение
Magik реализует все обычные логические операторы ( =
, <
, <=
, >
, >=
, ~=/<>
) для сравнения, а также несколько необычных из них. _is
И _isnt
операторы используются для сравнения конкретных экземпляров объектов или ссылок на объекты , а не значения.
Например:
a << "hello" b << "hello" a = b # returns True (_true) because the values of a and b are equal a _is b # returns False (_false) because a is not the same instance as b a << "hello" b << a a = b # returns True (_true) because the values of a and b are equal a _is b # returns True (_true) because b was assigned the specific instance of the same object as a, rather than the value of a.
Методы
Методы определяются на образцах с помощью операторов _method
и _endmethod
:
_method my_object.my_method(a, b) _return a + b _endmethod
По соглашению предоставляется два метода new()
(для создания нового экземпляра) и init()
(для инициализации экземпляра).
# New method _method person.new(name, age) _return _clone.init(name, age) _endmethod # Initialise method. _private _method person.init(name, age) # Call the parent implementation. _super.init(name, age) # Initialise the slots. .name << name .age << age _return _self _endmethod
_clone
Создает физическую копию person
объекта. _super
Утверждение позволяет объектам вызывать реализацию метода на родительском экземпляре. Объекты могут ссылаться на себя с помощью _self
оператора. Слоты объекта доступны и назначаются с использованием точечной записи.
Методы, которые не являются частью открытого интерфейса объекта, можно пометить как частные с помощью _private
оператора. Частные методы могут вызываться только _self
, _super
и _clone
.
Необязательные аргументы могут быть объявлены с помощью _optional
оператора. Необязательные аргументы, которые не были переданы, Magik присваивает специальному объекту _unset
(эквивалент null). Этот _gather
оператор можно использовать для объявления списка необязательных аргументов.
_method my_object.my_method(_gather values) _endmethod
Итерация
В Magik _while
, _for
, _over
, _loop
и _endloop
заявления позволяют итерацию.
_block _local s << 0 _local i << 0 _while i <= 100 _loop s +<< i i +<< 1 _endloop >> s _endblock
Здесь _ while сочетается с _loop и _endloop.
_method my_object.my_method(_gather values) total << 0.0 _for a _over values.elements() _loop total +<< a _endloop _return total _endmethod m << my_object.new() x << m.my_method(1.0, 2, 3.0, 4) # x = 10.0
Здесь values.elements () - итератор, который помогает перебирать значения.
В генераторах Magik методы называются методами итератора. Новые методы итераторов могут быть определены с помощью _iter
и _loopbody
заявления:
_iter _method my_object.even_elements() _for a _over _self.elements() _loop _if a.even? _is _true _then _loopbody(a) _endif _endloop _endmethod
Процедуры
Magik также поддерживает функции, называемые процедурами. Процедуры также объекты и объявляются с помощью _proc
и _endproc
заявления. Переменным присваиваются процедуры, которые затем могут быть вызваны:
my_procedure << _proc @my_procedure(a, b, c) _return a + b + c _endproc x << my_procedure(1, 2, 3) # x = 6
Регулярное выражение
Magik поддерживает // синтаксис регулярных выражений:
_if /Hello\,\s(\w)+!/.matches?("Hello, Magik!") _then write("Got a match!") _endif
и для захвата групп в Regex:
/sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss", "$1") # "65456" /sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss", "$2") # "324"
HTTP-библиотека
Magik поддерживает выполнение запросов HTTP или HTTPS через библиотеку http, см. Примеры ниже:
magikhttp << http.new() magikhttp.url("https://www.google.com").get() magikhttp.url("https://www.google.com").post({"User-agent", "Bot"}, "some data")
Языковые особенности
Поскольку Magik изначально была разработана в Англии, методы в основных библиотеках smallworld написаны с использованием британского английского языка . Например:
Use "initialise", not "initialize".
Коллекции
Как и у другого языка программирования, у Magik тоже есть коллекции. Они включают следующее:
- Простой вектор
- Веревка
- Хеш-таблица
- Список недвижимости
- Набор равенства
- Сумки
Пример Hello World
Ниже приведен пример программы Hello world, написанной на Magik:
write("Hello World!")
Рекомендации
внешняя ссылка
- Технология Smallworld Product Suite
- MDT - IDE Magik Development Tools для разработчиков ГИС GE Smallworld
- Открытый исходный код (SourceForge)
- Сообщение языкового форума на Magik
- Технический документ № 5 - Обзор Smallworld Magik
- GE Smallworld, Emacs Extensions для разработчиков Magik
- Расширение Visual Studio Code для языка программирования Smallworld Magik.