Chapter1:基础
整本书的核心:语言的设计与实现
我们所看到的设计是显示的,语法定义的,
而实现是隐式的,决定了编译或运行时的行为。
了解设计的目的,可以推测实现的细节,也可以自己实现设计。
学习具体的实现,更充分的达到高效设计。
行文的逻辑基本就是,对于一种特定设计
1.从程序员的使用者角度,解释该设计的必要性。
简化代码,清晰概念。
2.实现的细节,包括编译与运行中的推断与检查等,也有可能是个语法糖,简单的实现换来优美的设计。
设计的实现
3.设计的演变,实现的转变影响设计的优劣
从历史的角度说明设计的合理性与必然结果
4.对比从语言的剩余部分来实现设计(自举),指出特性上的差异
或5.模拟一种语言没有的设计
如果设计缺失,带来的不便与混乱,从反例说明
6.不同的语言的实现方案
对比各种实现方案带来的设计上的特性差异
charpter1.0引言
1.机器语言通过指令集控制处理器,机器语言的形式为进制数
2.汇编语言是指令集的助记形式,用的是英文的缩写
汇编语言与机器语言保持一一对应,所以本质上还是用指令集思考问题,是机器相关的。
由汇编器完成两种语言的翻译
机器相关的汇编语言+很多种不同的指令集=同一想法在不同机器上复现很困难
最后,高级语言登场,实现机器无关性
高级语言的单条语句与指令集中的单条语句不再对应
由编译器了解程序正文的语义,翻译成机器语言(或汇编语言)
硬件的复杂化(不容易提升手写汇编语言的效率)+编译技术进步(生成越来越高效的汇编语言)=高级语言被人接受
这一历史体现了“边际成本”的有趣现象,一种设计的优势与劣势是相对的,人们追求优雅一致的设计,但又不想放弃简单高效的实现,直至原有设计的效率提升达到瓶颈,并且效率的提升带来了难以控制的复杂性。
charpter1.2程序设计语言的分类
说明式
函数式:
数据流:
命令式
冯 诺伊曼:C
脚本:python
面向对象:Java
函数式:函数递归,目标函数递归为子问题
数据流:数据在功能节点间流动 tensorflow?
逻辑式:满足逻辑的值,不断筛选和加工 SQL
冯 诺伊曼:计算值(表达式,函数返回值),在变量上存储值,修改变量。
脚本:为特定目标快速建立原型
面向对象:对象维护状态(域),修改状态(方法)
charpter1.3:设计一种语言的目的
表达能力:简单高效地编写程序
实现效率:了解实现的细节对效率的影响
在语言中模拟缺乏的特性
charpter1.4编译与解释
编译器控制编译过程,然后交由目标程序控制自己的执行过程。
解释器在执行过程中控制程序的执行。
编译器与解释器的差别更在于目的:运行前的检查与推断,运行中的检查与推断。这两个动机都是有价值的,所以会看到两者的互补。
编译器尝试在运行前理解源程序,并维护程序的部分信息,供执行时使用,从而提升效率。并且生成代码进行运行时的动态检查。
书中经常提到静态与动态,其中静态是指由程序正文提供的,在编译时可以推断的信息,动态指的是运行时的,或者难以预测的信息。
程序经过编译后,依然存在不确定性,可能是对输入的依赖,也可能是由于函数调用等控制结构带来的复杂性。
编译器的特性:彻底的分析与非平凡的变换。
数据库系统的查询语言也是编译器,SQL语言翻译成文本操作。
IDE:汇编器,调试器,预处理器,连接器,编译器,解释器,编辑器
检查词法语法,维护语法树
1.6编译概览
一个编译遍
代码形态 编译的子步骤
字符流
扫描器(词法分析)
单词流
语法分析器
语法分析树
语义分析
抽象语法树
编译优化(机器无关)
中间形式
目标代码生成
目标语言(汇编)
编译优化(机器相关)
目标语言
扫描器(词法分析):检查单个单词的正确性
语法分析树:结构依赖于语法,上下文无关文法
语义分析器:标识符与表达式的类型,相容性
构造符号表,维护各个标识符的类型,内部结构,作用域
检查标识符的定义,上下文,子程序参数签名与调用,返回值
语义动作例程
依然不可检查的:动态语义
变量使用前初始化
指针指向有效对象
下标越界
算术溢出
具体语法树:序列的合法性
抽象语法树:删去不必要节点,增加符号表
代码生成器:保存符号表,包含在目标代码非执行部分
代码改进:在中间代码生成后,在目标代码生成后
rest:
语言的设计目标:清晰,紧凑,易于维护,表达能力强,方便优雅,概念清晰,实现效率
编译后的链接步骤,可以看作是通过库例程扩充硬件指令集,可也以人为编译器就像虚拟机那样生成代码,而虚拟机中包含了硬件和库的功能。
预处理器:执行简单的文本模式匹配。没有了解程序的正确性,语义的分析。
自举:简单的实现到复杂的实现,逐步扩充语言
#!待整理
Chapter1:基础的更多相关文章
- chapter1 渗透测试与metasploit
网络对抗技术课程学习 chapter1 渗透测试与metasploit 一.读书笔记 二.渗透测试 通过模拟恶意攻击者的技术与方法进行攻击,挫败目标系统安全控制措施,取得访问控制权,并发现具备业务影响 ...
- 《Linux内核设计与实现》CHAPTER1,2阅读梳理
<Linux内核设计与实现>CHAPTER1,2阅读梳理 [学习时间:2.5hours] [学习内容:Linux内核简介——历史与现今版本:Linux内核源代码以及编译] CHAPTER1 ...
- JQuery基础教程:入门
JQuery能做什么 JQuery在线手册 1.取得文档中的元素 如果不使用JavaScript库,遍历DOM(Document Object Model,文档对象模型)树,以及查找HTML文档结构中 ...
- C#当中的多线程_线程基础
前言 最近工作不是很忙,想把买了很久了的<C#多线程编程实战>看完,所以索性把每一章的重点记录一下,方便以后回忆. 第1章 线程基础 1.创建一个线程 using System; usin ...
- USACO chapter1
几天时间就把USACO chapter1重新做了一遍,发现了自己以前许多的不足.蒽,现在的程序明显比以前干净很多,而且效率也提高了许多.继续努力吧,好好的提高自己.这一章主要还是基本功的训练,没多少的 ...
- JavaSE学习总结(二)——Java语言基础
一.Java程序预览 Java的语法与C非常类似,这里先使用几个非常简单的程序以点带面来区分C语Java的区分再细讲每个知识点.该文仅针对有编程基础的朋友参考. 1.1.Hello World 创建j ...
- Java学习---面试基础知识点总结
Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线 ...
- 【Gradle】Gradle构建脚本基础
Gradle构建脚本基础 Settings文件 在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置.设置文件的默认名为settings.gradle,放在根工程目录下. 设置文件大多数的 ...
- Flutter基础系列之入门(一)
1.Flutter是什么? 官方介绍:Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter ...
随机推荐
- parted分区详解 查看UUID两种方式 blkid 和 ls -l /dev/disk/by-uuid
通常我们用的比较多的一般都是fdisk工具来进行分区,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大:而fdisk工具他对分区是有大小限制的,它只能划分小于2T的磁盘.但是现在的磁盘空间很多都已经是 ...
- Day15 Javascipt内容补充
JavaScript函数: 函数: function 函数名(a,b,c){ 执行代码 } 1,如何去找到标签 Dom直接选择器: 1,找到标签 #获取单个元素 document.getElement ...
- EF Code First 数据迁移配置
这里我想讲清楚code first 数据迁移的两种模式,还有开发环境和生产环境数据迁移的最佳实践. 1.1 数据迁移综述 EF Code first 虽然已经有了几种不同的数据库初始化策略,但是大部分 ...
- hadoop中setup,cleanup,run和context讲解
hadoop 执行中的setup run cleanup context的作用1.简介1) setup(),此方法被MapReduce框架仅且执行一次,在执行Map任务前,进行相关变量或者资源的集中初 ...
- LVM基本应用,扩展及缩减实现!
LVM概述 [百度百科] LVM是逻辑盘卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和 分区之上的一个逻辑层,来提高磁 ...
- 面试真题--------spring源码解析IOC
spring是我经常使用的框架,可是你真的对spring理解吗? 还是只知道它得使用.如果你想知道它真实的面目请仔细向下看. 1.spring是如何知道哪些Bean需要实例化的? 容器启动过程中,首先 ...
- js创建数组
var a1 = new Array(); var a2 = new Array(7); var a3 = new Array(100,"0",true); var a4 = ...
- spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- 用CSS画小猪佩奇,你就是下一个社会人!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯,这是我的爸爸,嚯~ 背景 小猪佩奇已经火了好 ...
- 『网络の转载』关于初学者上传文件到github的方法
说来也惭愧,我是最近开始用github,小白一个,昨天研究了一个下午.终于可以上传了,所以今天写点,一来分享是自己的一些经验,二来也是做个记录,万一哪天又不记得了:) 废话不多说,直接来,这次主要介绍 ...