求机器汇编语言编译器,源汇编语言编译器,据说编译器里有对应的机器汇编语言编译器,谁看过编译器的源?main()对应的机器汇编语言编译器是什

【图文】《编译原理》复习 (1)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
《编译原理》复习 (1)
上传于||暂无简介
大小:1.85MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢哈佛大学开放课程:计算机科学cs50.第04集.C语言,源代码,编译器(2).中英双字幕_土豆_高清视频在线观看编译原理 复习资料_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
编译原理 复习资料
上传于||文档简介
&&计​算​机​科​学​与​技​术​,​编​译​原​理​,​总​结​,​复​习​,​考​试​,​考​研
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩62页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢《编 译 原 理》笔记1 - 简书
下载简书移动应用
写了25354字,被6人关注,获得了9个喜欢
《编 译 原 理》笔记1
《编 译 原 理》笔记本书的作者是陈意云、张昱两个人。前言少数人从事构造或维护程序设计语言编译器的工作编译器是一个很好的实例(基本设计、模块划分、基于事件驱动的编程等)______________________________________________第1章 编译器 概述计算机能执行的都是非常低级的机器语言一个基本的问题是:高级语言的程序最终是怎样在计算机上执行的?能够完成从一种语言到另一种语言变换的软件称为翻译器编译器是一种翻译器,这两种语言分别叫做该翻译器的源语言和目标语言源代码-词法分析器-语法分析器-语义分析器-中间代码生器-代码优化器-代码生成器-目标程序贯穿其中的是:符号表管理器和出错管理器举例子,Pascal中有一条赋值语句:position := inital + rate * 60 1.1词法分析词法分析逐个读构成源程序的字符,把它们组成词法记号(token)流。编译器的词法分析也叫做线性分析或扫描。
首先使用词法分析方法进行分析,字符流可以被分为:
标识符position,inital,rate
分隔记号的空格通常在词法分析中被删除。为某些记号增加一个属性来区分属于同一记号的不同词法单元。id_{1} :=id_{2}+id_{3} *601.2 语 法 分 析
语法分析(syntaxanalysis)简称为分析(parsing),它把词法记号流依照语言的语法结构按层次分组,以形成语法短语。语法分析也称为层次分析。源程序语法短语常用分析树表示程序的层次结构通常由递归的规则表示,例如,可以用如下规则作为表达式定义的一部分:(1)任何一个标识符都是表达式;(2)任何一个数都是表达式;(3)如果e1 和 e2 都是表达式,那么
e_{1}+ e_{2}
e_{1}* e_{2}
也都是表达式。(1)如果identifer是标识符,expression是表达式,那么indentifer= expression是语句。(2)如果expression是表达式,statement是语句,那么
while (expression) do statement
if (expression) then statement
也都是语句。1.3 语 义 分 析语义分析阶段检查程序的语义正确性,以保证程序各部分能有意义地结合在一起,并为以后的代码生成阶段收集类型信息。语义分析的一个重要部分是类型检查,编译器检查每个算符的运算对象,看它们的类型是否适当。例如,当实数作为数组的下标时,许多语言的规定是要求编译器报告错误;当然也有些语言允许运算对象的类型隐式转换,例如二元的算术算符作用于一个整数和一个实数的时候。
在机器内部,整数的二进制表示和实数的二进制表示是有区别的,不论它们是否有相同的值。
*作用于实型变量rate和整数60,通常的办法是把整数转变为实数。可以建立一个额外的算符结点inttoreal.inttoreal显式地把整数转变为实数。
编译器的前三个阶段对源程序分别进行不同的分析,以揭示源程序的基本数据和结构,决定它们的含义,建立源程序的中间表示。许多处理源程序的软件工具都要完成某类分析:(1)格式打印程序 它以源程序为输入,以程序结构清晰可见的方式输出源程序。格式打印程序需要对源程序进行词法分析和语法分析,但不需要对源程序进行语义分析,因为一种书写格式只和语法有关。(2)文档抽取程序 它抽取程序文件中的注释和函数首部等信息,形成一份程序文档。它需要对程序进行词法分析和语法分析,至少是部分的语法分析。要使得这样抽取的信息形成一份有用的文档,注释很有讲究,否则抽取出来的文档没有什么用处。(3)静态检查程序 静态检查程序读入程序,分析它,并试图不运行程序而发现一些潜在的错误。它的分析部分和第9章优化编译器的分析部分类似。例如,它可以检查出源程序的某些部分决不会执行,或者某个变量在赋值前可能被引用。此外,使用比第五章更精致的类型检查和类型推导技术,它还能捕捉程序的安全隐患,例如通过指针使用已经释放了的存储空间。
(4)解释器 纯解释器在执行源程序语句时,都需分析构成该语句的字符串,以便识别和执行它指定的计算。如果给定的语句仅执行一次,纯解释的方法是所有方法中代价最小的一种。
例如,它常用于交互语言的“立即命令”。如果语句重复执行,较好途径是分析源程序的字符流仅一次,用一串更适于解释的符号序列或其他的形式来代替它。
因此解释器往往也做某种程度的翻译。例如,对于赋值语句,解释器可能建立语法树,在遍历树时执行结点的操作。
1.4 中 间代码生成
某些 编译器产生源程序的显式中间表示,可以认为这种中间表示是一种抽象机的程序。中间表示必须具有两个性质:它易于产生并且易于翻译成目标程序。中间表示有各种形式。三地址代码,由三地址语句序列组成,每个三地址语句最多有三个操作数;
temp1:=inttoreal(60)
temp2:=id_{3}*temp1
temp3:=id_{2}+temp2
id1:=temp3
首先,除了赋值算符外,每个语句至多只有一个算符其次,编译器必须产生临时变量名,用以保留每个语句的计算结果第三,某些三地址语句没有三个运算对象1.5 代 码 优 化
代码优化阶段试图改进代码,以产生执行较快的机器代码。
temp1:=id_{3}*60.0
id_{1}=id_{2} +temp1
不同的编译器完成不同程度的优化,能完成大多数优化的编译器叫做“优化编译器”。但是编译的相当大一部分时间都消耗在这种优化上。简单的优化也可以使目标程序的运行时间大大缩短,而编译速度并没有降低太多。1.6 代 码 生 成
编译的最后一个阶段是目标代码生成,它生成可重定位的机器代码或汇编码。源程序所用的每个变量选择存储单元,并且把中间代码翻译成等价的机器指令序列。此阶段的一个关键问题是寄存器分配。
MOVF id3,R2MULF #60.0,R2MOVF id2,R1ADDF R2,R1MOVF R1,id1
comment * 注释
;--------------------------------------;把地址id3的内容取入寄存器 R2;(我们暂且认为指令中id3代表对象id3的地址);然后把它乘上实数60.0,#号代表60.0作为常数处理。;第三条指令把id2取入寄存器R1,再把原先寄存器 R2的值加上去;最后寄存器R1的值存入地址id1;--------------------------------------
每条指令的第一个和第二个操作数分别代表源和目的操作数。
每条指令的F告诉我们指令处理浮点数。1.7 符号表管理
符号表管理和出错管理是编译过程中的两项重要工作,它们与词法分析、语法分析、语义分析、中间代码生成、代码优化和代码生成这六个阶段相互作用。编译器的一项重要工作是记录源程序中使用的标识符,并收集每个标识符的各种属性。属性提供标识符的存储分配、类型和作用域信息。如果是过程标识符,还有参数的个数和类型,参数传递方式和返回值类型(如果有的话)。符号表是为每个标识符保存一个记录的数据结构,记录的域是标识符的属性。该数据结构允许我们迅速地找到一个标识符的记录,在此记录中存储和读取数据。词法分析器发现源程序的标识符时,把该标识符填入符号表。但是,一般来说。词法分析期间不能确定一个标识符的属性。
var position,initial,rate:
{* 词法分析器读过position,initial,rate时,它们的类型还是未知的 *}
其(词法分析)余的阶段把标识符的信息填入符号表,然后以不同的方式使用这些信息。代码生成需要使用标识符存储分配信息以产生正确的指令。1.8 错误诊断和报告
每个阶段都有可能发现源程序的错误。在发现错误后,该阶段必须处理此错误,使得编译可以继续进行,以便进一步发现源程序的其他错误。发现一个错误便停下来的编译器是没有尽到责任的,除非编译和编辑之间的切换相当方便和迅速。*语法分析和语义分析通常处理编译器能发现的绝大部分错误。*词法分析阶段能发现的错误类型是,当前被扫描的字符串不能形成语言的词法记号。*记号流违反语言的语法规则是由语法分析阶段诊断。*语义分析时,编译器试图找出语法正确但对所含的操作来说是无意义的结构,如相加的两个标识符,其一是数组名,另一个是过程名。1.9 阶段的分组
在实际的编译器中,若干阶段可以组合在一起,各阶段之间的中间表示也无需显式构造。所有的阶段被分成前端和后端两部分。前端只依赖于源语言,由几乎独立于目标机器的阶段或阶段的一部分组成。通常,它们是词法和语法分析、符号表建立、语义分析和中间代码生成,有些优化也可以在前端完成。前端还包括与这些阶段同时完成的错误处理。后端是指编译器中依赖于目标机器的部分,它们一般独立于源语言,而与中间语言有关。后端包括代码优化、代码生成和伴随这些阶段的错误处理和符号表操作。
取一个编译器前端,重写它的后端以产生同一源语言在另一机器上的编译器已经是件普通的事情。如果这些后端是很仔细设计的,甚至不需要对它做很多的重新设计。
把几种不同的语言编译成同一种中间语言,让不同的前端使用同一后端,从而得到一台机器上的几个编译器,也是很吸引人的事。但是,由于不同语言的着眼点有区别,在这个方向上只取得了有限的成功。
编译的几个阶段常用一遍(Pass)扫描来实现。有很多不同的方式把编译器的阶段组成遍。把几个阶段组成一遍,并且这些阶段的活动在该遍中交错进行是屡见不鲜的。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:登录网易通行证
使用网易通行证(含网易邮箱)帐号登录
提交您的投诉或建议
视频画面花屏
视/音频不同步
播放不流畅
登录后才能查看我的笔记
暂时没有笔记!
确定删除笔记?
即将播放下一集,请您保存当前的笔记哦!
对字幕纠错要登录哦!
内容不能少于3个字
第一集:本节课,首先由在电话簿上查找Mike Smith的例子开始,通过直观的的授课方式给学生讲解了算法是什么,其次在说明算法与算法相比如何提向其优越性,运算效率是程序设计最根本的东西,而效率如何,最终还是取决于你所设计的算法。其次,通过几个简单的学生感兴趣的例子——拼图游戏再进一步告诉学生,什么是程序设计。最后,初步介绍了几种语言。在课程结束时,请了两位教学研究员Mather House 和Eliot House分别给大家讲话。
第二集:第0周周5课程,本节主要讲述了Gmail、FaceBook、ShuttleBoy等当前比较时新的技术话题,通过这些例子来探究隐藏在背后的技术,包括基本的算法、数据的存储的基本原理、磁盘(软盘、硬驱)的概念等基础知识,当然本节课还涉及到了计算机程序设计中的基本概念,包括循环、条件判断、分支等,对计算机学科进行简单的介绍。
C语言,源代码,编译器,目标代码,SSH,SFTP,GCC,函数,注释,标准输出,算术操作,优先级,局部变量,类型转换,标准输入,函数库,布尔表达式(接上次),条件(接上次),循环(接上次)
[第4课]C语言,源代码,编译器(2)
C语言,源代码,编译器,目标代码,SSH,SFTP,GCC,函数,注释,标准输出,算术操作,优先级,局部变量,类型转换,标准输入,函数库,布尔表达式(接上次),条件(接上次),循环(接上次)
函数,全局变量,参数,返回值
参数,返回值
线性搜索,二进制搜索
符号,递归,冒泡排序
第九集:归并排序,结构体,动态内存分配,堆和栈,指针,调试
第十集:CS50函数库,堆和栈(接上次),指针(接上次),文件输入输出,辩学,链表
本堂课程开头讲述“数独”游戏,开拓学生思维,并提醒大家将要到来的第一个小测验。接下来展示几幅图片,介绍计算机史上著名的bug。然后以一个小程序为例逐步展示gdb调试程序的方法,引入栈图,详细介绍栈的各个组成部分,并由此提出一个著名的攻击方法——“缓冲区溢出攻击法”,提醒大家要做边界检查。接下来讲结构体,并提醒大家GetString函数里面调用到malloc函数,因此,我们在主函数中要调用free函数释放相应的空间。最后介绍把输出打印到文件的方法。
首先讲了魂斗罗游戏,然后介绍了cs50.c和cs50.h两个文件的主要框架和内容,接着介绍了分配内存的规则,介绍了数组的优势和缺点。然后通过计算机存储的原理,引出链表的概念,重点介绍了链表的用法,包括链表节点的插入,删除操作。最后将了链表、堆栈和队列的区别
本节首先介绍了typedef的用法,接着简单介绍了安全文件传输协议SFTP,然后对之前的测验进行了点评,指出了一些常见的错误。通过回顾数组和链表,介绍了另外两种数据结构:堆和队列,并指出了在使用指针和内存时常犯的一些错误,介绍了一种用于内存检查的工具Valgrind。通过大小写字母转换的例子介绍了按位与和按位或操作符。
本次课程开头就结业项目,给出了几点建议。以预约课程的网站为例,阐述用户体验的重要性。然后复习二位操作符。通过两个相似的程序,对比数组和指针的使用方法。接下来讲述栈、队列的具体实现。然后介绍哈希表和几种哈希函数;以“生日悖论”为例,引入“冲突”的概念;循序渐进,介绍几种解决“冲突”的方法。最后提出“树”的概念,重点讲了两种树:“二叉排序树”和“单词查找树”。
首先说明了课程设计的要求,这节课主要讲网络编程,tcp/ip协议和网络连接的原理和域名服务器知识,然后引入了HTML语言。粗略的介绍了PHP语言和Javascript语言。然后介绍了动态处理图像的知识。接下来主要介绍如何用HTML编写网页。包括如何嵌入标题、正文、图像;如何调它的格式(居中、字体等)。
这节课主要通过实际的语言讲网络编程,首先提及到网络安全问题,介绍了一个窃取通讯信息的工具。然后提出了一些提高安全性的方案,包括cookie的概念,一些加密技术。
接着讲了深入讲了HTML语言和PHP语言,哈希表,如何实现动态网络编程。如何在网页中增加菜单,选择框等。
本次课程开头以电影“上班一条龙”吸引大家参加“cs50之夜”,然后简略提到研讨小组的课程。紧接着进入正题,以自己收到的垃圾邮件为例,讲述里面隐藏的骗局。然后以“cs50财政”和“雅虎财经”的股票问题,提到“屏幕抓取”,进而阐述“屏幕抓取的原理”以及需要用到的PHP语言,简单分析URL的成分,从网页源代码中提取需要的URL。紧接着上次课程,讲述register.php和froshims.php系列,回顾上次课程讲到的一些知识点,关联数组、超全局变量,以及PHP中GET与POST之间的区别。顺便提到,垃圾邮件中如何修改发件人地址。然后借助用例,详述MySQL数据库和SQL查询语言。
本次课程首先用一些图表博人眼球,引出JavaScript语言。然后教大家如何验证自己的php代码,简略提到几个网页开发工具。然后分别介绍网站经常出现的错误码,如404、401、403、404、500。接下来讲解PHP中的另一个超全局变量SESSION,进而提到“会话劫持”,简单回顾PHP中的SQL查询。通过几个网站的例子,让大家建立HTML5概念。然后讲解如何用PHP实现“拼写检查器”(之前用C语言实现过),通过几个例子,让大家温习了一遍PHP的相关知识点。接下来通过几个版本的forms.html例子,逐层递进,重点阐述JavaScript语言中的知识点,并引出DOM(文档对象模型)。
本次课程首先提醒大家,要开始做“结业项目”了,然后是几个讲师和助教上台,向大家推荐cs50的服装,并鼓励大家参与新学期讲师和助教的竞选。接下来,放了一部小电影——“网络勇士”,阐述互联网的工作原理。然后用一个视频游戏“CS50 Shuttle”吸引大家的眼球,并详细讲解了该游戏的制作过程,主要涉及到Google Earth API和Google Maps API,进一步加深大家对JavaScript的理解。
首先感谢了所有的助教和工作人员,接下来做了一个查找游戏。介绍了在CS50课程之后的一些相关课程的选择。然后展示了同学们做的比较好的一些作品并颁发奖品。大概回顾了这个学期学过的内容。介绍了CS50展览会的情况。最后举行了一个知识问答游戏、回顾了之前的一些知识问题。
学校:哈佛大学
讲师:David J. Malan
授课语言:英文
类型:计算机 国际名校公开课
课程简介:"CS50是哈佛的一门计算机科学的导论性的课程,内容包括基本的计算机知识以及基础算法,常见的编程语言等等,还会探讨最新的计算机科学领域的成果,课程发散性思维强。CS50课程的讲课形式让人耳目一新,真正做到了“快乐学习”。
扫描左侧二维码下载客户端

我要回帖

更多关于 c语言在线编译器 的文章

 

随机推荐