编译语言可以同音吗?

27 lisp compiler-construction scheme interpreter homoiconicity

根据定义,homoiconic这个词的意思是:

代码和数据的相同表示

在LISP中,这意味着您可以使用引用列表并对其进行评估,因此(car list)函数和(cdr list)参数也是如此.这可以在编译时或在运行时发生,但是它需要解释器.

没有编译时解释器的编译语言是否也可能是homoiconic?或者说同性恋的概念仅限于口译员?

Rai*_*wig 35

'Homoiconic'是一种模糊的结构.'代码是数据'有点清楚.

无论如何,维基百科的Homoiconic上的第一句话并不那么糟糕.它说语言必须使用其数据结构来源表示.如果我们忘记'字符串'作为源表示(这是微不足道的,并且没有那么有用的概念'homoiconic'),那么Lisp有列表,符号,数字,字符串等,用于表示源代码.EVAL函数的接口确定语言正在处理什么类型的源表示.在这种情况下,Lisp,它不是字符串.EVAL期望通常各种各样​​的数据结构和Lisp的评估规则确定字符串对其自身进行求值(因此不会被解释为程序表达式,而只是字符串数据).一个数字也评估自己.列表(sin 3.0)是符号和数字的列表.评估规则指出,具有表示函数作为第一个对象的符号的该列表将被评估为函数应用程序.对于数据,特殊运算符,宏应用程序和函数应用程序,有一些这样的评估规则.而已.

为了说清楚:在Lisp中,函数EVAL是在Lisp数据结构上定义的.它期望数据结构,根据其评估规则对其进行评估并返回结果 - 再次使用其数据结构.

这与homoiconic的定义相匹配:源代码使用Lisp的数据类型具有本机表示.

现在,有趣的部分是:EVAL如何实现并不重要.重要的是它使用Lisp数据结构接受源代码,它执行代码并返回结果.

因此,EVAL使用编译器是完全合法的.

(EVAL code)  =  (run (compile-expression code))
Run Code Online (Sandbox Code Playgroud)

这就是几个Lisp系统的工作方式,有些甚至没有解释器.

因此,'Homoiconic'表示SOURCE代码具有数据表示.它并没有说在运行时必须解释此源代码或执行基于此源代码.

如果编译代码,则运行时既不需要编译器也不需要解释器.只有当程序想要在运行时评估或编译代码时才需要这些 - 这通常是不需要的.

Lisp还提供了一个原始函数READ,它将数据的外部表示(S-Expressions)转换为数据的内部表示(Lisp数据).因此,它还可以用于将源代码的外部表示转换为源代码的内部表示.Lisp不对源代码使用特殊的解析器 - 因为代码是数据,只有READ.

  • 'String'没有意义,因为所有基于文本的编程语言都有字符串表示.在Java中,您可以构建一个字符串,将其编译出来进行编译,然后使用类加载器将结果加载.这会让Java'同性恋'吗?如果是的话,"同质性"的整个概念是无用的.'homoiconic'可能想要捕获的想法是代码具有**内部表示,即结构化数据**( - >不是普通字符串). (16认同)
  • "homoiconic/ity"有什么含糊之处?确切的维基百科引用说:"在计算机编程中,同质性是一些编程语言的属性,其中程序的主要表示也是语言本身的原始类型的数据结构,从同一意义相同和图标意义表示".话虽这么说,但你指出这不是一个适用于编译器和解释器讨论的概念.一个语言的"做"与该语言的结构有何不同. (4认同)

dsm*_*dsm 8

是.lisp可以编译为本机二进制文件

  • @ott和一个CPU包含微码,它是各种解释器...一切都在某种程度上,一个解释器. (6认同)
  • 如果编译代码,二进制文件不需要解释器.有些Lisps甚至没有翻译. (6认同)
  • @ott,没关系......同质性是某个定义抽象层次的一个属性:你可以将一个同性语言编译成一个仲裁级别......这个层次可能/可能不会表达同性语义等等. .. (2认同)
  • @Rainer,甚至没有提到LISPM/Lisp-on-a-chip的东西http://www.scribd.com/doc/938809/Design-of-a-LISPBased-Microprocessor (2认同)