什么是“数据仅仅是愚蠢的代码,代码只是智能数据”是什么意思? [关闭]

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

像方案有些语言有“一流的功能”概念,这意味着你可以把一个函数作为数据,并通过它没有评估它,直到你真正想。

其结果是,“代码”和“数据”之间的划分是几乎任意的,只立体的函数。抽象的层次越低,“聪明”的代码必须是:它必须包含有关应如何执行的更多信息。在另一方面,所述详细信息解释器用品,更哑代码可以是,直到它开始看起来像在所有无聪明数据。

其中一个最有效的方法来编写代码是你所需要的简单描述:数据将变成描述如何得到你需要通过上下文解释什么代码。我们称这种 “声明式编程”

有关一个具体的例子,考虑HTML。 HTML没有描述图灵完备的编程语言。这仅仅是结构化数据。它的结构包含了一些智慧,让它控制其解释上下文的行为 - 但不是很多聪明的。在另一方面,它包含了比文字中出现的平均网页上的段落更聪明:这些都是非常愚蠢的数据

其他提示

在安全的范围内:由于缓冲器溢出,则认为是数据,从而无害(如图像)可以成为作为代码执行和p0wn机器

的内容。

在软件开发的背景:许多开发人员都非常害怕的“硬编码”的东西,在提取可能需要更改成配置文件中的参数非常热衷。这通常是基于这样的想法是配置文件仅仅是“数据”,因此可以(通过客户perhapy)容易改变,而提高的问题(编译,部署,测试),在代码进行任何更改会。

什么这些开发人员没有意识到的是,由于该“数据”影响程序的行为,这真的是代码;它可能会破坏该计划的唯一理由不要求完成测试后,这样的变化是,如果做得正确,可配置的值有一个非常具体的,证据充分的效果,任何无效的值或破损的文件结构将被捕获该程序。

然而,什么都太经常发生的是,配置文件结构变得本身就是一门编程语言,完整的控制流和一切 - 一个真实厉害记载,有一个古怪的语法和分析器以及其中只有最有经验的开发人员在团队可以触摸而不完全打破了应用程序。

所以,在像方案A语言,即使代码被视为第一类数据。像你对待其他代码,说他们突入其它功能,lambda表达式,你可以把功能和lambda表达式得多。我建议用文继续担任这都将成为相当清楚的。

这是你应该来自于编译器写明白了。

在编译器的一个共同的步骤是将程序变换成抽象语法树。表示往往会像树木如[+,2,3]其中+为根,和2,3是孩子。

Lisp的语言简单地将这个作为其数据。因此,有数据和代码这两者都是列出了看起来像AST树之间没有分离。

代码是绝对的数据,但数据是绝对的并不总是代码。让我们来简单的例子 - 客户名称。它是无关的代码,它是一种的功能(必要的),而不是一个的技术(偶然)的应用的一个方面。

您也许可以说,任何技术/意外的数据是代码和功能/基本数据是没有的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top