Magik (język programowania) - Magik (programming language)

Magik to zorientowany obiektowo język programowania , który obsługuje wielokrotne dziedziczenie i polimorfizm i jest dynamicznie typowany . Został zaprojektowany i wdrożony w 1989 roku przez Arthura Chance'a z Smallworld Systems Ltd. w ramach Smallworld Geographical Information System (GIS). Po przejęciu Smallworld w 2000 roku, Magik jest obecnie dostarczany przez GE Energy , nadal jako część platformy technologicznej Smallworld.

Magik (Inspirational Magik) został pierwotnie wprowadzony w 1990 roku i przez lata był ulepszany i aktualizowany. Jego aktualna wersja to 5.2.

W lipcu 2012 roku programiści Magik ogłosili, że są w trakcie przenoszenia języka Magik na wirtualną maszynę Java . Pomyślne przeniesienie zostało potwierdzone przez Oracle Corporation w listopadzie tego samego roku.

Podobieństwa z Smalltalk

Sam Magik ma pewne podobieństwa z Smalltalk pod względem funkcji językowych i architektury: język Magik jest kompilowany w kodach bajtowych interpretowanych przez maszynę wirtualną Magik . Maszyna wirtualna Magik jest dostępna na kilku platformach, w tym Microsoft Windows , różne wersje Unix i Linux .

Magik jest oparty na konsoli, a kod można modyfikować w locie, nawet gdy aplikacja jest uruchomiona. Konsola może być również używana do wykonywania kodu Magik i przeglądania wyników.

Skompilowany kod jest przechowywany w jednym pliku zwanym plikiem obrazu. Każdy plik obrazu zawiera skompilowane kody bajtów i stan sesji (na przykład wartości zmiennych), kiedy obraz był ostatnio zapisywany.

Funkcje językowe

Komentarze

Magik używa # tokena do oznaczania sekcji kodu jako komentarzy:

 # This is a comment.

Zadania

Magik używa << operatora do wykonywania zadań :

  a << 1.234
  b << b + a
  c << "foo" + "bar" # Concat strings

Dla jasności, zapis ten odczytuje się jako „a staje się 1,234” lub „b staje się b plus a”. Ta terminologia oddziela przypisanie od porównania .

Magik obsługuje również skompresowaną odmianę tego operatora, która działa podobnie do tych znalezionych w C :

  b +<< a # Equivalent to b << b + a

Aby wydrukować zmienną, możesz użyć następującego polecenia

 a << "hello"
 write(a)

Symbolika

Oprócz konwencjonalnych typów danych, takich jak liczby całkowite, zmiennoprzecinkowe i ciągi znaków, Magik implementuje również symbole. Symbole są specjalnym typem danych tokenów, które są szeroko stosowane w całym Magiku do jednoznacznej identyfikacji obiektów. Są reprezentowane przez dwukropek, po którym następuje ciąg znaków. Symbole można zmienić za pomocą znaku pionowej kreski . Na przykład:

  a << :hello  # whenever :hello is encountered, it is the same instance
  b << :|hello world|

Dynamiczne pisanie

Zmienne Magik nie są wpisywane, jak na przykład w C # i mogą odnosić się do różnych obiektów w czasie wykonywania. Wszystko w Magiku jest przedmiotem (nie ma rozróżnienia między obiektami a typami prymitywnymi, takimi jak liczby całkowite):

  a << 1.2     # a floating point number is assigned to variable 'a'
  a << "1.2"   # later, a string is assigned to variable 'a'
Obiekty

Obiekty są implementowane w Magiku na przykładach. Przykłady mają podobieństwa do klas w innych językach programowania, takich jak Java , ale z istotnymi różnicami. Magik obsługuje wielokrotne dziedziczenie i mieszanki (które implementują funkcjonalność bez danych). Nowe instancje są tworzone przez sklonowanie istniejącej instancji (która zazwyczaj będzie przykładem, ale nie musi).

Nowe wzory tworzone są za pomocą instrukcji def_slotted_exemplar() , na przykład:

  def_slotted_exemplar(:my_object,
  {
    {:slot_a, 34},
    {:slot_b, "hello"}
  }, {:parent_object_a, :parent_object_b})

