Magik (язык программирования) - Magik (programming language)
Эта статья слишком полагается на Рекомендации к основные источники.Январь 2008 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Мэджик является объектно-ориентированного программирования язык, поддерживающий множественное наследование и полиморфизм, и это динамически типизированный. Он был разработан и реализован в 1989 году Артуром Ченсом из Smallworld Systems Ltd. как часть географической информационной системы Smallworld (GIS). После приобретения Smallworld в 2000 году Magik теперь предоставляется GE Energy, все еще как часть технологической платформы Smallworld.
Magik (Вдохновляющая магия) была впервые представлена в 1990 году и с годами улучшалась и обновлялась. Его текущая версия - 5.2.
В июле 2012 года разработчики Magik объявили о переносе языка Magik на Виртуальная машина Java. Успешное портирование подтвердили Корпорация Oracle в ноябре того же года.[1]
Сходства со Smalltalk
Сама Magik имеет некоторые сходства с Болтовня с точки зрения особенностей языка и архитектуры: язык Magik скомпилирован в байтовые коды интерпретируется Magik виртуальная машина. Виртуальная машина Magik доступна на нескольких платформах, включая Майкрософт Виндоус, различные вкусы Unix и Linux.
Magik работает на консоли, и код можно изменять на лету, даже когда приложение запущено. Консоль также может использоваться для выполнения кода Magik и просмотра результатов.
Скомпилированный код хранится в одном файле, который называется файлом изображения. Каждый файл изображения содержит скомпилированные байтовые коды и состояние сеанса (например, значения переменных), когда изображение было в последний раз сохранено.
Особенности языка
Комментарии
Мэджик использует #
токен, чтобы пометить разделы кода как комментарии:
# Это комментарий.
Задания
Мэджик использует <<
оператор сделать задания:
a << 1.234 b << b + a c << "foo" + "bar" # Concat strings
Для ясности это обозначение читается как «a становится 1,234» или «b становится b плюс a». Эта терминология отделяет присвоение от сравнение.
Magik также поддерживает сжатый вариант этого оператора, который работает аналогично тем, которые находятся в C:
b + << a # Эквивалентно b << b + a
Чтобы распечатать переменную, вы можете использовать следующую команду
a << "привет" написать (а)
Символы
Помимо обычных типов данных, таких как целые числа, числа с плавающей запятой и строки, Magik также реализует символы. Символы - это особый тип данных токена, который широко используется в Magik для уникальной идентификации объектов. Они представлены двоеточием, за которым следует строка символов. Символы можно экранировать с помощью вертикальная полоса персонаж. Например:
a <<: hello # всякий раз, когда встречается: hello, это тот же экземпляр b <<: | hello world |
Динамический набор текста
Переменные Magik не набираются так, как говорят C # и может ссылаться на разные объекты во время выполнения. Все в Magik - это объект (нет различий между объектами и примитивными типами, такими как целые числа):
a << 1.2 # переменной 'a' присваивается число с плавающей запятой a << "1.2" # позже строка присваивается переменной 'a'
- Объекты
Объекты реализованы в Magik на экземплярах. Образцы имеют сходство с классами на других языках программирования, таких как Ява, но с важными отличиями. Magik поддерживает множественное наследование и миксины (которые реализуют функциональность без данных). Новые экземпляры создаются путем клонирования существующего экземпляра (который обычно будет образцом, но не обязательно).
Новые экземпляры создаются с помощью инструкции def_slotted_exemplar ()
, Например:
def_slotted_exemplar (: my_object, {{: slot_a, 34}, {: slot_b, "привет"}}, {: parent_object_a,: parent_object_b})
Этот фрагмент кода определит новый образец с именем my_object
в котором есть два слота (или поля), называемые slot_a
(предварительно инициализировано на 34) и slot_b
(предварительно инициализировано как "hello"), который наследуется от двух существующих экземпляров, называемых parent_object_a
и parent_object_b
.
Сравнение
Magik реализует все обычные логические операторы (=
, <
, <=
, >
, >=
, ~=/<>
) для сравнения, а также несколько необычных. В _является
и _isnt
Операторы используются для сравнения конкретных экземпляров объектов или ссылок на объекты, а не значений.
Например:
a << "hello" b << "hello" a = b # возвращает True (_true), потому что значения a и b равны a _is b # возвращает False (_false), потому что a не совпадает с экземпляром ba << "hello" b << aa = b # возвращает True (_true), потому что значения a и b равны a _is b # возвращает True (_true), потому что b был назначен конкретный экземпляр того же объекта, что и a, а не значение a.
Методы
Методы определяются на образцах с помощью операторов _method
и _endmethod
:
_method my_object.my_method (a, b) _return a + b _endmethod
Принято предоставлять два метода новый()
(чтобы создать новый экземпляр) и в этом()
(для инициализации экземпляра).
# Новый метод _method person.new (имя, возраст) _return _clone.init (имя, возраст) _endmethod # Инициализировать метод. _private _method person.init (name, age) # Вызов родительской реализации. _super.init (имя, возраст) # Инициализировать слоты. .name << name .age << age _return _self _endmethod
В _clone
создает физическую копию человек
объект. В _супер
оператор позволяет объектам вызывать реализацию метода в родительском экземпляре. Объекты могут ссылаться на себя, используя _себя
утверждение. Слоты объекта доступны и назначаются с использованием точечной записи.
Методы, которые не являются частью открытого интерфейса объекта, можно пометить как частные с помощью _частный
утверждение. Частные методы могут быть вызваны только _себя
, _супер
и _clone
.
Необязательные аргументы могут быть объявлены с помощью _необязательный
утверждение. Необязательные аргументы, которые не переданы, Magik назначает специальному объекту _unset
(эквивалент null). В _собирать
оператор может использоваться для объявления списка необязательных аргументов.
_method my_object.my_method (_gather values) _endmethod
Итерация
В Magik _пока
, _за
, _над
, _петля
и _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 _для 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) # х = 10,0
Здесь values.elements () - итератор, который помогает перебирать значения.
В магике генератор методы называются методами итератора. Новые методы итератора можно определить с помощью _iter
и _loopbody
заявления:
_iter _method my_object.even_elements () _for _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 напишите (" Есть совпадение! ") _ endif
и для захвата групп в Regex:
/sw(([0-9 выгодно+)-((0-9pting+).*/.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 ({"Пользователь -agent "," Bot "}," некоторые данные ")
Языковые особенности
Поскольку Magik изначально был разработан в Англии, методы в основных библиотеках smallworld написаны с использованием Британский английский. Например:
Используйте «инициализировать», а не «инициализировать».
Коллекции
Как и у другого языка программирования, у Magik тоже есть коллекции. Они включают следующее:
- Простой вектор
- Веревка
- Хеш-таблица
- Список недвижимости
- Набор равенства
- Сумки
Пример Hello World
Ниже приводится пример Привет, мир программа написано на Magik:
написать ("Привет, мир!")
Рекомендации
- ^ Джим Коннорс (05.11.2012). «Добавьте немного волшебства в эту виртуальную машину Java». Получено 2012-11-06.
Благодаря этой новой возможности GE Energy удалось разместить свою среду Magik на виртуальной машине Java.