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 ...
随机推荐
- git push 报错 "Peer certificate cannot be authenticated with known CA certificates"
使用git push -u origin master 命令向远程仓库提交代码时报错:Peer certificate cannot be authenticated with known CA ce ...
- Msys+MinGW编译VLC
说明:本文只是对官方文档进行简单的翻译总结,旨在帮助一些英文不太好的朋友.官方文档请见wiki.videolan.org/Win32CompileMSYSNew. Msys是MinGW的一个辅助工 ...
- websocket通信 实现java模拟一个client与webclient通信
发文原由: 熟悉socket通信的同学,对于socket模拟server与client,实现相互通信, 或者使用websocket与java模拟的websocket服务器通信(比如一个聊天室),对于这 ...
- js中window对象的opener属性的一个坑
2018-05-08 17:48:33 今天我编写代码碰到了一个让我纠结了很久的坑,特别想在此说一下,让其他人避免我踏过的这个坑. 这个坑就是:在我自己写的子窗口中用opener属性却获取不到父窗口的 ...
- oracle 游标简单示例
1.游标的概念以及作用 游标(Cursor)可以使用户想操作数组一样对查询出来的结果集进行操作,可以形象的看做一个变动的光标,其实际行是一个指针,它在一段Oracle存放数据查询结果集或数据 操作集的 ...
- Java并发之CountDownLatch工具类
一.CountDownLatch工具类介绍 CountDownLatch类是Java并发工具常用的四大工具之一,CountDownLatch允许一个或者多个线程等待其他线程完成工作.假设我们有这样的一 ...
- Spring+Mybatis多数据源的一种实现方式,支持事务
最近一个项目用到了多个数据库,所以需要实现动态切换数据源来查询数据,http://www.cnblogs.com/lzrabbit/p/3750803.html这篇文章让我受益匪浅,提供了一种自动切换 ...
- 安装ubuntu系统及ubuntu安装Python的几点心得
一.安装ubuntu系统 1.ubuntu系统是Linux系统的一种,和centos差别不大,但是个人还是建议大家安装ubuntu,它更适合国内使用习惯,换句话说更亲切. 2.安装方法不再赘述,网上有 ...
- java客户端调用webService
啥也不想说,以前使用的方法突然不行了.各种网搜(记得别忘记到jar包哦:axis.jar) 看代码,第一种方式,也就是以前的方式: 改方式不用表名参数名称 public static String i ...
- jmeter接口测试报java.net.SocketException: Socket closed错误。
如题,jmeter报出java.net.SocketException: Socket closed,我查询了下,服务器是正常的,可以返回数据,基本确定问题出在我这边jmeter.查询原因,看到有人说 ...