Ten fragment kodu zdefiniuje nowy przykład o nazwie, my_object który ma dwa gniazda (lub pola) o nazwie slot_a (wstępnie zainicjowane do 34) i slot_b (wstępnie zainicjowane jako „hello”), który dziedziczy z dwóch istniejących przykładów o nazwie parent_object_a i parent_object_b .

Porównanie

Magik implementuje wszystkie zwykłe operatory logiczne ( = , < , <= , > , >= , ~=/<> ) dla porównania, jak również kilka nietypowych. _is I _isnt operatorzy są używane do porównywania konkretnych wystąpień obiektów lub referencji obiekt zamiast wartości.

Na przykład:

  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.

Metody

Metody są zdefiniowane na przykładach za pomocą instrukcji _method oraz _endmethod :

  _method my_object.my_method(a, b)
    _return a + b
  _endmethod

Konwencją jest podawanie dwóch metod new() (do utworzenia nowej instancji) i init() (do zainicjowania instancji).

  # 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 Tworzy fizyczną kopię person obiektu. _super Zestawienie pozwala obiekty powołać implementację metody na egzemplarzu macierzystej. Obiekty mogą odwoływać się do siebie za pomocą _self instrukcji. Dostęp do szczelin obiektu i przypisywanie ich odbywa się za pomocą notacji kropkowej.

Metody, które nie są częścią publicznego interfejsu obiektu, można oznaczyć jako prywatne za pomocą _private instrukcji. Metody prywatne mogą być wywoływane tylko przez _self , _super i _clone .

Opcjonalne argumenty można zadeklarować za pomocą _optional instrukcji. Opcjonalne argumenty, które nie są przekazywane, są przypisywane przez Magika do specjalnego obiektu _unset (odpowiednik null). _gather Oświadczenie może być stosowane do deklarowania listy opcjonalnych argumentów.

  _method my_object.my_method(_gather values)     
  _endmethod

Iteracja

W Magik _while , _for , _over , _loop i _endloop oświadczenia pozwalają iteracji.

_block
	_local s << 0 
	_local i << 0
	_while i <= 100
	_loop 
		s +<< i 
		i +<< 1 
	_endloop
>> s
_endblock

Tutaj _while jest połączony z _loop i _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

Tutaj values.elements () jest iteratorem, który pomaga iterować wartości.

W generatorze Magik metody nazywane są metodami iteratorowymi. Nowe metody iteratora można zdefiniować za pomocą instrukcji _iter i _loopbody :

  _iter _method my_object.even_elements()
    _for a _over _self.elements()
    _loop
      _if a.even? _is _true
      _then
         _loopbody(a)       
      _endif
    _endloop
  _endmethod

Procedury

Magik obsługuje również funkcje zwane procedurami. Procedury są również obiektami i są deklarowane przy użyciu instrukcji _proc i _endproc . Procedury są przypisane do zmiennych, które można następnie wywołać:

  my_procedure << _proc @my_procedure(a, b, c)
    _return a + b + c
  _endproc

  x << my_procedure(1, 2, 3) # x = 6

Wyrażenie regularne

Magik obsługuje // składnię wyrażeń regularnych:

_if /Hello\,\s(\w)+!/.matches?("Hello, Magik!") _then
    write("Got a match!")
_endif 

i do przechwytywania grup w Regex:

/sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss", "$1") # "65456"
/sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss", "$2") # "324"

Biblioteka HTTP

Magik obsługuje wysyłanie żądań HTTP lub HTTPS przez bibliotekę http, patrz poniższe przykłady:

magikhttp << http.new()
magikhttp.url("https://www.google.com").get()
magikhttp.url("https://www.google.com").post({"User-agent", "Bot"}, "some data")

Dziwactwa językowe

Ponieważ Magik został pierwotnie opracowany w Anglii, metody w podstawowych bibliotekach smallworld są zapisywane przy użyciu brytyjskiego angielskiego . Na przykład:

  Use "initialise", not "initialize".

Kolekcje

Podobnie jak inny język programowania, Magik również ma kolekcje. Obejmują one:

  • Prosty wektor
  • Lina
  • Hash Table
  • Lista nieruchomości
  • Zestaw równości
  • Torebki

Przykład Hello World

Poniżej znajduje się przykład programu Hello world napisanego w Magiku:

 write("Hello World!")

Bibliografia

Zewnętrzne linki