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!")

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

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