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
- Technologia Smallworld Product Suite
- MDT - Magik Development Tools IDE dla programistów GE Smallworld GIS
- Open Source (SourceForge)
- Post na forum językowym na Magiku
- Artykuł techniczny nr 5 - Przegląd Smallworld Magik
- GE Smallworld, rozszerzenia Emacs dla programistów Magik
- Rozszerzenie Visual Studio Code dla języka programowania Smallworld Magik.