用几句最通俗的话向一个非科班的人解释什么是编译原理

一千年前的人 发布于 2012/07/11 14:59
阅读 2K+
收藏 4

我不是计算机科班出身的, 但是做了好些年开发,在osc, 这样的人很多。
有些计算机基础理论,一直觉得可神秘了。

(先把我大概知道的贴出来哈:电子技术、计算机组成、C、数据结构、操作系统原理、数据库原理。   免得各位说没基础, 无法解释)

先说第一个不懂的:编译原理、解释原理。 例如:
   (1)把代码编译成机器理解的形式
   (2)把脚本语言解释成VM理解的形式
   (3)甚至sql解析

请用几句最通俗易懂的话来向一个非科班的人说明 编译程序、解释程序 是怎么实现的。 谢谢!

别让我去看教科书哈!时间和空间不合适了....

 

@宏哥     @中山野鬼     @CheckStyle

 

加载中
0
中山野鬼
中山野鬼

哈。我本科是电子工程系,我研究生也是电子系(无非是折腾图像处理,和模式识别方面的研究)。我也不是科班出身。

不过科班不科班不是重点。教科书和专业的书籍还是要看的。我高中就在学计算机,编程语言,数据结构,操作系统应用,计算机组成原理等等,大一基本上计算机系的教科书也都自己折腾完了。大二一开学,就考了个狗屁不是的国家四级,当时号称等同于计算机本科能力。虽然当时很SB的满足,但至少说明一个问题,计算系本科的那些东西,完全可以也有必要去自学的,即不能认为非要对口专业科班生才能懂,也不能认为他没有必要。毕竟知识的学习和技术的应用都有一定说法的,或者专业的操作手法的 。做人不能太民间科学家。

先声明我下面的个人看法,大家不需要用教科书上的段落喷我,第一你喷的我都看过,第二我记忆力不好,第三,我记得的都是该记的,记不得的你会我也不嫉妒。哈。喷也白喷,喷了对我也没有什么值得学值得争论的。

编译本身是两个不同逻辑描述方式的映射,这还不涉及到连接的工作。连接是针对软硬件底层环境做的可运行态前的规范化组织。

所以编译,其实也可以等同翻译。和解释其实没太多区别。你说解释是一条条的,难道高级的解释性语言就不能全局优化后,再执行吗?显然也可以。

编译和解释,我的理解最大区别在于编译包含了编译的后端,针对逻辑描述,使用一个具体指令集进行实现。而解释不存在这个工作。其他方面都没有本质区别。

编译和解释也不存在什么效率不效率的本质区别,编译差的性能一样差。有些事情,解释执行和编译执行性能也几乎相同。特别是大家都是更多的调用已有库,而不是程序自身逻辑占用了大量的计算时间。

也不存在,编译一定出来的是具体机器指令,这个存在指令集映射是两回事。编译完全可以作成VM指令集,然后在不同硬件上再次做二次编译。这也可以叫做编译。

至于编译和解释是怎么实现的。哈,这个就复杂了。我认为计算机里面目前能看到的,逻辑最复杂的系统,无非是OS和编译器。数据库如果抛掉这两个组成部分,其他的部分并不复杂。

编译器我个人的理解,基本流程是

1、文本的组织整理,信息的识别。

2、语法逻辑的验证,由此获取无矛盾或冲突的逻辑序列。

3、根据逻辑序列,采用各种方法进行在保证前后关联性的前提下,进行优化整理,并获取逻辑执行表。

4、根据逻辑执行表匹配指令集。

基本这样。无非优势根绝外部的评价标准的改变,存在个二次再编译的循环过程而已。

当然以上只是原理,看起来简单,实际也不难,但确实非常烦。

 

 

z
zippon
回复 @中山野鬼 : 看这个:http://help.sap.com/saphelp_nwpi71/helpdata/en/47/1784966e8a21c3e10000000a114a6b/content.htm sybase也有类似的。 不过现在各大数据库都渐渐不鼓励这种对raw device的直接操作了。 反正感觉数据库相当于一个较专有的操作系统,内存管理,任务调度都要有。
泡不烂的凉粉
泡不烂的凉粉
回复 @aoniao : 指令集映射? 说的哪儿跟哪儿啊。我说的只是这3个sql之间的感觉。pg可以直接由内核启动后管理权教于它。pg作为shell可以干系统shell的事,mysql似乎干不了吧。 mssql虽然系统可以把管理权教给mssql,让它干所有事。可mssql只运行在win下,win下软件依靠的东西多了去了。mssql本领再强,也是在win下。
中山野鬼
中山野鬼
回复 @zippon : ????这话从哪说起?哈。
z
zippon
回复 @中山野鬼 : 商用数据库(都)支持原始设备,这肯定要自己实现IO了。
aoniao
aoniao
回复 @看能不能改个名 : 意思是还有指令集的映射?
下一页
2
泡不烂的凉粉
泡不烂的凉粉

