Magik は、多重継承とポリモーフィズムをサポートし、動的型付けされるオブジェクト指向プログラミング言語です。1989 年にSmallworld Systems Ltd.の Arthur Chance によってSmallworld 地理情報システム (GIS) の一部として設計および実装されました。2000 年に Smallworld が買収された後、Magik は現在GE Energyによって提供されており、依然として Smallworld テクノロジ プラットフォームの一部として使用されています。
Magik (Inspirational Magik) は 1990 年に最初に導入され、その後何年も改良と更新が続けられてきました。現在のバージョンは 5.2 です。
2012年7月、Magikの開発者はMagik言語をJava仮想マシンに移植中であると発表しました。同年11月、Oracle Corporationによって移植の成功が確認されました。 [1]
Smalltalkとの類似点
Magik 自体は、言語機能とアーキテクチャの点でSmalltalkといくつかの類似点があります。Magik 言語は、 Magik仮想マシンによって解釈されるバイト コードにコンパイルされます。Magik 仮想マシンは、 Microsoft Windows、さまざまなUnixおよびLinuxを含む複数のプラットフォームで使用できます。
Magik はコンソール ベースであり、アプリケーションの実行中でもコードをその場で変更できます。コンソールを使用して Magik コードを実行し、結果を確認することもできます。
コンパイルされたコードは、イメージ ファイルと呼ばれる単一のファイルに保存されます。各イメージ ファイルには、コンパイルされたバイト コードと、イメージが最後に保存されたときのセッションの状態 (変数値など) が保持されます。
言語機能
コメント
Magik は#トークンを使用して、コードの一部をコメントとしてマークします。
# これはコメントです。
課題
Magik は<<演算子を使用して割り当てを行います:
<< 1.234 b << b + a c << "foo" + "bar" # 文字列を連結する
わかりやすくするために、この表記は「a は 1.234 になる」または「b は b プラス a になる」と読みます。この用語は、割り当てと比較を区別します。
Magik は、 Cの演算子と同様に動作するこの演算子の圧縮バリエーションもサポートしています。
b +<< a # b << b + a と同等
変数を印刷するには次のコマンドを使用します。
<<「こんにちは」 書く(a)
シンボル
Magik は、整数、浮動小数点数、文字列などの従来のデータ型だけでなく、シンボルも実装しています。シンボルは、オブジェクトを一意に識別するために Magik 全体で広く使用されている特別なトークン データ型です。シンボルは、コロンの後に文字列が続く形式で表されます。シンボルは、縦棒文字を使用してエスケープできます。例:
a << :hello # :helloに遭遇するたびに、それは同じインスタンスです b << :|こんにちは世界|
動的型付け
Magik 変数は、 C#のような型付けはされておらず、実行時に異なるオブジェクトを参照できます。Magik 内のすべてはオブジェクトです (オブジェクトと整数などのプリミティブ型の間に区別はありません)。
a << 1.2 # 浮動小数点数が変数 'a' に割り当てられます a << "1.2" # 後で、文字列が変数 'a' に割り当てられます
- オブジェクト
オブジェクトは、Magik でエグザンプラを使用して実装されます。エグザンプラは、 Javaなどの他のプログラミング言語のクラスと類似していますが、重要な違いもあります。Magik は、多重継承とミックスイン(データなしで機能を実装する) をサポートしています。新しいインスタンスは、既存のインスタンス (通常はエグザンプラですが、必ずしもそうである必要はありません) を複製することによって作成されます。
新しい例は、次の例のように、ステートメントを使用して作成されますdef_slotted_exemplar()。
def_slotted_exemplar(:my_object,
{
{:スロット_a, 34},
{:slot_b, "こんにちは"}
}, {:親オブジェクトa, :親オブジェクトb})
このコード フラグメントは、 およびという 2 つの既存のエグザンプラから継承するmy_objectという 2 つのスロット (またはフィールド) slot_a(34 に事前初期化済み) と という2 つのスロット (またはフィールドslot_b) ("hello" に事前初期化済み) を持つ という新しいエグザンプラを定義します。
parent_object_aparent_object_b
比較
Magik は、比較のためにすべての通常の論理演算子 (、、、、、) を実装する=ほか、いくつかの珍しい演算子も実装します。and演算子は<、オブジェクトの特定のインスタンスを比較する<=場合や、値ではなくオブジェクト参照を比較する場合に使用されます。
>>=~=/<>_is_isnt
例えば:
<<「こんにちは」 b <<「こんにちは」 a = b # aとbの値が等しいためTrue (_true)を返します a _is b # a は b と同じインスタンスではないため、False (_false) を返します。 <<「こんにちは」 b << a a = b # aとbの値が等しいためTrue (_true)を返します a _is b # は、b に a の値ではなく、a と同じオブジェクトの特定のインスタンスが割り当てられたため、True (_true) を返します。
方法
メソッドは、ステートメント_methodとを使用して例に定義されます_endmethod。
_method my_object.my_method(a, b)
_a + b を返す
_endメソッド
new()(新しいインスタンスを作成する) とinit()(インスタンスを初期化する) の
2 つのメソッドを提供するのが慣例です。
# 新しい方法
_メソッド person.new(名前, 年齢)
_return _clone.init(名前、年齢)
_endメソッド
# メソッドを初期化します。
_private _method person.init(名前、年齢)
# 親実装を呼び出します。
_super.init(名前、年齢)
# スロットを初期化します。
.名前 << 名前
.年齢 << 年齢
_return _self
_endメソッド
はオブジェクト_cloneの物理コピーを作成しますperson。_superステートメントにより、オブジェクトは親のインスタンスのメソッドの実装を呼び出すことができます。 オブジェクトは_selfステートメントを使用して自分自身を参照できます。 オブジェクトのスロットはドット表記を使用してアクセスおよび割り当てられます。
オブジェクトのパブリック インターフェイスの一部ではないメソッドは、 ステートメントを使用してプライベートとしてマークできます。プライベート メソッドは、、および_privateによってのみ呼び出すことができます。
_self_super_clone
オプション引数は、ステートメントを使用して宣言できます_optional。渡されないオプション引数は、Magik によって特別なオブジェクト_unset(null と同等) に割り当てられます。_gatherステートメントを使用して、オプション引数のリストを宣言できます。
_method my_object.my_method(_gather 値) _endメソッド
反復
Magik では_while、、、およびステートメント_forによって反復処理が可能になります。
_over_loop_endloop
_ブロック _local s << 0 _local i << 0 _i <= 100 の間 _ループ s +<< i 私 +<< 1 _終了ループ >> さん _endblock
ここで、_while は _loop および _endloop と組み合わされています。
_method my_object.my_method(_gather 値)
合計 << 0.0
_for _over values.elements()
_ループ
合計 +<< a
_終了ループ
_合計を返す
_endメソッド
m << my_object.new()
x << m.my_method(1.0, 2, 3.0, 4) # x = 10.0
ここで values.elements() は、値を反復するのに役立つ反復子です。
Magik では、ジェネレータ_iterメソッドはイテレータ メソッドと呼ばれます。新しいイテレータ メソッドは、およびステートメントを使用して定義できます_loopbody。
_iter _メソッド my_object.even_elements()
_for _over _self.elements()
_ループ
_if a.even? _is _true
_それから
_ループボディ(a)
_endif
_終了ループ
_endメソッド
手順
_procMagik は、プロシージャと呼ばれる関数もサポートしています。プロシージャもオブジェクトであり、およびステートメントを使用して宣言されます_endproc。プロシージャは変数に割り当てられ、その後呼び出されます。
my_procedure << _proc @my_procedure(a, b, c)
_a + b + c を返す
_endproc
x << my_procedure(1, 2, 3) # x = 6
正規表現
Magik は // 正規表現構文をサポートしています:
_if /Hello\,\s(\w)+!/.matches?("Hello, Magik!") _then
write("マッチしました!")
_endif
正規表現でグループをキャプチャするには:
/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 ライブラリ経由で HTTP または HTTPS リクエストを行うことをサポートしています。以下の例を参照してください。
magikhttp << http.new()
magikhttp.url("https://www.google.com").get()
magikhttp.url("https://www.google.com").post({"ユーザーエージェント", "ボット"}, "いくつかのデータ")
言語の癖
Magik はもともとイギリスで開発されたため、コアの smallworld ライブラリのメソッドはイギリス英語で表記されます。例:
「initialize」ではなく「initialise」を使用してください。
コレクション
他のプログラミング言語と同様に、Magik にもコレクションがあります。コレクションには次のものが含まれます。
Hello Worldの例
以下は Magik で記述されたHello world プログラムの例です。
書き込み("Hello World!")
参考文献
- ^ Jim Connors (2012-11-05). 「Java 仮想マシンに Magik を少し加える」。2012-11-06取得。
この新しい機能により、GE Energy は Java 仮想マシン上で Magik 環境をホストすることに成功しました。
外部リンク
- Smallworld製品スイートテクノロジー
- MDT - GE Smallworld GIS 開発者向けの Magik 開発ツール IDE
- オープンソース (SourceForge)
- Magik の言語フォーラム投稿
- 技術論文 No. 5 - Smallworld Magik の概要
- GE Smallworld、Magik 開発者向け Emacs 拡張機能
- Smallworld Magik プログラミング言語用の Visual Studio Code 拡張機能。
