Магик (язык программирования)
Magik — объектно-ориентированный язык программирования, поддерживающий множественное наследование и полиморфизм , а также динамически типизированный . Он был разработан и реализован в 1989 году Артуром Ченсом из Smallworld Systems Ltd. как часть географической информационной системы (ГИС) Smallworld. После приобретения Smallworld в 2000 году Magik теперь предоставляется GE Energy , по-прежнему являясь частью ее технологической платформы Smallworld.
Magik (Вдохновляющая магия) была первоначально представлена в 1990 году и с годами улучшалась и обновлялась. Текущая версия — 5.2.
В июле 2012 года разработчики Magik объявили, что они находятся в процессе портирования языка Magik на виртуальную машину Java . Успешное портирование было подтверждено корпорацией Oracle в ноябре того же года. [1]
Сходства со 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
(предварительно инициализированный как «привет»), который наследуется от двух существующих экземпляров, называемых 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
The _clone
создает физическую копию person
объект. _super
Оператор позволяет объектам вызывать реализацию метода родительского экземпляра. Объекты могут ссылаться на себя с помощью _self
заявление. Доступ к слотам объекта и их назначение осуществляется с помощью точечной записи.
Методы, не являющиеся частью публичного интерфейса объекта, можно пометить как частные с помощью _private
заявление. Частные методы могут быть вызваны только _self
, _super
и _clone
.
Необязательные аргументы могут быть объявлены с помощью _optional
заявление. Необязательные аргументы, которые не переданы, присваиваются Magik специальному объекту. _unset
(эквивалент нуля). _gather
Оператор можно использовать для объявления списка необязательных аргументов.
_method my_object.my_method(_gather values) _endmethod
Итерация
[ редактировать ]В Магике _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, написанной на Magik:
write("Hello World!")
Ссылки
[ редактировать ]- ^ Джим Коннорс (5 ноября 2012 г.). «Добавьте немного магии на эту виртуальную машину Java» . Проверено 6 ноября 2012 г.
Благодаря этой новой возможности компании GE Energy удалось разместить свою среду Magik поверх виртуальной машины Java.
Внешние ссылки
[ редактировать ]- Технология пакета продуктов Smallworld
- MDT — интегрированная среда разработки Magik Development Tools для разработчиков ГИС GE Smallworld
- Открытый исходный код (SourceForge)
- Сообщение на языковом форуме Magik
- Технический документ № 5 — Обзор Smallworld Magik
- GE Smallworld, Расширения Emacs для разработчиков Magik
- Расширение Visual Studio Code для языка программирования Smallworld Magik.