【编译原理】 CS143 斯坦福大学公开课 第一周:简介
youtube : 1.1| Introduction to Compilers and interpreters
1.1| Introduction to Compilers and interpreters – 编译器解释器介绍
- 两种主要的实现编程语言的方法 – 编译器和解释器
这个课程主要讲编译器,编译器通过产生汇编语言或者字节码等等,可以认为是off-line的,解释器则可以认为是on-line的。
- 编译器和解释器开发历史
1954年,IBM开发了名为704的机器,用户购买该机器后发现软件成本远大于硬件成本。这让人们思考如何更容易的创造程序。
1953年,John Backus开发了Speedcoding,类似于我们今天说的解释器。不过有两个主要的缺点,第一是比直接编写的程序慢10-20倍,第二是占用了300字节的内存,虽然今天看来很小,但是这在当时相当于704机器的30%内存。因此并未流行。
Formulas Translated – 公式翻译项目或者叫做FORTRAN(原来是这么取的名字呀!)在1954年开始一直到1957年,不过有趣的是,他们之前以为只需要1年。到1958年,一半以上的代码都是FORTRAN编写的,非常流行。
- FORTRAN 1
因此FORTRAN 1是第一种成功的高级语言(怪不得教材少不了它),并对之后的编译器产生了深刻的影响。编译器迷人的地方在于它结合了Theory – 理论 Practice – 实践。
FORTRAN 1包含了五个组成部分:
Lexical Analysis
– 词法分析Parsing
Semantic Analysis
– 语义分析Optimization
– 优化Code Generation
– 代码生成
1.2| Structure of a Compiler – 编译器结构
让我们用英语的方法对编译器结构进行简单介绍。
- 第一步,认识单词 – 字母以上的最小单元
Lexical Analysis
– 词法分析的目标是将程序的文本划分为“words”和“token”。
- 第二步,明白句子的结构
Parsing = Diagramming Sentence
– 图解句子,这里的“图”是一棵树
- 第三步,明白意思,这对于编译器来说很困难
Semantic Analysis
– 语义分析,编译器执行有限的语义分析来捕获程序的不一致之处(程序是否有歧义、语法错误)
- 第四步,优化,这里有一点像编辑(看成把白话文写成文言文吧 /W\ )
Optimization
– 优化,让程序运行更快,或者占用更少的内存等等。
- 第五步,翻译成另一种语言(这不是英语白痴的我看懂句子经历的5步吗 (╯°Д°)╯︵ ┻━┻ )
Code Generation
– 代码生成,翻译成机器码或者其他语言。
几乎每一个编译器都包含这5步,但是从上一节介绍的FORTRAN
开始,这5步所占比重却发生了改变。
图片上面的是传统的编译器,语义分析比重较小,其他比较平衡。
图片下面的是现代编译器,代码优化比重非常大,语义分析比重一般,其他几步比重小。(过于真实)
1.3| The Economy of Programming Languages – 程序设计语言的经济性
为什么有这么多编程语言?
因为编程领域有很多特殊/矛盾的需求,很难设计一门语言完成所有情形。
比如:
科学计算(Scientific Computing
) 比如 FORTRAN
- 需要好的浮点运算(FP,floating point)的支持。
- 需要好的数组、矩阵(Arrays)的支持。
- 需要好的并行计算(parallelism)的支持。
- …
商业应用(Business Applications
) 比如 SQL
- 需要可靠的持久化(persistence)的支持。
- 需要好的报告(report facility)的支持。
- 需要好的数据分析(data analysis)的支持。
- …
系统编程(System programing
) 比如 C\C++
- 需要对资源控制(control of resource)的支持。
- 需要好的实时约束(real time constraint)的支持。
- …
为什么我们有新的编程语言?
对于一门编程语言,训练程序员使用它(Programmer training)是最大的成本。(即让程序员学习这门语言、让这门语言流行是最困难的)
结论:
- 广泛使用的编程语言的变化速度将会越来越慢。(就是说你呢,C)
- 开始一门新的编程语言将很简单。
于是,如果 productivity
> training cost
(生产率>学习成本) 那么就会去学习这门新语言。
- 编程语言将一次又一次的填补空白。
- 新的编程语言将和旧的编程语言非常相似(就比如Java vs C++)
什么是好的编程语言?
没有普遍接受的语言设计标准。
【编译原理】 CS143 斯坦福大学公开课 第一周:简介相关推荐
- 【编译原理】 CS143 斯坦福大学公开课 第二周:词法分析和有限自动机(下)
youtube :词法规则 文章较长,是4节视频的合集,大家看的时候多思考吧. 4.1| Lexical Specification – 词法规则 回顾: 如何识别任意字符串是否属于某一语言? 步骤: ...
- 【斯坦福大学公开课CS224W——图机器学习】三、节点和图嵌入
[斯坦福大学公开课CS224W--图机器学习]三.节点和图嵌入 文章目录 [斯坦福大学公开课CS224W--图机器学习]三.节点和图嵌入 1. 节点嵌入 1.1 编码器与解码器 1.2 节点嵌入的游走 ...
- 【斯坦福大学公开课CS224W——图机器学习】五、消息传递和节点分类
[斯坦福大学公开课CS224W--图机器学习]五.消息传递和节点分类 文章目录 [斯坦福大学公开课CS224W--图机器学习]五.消息传递和节点分类 1. Message Passing and No ...
- 斯坦福大学公开课:iPhone开发教程2010年冬
2019独角兽企业重金招聘Python工程师标准>>> 斯坦福大学公开课:iPhone开发教程2010年冬 http://v.163.com/special/opencourse/i ...
- 斯坦福大学公开课 :机器学习课程
共20讲 在网易公开课上有视频全集,难能可贵的是配带中英文字幕 斯坦福大学公开课 :机器学习课程 在JerryLead的blog中可以下到他的学习笔记以及讲义原稿. 感谢Andrew Ng, 感谢Je ...
- 斯坦福大学公开课:iOS 8开发
斯坦福大学公开课:iOS 8开发: http://open.163.com/special/opencourse/ios8.html
- SCI论文如何写--斯坦福大学公开课-Writing in the Sciences
SCI论文如何写--斯坦福大学公开课-Writing in the Sciences 链接:https://pan.baidu.com/s/1McDHMLqhs-KbpKRDNRNQTQ 提取码:12 ...
- iPhone应用开发视频教程-斯坦福大学公开课
以下是一套由美国斯坦福大学(Stanford University)在2013年初推出的一套iPhone应用程序开发视频教程,详细讲解了iPhone4/iPhone4s/iPhone5/iPad等iO ...
- Martin Odersky Scala编程公开课 第一周作业
Functional Programming Principles in Scala by Martin Odersky Martin教授是scala语言的creator,在coursera上面有s ...
- 斯坦福大学公开课机器学习:Neural Networks,representation: non-linear hypotheses(为什么需要做非线性分类器)...
如上图所示,如果用逻辑回归来解决这个问题,首先需要构造一个包含很多非线性项的逻辑回归函数g(x).这里g仍是s型函数(即 ).我们能让函数包含很多像这的多项式,当多项式足够多时,那么你也许能够得到可以 ...
最新文章
- AlphaGo的制胜秘诀:蒙特卡洛树搜索初学者指南
- mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换(上)
- MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
- 【数据结构-图】2.多图详解最小生成树(多图详解+实现代码)
- 信号与系统 chapter4 单位脉冲与单位阶跃序列
- eja智能压力变送器工作原理_压力变送器的原理、接线和安装方法
- 杭州SEO大熊:百度分享插件的SEO研究心得
- Adapter中notify(),notifyAll(),notifyDataSetChanged(),notifyDataSetInvalidaded()方法的区别
- Kicad如何导入封装库、符号库(元件库)以及3D模型文件?
- java高级工程师认证考试_ACAA 认证Java开发工程师
- 两个平面的位置关系和判定方程组解_必修二数学课后题答案
- 快压、360压缩、WinRAR关于打开快压通过超高压缩比压缩后的文件不兼容的问题
- 20155201 2016-2017-2 《Java程序设计》第六周学习总结
- C++之(public/protect/private)及fiend
- 计算一个整数,转换成二进制,里面有多少个1
- java ssl 双向认证_Java实现SSL双向认证的方法
- 力扣解题思路:1419. 数青蛙
- 2022-2028全球与中国近红外脑成像系统市场现状及未来发展趋势
- 字符串转化为RTF格式-RTF研究系列
- Url被多次转义 URLDecoder.decode(url,“UTF-8“)
热门文章
- 无线网络的设置和使用
- 一个码稿人自述:什么样的文档产品适合我?|深度吐槽
- C++17之std::apply与std::make_from_tuple
- cf1668E. Half Queen Cover 思维
- iPhone上塔罗牌测试软件,塔罗牌占卜:测Ta对你是用情至深还是一时兴起?准到没朋友!...
- win7网络怎么添加一台计算机,win7网络共享的设置方法【详细步骤】
- 基于Javaweb的酒店客房预订管理系统
- 常见电子元器件的分类与识别
- java复数类求模_用java定义一个复数类Complex,能够创建复数对象,并且实现复数之间的加、减运算 用java编写一个复数类...
- 网络略谈(一).局域网游戏谈起红警尤里的复仇