编译原理可以用c写解释器吗
1. 我要用C写个面对对象的语言的解释器,怎么开始比较好
先去阅读编译原理吧!脚本语言的解释器不是那么好做的,涉及到的东西实在多,如果你敢于尝试,建议先去阅读一下现有的编译器代码。
2. 怎样去写一个编译器(用c语言写C语言编译器),需要哪些知识做铺垫,可以给一下相关网站和书籍的推荐吗
写编译器重点就是设计并实现一些数据结构和算法,语言特点太多的话,代码写起来不容易,建议你找一个小语言尝试下,不要一开始就去尝试成熟语言。否则你会在写完语法分析程序以后,遭遇到很大的困难。多数人都是在写语义分析程序的时候,突然发现自己设计的数据结构很烂,后边越写越要命。
如果你想入门编译器的话,那么可以看《编译原理与实践》,整本书先将编译器理论,然后后边教你一步步实现c-miuns(c的子集)的编译器,包括lex,yacc,都在几千行代码左右。这本书讲的比较简单易懂一点
也可以学学斯坦福大学的编译器设计公开课(aiken设计了一个叫cool的语言,专门用来教人写编译器),课程地址上面有人给了:Compilers。这门课以前有个实验环境(据说已经给了,我以前写的时候还是用的网上一个不完整的实验环境),把和编译器知识无关的内容都给你写好了,你只需要在固定的地方填上你的内容就可以写出你的编译器(不要觉得很简单哦,人家的代码写的很精巧的,读完就发现写个好编译器还是很费脑子的),另外,这个实验环境有个特点,就是在每一步都提供标准程序做对比,你可以在写完一部分以后就同标准程序对比,及时发现错误。这种方式为写编译器又提供了很多帮助
先找个小的,慢慢研究,弄懂了整体的结构再说
3. 关于编译原理的问题
1.当然是机器语言了,如果是汇编指令,那还得编译一次!能运行的程序都是机器语言,只有机器语言才能控制CPU,NET或java这些中间语言,程序在运行时会被CLR或JVM快速编译成机器语言,因此这些程序速度上有损失。
高级语言源代码(文本)-通过编译器(compiler)-程序(二进制机器语言)
汇编代码(文本)-通过汇编器(assembler)-程序(二进制语言)
看到这里,你可能会想那汇编语言到底有什么用呢,编译器完全能代替汇编啊?
(1).编译器是通过高级语言(c,c++)转到机器语言的。转换过的机器语言受限与高级语言,效率和功能上都有限制。比如c不等过分操作内存。但通过汇编器转化过来的机器语言,效率高,且用汇编语言,直接和CPU对话!
(2).汇编可以反汇编(逆向编译),而这里高级语言没有发言权,就是:
程序(二进制机器语言)-通过反汇编器(compiler)-可转化为汇编代码(文本)
但永远不能转化为高级语言的源代码,。
以上两点汇编存在的重要性。
2。当然是说移植源代码。windows用x86机器语言,苹果用powerPC机器语言,windows程序当然不能运行在苹果机上,因为程序其实就是一串机器语言!但windows上有c的编译器(vc++),苹果机上也有c编译器(gcc),因此同一个c的源代码,当然就可以通过不同平台的同一种编译器实现平台移植。
3.当然是NASM,我看的所有书都首先说NASM,他是开源的,就像Linux一样,很受欢迎,还有MASN是微软的,borland的也有汇编器,不过都不常见了。
4.这跟CPU有关,一般32位x86兼容的cpu有许多寄存器,多数是32位的,也有16位的。比如CS,ES,DS这些segment寄存器一直是16位的。
5.优势太多了,这和32位和16位存在的优势一样,16位电脑最大内存1MB,寄存器都是16位的。32位,最大内存可以有4GB,整整是16位的4096倍啊!16位多渺小啊,同理64位基本上也可以蔑视32位,64内存最大内存用TB来衡量,寄存器多数是64位!地址总线也是64位。64对32位没有什么优势劣势可言,64位完全就是32位的下一代。
4. c++编译程序是用什么软件写出来的
我只知道c可以用来开发编译器~~我们编译原理课程是使用c语言开发编译器
当然汇编肯定也可以用来开发编译器
汇编语言的编译器也可以使用c语言来编写,编译器其实算是一个文本处理工具,再说c语言的程序之后也会转换为汇编语言的版本,直至机器语言,所以汇编的编译器不一定非得汇编语言编写~~
应该不是java
c#这样的高级语言开发出来的。。。
另外java虚拟机以及c#的底层都是c++编写的。
能力有限,只知道这些,期待楼下的答复~~
5. 如何用c写一个编译器
先学编译原理。
然后根据步骤,
1 处理预编译
2 词法分析
3 语法分析
4 语义分析
5 中间代码转换
6 二进制代码生成。
简单起见,不需要考虑优化。 初期可以不需要支持太多语法。
6. C语言既可以编译执行又可以解释执行吗 编译执行怎么解释 解释执行又怎么解释
C 语言程序仅可以解释执行。
解释程序是将源程序(如BASIC)作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。编译程序是把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,进行翻译转换,产生出机器语言的目标程序,然后再让计算机执行这个目标程序,得到计算结果。
相对于编译性语言,其优点是可移植性好,只要有解释器环境,程序就可以在不同的操作系统上运行。
缺点是代码需要有专门的解释器,在程序运行时,除要给用户程序本身分配内存空间外,解释器也占用系统资源,所以其运行速度较慢。另外,也很难达到像C、C++那样操作系统底层操作的目的。
解释型语言常用于,一是对运行速度要求不高(如一些网页脚本等)的场合,二是对跨平台(操作系统的兼容性)有要求的场合。
(6)编译原理可以用c写解释器吗扩展阅读
1、Python和Java语言,专门有一个解释器能够直接执行Python程序,每个语句都是执行的时候才翻译。
2、Python代码在运行前,会先编译成中间代码,每个 .py 文件将被换转成pyc 文件,pyc 就是一种字节码文件,它是与平台无关的中间代码。不管放在 Windows 还是 Linux 平台都可以执行,运行时将由虚拟机逐行把字节码翻译成目标代码。
7. c++ 解释器与编译程序
解释语言是解释执行,编译语言是编译后执行。这个大部分书记中对这2中语言 的描述。
简单解释一下(个人理解):
解释语言也可以成为脚本语言,代码编写后可以直接在代码解释器上执行(不是编辑器,编辑器调用了解释器才可以执行代码)。解释器也就是执行代码需要的运行环境,比如执行Java代码就需要jvm。
编译语言是需要编译后才可以执行的语言,代表语言——C语言。编写完代码后需要编译才可以运行。编译后的文件不一定就是exe文件,exe文件只是window系统上的一种可执行文件。
解释语言和编译语言最大的区别就在于编写完的代码是否需要编译后才能执行。所谓编译,就算编写代码的优化、调整。具体可以参考《编译原理》这本书。经过编译后的代码具有更高的执行效率(编译过程计算机会将你写的代码极度优化,包括更改变量名、删除注释、删除无用变量、运算符的替换……)经过编译后的文件因为更改了很多的内容所以反编译成原始代码的时候已经面目全非了。而解释语言不同,解释语言没有编译过程(执行效率全看程序员个人水平和解释器的速度)只是将代码转化为标准的二进制代码(比如Java)可以将转化后的代码转化回原来的代码只是少了注释。
目前开发语言中编译类的语言使用率在下降,但是效率的优势,编译类的语言依然占据很大市场。
8. 请问编译原理的词法分析用C语言编写的算法是怎样的
ε只能出现在NFA中,当然不是为了方便直观,而是连通NFA和DFA的桥梁。编译原理讲授的不是如何绘制NFA或者DFA,二是告诉读者怎样能够自动实现NFA或DFA的构造。在实际应用中ε可以帮助计算机转换NFA为DFA,而在属性文法和语法制导阶段,它也是沟通综合属性与继承属性、执行语义动作不可或缺的一部分。另外ε的使用可以大大简化文法产生式的构造难度。我记得最初使用ε是为了使得文法体系(字母表)更加完善,但是在实际应用中却变得应用广泛(此观点不一定正确)。 最后想说的是,在编译中,ε也带来了不小的麻烦,否则也就不会有诸如“去空产生式”这样的算法了:)
采纳哦
9. 编译原理里,什么是源语言,什么是目标语言,什么是翻译器,什么是编译器,什么是解释器,什么是T形图
在vc 将c/c++代码翻译成asm文件的过程中
c/c++ 是源语言 asm是目标语言 vc是翻译器
vc将asm在编译成 obj文件 最后于库文件链接成 二进制文件 vc就是编译器
java中 需要跑一个 java虚拟机 比如 sun的 java.exe java.exe就是解释器
c语言 a机器 c语言 b机器 C语言 b机器
a机器 c语言 a机器
图a 图b 图c
在上图中,图(a)为已有的编译程序,图(c)为需要得到的编译程序,图(b)为需要书写的编译程序,只要我们把(b)在(a)上编译就可得到(c)
打个比方
编译器a是已有的在intel主机上将c语言翻译成可在intel主机上运行的编译器 我们希望得到在intel机器上运行的将c语言翻译成可在苹果主机上运行的编译器c 那么我们只需要用c语言写一个将c语言翻译成可在苹果主机上运行的编译器b, 在编译器a上编译c语言写的编译器b 就可以得到编译器c
10. 我想自己用C/C++做一个脚本语言解释器,但是不知道需要什么知识
对于脚本解释的,只是调用了系统的api吧,应该是这样子,你自己用程序写,然后调用系统api,然后获取返回内容就行了
比如普通的命令,,复制,你可以定义成其他名字,调用的api或者是直接用cmd下可以用的命令直接用至于读取你的程序执行内容,那根读取文本一样!