Jump to content

Магик (язык программирования)

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!")
  1. ^ Джим Коннорс (5 ноября 2012 г.). «Добавьте немного магии на эту виртуальную машину Java» . Проверено 6 ноября 2012 г. Благодаря этой новой возможности компании GE Energy удалось разместить свою среду Magik поверх виртуальной машины Java.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f25c8cd8086b4887c34d29a399dc5ee1__1713925200
URL1:https://arc.ask3.ru/arc/aa/f2/e1/f25c8cd8086b4887c34d29a399dc5ee1.html
Заголовок, (Title) документа по адресу, URL1:
Magik (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)