「データは単なるダムコードであり、コードは単なるスマートデータです」とはどういう意味ですか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/871833

  •  22-08-2019
  •  | 
  •  

質問

ちょうどアイデアを思いついたのですが、 コンピュータプログラムの構造と解釈:

データは単なるダムコードであり、コードは単なるスマートデータです

それが何を意味するのか理解できません。誰かがそれをよりよく理解するのを手伝ってくれますか?

役に立ちましたか?

解決

このはSICPの基本的な教訓の一つとコンピュータ科学の最も強力なアイデアの一つです。これは次のように動作します:

私たちは、「コード」と考える実際に自分自身で何かをする力を持っていません。コードは、解釈のコンテキスト内でプログラムを定義する - そのコンテキストの外で、それは文字だけの流れです。 (。。本当に本当に電気インパルスの流れであるビットストリーム、しかし、のは、それをシンプルに保つみましょう)<全角> のコードの意味することは、あなたがそれを実行してその中に、システムによって定義される - と、このシステムだけあなたのコードは、あなたがやりたいことを伝えるデータとして扱います。 Cのソースコードは、あなたがそれを作成したいオブジェクトファイルを記述したデータとして、Cコンパイラによって解釈されます。オブジェクトファイルは、実行のためにキューに入れたいいくつかのマシン命令を記述したデータとしてローダーによって処理されます。マシン命令は、それが受けるべき状態遷移のシーケンスを定義するデータとしてCPUによって解釈されます。

インタプリタ言語は、多くの場合、あなたが何らかの形で関数にコードを渡すと、それを実行することができることを意味しており、コードなどのデータを処理するためのメカニズムが含まれている - あるいは実行時にコードを生成します:

#!/usr/bin/perl
# Note that the above line explicitly defines the interpretive context for the
# rest of this file.  Without the context of a Perl interpreter, this script
# doesn't do anything.
sub foo {
    my ($expression) = @_;
    # $expression is just a string that happens to be valid Perl

    print "$expression = " . eval("$expression") . "\n";
}

foo("1 + 1 + 2 + 3 + 5 + 8");              # sum of first six Fibonacci numbers
foo(join(' + ', map { $_ * $_ } (1..10))); # sum of first ten squares

スキームのようないくつかの言語を使用すると、データとしての機能を扱い、あなたが本当にしたいまでそれを評価せずに周りにそれを渡すことができることを意味し、「ファーストクラスの機能」の概念を持っています。

結論は、「コード」と「データ」との間の分割は、唯一の視点の関数かなり任意であるということです。抽象化のレベルが低いほど、「賢く」コードがなければならない。それがどのように実行するかについての詳細な情報が含まれていなければなりません。それは全く知性とのデータのように見えるし始めるまで一方、より多くの情報インタプリタの供給は、より多くのダムのコードは、することができます。

のコードを書くための最も強力な方法の一つは、あなたが必要なものについて簡単に説明の通りです:データあなたが解釈文脈によって必要なものを取得する方法を記述したコードに変換されます。私たちは、href="http://en.wikipedia.org/wiki/Declarative_programming" rel="noreferrer"> "宣言型プログラミング" のこの

具体的な例については、HTMLを考えます。 HTMLはチューリング完全なプログラミング言語については説明しません。これは、単にデータを構造化されています。ではなく、知性の多く - その構造は、その解釈コンテキストの動作を制御でき、いくつかの知性が含まれています。一方、それは平均的なWebページに表示されるテキストの段落よりも知性が含まれています。それらはかなり間抜けデータです。

他のヒント

セキュリティのコンテキストで:原因あなたはデータやコードとして実行になると、あなたのマシンをp0wnすることができます(画像など)ので、無害

のように考えどのようなバッファオーバーフロー、へ

ソフトウェア開発の文脈では:多くの開発者は、「ハードコード」物事の非常に恐れおよびコンフィギュレーションファイルに変更する必要がありますパラメータを抽出することに非常に熱心です。これは、多くの場合、設定ファイルは、単に「データ」であり、したがって、コード内で何かを変更することであろうと問題点(コンパイル、展開、テスト)を上昇させることなく(顧客がperhapy)容易に変更することができます。

という考えに基づいています

どのようなこれらの開発者が気付いていないことは、この「データ」は、プログラムの動作に影響するので、それは本当にコードであるということです。このような変更が正しく行われていれば、設定可能な値は非常に具体的、明確に文書化効果や無効な値または壊れたファイル構造を持っている、ということになった後、それをキャッチされたプログラムと完全なテストを必要としない唯一の理由を破ることができプログラムます。

しかし、どのようなすべてあまりにも頻繁に起こることは、設定ファイルの構造は、制御フローおよびすべてとの完全な独自の権利で、プログラミング言語、となっていることである - ひどく文書のOneは、風変わりな構文とパーサとは、最も経験豊富な開発を持っていますチームでアプリケーションを完全に壊すことなく触れることができます。

だから、スキームのような言語であってもコードがファーストクラスのデータとして扱われます。あなたは、他のコードを扱う他の関数とラムダ式に渡すと言うように、あなたは多くの関数やラムダ式を扱うことができます。私は、これはすべての非常に明確になるようにテキストを続けてお勧めします。

これはあなたがコンパイラに書くことから理解するために来るべきものである。

コンパイラで一つの共通のステップは、抽象構文木にプログラムを変換することです。表現がしばしばような木のようになる[+、2、3] +ルート、及び2であり、3は子供である。

Lispの言語は、単にそのデータとしてこれを扱います。だから、ASTの木のように見える両方のリストされているデータとコードの間の分離はありません。

コードは間違いなくデータですが、データも間違いなく 常にではない コード。基本的な例として顧客名を考えてみましょう。それはコードとは何の関係もありません、 機能的な (必須)、とは対照的に、 テクニカル アプリケーションの(偶然の)側面。

おそらく、技術的/偶発的なデータはコードであり、機能的/本質的なデータはコードではないと言えるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top