2009-05-16 9 views
22

私はちょうどThe Structure And Interpretation of Computer Programsにアイデアに出くわした:「データは単にダム・コードであり、コードはスマート・データ」とは何ですか?

データはちょうどダムのコードで、コードが、私はそれが何を意味するのか理解できないだけで、スマートデータ

です。誰かが私がそれをよりよく理解するのを助けることができますか?

+5

あなたはそれが何を意味するのかわからない場合、どのように「優雅に表現されていますか? – sykora

+3

まず最初に私はそれが重症であると思ったが、今はそれが代謝拮抗物質であると思う。 – tuinstoel

+2

http://en.wikipedia.org/wiki/Von_Neumann_architecture –

答えて

37

これはSICPの基本的な教訓の1つであり、コンピュータサイエンスの最も強力なアイデアの1つです。

私たちが "コード"と考えるのは、実際には何もすることはできません。コードは解釈のコンテキスト内でのみプログラムを定義します - そのコンテキストの外では、文字のストリームです。 (実際には電気パルスの流れですが、単純にしておきましょう)の意味はのコードが実行されるシステムによって定義されています。このシステムはコードをデータとして扱いますそれはあなたがしたいことを伝えます。 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 

一部の言語:あるいは、実行時にコードを生成 -

インタプリタ言語は、多くの場合、あなたが何らかの形で関数にコードを渡すと、それを実行することができることを意味しており、コードなどのデータを処理するためのメカニズムが含まれています「一流の機能」という概念を持っています。つまり、関数をデータとして扱い、本当に欲しいまで評価することなくその関数を渡すことができます。

"コード"と "データ"の間の分割は、ほとんど恣意的で、視点のみの機能です。抽象レベルが低くなればなるほど、コードはよりスマートになります。実行方法に関する詳細情報が含まれていなければなりません。一方、インタプリタが提供する情報が多くなればなるほど、スマートのないデータのように見えるようになるまで、コードはもっと暗くなります。

コードを書くための最も強力な方法の1つは、必要なものの簡単な説明です。データは、解釈コンテキストによって必要なものを得る方法を記述するコードに変換されます。我々はこれを"declarative programming"と呼ぶ。

具体的な例として、HTMLを考えてみましょう。 HTMLはチューリング完全なプログラミング言語を記述するものではありません。それは単に構造化されたデータです。その構造には、インタプリタの文脈の振る舞いを制御するためのスマートが含まれていますが、多くのスマートはそうではありません。一方、平均Webページに表示されるテキストの段落よりもスマートなものが含まれています。これらはかなりダムのデータです。

+0

ところで... http://stackoverflow.com/questions/2497146/is-css-turing-complete – n611x007

+0

あなたの答えは、文章が理論的なレベルで何を意味するのかを説明する上で素晴らしいですが、私はカバーする余地があると思いますあなたがプログラムを扱う方法を実際に変更するという意味での意味。この格言がどのようにOOPの中核洞察であるかの考え方についても説明したいと思うかもしれません。関連するコードとデータを一緒にカプセル化する能力、アクセサが呼び出しコンテキストのPOVからの下位データであるかのようにセマンティック的に扱うことなどが含まれる。 – Racheet

2

Schemeのような言語では、偶数コードはファーストクラスのデータとして扱われます。関数やラムダ式は、他のコードを扱うように、他の関数やラムダ式に渡すように扱うことができます。私はすべてこれが完全に明らかになるので、テキストを続けることをお勧めします。

2

これは、コンパイラで書くことから理解する必要があります。

コンパイラの一般的なステップの1つは、プログラムを抽象構文ツリーに変換することです。表現は、[+、2、3]のような木とよく似ており、+は根であり、2,3は子供です。

Lisp言語はこれを単にデータとして扱います。したがって、ASTツリーのように見える両方のリストであるデータとコードの間に分離はありません。

7

セキュリティの文脈では、バッファオーバーフローのために、データと考えられていた無害なもの(イメージなど)をコードとして実行し、マシンをp0wnすることができます。

ソフトウェア開発のコンテキストでは、多くの開発者は「ハードコーディング」を非常に恐れており、設定ファイルに変更する必要のあるパラメータを抽出することに非常に熱心です。これはしばしば、設定ファイルがちょうど "データ"なので、コード内の何かを変更するという問題(コンパイル、デプロイメント、テスト)を起こすことなく、簡単に(顧客ごとに)変更できるという考えに基づいています。

これらの開発者が認識していないのは、この「データ」がプログラムの動作に影響を与えるため、実際はコードであることです。そのような変更の後に完全なテストを必要としない唯一の理由は、正しく行われた場合、設定可能な値が非常に具体的で、文書化された効果を持ち、無効な値または破損したファイル構造がプログラム。

しかし、頻繁に起こることは、設定ファイルの構造がそれ自体でプログラミング言語になり、制御フローが完全であり、ひどく文書化されていて、奇妙な構文とパーサーがあり、最も経験豊富なチーム内の開発者は、アプリケーションを完全に破ることなく触れることができます。

+0

+1。今日はすべてが醜いXMLファイルに保存されるという心配する世界的な傾向があります。時間が経つにつれ、ますます複雑になり、理解するのが難しくなります。あなたが言ったように、それはコードとデータの違いについて平均的なプログラマーの洞察力の欠如を露呈する。 –

+0

あなたはそこに良い点を持っている、私は次のスーパーメガ素晴らしいキャンドルすべての柔軟なシステムを設計するときにそれについて考えているだろう;-) –

0

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

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

関連する問題