5

「魔法」という言葉は、「言語 X には魔法が多すぎる」、「プラットフォーム Y は一般的に魔法を避ける」などの文脈でよく使われます。ただし、この用語の定義はかなり不十分であり、人々が見ればわかるものです。たとえば、Java には魔法がほとんど含まれていないと言われていますが、Java のガベージ コレクターは多くのことをプログラマーから隠しています。魔法が単純に詳細を隠す抽象化を意味する場合、アセンブリ言語で大規模なプログラムを作成する人がもういないことを考えると、魔法が悪いことと見なされるのはなぜでしょうか? 魔法がそれ以上の意味を持つとすれば、それは何を意味するのでしょうか?

4

13 に答える 13

4

魔法はあなたの理解に非常に関連しています。

Java で書き始める前に、かなりの量の C と C++ を書きました。すべてのメモリを割り当てて解放する必要がありました。メモリリークが発生し始めたら、あまり楽しくありませんでした。Java で書き始めると、すべてのインスタンス オブジェクトを作成するために舞台裏で何が行われているかを (基本的に) 知っていました。したがって、私にとっては、Java を始めた人にとってはそれほど魔法ではありません (私は割り当てを行いましたが、実際にオブジェクトを格納し、いつそれらを解放するかを知る方法は、私にとってもう少し「魔法のよう」です)。 (メモリを手動で処理する必要がなかった人。)

別の例は ORM です。プロジェクトの早い段階で、自分自身の一時的なオブジェクト リレーショナル マッピング構造を展開し、実際に腰を落ち着けて Hibernate などを学ぶ時間ができました。ResultSet マッパー、遅延読み込み、基本的なキャッシングなどを記述する必要がありました。さて、戻ってこれをより成熟した Hibernate または JPA にマップされたエンティティに置き換えても、何が起こっているのかについての基本的な理解が得られます。JBDC などを使用したことがない場合は、データがデータベースからオブジェクトに移動し、再びデータベースに戻ることだけを知っているでしょう。

誰もがキャリアの中で一定レベルの魔法を扱っています。すべてを知ることはできません。魔法は本当に抽象化と同義です。それが「あまりにも魔法的」になるときは、制御できるようにする必要があるものを抽象化が覆い隠し始めるときです。先日の例では、JSF プログラムで、JSF コンテキストを開始する方法がわかりませんでした。JSF は、初めて JSF ページに移動したときにこれを行います。通常のサーブレットからコンテキストを開始する必要がありました。代わりに、それを処理するためにダミーの JSF ページを作成する必要がありました。このプロジェクトでは、JSF コンテキスト管理の「魔法」を学ぶ時間がありませんでした。

于 2009-02-28T17:51:12.973 に答える
2

興味深いことに、この用語magicは、コンピューター サイエンスの理論的基盤の 1 つである正式なプログラミング言語に関連しています。Morgan の著書「Programming from Specifications」では、魔法について次のように定義しています。

w:[true, false]

この表記は次の形式です。

w:[P, Q]

Pと が真の状態で実行すると が真の状態で終了し、 内Qの変数のみを変更するプログラムを表しますw

このコンテキストでは、「魔法」は、プログラムを任意の状態 (trueは常にtrueであるため) から不可能な状態 ( になることはあり得ないため)falseにすることができる実行不可能なプログラムtrueです。

はるかに簡単なプログラムは次のとおりです。

w:[true, true]

これは常に終了するプログラムですが、特定の結果は保証されません。これは、単純な で実装できますskip

明らかに、この技術的な定義は、人々がmagicプログラムについて話すときに悪用されてきました。これは、実行不可能であることが証明されているプログラムを意味するはずだからです。それにもかかわらず、何かがどのように機能するかを知らない、または理解していないときに、舞台裏で何か魔法のようなことが起こると想像するのは良いことなので、この用語は口語のままです.

于 2009-02-28T18:21:03.480 に答える
1

専門用語ファイルの付録からの古典的な魔法の物語。

http://catb.org/jargon/html/magic-story.html

それを読んでください。

于 2010-02-24T04:46:59.787 に答える
1

理解できないものを「魔法」と呼びます。

中世の人々は、他の人には理解できない何かをしたり、知ったり、言ったりすると、火傷を負うのに慣れていました。彼らは「魔法」を使ったとして告発されました。

コード/フレームワーク/言語が何をするのか理解していないとき、それを「魔法」と呼びます。時間をかけて理解するよりも、何かを「魔法」と呼ぶ方が簡単です。

魔法は存在しません!

何かを「魔法」と呼ぶのではなく、手を汚して、それが何をしているのかを理解してください... または、「(あなたの)知識の未踏の部分」と呼んでください。

于 2009-02-28T18:45:09.693 に答える
0

For some nice examples of black magic, look at the documentation in the perl source code ;-)

于 2009-03-01T11:30:47.467 に答える
0

私が「ブラック マジック」という用語を使用するコンテキストの 1 つは、(Java での) バイトコード操作です。つまり、実行時にプログラム コードを変換して、プレーンなコードとは異なることを行うことです。多くの場合、バイトコードの操作は非常に便利ですが、簡単に失敗することもあります。

多くのフレームワークとミドルウェアは、AOPとバイトコード操作を使用して分野横断的な問題を実装しています。これにより、プログラマーの作業が軽減されますが、状況によっては、システムの動作のデバッグが困難になる場合があります。また、バイトコード変換には微妙なバグが残りやすいです。

私は自分でいくつかのバイトコード操作を行ったので、基本的にバイトコード命令を変更する方法を知っていますが、その意味で「魔法」ではなく、それがどのように機能するか理解できません。しかし、それでも私はそれを「魔法」と呼んでいます。なぜなら、それはコードが通常動作する方法を変更し、変更されるクラスのソース コードには表示されないからです。

于 2009-02-28T18:21:57.657 に答える