整本书的核心:语言的设计与实现

我们所看到的设计是显示的,语法定义的,

而实现是隐式的,决定了编译或运行时的行为。

了解设计的目的,可以推测实现的细节,也可以自己实现设计。

学习具体的实现,更充分的达到高效设计。

行文的逻辑基本就是,对于一种特定设计

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:基础的更多相关文章

  1. chapter1 渗透测试与metasploit

    网络对抗技术课程学习 chapter1 渗透测试与metasploit 一.读书笔记 二.渗透测试 通过模拟恶意攻击者的技术与方法进行攻击,挫败目标系统安全控制措施,取得访问控制权,并发现具备业务影响 ...

  2. 《Linux内核设计与实现》CHAPTER1,2阅读梳理

    <Linux内核设计与实现>CHAPTER1,2阅读梳理 [学习时间:2.5hours] [学习内容:Linux内核简介——历史与现今版本:Linux内核源代码以及编译] CHAPTER1 ...

  3. JQuery基础教程:入门

    JQuery能做什么 JQuery在线手册 1.取得文档中的元素 如果不使用JavaScript库,遍历DOM(Document Object Model,文档对象模型)树,以及查找HTML文档结构中 ...

  4. C#当中的多线程_线程基础

    前言 最近工作不是很忙,想把买了很久了的<C#多线程编程实战>看完,所以索性把每一章的重点记录一下,方便以后回忆. 第1章 线程基础 1.创建一个线程 using System; usin ...

  5. USACO chapter1

    几天时间就把USACO chapter1重新做了一遍,发现了自己以前许多的不足.蒽,现在的程序明显比以前干净很多,而且效率也提高了许多.继续努力吧,好好的提高自己.这一章主要还是基本功的训练,没多少的 ...

  6. JavaSE学习总结(二)——Java语言基础

    一.Java程序预览 Java的语法与C非常类似,这里先使用几个非常简单的程序以点带面来区分C语Java的区分再细讲每个知识点.该文仅针对有编程基础的朋友参考. 1.1.Hello World 创建j ...

  7. Java学习---面试基础知识点总结

    Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线 ...

  8. 【Gradle】Gradle构建脚本基础

    Gradle构建脚本基础 Settings文件 在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置.设置文件的默认名为settings.gradle,放在根工程目录下. 设置文件大多数的 ...

  9. Flutter基础系列之入门(一)

    1.Flutter是什么? 官方介绍:Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter ...

随机推荐

  1. Java内存模型与指令重排

    Java内存模型与指令重排 本文暂不讲JMM(Java Memory Model)中的主存, 工作内存以及数据如何在其中流转等等, 这些本身还牵扯到硬件内存架构, 直接上手容易绕晕, 先从以下几个点探 ...

  2. (转)go rabbitmq实践

    转载自:http://www.cnblogs.com/shi-meng/p/4800080.html 1:驱动 本来打算自己写一个驱动的,后来发现github上面已经有了,那我就直接拿现成的了, 驱动 ...

  3. 8人/天,小记一次 JAVA(APP后台) 项目改造 .NET 过程(后台代码已完整开源于 Github)

    Github: https://github.com/iccb1013/Jade.Net 我们只消耗了8人/天的时间,完成了全部工作,基于我们 Jade.Net 的开源后台代码,任何小规模的后台管理系 ...

  4. JBOSSAS 5.x/6.x 反序列化命令执行漏洞(CVE-2017-12149)

    本文主要记录一下JBOSSAS 5.x/6.x 反序列化命令执行漏洞的测试过程 仅供学习 文中利用到漏洞环境由phith0n维护: JBoss 5.x/6.x 反序列化漏洞(CVE-2017-1214 ...

  5. 简单记录numpy库的某些基本功能

    这里介绍python的一个库,numpy库,这个库是机器学习,数据分析最经常用到的库之一,也是利用python做数据必须用到的一个库,入门机器学习学的第一个python库就是它了. 先对其导入到pyt ...

  6. Cookie熟知

    Cookie能干什么 会话(cookie,session)技术的一种.因为http协议是无状态的,每次都是基于一个请求一个响应.每次请求和响应都跟上次没有关系.我们需要记录之前对话信息.cookie技 ...

  7. pycharm中from xx import xx报错:Unresolved reference

    出现问题:无法引用到相关的类,但是这些类确实都在工程中 分析原因:import不成功是路径没对应上,pycharm默认该项目的根目录为source目录 解决方案: 将对应的项目searchTest,选 ...

  8. [CVPR2017] Visual Translation Embedding Network for Visual Relation Detection 论文笔记

    http://www.ee.columbia.edu/ln/dvmm/publications/17/zhang2017visual.pdf Visual Translation Embedding ...

  9. 【python3】如何建立爬虫代理ip池

    一.为什么需要建立爬虫代理ip池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑.在一段时间内被禁止访问. 这种时候,可 ...

  10. PAT1100:Mars Numbers

    1100. Mars Numbers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue People o ...