「データは単なる愚かなコードであり、コードは単なる賢いデータである」とはどういう意味ですか? [closed] 質問する

「データは単なる愚かなコードであり、コードは単なる賢いデータである」とはどういう意味ですか? [closed] 質問する

私はちょうどアイデアに出会ったコンピュータプログラムの構造と解釈:

データは単なる愚かなコードであり、コードは単なる賢いデータである

意味がわかりません。誰かもっとよく理解できるように手助けしてくれませんか?

ベストアンサー1

これは 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

Scheme などの一部の言語には「ファーストクラス関数」という概念があり、これは関数をデータとして扱い、本当に必要なときまで評価せずに渡すことができることを意味します。

結局のところ、「コード」と「データ」の区分は、視点のみの関数で、かなり恣意的です。抽象化のレベルが低いほど、コードは「賢く」なければなりません。つまり、コードの実行方法に関するより多くの情報を含める必要があります。一方、インタープリタが提供する情報が多いほど、コードはより愚かになり、まったく賢くないデータのように見え始めます。

コードを書く最も強力な方法の1つは、必要なものをシンプルに記述することです。つまり、解釈コンテキストによって必要なものを取得する方法を記述するコードに変換されるデータです。これを「宣言型プログラミング」

具体的な例として、HTML を考えてみましょう。HTML はチューリング完全なプログラミング言語を記述するものではありません。単に構造化されたデータです。その構造には、解釈コンテキストの動作を制御できるいくつかの機能が含まれていますが、それほど多くの機能があるわけではありません。一方、平均的な Web ページに表示されるテキストの段落よりも多くの機能が含まれています。つまり、それらは非常に愚かなデータです。

おすすめ記事