mirror of
https://github.com/Estom/notes.git
synced 2026-02-03 02:23:31 +08:00
程序设计语言原理
This commit is contained in:
13
Algorithm/旅行商问题.md
Normal file
13
Algorithm/旅行商问题.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# 旅行商问题
|
||||
|
||||
|
||||
## 1 贪心算法
|
||||
|
||||
## 2 邻域搜索
|
||||
|
||||
|
||||
## 3
|
||||
|
||||
## 4 遗传算法
|
||||
|
||||
## 5 蚁群算法
|
||||
@@ -136,12 +136,12 @@ $$
|
||||
|
||||
* $\hat{a},\hat{b}$也是极大似然估计
|
||||
* $\hat{a}\sim N(a,(\frac{1}{n}+\frac{\overline{x}^2}{L_{xx}})\sigma^2)$
|
||||
* $\hat{b}\sim N(b,\frac{\sigma^2}{L_{xx}}$
|
||||
* $\hat{b}\sim N(b,\frac{\sigma^2}{L_{xx}})$
|
||||
* $\overline{y}与\hat{b}相互独立$
|
||||
|
||||
## 3.3 $\sigma^2$的无偏估计
|
||||
### 定理:$\sigma^2$的无偏估计
|
||||
$Q(\hat{a},\hat{b})=\sum(y_i-\hat{y_i}^2$称为残差平方和。
|
||||
$Q(\hat{a},\hat{b})=\sum(y_i-\hat{y_i}^2)$称为残差平方和。
|
||||
$$
|
||||
E(Q)=(n-2)\sigma^2\\
|
||||
\sigma^2=E(\frac{Q}{n-2})是\sigma^2的一个无偏估计
|
||||
|
||||
@@ -144,10 +144,12 @@ $$
|
||||
$$
|
||||
## 5 预测控制
|
||||
|
||||
> 未涉及内容:
|
||||
> # 可化为线性回归的曲线回归
|
||||
> # 自变量选择与“最优”回归方程选择
|
||||
> # 异常情况的诊断处理
|
||||
> 未涉及内容:
|
||||
> #可化为线性回归的曲线回归
|
||||
> #自变量选择与“最优”回归方程选择
|
||||
> #异常情况的诊断处理
|
||||
|
||||
|
||||
状态转移方程
|
||||
|
||||
$$
|
||||
|
||||
BIN
程序设计语言原理/image/chomsky文法的关系.png
Normal file
BIN
程序设计语言原理/image/chomsky文法的关系.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
程序设计语言原理/image/语法分析图.png
Normal file
BIN
程序设计语言原理/image/语法分析图.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 70 KiB |
@@ -11,15 +11,22 @@
|
||||
|
||||
### 程序设计语言的特性
|
||||
|
||||
* 人工语言
|
||||
* 对象是机器
|
||||
* 程序设计语言是人工语言
|
||||
* 主要通信对象是机器
|
||||
* 用于表达软件
|
||||
|
||||
### 程序设计语言的作用
|
||||
### 程序设计语言的作用(为什么研究)
|
||||
|
||||
* 计算机软硬件技术的窗口
|
||||
* 人们研究计算表达的形势
|
||||
* 它和计算机理论研究联系最为密切
|
||||
* 研究有利于与提高软件开发人员的素质
|
||||
* 有利于开发专用用语言或界面语言
|
||||
* 有利于新领域语言的发展
|
||||
* 有利于通用语言的标准化规范化
|
||||
|
||||
*
|
||||
## 2 程序设计语言的定义与处理器
|
||||
|
||||
> 一个程序设计语言的实际存在是《语言规格说明书》。一个程序设计语言的实际存在是改语言程序的处理器。
|
||||
### 解释器
|
||||
解释器读入一段相对完整源代码(多数情况下是一句)翻译为目标代码后,立即解释执行。
|
||||
|
||||
|
||||
@@ -1,20 +1,68 @@
|
||||
# 发展与分类
|
||||
|
||||
## 1 历史
|
||||
|
||||
|
||||

|
||||
|
||||
### 程序设计语言简史
|
||||
* 1945 ENIAC 真空管计算机
|
||||
* 1946 冯诺依曼机构UNIVAC-1计算机
|
||||
* 50年代 FORTRAN ALGOL COBOL
|
||||
* 60年代 APL SNOBOL LOGO PASCAL
|
||||
* 70年代 C LISP Perlog Edison
|
||||
* 80年代 面向对象Smalltalk C++ SQL
|
||||
|
||||
## 2 分类
|
||||
|
||||
### 对机器依赖程度
|
||||
|
||||
* 低级语言
|
||||
* 中级语言
|
||||
* 高级语言
|
||||
* 低级语言:机器语言和汇编语言
|
||||
* 中级语言:编程操纵机器硬件,不涉及地址码和操作码。
|
||||
* 高级语言:独立于机器
|
||||
|
||||
### 应用领域
|
||||
* 商用语言
|
||||
* 科学计算
|
||||
* 系统程序设计
|
||||
* 模拟预演
|
||||
* 正文处理
|
||||
* 实时处理
|
||||
* 嵌入式应用
|
||||
* 人工智能应用
|
||||
* 查询和命令语言
|
||||
* 教学语言
|
||||
* 打印专用
|
||||
* 专用与某种数据结构
|
||||
```
|
||||
/*
|
||||
引入外部文件进行构建
|
||||
能够定义文本的名字,实现文本与排版的分离
|
||||
能够进行文本与文本的嵌套,支持嵌套处理
|
||||
能够使用反斜杠转义特殊符号
|
||||
支持链式处理
|
||||
全局默认控制对象env
|
||||
定义新的处理函数默认一个文本输入对象,默认一个文本输出对象。前边的函数可以覆盖处理前边的函数。内部函数的优先级更高。
|
||||
能够定义函数所处的模块。
|
||||
自顶向下的设计过程。从全局到局部。所以后边可以覆盖前边,细节覆盖总体布局。
|
||||
链式处理,是对原来文本的处理,不是生成新的文本
|
||||
定义引用,引用编号,自动引用
|
||||
*/
|
||||
import another_name.pp
|
||||
import another_progrom.pp
|
||||
|
||||
//paper 模块的leftboder函数
|
||||
env.paper.leftborder(29)
|
||||
|
||||
textname={i am a good man}
|
||||
textname.fix(delete)
|
||||
text1,text2,text3.fix()
|
||||
pic1,pic2.middle()
|
||||
|
||||
{zhesh 'pic.hello()' iwe\alpha nben}.hello(middle,big).world(45size).print()
|
||||
|
||||
def newp(hello,txt):
|
||||
this is content
|
||||
enddef
|
||||
```
|
||||
### 实现计算方式
|
||||
* 编译型语言
|
||||
* 解释型语言
|
||||
@@ -24,9 +72,7 @@
|
||||
* 非交互式语言
|
||||
|
||||
### 程序设计范型
|
||||
> 单范型语言、多范型语言
|
||||
|
||||
|
||||
单范型语言:程序组织和实现计算的模式
|
||||
* 命令式语言
|
||||
* 面向对象语言
|
||||
* 数据流语言
|
||||
@@ -34,6 +80,11 @@
|
||||
* 逻辑式语言
|
||||
* 并发程序设计语言
|
||||
|
||||
多范型语言:
|
||||
包含多种范型的程序设计语言。
|
||||
|
||||
|
||||
|
||||
|
||||
### 断代
|
||||
|
||||
|
||||
@@ -1,14 +1,26 @@
|
||||
# 设计概述
|
||||
|
||||
## 1 表示与抽象
|
||||
|
||||
自然语言描述、高级语言表示、汇编语言表示、机器语言表示,是同一个程序在不同抽象层次上的表示。
|
||||
### 表达与抽象的概念
|
||||
* 表示是对事物抽象的表达。
|
||||
* 抽象是对论题本质的提取。
|
||||
* 同一个事物在不同抽象层次上的表示。自然语言描述、高级语言表示、汇编语言表示、机器语言表示。
|
||||
* 上层抽象可以用多种下层抽象的实现。
|
||||
### 不同抽象层次
|
||||
* 客观世界自然语言描述
|
||||
* 数学模型数学语言描述
|
||||
* 程序设计程序语言描述
|
||||
* 机器指令机器语言描述
|
||||
|
||||
|
||||
### 显示表示和隐式表示
|
||||
* 显示表示float n=3.14指明n的类型。
|
||||
* 隐式表示 n=3.14缺省为浮点类型。
|
||||
|
||||
### 聚合表示和分散表示。
|
||||
* 分散表示。整型,浮点型等数据之间的+运算使用不同的运算符。
|
||||
* 聚合表示。所有类型的+运算都可以使用+运算符实现。或者同一个函数实现。
|
||||
|
||||
## 2 设计目标
|
||||
|
||||
### 具体目标
|
||||
@@ -49,3 +61,214 @@
|
||||
|
||||
## 4 规格说明
|
||||
|
||||
### 概述
|
||||
|
||||
规格说明用来定义一个语言文本的语法和语义。用于表达程序设计语言的的语言成为元语言。
|
||||
* 形式语法:以形式结构规则的语言元素组合规则。
|
||||
* 微语法:词法Lexicon
|
||||
* 宏语法:定义特征规则
|
||||
|
||||
### 字符集
|
||||
* 允许出现在语言的程序里出现的字符的全体
|
||||
|
||||
|
||||
### 词法分析
|
||||
|
||||
由程序的字符序列得到词法元素序列的过程就是词法分析。编译器处理表示源程序的字符序列,根据词法规则做词法分析,将 源程序切分为符合词法的段,识别出源程序的有意义单词(token) 。词法分析得到一个(表达被分析的源程序的)单词流,流中各单词 标明了词法类别。词法分析中抛弃所有无保留价值的分隔符(如空白符)和噪声词。
|
||||
|
||||
词法分析通常采用最长可能原则,确定可能成为单词的最长字符串。
|
||||
|
||||
词法分类主要包括以下内容
|
||||
* 标识符:文字形式的词法对象,用于表示程序对象的名字。
|
||||
* 关键字:语言规定了特殊意义的标识符
|
||||
* 运算符:有预定义意义的特殊字符或特殊字符序列
|
||||
* 分隔符:用于分隔程序里的不同词法元素的特殊符号或标识符。空格,换行和制表符等,通常作为语法元素的分隔符。
|
||||
|
||||
### 语法分析
|
||||
|
||||
* 语法分析定义
|
||||
|
||||
语法规定位于词法层次之上的程序结构。
|
||||
|
||||
语法用于确定一个输入序列是否合法的程序。程序存在多个不同层次的合法性问题:
|
||||
– 局部结构 例:C程序里的if 之后是不是左括号,括号是否配对
|
||||
– 上下文关系 例:变量使用前是否有定义,使用是否符合类型的要求
|
||||
– 深层问题 例:使用变量的值之前,变量是否已经初始化
|
||||
|
||||
* 语法分析图
|
||||
|
||||

|
||||
|
||||
其中方框为非终结符,圆和椭圆形为终结符。箭头指向构造流向。每个非终结符又可开始一个语法图(一条产生式规则) 。与EBNF完全对应,[ ]以'短路'绕道表示,{ }以迥环表示,小圆弧是有意义的,表示流向。有的语法图在环线上注上数字表示最多转几次。
|
||||
|
||||
* 语法分析分类
|
||||
* “自顶向下” 释义则从文法的起始符开始,按可能产生的表达式寻 找语句相同的结构匹配。每一步都产生下一个可能的源符号串,找到再 往下走。
|
||||
* “由底向上”释义则相反,它先查找源代码的各个符号串,看它能 否匹配归结为产生式左边的非终结符,如果有含混则向前多读入k个符 号串,为此归约下去,一个短语一个短语,最后到达起始符号串,归约 的过程就形成了释义树。
|
||||
|
||||
|
||||
### 语义分析
|
||||
> 在最后再详细补充
|
||||
|
||||
程序通常要在计算机上执行,因此按照程序的运行步骤或操作来说明程序设计语言是很自然的,这就是所谓的操作语义学。大多数程序设计语言的非形式化语义都是用这种方式说明的。例如 Pascal中while命令的操作语义可说明如下:
|
||||
```
|
||||
执行命令while E do C,其步骤为:
|
||||
(1) 对表达式E求值,产生一个真假值。
|
||||
(2) 如果值为true,则执行命令C,然后从(1)开始重复。
|
||||
(3) 如果值为false,终止。
|
||||
```
|
||||
|
||||
|
||||
* 指称语义。为每个程序短语指派一数学实体(指称)为其意义。典型情况是将其输入映射为输出的函数。例如,一个表达式的指称是将环境和存储映射为值的函数。一个命令的指称是将环境、初始存储映射为最终存储的函数。
|
||||
```
|
||||
execute 〖while E do C〗 =
|
||||
let execute-while env sto =
|
||||
let truth-value tr=evaluate〖E〗 env sto in
|
||||
if tr
|
||||
then execute-while env (execute 〖C〗 env sto)
|
||||
else sto
|
||||
in
|
||||
execute-while
|
||||
```
|
||||
* 公理语义。它只定义证明规则(公理及推理规则),以此证明程序的某些性质。这些证明规则在某种意义上就是抽象的语义。公理语义主要用于程序验证,语言理解,语言规范/标准化等方面,对编译 、解释器的 没有直接的作用。把语言的公理描述看作是该语言的一个理论,该理论由三部分组成:
|
||||
* 公理集 元语言描述的不加证明的公理集如:|- 0 succ 0 即自然数0的后继大于0是一个定理(由|-表示)也是一条公理。
|
||||
* 语法规划集 以它来确定什么是合式公式。
|
||||
* 推理规则集 从已确立的定理演绎新定理。
|
||||
|
||||
* 代数语义。代数语义把语义模型的集合看成是一个代数结构,模型簇 对应为代数系统。
|
||||
|
||||
|
||||
## 5 上下文无关文法
|
||||
|
||||
### 文法(Grammar)
|
||||
文法可导出该语言所有可能的句子,形式地,一个文法G是一个四元组:
|
||||
$$
|
||||
G=(S,N,T,P)
|
||||
$$
|
||||
* 其中,T是终结符号串的有限集。
|
||||
* N是非终结符号串的有限集,是文法中提供的成分概念,相当于英语动词短语、名词短语或定语从句等句子成分的符号表示。
|
||||
* T∩N = Φ,即它们是不相交的。
|
||||
* S是起始符号串,S∈N。
|
||||
* P是产生式,一般形式是:α→β α,β∈(T∪N)*。“→”表示左端可推导出右端,如α→β,α→Υ,α→δ则可写为: α→β|Υ|δ
|
||||
|
||||
|
||||
如果产生式将语言的非终结符中的每一个标记都推得为终结符号,则这一组产生式集即为该语言的全部文法。
|
||||
|
||||
### 文法的递归表示
|
||||
|
||||
文法的递归表示在形式文法中是必须的。例2-1 整数的产生式表示法:
|
||||
```
|
||||
<digit>→0|1|2|3|4|5|6|7|8|9
|
||||
<Integer>→<digit> 一位数字是整数
|
||||
<Integer>→<digit><digit> 两位数字也是整数
|
||||
<Integer>→<digit>…<digit> n位数字也是整数
|
||||
可以写成:
|
||||
<Integer>→<digit>|<Integer><digit>|<digit> <Integer>
|
||||
```
|
||||
> α→αβ是左递归产生式,而α→βα是右递归产生式,也叫尾递归的。不同型式的产生式决定了不同型式的文法。
|
||||
|
||||
### Chomsky文法
|
||||
> 希腊字母是终结符。大写字母是非终结符。
|
||||
|
||||
* **0型文法**如果对产生式α→β左端和右端不加任何限制:
|
||||
```
|
||||
α∈(N∪T) ,β∈(N∪T)*
|
||||
```
|
||||
这种文法对应的语言是递归可枚举语言。在编译理论中,图灵机(或双向下推机)可以识别这种语言。
|
||||
|
||||
* **1型文法**如果产生式形如:
|
||||
```
|
||||
αAβ→αBβ α,β∈(N∪T)*, A∈N, B∈(N∪T)
|
||||
```
|
||||
则叫做上下文相关文法,对应的语言是上下文敏感语言。线性有界自动机可识别这种语言。(因为左端含有非终结符,每一个推导式与左右两边的非终结符有关,所以是上下文有关文法)
|
||||
|
||||
* **2型文法**如果产生式形如:
|
||||
```
|
||||
A→α α∈ (N∪T)*, A∈N
|
||||
```
|
||||
左端不含终结符且只有一个非终结符。这种文法叫上下文无关文法。对应的语言即上下文无关语言。非确定下推机能识别这种语言。
|
||||
|
||||
* 3型文法 如果产生式形如:
|
||||
```
|
||||
A→ αB|Bα α∈T*, A,B ∈N
|
||||
```
|
||||
左端不含终结符且只有一个非终结符。右端最多也只有一个非终结符且不在最左就在最右端。这种文法叫做正则文法,对应为正则语言。有限自动机可识别这种语言。显然,这种文法经置换可消除右端非终结符,使每一产生式均可用一终结符的正则表达式表达。
|
||||
例2-2 所有产生式的非终结符均可置换为终结符表达式。
|
||||
```
|
||||
设产生式是:
|
||||
N={S,R, Q}, T={a,b,c}
|
||||
P={S→Ra, S→Q, R→Qb, Q→c}
|
||||
则有:
|
||||
S→Ra→Qba→cba|S→Q→c
|
||||
R→Qb→cb
|
||||
Q→c
|
||||
```
|
||||

|
||||
|
||||
### BNF和EBNF
|
||||
|
||||
BNF就是上下文无关文法的表示法。
|
||||
|
||||
* ::= '定义为',即产生式中的“→”符号。
|
||||
* < > 表示所括符号串是非终结符号串。
|
||||
* | '或者'表示左右两边符号串序列是可替换的。终结符、关键字、标点符号直接写在产生式中。
|
||||
|
||||
BNF示例
|
||||
```
|
||||
<unsigned integer> ::= <digit>
|
||||
| <unsigned integer> <digit>
|
||||
<integer> ::= +<unsigned integer>
|
||||
|-<unsigned integer>
|
||||
|<unsigned integer>
|
||||
<identifier> ::= <letter>
|
||||
| <idenfitier> < digit>
|
||||
| <identifier> <letter>
|
||||
```
|
||||
|
||||
增加更多内容
|
||||
|
||||
* "[ ]"表示括号内的内容是可选的。
|
||||
* "{ }"表示括号内的内容可重复0至多次。
|
||||
* "*"是指可以重复多次。
|
||||
* "+"是指可以出现多次
|
||||
* "?"意思是操作符左边的符号(或括号中的一组符号)是可选项(可以出现0到多次)。
|
||||
```
|
||||
<integer> ::= [ +|-]<unsigned integer>
|
||||
<identifier> ::= <letter> {<digit> | <letter>}
|
||||
<unsigned integer> ::= <digit>
|
||||
<identifier> ::= <letter> {<digit> | < letter>}*
|
||||
```
|
||||
|
||||
EBNF将BNF与正则表达式结合起来
|
||||
|
||||
* 其元语符号变动是: 增加[ ]、{ } 、( )(表示成组)、.(表示产生式终结)。[ ] 、{ } 意义同前,旨在消除或减少递归表达。
|
||||
* 取消非终结符的尖括号,至少是产生式左端,为此符号串中空白用'_'连接。
|
||||
* 为区别元符号和程序符号(程序中也有[ ]、 、()、.),程序中的终结符加引号,如'(', ')', '.'。
|
||||
|
||||
```
|
||||
program ::= <program_heading> ';' <program_block> '.'.
|
||||
program_heading ::= 'program' <identifier>[ '('<program_parameters> ')'].
|
||||
program_parameters ::= <identifier_list>.
|
||||
identifier_list ::= <identifier> {',' <identifier>} .
|
||||
program_block ::= <block>.
|
||||
block ::= <label_declaration_part> <constant_declaration_part>
|
||||
<type_declaration_part><variable_declaration_part>
|
||||
<procedure_and_function_declaration_part><statement_part>.
|
||||
variable_declaration_part ::= ['var' <variable_declaration> ';'
|
||||
{<variabe_declaration> ';' }].
|
||||
variable_declaration ::= <identifier_list> ';' <type_denoter>.
|
||||
statement_part ::= compound_statement.
|
||||
compound_statement ::= 'begin' <statement_sequence> 'end'.
|
||||
statement_sequence ::= <statement> {';' <statement>}.
|
||||
statement::=[<label> ':'](<simple_statement>|<structured_statement>).
|
||||
simple_statement ::= <empty_statement> | <assignment_statement> |
|
||||
<procedure_statement> | < goto_statement>.
|
||||
structured_statement ::= <compound_statement>|<conditional_statement>
|
||||
|<repetitive_statement> | <with_statement>.
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
# 过程式程序设计语言
|
||||
|
||||
## 1 值与类型
|
||||
|
||||
### 值与类型
|
||||
|
||||
* 值是对事物性态的表征和度量,而表征和度量总是在某个论域的某个抽象层次上,讨论问题的抽象层次不同取值也不同。
|
||||
* 对值进行分类。每一个值都属于一个类型。
|
||||
* 主要包括以下类型:
|
||||
* 基本类型:整型实型浮点类型字符型真值型枚举型
|
||||
* 以简单的基本类型可以构造结构类型:元组、数组、记录、结构、表
|
||||
* 还可进一步组合成更复杂的复合类型:串、其他专用或更复杂的类型。
|
||||
|
||||
### 字面量、变量常量
|
||||
|
||||
* 字面量也称直接量,约定它的表示(名)就是它的值,且从它的表示可以得知其类型, 如123,1.23e10,'s',"stock",TRUE,dec,
|
||||
* 变量是代表任何值的标识符。一旦声明该标识符是什么类型,它在程序中只可取得该类型的某个值。变量只是一个数据的名字,它的值随时可变。
|
||||
* 常量也可以是标识符。一旦某标识符声明为某类型的常量,则必须给它赋初值,且在程序中不得改变,它就成了某个值的代名词。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user