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包含了五个组成部分:

  1. Lexical Analysis – 词法分析
  2. Parsing
  3. Semantic Analysis – 语义分析
  4. Optimization – 优化
  5. 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)是最大的成本。(即让程序员学习这门语言、让这门语言流行是最困难的)

结论:

  1. 广泛使用的编程语言的变化速度将会越来越慢。(就是说你呢,C)
  2. 开始一门新的编程语言将很简单。

于是,如果 productivity > training cost (生产率>学习成本) 那么就会去学习这门新语言。

  1. 编程语言将一次又一次的填补空白。
  2. 新的编程语言将和旧的编程语言非常相似(就比如Java vs C++)

什么是好的编程语言?

没有普遍接受的语言设计标准。

【编译原理】 CS143 斯坦福大学公开课 第一周:简介相关推荐

  1. 【编译原理】 CS143 斯坦福大学公开课 第二周:词法分析和有限自动机(下)

    youtube :词法规则 文章较长,是4节视频的合集,大家看的时候多思考吧. 4.1| Lexical Specification – 词法规则 回顾: 如何识别任意字符串是否属于某一语言? 步骤: ...

  2. 【斯坦福大学公开课CS224W——图机器学习】三、节点和图嵌入

    [斯坦福大学公开课CS224W--图机器学习]三.节点和图嵌入 文章目录 [斯坦福大学公开课CS224W--图机器学习]三.节点和图嵌入 1. 节点嵌入 1.1 编码器与解码器 1.2 节点嵌入的游走 ...

  3. 【斯坦福大学公开课CS224W——图机器学习】五、消息传递和节点分类

    [斯坦福大学公开课CS224W--图机器学习]五.消息传递和节点分类 文章目录 [斯坦福大学公开课CS224W--图机器学习]五.消息传递和节点分类 1. Message Passing and No ...

  4. 斯坦福大学公开课:iPhone开发教程2010年冬

    2019独角兽企业重金招聘Python工程师标准>>> 斯坦福大学公开课:iPhone开发教程2010年冬 http://v.163.com/special/opencourse/i ...

  5. 斯坦福大学公开课 :机器学习课程

    共20讲 在网易公开课上有视频全集,难能可贵的是配带中英文字幕 斯坦福大学公开课 :机器学习课程 在JerryLead的blog中可以下到他的学习笔记以及讲义原稿. 感谢Andrew Ng, 感谢Je ...

  6. 斯坦福大学公开课:iOS 8开发

    斯坦福大学公开课:iOS 8开发: http://open.163.com/special/opencourse/ios8.html

  7. SCI论文如何写--斯坦福大学公开课-Writing in the Sciences

    SCI论文如何写--斯坦福大学公开课-Writing in the Sciences 链接:https://pan.baidu.com/s/1McDHMLqhs-KbpKRDNRNQTQ 提取码:12 ...

  8. iPhone应用开发视频教程-斯坦福大学公开课

    以下是一套由美国斯坦福大学(Stanford University)在2013年初推出的一套iPhone应用程序开发视频教程,详细讲解了iPhone4/iPhone4s/iPhone5/iPad等iO ...

  9. Martin Odersky Scala编程公开课 第一周作业

    Functional Programming Principles in Scala  by Martin Odersky Martin教授是scala语言的creator,在coursera上面有s ...

  10. 斯坦福大学公开课机器学习:Neural Networks,representation: non-linear hypotheses(为什么需要做非线性分类器)...

    如上图所示,如果用逻辑回归来解决这个问题,首先需要构造一个包含很多非线性项的逻辑回归函数g(x).这里g仍是s型函数(即 ).我们能让函数包含很多像这的多项式,当多项式足够多时,那么你也许能够得到可以 ...

最新文章

  1. AlphaGo的制胜秘诀:蒙特卡洛树搜索初学者指南
  2. mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换(上)
  3. MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
  4. 【数据结构-图】2.多图详解最小生成树(多图详解+实现代码)
  5. 信号与系统 chapter4 单位脉冲与单位阶跃序列
  6. eja智能压力变送器工作原理_压力变送器的原理、接线和安装方法
  7. 杭州SEO大熊:百度分享插件的SEO研究心得
  8. Adapter中notify(),notifyAll(),notifyDataSetChanged(),notifyDataSetInvalidaded()方法的区别
  9. Kicad如何导入封装库、符号库(元件库)以及3D模型文件?
  10. java高级工程师认证考试_ACAA 认证Java开发工程师
  11. 两个平面的位置关系和判定方程组解_必修二数学课后题答案
  12. 快压、360压缩、WinRAR关于打开快压通过超高压缩比压缩后的文件不兼容的问题
  13. 20155201 2016-2017-2 《Java程序设计》第六周学习总结
  14. C++之(public/protect/private)及fiend
  15. 计算一个整数,转换成二进制,里面有多少个1
  16. java ssl 双向认证_Java实现SSL双向认证的方法
  17. 力扣解题思路:1419. 数青蛙
  18. 2022-2028全球与中国近红外脑成像系统市场现状及未来发展趋势
  19. 字符串转化为RTF格式-RTF研究系列
  20. Url被多次转义 URLDecoder.decode(url,“UTF-8“)

热门文章

  1. 无线网络的设置和使用
  2. 一个码稿人自述:什么样的文档产品适合我?|深度吐槽
  3. C++17之std::apply与std::make_from_tuple
  4. cf1668E. Half Queen Cover 思维
  5. iPhone上塔罗牌测试软件,塔罗牌占卜:测Ta对你是用情至深还是一时兴起?准到没朋友!...
  6. win7网络怎么添加一台计算机,win7网络共享的设置方法【详细步骤】
  7. 基于Javaweb的酒店客房预订管理系统
  8. 常见电子元器件的分类与识别
  9. java复数类求模_用java定义一个复数类Complex,能够创建复数对象,并且实现复数之间的加、减运算 用java编写一个复数类...
  10. 网络略谈(一).局域网游戏谈起红警尤里的复仇