《Compilers Principles,Techniques,&Tools》Chapter 1---->Introduction

入门

编程语言是一些符号,用来为人和机器描述计算或者计算指令,我们所熟悉的计算机世界,他完全依赖于编程语言,因为所有的运行在计算机中的软件都是由某些编程语言开发的,但是,一个程序可以运行之前,它必须要翻译成某种形式,使得计算机能够执行它。

The software systems that do this translated are called compilers(由称作编译器的软件系统来做这个翻译的工作!)

这本书(我正在学,是英文的)是关于如何设计和实现编译。我们会发现一些基本的ideas 可以用来为广泛而不同的编程语言和机器构造翻译器。除了构造编译器,这些基本的设计原则和技术可以应用于很多其他的计算机领域,这些领域的技术可能会被计算机科学家多次使用,因为编译器的研究写作涉及各种编程语言、机器架构、编程语言原理、算法,和软件工程。

在这一入门的章节,我们会介绍不同形式的编程语言的编译器,并给出一个高度概括的经典编译器的结构,然后讨论编程语言和机器架构对塑造编译器的趋势。我们包含了一些关于编译器设计和计算机科学原理的关系的研究,和一个编译器技术应用的略述,编译器技术的应用已经超出了编译器本身。我们会以一个简略的论述来结束入门,这个论述说明了一些重要的编程语言概念,他们对于编译器的研究是必须的。

1.1 Language Processors(语言处理器)

让我们快速的开始吧,一个编译器是一个程序,这个程序可以读取另一个使用编程语言编写的程序——源程序——然后翻译它,得到一个等价的,使用另外一种编程语言编写的程序,该语言叫做目标语言,该程序叫做目标程序,如下面的target program。编译器的一个重要的角色职能,就是在翻译的过程中,检测源程序中的错误并向用户报告。

	source program ---------》Compiler--------》target  program

如果该目标程序是一个机器可以执行的程序,他就可以被用户调用,去处理输入,并产生输出结果

	input --------》target program -------》output

解释器是另外一种常用的语言处理器,不同于编译器会翻译源程序文件,产生目标程序,一个解释器会直接执行由用户编写或提供的源程序文件中的详细描述的指令

	source program  with input synchronously ---------》Interpreter------------》output

通常,由编译器产生的与机器相关的目标程序执行起来比使用迭代获取输入得到输出的解释器更加快!但是,解释器的诊断效果比编译器更好,能更好更有效的发现程序的错误,因为解释器是从源程序文件中,逐条语句解释执行的

比如,Java语言处理器,结合了编译器和解释器,一个Java源程序可能首先会被编译成中间媒介的形式,叫做字节码,这些字节码然后会被虚拟机解释执行,这样做的好处就是,在一台机器上编译后,可以在其他机器上运行,甚至是在网络上,因为只要装了同一个虚拟机,字节码就可以得到一样的解释

为了获得快速的输入到输出的处理,一些Java编译器,称为即时编译器,在他们执行字节码处理输入之前,直接翻译字节码为机器语言

source program--------------》translator(intermediate program  with input synchronously)------------》virtual machine-------------------》output

除了需要编译器,一些其他的程序可能还会需要创建一个可执行的目标程序。一个源文件会被分成很多个模块,各个模块分布在不同的源文件中,这样就有一个任务,必须要收集分布在不同文件的程序模块,对于这个任务,编译器委托了一个单独的程序来完成——预处理器。预处理器也给用户编程扩展了一些应用,比如可以使用速记法,称为宏,他们可以分布在程序的任何地方

接下来,被预处理器修改后的源程序将送给编译器,这时,编译器处理源文件后,可能会产生汇编程序做为输出结果,因为把汇编语言作为输出程序将非常易于调试。接下来,汇编语言程序将会被汇编器调用,产生浮动的机器代码作为结果文件

庞大的程序通常会被分块编译,所以浮动的机器代码可能会和其他的浮动文件和库文件链接在一起形成一个机器浮动代码文件被执行。连接器被设计来处理了这件事情,他会处理外部内存地址,这些地方存放的是外部程序代码,然后把各个程序模块通过地址索引成一个索引文件,交给编译器,编译通过这个索引文件来生成跟这个索引文件一样的程序文件,不同的只是,这个程序是可以执行的

《Compilers Principles,Techniques,&Tools》Chapter 1---->Introduction

时间: 2024-11-13 16:06:44