编译程序,解释程序,都是怎么实现的?

如果从字面上讲。都是靠打字实现的。都用编码来实现。差别是实现方法不同。

举个例子,你写了一个机器操作流程指南,给你机器操作者指导使用你的机器。那你写的指南就是程序。

操作人员是个英国人,你写的是中文。 所以,找了个翻译。全部翻译成英文给操作员使用。 这就是编译方式。   有了英文的指南,就可以把翻译扔一边了。

另外一个情况, 英国人打开设备,顺便看到使用指南是中文的,不懂,就找了个翻译一步一步讲,然后操作员一步一步按照指南上说的操作了。然后完成了操作。 这个方式叫解释执行。 离不开翻译这个解释器的参与。

为开源贡献力量
为开源贡献力量
棒棒的
一千年前的人
一千年前的人
很好, 牛人啊。 这个回答也很好!
1
mallon
mallon
说白了就是按某种规则转换,生活中处处有类似的思想
1
宏哥
宏哥

引用来自“一千年前的人”的答案

引用来自“宏哥”的答案

1,2 我也感觉几句话,没有办法说清楚. 这个和芯片的运行方式有关. 

至于脚本语言,专业俗语叫做 managed code, 只是指针的另外一种形式而已. 

回头我再想想.

至于SQL, 我也想搞明白为啥它们能那么快速,里面肯定有神奇的东西.

我对sql解析的理解:

1. 生成执行计划

2. 执行sql, 此时问题已经变成了:数据快速查找 和 排序 的问题了。 数据结构。。。。

其实你如果能理解原语和库的区别

再加上理解一些芯片工作的方式,你上面大多问题都能明白. 

原语有芯片级别的,如directx, 或者GPS芯片里面的那个位置算法.

1
永远对你好
永远对你好

编译原理--->编,译,原,理

 

宏哥
宏哥
回复 @一千年前的人 : 原,不可分割, 理,调理
一千年前的人
一千年前的人
回复 @宏哥 : 原 和 理 怎么理解呢?
宏哥
宏哥
这个是极强的解释,楼主应当看看
1
helloworld_go
helloworld_go

楼主我推荐你一篇文章:

http://coolshell.cn/articles/1547.html

这是一个小例子,应该能让你很快上手。

 

helloworld_go
helloworld_go
其实sql解析是很容易的,(当然执行起来很复杂),以致有些书上会拿sql解析做为一些文法词法的例子。 楼主有心的话还可以看这个: http://www.gnu.org/software/dotgnu/libjit-doc/libjit_1.html 这是个jit
一千年前的人
一千年前的人
确实很好。。。谢谢。
helloworld_go
helloworld_go
大致都是文法分析 -->语法分析 下面的就不一样了,主要区别在于此,前面两步基本上没有什么逃得掉的。 有的是生成汇编码, 有的是直接解析执行。
0
xesam
xesam
...如果几句话就说清楚了,还有那些书干嘛啊
0
CheckStyle
CheckStyle
不懂就去看书呗,
0
宏哥
宏哥

1,2 我也感觉几句话,没有办法说清楚. 这个和芯片的运行方式有关. 

至于脚本语言,专业俗语叫做 managed code, 只是指针的另外一种形式而已. 

回头我再想想.

至于SQL, 我也想搞明白为啥它们能那么快速,里面肯定有神奇的东西.

0
宏哥
宏哥

我一直觉得非计算机科班的人,更适合搞计算机.

比如 学习财务的人,开发财务系统,绝对一流. 用个破vbscript或者php啥的,就可以开发极好的系统.

学习计算机的嘛,我真不知道能干啥,会玩游戏我都觉得比搞计算机好.

一千年前的人
一千年前的人
有不少老板, 本身不是不会计算机。。 但是懂业务(老板本身就是需求单位的人啊)。。 于是事情就成了。。
返回顶部
顶部