Magik (язык программирования) - Magik (programming language)

Мэджик является объектно-ориентированного программирования язык, поддерживающий множественное наследование и полиморфизм, и это динамически типизированный. Он был разработан и реализован в 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:

 написать ("Привет, мир!")

Рекомендации

  1. ^ Джим Коннорс (05.11.2012). «Добавьте немного волшебства в эту виртуальную машину Java». Получено 2012-11-06. Благодаря этой новой возможности GE Energy удалось разместить свою среду Magik на виртуальной машине Java.

внешняя ссылка