《Compilers Principles,Techniques,&Tools》Chapter 1---->Introduction的相关文章

《linux 内核完全剖析》chapter 13 内存管理 (不含swap.c)

内存管理(memory.c 和swap.s 部分) "倒着看" 先看memory management,很明显,前面各种阻力,都是因为涉及内存管理.不先看这个,我估计前面看了也是白看 我估算着理论打基础砸了差不多一个星期的时间在memory management上面了...感觉很有收获,是时候用实践(code)印证理论了! <modern operating system>讲内存管理那一章 http://blog.csdn.net/cinmyheart/article/de

《linux 内核完全剖析》 chapter 8 内核代码

求n内与n互质的数有多少个. 欧拉函数就是为这个而生的. 如果对欧拉函数不是很了解的话,可以看看这个http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%87%BD%E6%95%B0 我们有了上一篇埃氏筛法求素数之后,我们求这个就简单了. 具体用法就是这个函数 用最后这个公式.n可以写成 我们先来求得2到sqrt(n)的素数然后来将n化成的形式 中间如果n能整除p的话就要带入公式了.这样我们就求得最后结果了. #include<iostream>

《Java 8 in Action》Chapter 2:通过行为参数化传递代码

你将了解行为参数化,这是Java 8非常依赖的一种软件开发模式,也是引入 Lambda表达式的主要原因.行为参数化就是可以帮助你处理频繁变更的需求的一种软件开发模式.一言以蔽之,它意味 着拿出一个代码块,把它准备好却不去执行它.这个代码块以后可以被你程序的其他部分调用.本章通过筛选苹果这个实际需求来一步步引出Lambda表达式,同时我也会把代码贴出来,读完你会看到代码是如何一步一步的向Lambda转化.多代码来袭,保护我方ADC!! 代码演化 1.实习生版本 package com.lujiah

《linux 内核完全剖析》 chapter 7 初始化程序

初始化程序 7.1 main.c 程序 图中,高速缓存的部分还要扣除显存和ROM BIOS占用的部分.告诉缓冲区是用于磁盘等块设备临时存放数据的地方,以1K字节为一个数据单位. init().函数的功能可分为四个部分 安装根文件系统 显示系统信息 运行系统初始资源配置文件rc中的命令 执行用户登录程序shell程序 要注意的是,由于创建新进程的过程通过完全复制父进程代码段和数据段的方式实现.因此在首次使用fork()创建新进程init时,为了确保新进程用户态栈中没有进程0的多余信息,要求进程0在

《Java 8 in Action》Chapter 1:为什么要关心Java 8

自1998年 JDK 1.0(Java 1.0) 发布以来,Java 已经受到了学生.项目经理和程序员等一大批活跃用户的欢迎.这一语言极富活力,不断被用在大大小小的项目里.从 Java 1.1(1997年) 一直到 Java 7(2011年),Java 通过增加新功能,不断得到良好的升级.Java 8 则是在2014年3月发布的.Java 8 所做的改变,在许多方面比 Java 历史上任何一次改变都深远,而且极大的提高了 Java 代码的简洁性. 1. lambda 表达式 本文通过筛选苹果的需

《CS:APP》 chapter 8 Exceptional Control Flow 笔记

Exceptional Control Flow The program counter assumes a sequence of values a0,a1,...,an?1 where each ak is the address of some corresponding instruction Ik. Each transition from ak to ak +1 is called a control transfer. A sequence of such control tran

《CS:APP》 chapter 7 Linking 笔记

Linking Linking is the process of collecting and combining various pieces of code and data into a single file that can be loaded (copied) into memory and executed. 7.1 Compiler Drivers Most compilation systems provide acompiler driver that invokes th

《深入理解计算机系统》 Chapter 7 读书笔记

<深入理解计算机系统>Chapter 7 读书笔记 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成机器代码时 加载时,也就是在程序被加载器加载到存储器并执行时 运行时,由应用程序执行 链接器使分离编译称为可能. 一.编译器驱动程序 大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器和链接器. 1.将示例程序从ASCⅡ码源文件翻译成可执行目标文件的步骤 (1)运

《CS:APP》 chapter 6 The Memory Hierarchy笔记

The Memory Hierarchy 6.1 Storage Technologies The earliest IBM PCs didn't even have a hard disk. 让我惊奇的是早期的IBM直接没有硬盘... 6.1.1 Random-Access Memory Random-access memory(RAM) comes in two varieties- static anddynamic . Static RAM (SRAM) is faster and si