eval()机制在编译型语言D语言中是怎么样被实现的

Yang 273

把字符串转换成代码然后编译,其实和脚本语言的eval是不一样的,对于脚本语言来说源代码就是执行码,源文件就是可执行文件,eval就是执行一段程序,但对于编译型语言来说,执行码是二进制代码,可执行文件也是二进制的。

一、实现

把字符串转换成代码然后编译,其实和脚本语言的eval是不一样的,对于脚本语言来说源代码就是执行码,源文件就是可执行文件,eval就是执行一段程序,但对于编译型语言来说,执行码是二进制代码,可执行文件也是二进制的,编译弄语言的eval的参数应该是编译后的二进制代码,而不是源文件。

编译语言可以有eval功能,但是二进制文件需要包含或访问一个编译器。如果要让eval的代码与编译的代码交互,那么二进制文件中需要一些注释(例如变量名、类名、函数名、类型)。

在D语言中,‘eval()’函数被称为‘mixin’,它允许将字符串作为代码执行。这是通过将字符串插入到源代码中并在编译时进行解析来实现的。这使得可以在运行时动态生成代码,从而提高了灵活性和可重用性。

例如,以下代码将字符串`”1+2″`插入到源代码中,并使用`mixin`函数将其解析为可执行的代码:

mixin(“int result = ” ~ “1+2” ~ “;”);

这将创建一个名为`result`的整数变量,并将其设置为3。

延伸阅读

1、什么是D语言

D语言,一种通用计算机程序语言,威力强大、功能丰富,支持多种编程范式,例如面向对象,最初由Digital Mars公司就职的Walter Bright于2001年发布,意图改进C++语言。最新D语言被简称为D2。最主要的D语言的实现是DMD。

D语言源自C/C++,借鉴了众多编程语言的特色和现代编译器技术,融会贯通了设计者丰富的实践经验,使之具备了非凡的威力--既有 C/C++ 语言的强大威力,又有 Python 和 Ruby 的开发效率。它集众多系统级编程所需的功能于一身,例如垃圾回收、手工内存操作、契约式设计、高级模板技术、内嵌汇编、内置单元测试、Mixin 风格多继承、类 Java 包管理机制、内置同步机制、内建基本运行时信息。

D是一种静态编译语言,因此没有传统意义上的eval语句,但是有相关的mixin语句。区别在于,eval在运行时将字符串解释为代码,而mixin则将字符串静态编译为普通代码,并且必须在编译时知道。

2、什么是编译型语言

程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++、Delphi等。

3、编译型语言和解释型语言的区别

解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。

(1)编译型与解释型,两者各有利弊

前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。

(2)编译性语言不如解释性语言跨平台性好

编译性语言例如c语言:用c语言开发了程序后,需要通过编译器把程序编译成机器语言(即计算机识别的二进制文件,因为不同的操作系统计算机识别的二进制文件是不同的),所以c语言程序进行移植后,要重新编译。(如windows编译成ext文件,linux编译成erp文件)。

解释性语言,例如java语言,java程序首先通过编译器编译成class文件,如果在windows平台上运行,则通过windows平台上的java虚拟机(VM)进行解释。如果运行在linux平台上,则通过linux平台上的java虚拟机进行解释执行。所以说能跨平台,前提是平台上必须要有相匹配的java虚拟机。如果没有java虚拟机,则不能进行跨平台。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部