目录

前言

第一节课:编译器与解释器简介

线上与线下的概念

线上

线下

编译器与解释器的区别

编译器

解释器

FORTRAN 1结构

它包含五个阶段

1.词法 分析

2.语法解析

3.语义分析

4.优化

5.代码生成


前言

最近博主在上斯坦福大学的CS143课程系列的编译原理,为了便于日后的重温以及给它人学习的帮助我会更新这一系列的文章,这一系列的所有文章都是博主自己记的随堂笔记,也有很多自己的理解与见解。

第一节课:编译器与解释器简介

线上与线下的概念

线上

在程序中,执行属于线上,即被操作系统加载到内存中并被cpu开始解码并执行属于线上操作,标识单词:on-line

线下

不执行程序,仅仅只是生成可执行代码或者数据或者其它输出,但它不会去执行程序属于线下,标识单词:off-line

编译器与解释器的区别

编译器

编译器属于线下,它只通过源文件生成可执行代码,不需要在使用它时给它参数或者一些其它数据,它只需要编译源代码文件就生成可执行程序或者编译数据或者其它输出,这取决于编译器的实现,编译器不能够直接执行程序,它需要编译,同时它也不会去执行程序。

解释器

解释器属于线上,它必须输入一些参数,或者数据才能执行,它通过将输入的数据或者命令进行解释并做相应的处理,然后输出结果,解释器属于线上因为它会去执行我们输入的命令,就像shell脚本一样,shell会解析我们的脚本代码,然后解析shell代码,并进行转译成shell自己内部的命令指令集,接着去按个执行它们,同时解释器只能一行一行的转译然后一行一行的执行,不能一次性转译全部命令然后统一执行,这是规范。

通常情况下解释器相较于会慢许多,因为解释器执行的不是二进制代码,它需要转译然后在执行,而编译器编译出来的程序,是直接运行。

两者区别

编译器:编译器属于线下,只需要源代码文件,就能生成可执行程序,它不属于程序运行的一部分,属于生成程序的一部分。

解释器:解释器属于线上,它需要与解释器对应的指令集,它通过解析指令集然后执行,它属于程序运行的一部分。

编译器和解释器的开发历史

20世纪50年代(1950年),IBM打造了一台名为704的机器(再次之前IBM也生产过其它机器,但只有704最为成功),当时704的成本里软件最高,在当时那个硬件相对于昂贵的情况下,704的软件成本要大于硬件成本,这是因为IBM为了让用户更好的使用计算机,他们投入了大量的人力资源去编写软件,但是那个年代编程变得极其困难,不像现在,打开电脑,打开IDE就可以开始写代码了,那个时候只有0101,用打孔机来做,还要去制作打孔机所需要的指令纸,同时那个年代也不好debug,因为都是实打实的硬件环境。

这就使得一群人去思考如何更好地写软件,以及如何使编程更具有生产力。

最早用来提升编程生产力的编程语言是由John Backus(1977年授予图灵奖)在1953年开发的Speedcoding(这是专门为IMB电脑开发的高级语言,具有过程化、命令式、结构化、面向对象的特点),Speedcoding属于解释器类型,属于线上。

它的优势在于你不需要去写复杂的代码,你只需要去描述要做的功能,Speedcoding就能解释你的输入并执行,它不具备编译的过程,这让开发者们能更快的开发程序,不用再去记0101这样的指令集了。

但是它的缺点在于代码执行效率很低,比手写代码低了10-20倍,同时Speedcoding解释器占用300字节内存(在那个年代编译出来的程序都很小,但是对于现在的程序来说小到不能在小,因为现在的编译器为了运行会附加许多依赖代码,许许多多用来初始化的汇编代码或者其它依赖文件),虽然300字节很小,但是在那个年代已经占用来IBM 704电脑的30%。

因为解释器不光需要转译,还要运行,相对于更需要更大的内存空间。

Speedcoding并没有流行起来,原因是因为那个年代内存本身就小,如果运行Speedcoding那么意味着就要减少更多的内存来存储其它资料或者运行其它程序,同时效率较低。

但这也给john backus一个新的项目灵感,在当时最重要的应用程序是科学计算(数学运算),那个时候的科学运算不是像现在一样输入3+4这样的代码,而是以机器(CPU)可以执行的形式写下公司,也就是把指令拼接成一个公式,加法公式或者减法,同时要计算的数都要转化成0101这种,然后在让机器去执行最后得到输出结果。

john backus认为Speedcoding是先将指令集转译成自己认识的命令,再去执行相对于会很慢,他又想到如果让程序员先写好代码,自己在转译成CPU的可执行程序,然后在让CPU去执行效率会更高,因此FORTRAN(公式翻译)项目就诞生了,专门用于翻译计算公式的,程序员不需要写0101这种代码,只需要按照FORTRAN的代码格式来写就可以了,如3+4等等。

FORTAN开发总共用了三年,从1954年到1957年。

那个时候开发人员们认为只需要一年,但是实际用了三年,就像现在一样,程序员们仍然不能很好的预测软件开发周期,因为你不知道会出什么样的问题。

FORTAN的出现使其更快的流行了起来,当时超过50%的代码都是由FORTAN完成的,FORTAN也是最早一款编译器。一直持续到1958年。

那个时候程序员们非常开心,因为不用在去记0101这样的指令了,可以使用高级语言来进行开发,大家都能更好的使用IBM的机器了(注意那个年代凡是用电脑的,都需要输入指令,让电脑工作,也就是说每个人都需要写代码)。

