Terminology 什么是“;数据只是哑代码,而代码只是智能数据”;什么意思?

Terminology 什么是“;数据只是哑代码,而代码只是智能数据”;什么意思?,terminology,sicp,Terminology,Sicp,我刚在一本书中发现了一个想法: 数据只是哑代码,而代码只是智能数据 我不明白这是什么意思。有人能帮我更好地理解它吗?因此,在类似Scheme的语言中,甚至代码都被视为第一类数据。可以像处理其他代码一样处理函数和lambda表达式,比如将它们传递到其他函数和lambda表达式中。我建议继续读课文,因为这将变得非常清楚。这是SICP的基本课程之一,也是计算机科学最强大的思想之一。它的工作原理如下: 我们所认为的“代码”本身并没有做任何事情的能力。代码仅在解释上下文中定义程序——在该上下文之外,它只是

我刚在一本书中发现了一个想法:

数据只是哑代码,而代码只是智能数据


我不明白这是什么意思。有人能帮我更好地理解它吗?

因此,在类似Scheme的语言中,甚至代码都被视为第一类数据。可以像处理其他代码一样处理函数和lambda表达式,比如将它们传递到其他函数和lambda表达式中。我建议继续读课文,因为这将变得非常清楚。

这是SICP的基本课程之一,也是计算机科学最强大的思想之一。它的工作原理如下:

我们所认为的“代码”本身并没有做任何事情的能力。代码仅在解释上下文中定义程序——在该上下文之外,它只是一个字符流。(实际上是一个比特流,实际上是一个电脉冲流。但让我们保持简单。)代码的含义是由运行它的系统定义的——这个系统只是将代码视为告诉它你想做什么的数据。C编译器将C源代码解释为描述要创建的目标文件的数据。加载程序将对象文件视为描述要排队执行的某些机器指令的数据。CPU将机器指令解释为定义其应经历的状态转换序列的数据

解释语言通常包含将数据视为代码的机制,这意味着您可以将代码以某种形式传递到函数中,然后执行它,甚至可以在运行时生成代码:

#/usr/bin/perl
#请注意,上面的一行明确定义了
#此文件的其余部分。如果没有Perl解释器的上下文,此脚本
#什么都不做。
sub-foo{
我的($表达式)=@;
#$expression只是一个碰巧是有效Perl的字符串
打印“$expression=“.eval”($expression”)。\n”;
}
foo(“1+1+2+3+5+8”)#前六个斐波那契数之和
foo(join(+',map{$\u*$\ u}(1..10));#前十平方和
scheme等一些语言有一个“一流函数”的概念,这意味着您可以将函数视为数据,并在不计算它的情况下传递它,直到您真正想要为止

结果是,“代码”和“数据”之间的划分几乎是任意的,只是一种透视功能。抽象级别越低,代码就必须越“聪明”:它必须包含更多关于如何执行的信息。另一方面,解释器提供的信息越多,代码就越愚蠢,直到它开始看起来像没有智能的数据

编写代码最有效的方法之一是简单地描述您需要的内容:数据将转化为代码,描述如何通过解释性上下文获得您需要的内容。我们称之为


作为一个具体的例子,考虑HTML。HTML不描述图灵完整编程语言。它仅仅是结构化数据。它的结构包含一些智能,可以让它控制其解释性上下文的行为——但不是很多智能。另一方面,它比普通网页上出现的文本段落更聪明:这些都是非常愚蠢的数据。

这是在编译器中编写时应该理解的

编译器中的一个常见步骤是将程序转换为抽象语法树。表示通常类似于树,例如[+,2,3],其中+是根,2,3是子项


Lisp语言只是将其视为数据。因此,数据和代码之间没有分离,它们都是看起来像AST树的列表。

在安全上下文中:由于缓冲区溢出,您认为是数据的东西,因此无害的东西(如图像)可以作为代码执行,并在您的机器上运行

在软件开发环境中:许多开发人员非常害怕“硬编码”的东西,并且非常热衷于提取可能必须更改为配置文件的参数。这通常是基于这样的想法,即配置文件只是“数据”,因此可以很容易地进行更改(可能是由客户更改),而不会引起更改代码中的任何内容都会带来的问题(编译、部署、测试)

这些开发人员没有意识到的是,由于这些“数据”会影响程序的行为,所以它实际上是代码;它可能会破坏程序,在这样的更改后不需要进行完整测试的唯一原因是,如果正确执行,可配置值会产生非常具体的、有详细记录的效果,并且任何无效值或损坏的文件结构都会被程序捕获


然而,经常发生的事情是,配置文件结构本身就变成了一种编程语言,包括控制流和所有东西——一种没有很好的文档记录的语言,有一个奇怪的语法和解析器,只有团队中最有经验的开发人员才能使用它,而不会完全破坏应用程序。

代码绝对是数据,但数据绝对是不一定总是代码。让我们举一个基本的例子-客户名称。这与代码无关,它是应用程序的功能性方面,而不是技术性方面


你可能会说,任何技术/意外数据都是代码,而功能/基本数据则不是。

如果你不知道它的含义,你怎么能说它“措辞优雅”呢?起初我认为它是一种交叉现象,但现在我认为它是一种反代谢物。这是我作为程序员最重要的见解之一,这实际上是白板编程问题的范例。甚至有一个著名的视频系列,其中“它的解释”