Magik(プログラミング言語)

Magikは、多重継承ポリモーフィズムをサポートし、動的型付けされたオブジェクト指向プログラミング言語です。1989年にSmallworld Systems Ltd.のアーサー・チャンス氏によって、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、各種UnixLinuxなど、複数のプラットフォームで利用可能です。

Magikはコンソールベースなので、アプリケーションの実行中でもコードを即座に変更できます。コンソールを使用してMagikコードを実行し、結果を確認することもできます。

コンパイルされたコードは、イメージファイルと呼ばれる単一のファイルに保存されます。各イメージファイルには、コンパイルされたバイトコードと、イメージが最後に保存された時点のセッションの状態(変数の値など)が保持されます。

言語機能

コメント

Magik は#トークンを使用して、コードの一部をコメントとしてマークします。

# これはコメントです。 

課題

Magik は演算子を使用して割り当て<<を行います。

 a << 1.234 b << b + a c << "foo" + "bar" # 文字列を連結する 

分かりやすくするために、この表記は「aは1.234になる」または「bはb+aになる」と読みます。この用語は、代入と比較を区別するものです。

Magik は、 Cの演算子と同様に動作するこの演算子の圧縮バリエーションもサポートしています。

 b +<< a # b << b + a と同等 

変数を出力するには次のコマンドを使用します。

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、オブジェクトの特定のインスタンスを比較する場合、または値ではなくオブジェクト参照を比較する場合に使用されます。

例えば:

 a <<「こんにちは」 b << "こんにちは" a = b # aとbの値が等しいのでTrue (_true)を返します a _is b # a は b と同じインスタンスではないため、False (_false) を返します a <<「こんにちは」 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) _return a + b _endメソッド 

new()(新しいインスタンスを作成する) メソッドとinit()(インスタンスを初期化する) メソッドの 2 つを指定するのが慣例です。

 # 新しい方法 _メソッド person.new(名前, 年齢) _return _clone.init(名前、年齢) _endメソッド # メソッドを初期化します。 _private _method person.init(名前, 年齢) # 親実装を呼び出します。 _super.init(名前, 年齢) # スロットを初期化します。 .name << 名前 .年齢 << 年齢 _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 _endloop >> 秒 _endblock 

ここで、_while は _loop および _endloop と結合されています。

 _method my_object.my_method(_gather 値) 合計 << 0.0 _for _over values.elements() _ループ 合計 +<< a _endloop _合計を返す _endメソッド m << my_object.new() x << m.my_method(1.0, 2, 3.0, 4) # x = 10.0 

ここで、values.elements() は値を反復するのに役立つ 反復子です。

Magikでは、ジェネレータ_iterメソッドはイテレータメソッドと呼ばれます。新しいイテレータメソッドは、 andステートメントを使用して定義できます_loopbody

 _iter _メソッド my_object.even_elements() _for _over _self.elements() _ループ _if a.even? が _true の場合 _それから _loopbody(a) _endif _endloop _endメソッド 

手順

Magikはプロシージャと呼ばれる関数もサポートしています。プロシージャもオブジェクトであり、_procand_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("マッチしました!") _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 リクエストを行うことをサポートしています。以下の例を参照してください。

マジックhttp << http.new() magikhttp.url("https://www.google.com").get() magikhttp.url("https://www.google.com").post({"ユーザーエージェント", "Bot"}, "いくつかのデータ") 

言語の癖

Magikはもともとイギリスで開発されたため、コアとなるsmallworldライブラリのメソッドはイギリス英語で表記されています。例えば:

 「initialize」ではなく「initialise」を使用してください。 

コレクション

他のプログラミング言語と同様に、Magikにもコレクションがあります。コレクションには以下のものがあります。

Hello Worldの例

以下はMagik で記述された Hello world プログラムの例です。

書き込み("Hello World!") 

参考文献

  1. ^ Jim Connors (2012年11月5日). 「Java仮想マシンにMagikを少し加える」 . 2012年11月6日閲覧この新機能により、GE EnergyはMagik環境をJava仮想マシン上にホストすることに成功しました。