FORTRAN是第一个成功的高级语言,并且对计算机科学有巨大的影响,它推动了计算机理论的发展以及程序和编译器的规范,为计算机行业打下了基石,同时FORTRAN只有一个版本1,所以被成为FORTRAN 1

编程是需要理论与实践结合的,如果你没有一定的理论与良好的专业技术,你是不可能将这门语言用好的(如果你的理论知识不够,专业不强,你学再多的编程语言都没用,编程语言就像你的工具,它只负责实现你的想法,最主要的还是你个人的动手能力以及逻辑思维能力),这也促使了许多的系统以及编程语言的但是,同时也产生了一个微妙的互动,那就是互相促进,共同成长,在当时许多充满想象力的开发者们为不同的环境以及不同的领域开发了不同的系统和编程语言,同时他们之间会互相攀比,促使相互进步,这也是计算机科学最吸引人的地方。

直到现在当代编译器仍把FORRTRAN作为基础框架。

FORTRAN 1结构

它包含五个阶段

1.词法 分析

2.语法解析

上面两个共同负责语法方面的问题,词法分析负责分析语法的错误和书写是否正确,词法分析确定语法没问题后交给词法解析进行解析语法的含义。

3.语义分析

语义分析负责解析变量类型,作用域规则等待

4.优化

负责对程序代码进行优化,使其更快运行,减少内存的使用。

5.代码生成

就是将代码转换成CPU可认识的可执行代码,或者其它的语言,可以根据编译器开发者的目标,FORTRAN的目标是转换成机器码(也就是CPU的指令集)。只要你愿意,你可以写出编译器来将这个代码转换成另一个高级语言的代码也一样可以。

斯坦福大学CS143编译原理课程笔记:1.编译器与解释器简介相关推荐

  1. 斯坦福大学CS143编译原理课程笔记:3.编译器的性价比

    目录 编译器性价比的三个问题 为什么会有那么多编程语言? 科学计算 并行处理 商业领域 系统编程 为什么会有新编程语言的诞生? 1.广泛使用的编程语言会改变的很慢 2.很容易产生一门新的语言 3.使用 ...

  2. 斯坦福大学CS143编译原理课程笔记:2.编译器结构

    目录 编译器的五个阶段 五个阶段的作用 1.概念 2.词法分析 3.语法分析 4.语义分析 5.代码与内存优化 6.代码生成 编译器的五个阶段 1.词法分析 2.语法分析 3.语义分析 4.代码与内存 ...

  3. 斯坦福大学CS143编译原理课程笔记:4. Cool语言概述

    目录 什么是Cool语言? 开始前的准备 COOL项目的五个步骤 COOL编程语言基本教程 文件属性 基本组成 如何运行 输入输出 变量定义 让我们来编译它 COOL语言换行符 COOL方法体续说 C ...

  4. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记

    最近开了一个新坑--[CS231n]斯坦福大学李飞飞视觉识别课程,准备认真学习并记录自己的学习历程. 文章目录 [CS231n]斯坦福大学李飞飞视觉识别课程笔记 课程笔记 学习安排 Week 1 We ...

  5. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(四):图像分类笔记(上)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  6. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(六):线性分类笔记(上)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  7. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(五):图像分类笔记(下)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  8. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(十九):卷积神经网络笔记(下)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  9. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(十一):反向传播笔记

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

最新文章

  1. ipykernel_launcher.py: error: unrecognized arguments: -f /Users/apple/Library/Jupyter/runtime/kernel
  2. python避免深度嵌套的if-else_避免嵌套If语句?(Python 2.7)
  3. JavaScript 更新对象属性
  4. TDMA 时分多路复用
  5. bom实现方块移动_从0开始实现一个俄罗斯方块
  6. CentOS下Redis 2.2.14安装配置详解
  7. C#使用System.Data.SQLite操作SQLite
  8. CSS 如何影响浏览器元素在文档中的排列?
  9. asp 检查黑名单_黑名单验证的突破
  10. 服务器驱动硬盘故障修复,如何修复崩溃的硬盘驱动器
  11. 致远互联发布的智慧协同新一代企业管理平台,新在哪里?
  12. Web3.0:伟大的骗局,请无辜的各位做一个敢于大声说出来的孩子吧
  13. 清橙OJ A1095 回溯之教室排课
  14. 常用的无线充发射IC芯片
  15. Flutter 错误解决Building with plugins requires symlink support.
  16. 天桥脑科学研究院推出“对话大脑”院士论坛:国际大咖畅谈脑机接口
  17. 二叉树任意两节点之间的最短距离
  18. R语言读取文件报错之二:Error in read.table(“xxxx.txt“, header = TRUE) : 列的数目比列的名字要多
  19. 云计算赛项-私有云skywalking服务部署与应用
  20. 数据分析 EXCEL

热门文章

  1. 20h2是04服务器操作系统吗,爆料:微软 Win10 20H2 将是小更新
  2. python批量巡检服务器_python批量服务器巡检
  3. 进阶04 4 Collection集合类+Iterator迭代器+增强for+泛型
  4. Android Studio实现音乐播放器2.0
  5. Android移动应用基础教程【广播机制】
  6. git学习(七)新建远程仓库-Gitee为例
  7. 计算机学业水平测试网,学业水平测试
  8. MATLAB对表达式进行降幂排列,MATLAB上机答案.doc
  9. python爬取岗位数据并分析_Python年薪最高有50w|探秘全国近1600个Python岗位数据分析...
  10. 华为平板鸿蒙发布,华为将发布鸿蒙平板,你期待吗?