コンピュータ プログラミングの文脈では、マジックは抽象化の非公式な用語です。複雑なタスクを処理しながらその複雑さを隠して単純なインターフェイスを提供するコードを説明するために使用されます。この用語はいくぶん冗談めいたもので、コードの実際の動作がすぐには明らかではないことを暗示する悪い意味合いを持つことがよくあります。たとえば、Perlの多態的な型付けとクロージャのメカニズムは、しばしば「マジック」と呼ばれます。
この用語は、隠された複雑さが少なくとも原理的には理解可能であることを意味しており、意図的に隠されたり、理解するのが極めて難しい難解なテクニックを表す変種とは対照的です。ただし、この用語は、コードの「魅力」を示唆する愛情を込めて使用されることもあります。
このような抽象化のアクションは、「自動的に」実行されると説明されます。これは、「自動的に」と「魔法のように」を 組み合わせた造語です。
参照の不透明性
「マジック」とは、他のモジュール、メモリ位置、またはグローバル変数にアクセスして、明示的に提供されていないデータに基づいて計算を行う手順を指します(つまり、参照透過性がありません)。最新のソフトウェア アーキテクチャ モデルによると、構造化プログラミングを使用する場合でも、通常は、同じ引数が渡されるたびに各関数が同じように動作するようにすることが好まれます。これにより、関数型プログラミングの基本原則の 1 つに従います。関数がこの規則に違反すると、多くの場合、「マジック」が含まれていると言われます。
ネガティブマジックの簡略化された例は、 PHPの次のコードです。
関数 マジック()
{
グローバル $somevariable ;
$somevariableをエコーします;
}
$somevariable = true ;
魔法();
上記のコードは明確ですが、大規模なプロジェクトで見ると、関数がmagic()値をどこから取得するのか理解するのが難しいことがよくあります。次の概念を使用してコードを記述することをお勧めします。
関数 noMagic ( $myvariable )
{
echo $myvariable ;
}
$somevariable = true ;
マジックなし( $somevariable );
非直交性
任意の SV [スカラー値] は魔法のものである可能性があります。つまり、通常の SV にはない特別な機能があります。
— Larry Wall、perlgutsマニュアルページ、[1] Perl 5
このマジックまたはマジカルの定義は、他の同一のオブジェクトによって共有されないプロパティを持つデータ型、コード フラグメント、キーワード、またはマシン アドレスに拡張できます。マジカル プロパティは、ドキュメント化される場合とされない場合があります。
- ISO Cでは、ファイルハンドル( 型
FILE)は、そのアドレス[2]がマジックアドレスである可能性があるため、安全にコピーできません。つまり、ランタイム環境は、元のファイルハンドルをハードコードされたアドレス範囲に配置し、別のアドレスにあるユーザーが作成したコピーに対してファイルハンドルの動作を提供しない可能性があります。その結果、標準ライブラリルーチンは、FILE *代わりに 型のファイルハンドルへのポインタを受け入れます。 - Perl 5では、文は暗黙的に<file_handle>によってファイルから読み取られた行を変数に割り当て、関数を式に適用して、正常に読み取られた文字列(または空の文字列)がtrueと評価され、ループが続行されるようにします。これは、他の場所の<file_handle>や他の制御式では発生しません。[3]
while(<file_handle>)$_defined()"0"while()while() - エミュレーター、特に開発中のエミュレーターでは、エミュレートされたマシンのシステム コールポイントが魔法のようになることがあります。そのポイントが呼び出されると、エミュレーターは利便性、速度、または物理ハードウェアへのアクセスのためにネイティブ コードを実行し、元のコードを実行したかのようにエミュレートされた CPU とメモリを設定します。
- たとえば、BBC BASIC
CALLVのステートメントは、 Acorn MOSのシステムコールアドレスを魔法のように扱います。つまり、それらのアドレスでARMコードに分岐しようとする代わりに、RISC OSでシステムコールと同等のソフトウェア割り込みを発生させます。 [4] [非プライマリソースが必要]その結果、アセンブリ言語を含まない8ビットBASICプログラムを変更せずに実行できるほどAcorn MOSを十分にエミュレートできます。
- たとえば、BBC BASIC
- また、BBC BASICでは、数値変数は印刷フォーマットを制御するだけでなく、ANSI printf
@%フォーマット文字列の直接割り当ても受け入れますが、通常は型の不一致エラーになります。[4] - JavaScriptでは、
typeofオペランドが宣言されていない識別子である場合に演算子の評価が成功し、通常は が返されますReferenceError。 - コードに影響を及ぼすコメントはすべて魔法です。
- メモリマップされた I/Oアドレスと揮発性変数もこの意味ではマジックですが、この用語は通常は適用されません。
参照
参考文献
- ^ "perlguts – perldoc.perl.org". 2014年10月5日. 2015年2月18日閲覧。
- ^ Banahan, Mike; Brady, Declan; Doran, Mark (1991)。「9.10.3ヘッダー ファイル」。C ブック: ANSI C 標準をフィーチャー。命令セット (第 2 版)。ウォキンガム、イギリス: Addison-Wesley Publishers。p. 234。ISBN
stdio.h0-201-54433-4プログラム内でこれらのオブジェクトをコピーするのは安全ではありません
。そのアドレスが「マジック」である場合もあります。 - ^ "perlop – perldoc.perl.org". 2010年9月7日. 2011年2月17日閲覧。
- ^ ab "27. キーワード" (PDF) . BBC BASIC リファレンスマニュアル(第 1 版) . ケンブリッジ、イギリス: Acorn Computers. 1992 年 10 月. pp. 229, 349. ISBN 1-85250-103-0. 2007年5月9日閲覧。[リンク切れ ]
