第2章:程序设计语言基础知识

一、程序设计语言基础

低级语言:机器语言,汇编语言
高级语言
语言翻译的基本方式:汇编,解释和编译

解释器:翻译源程序时不生产独立的目标程序。解释程序和源程序要参与到程序的运行过程中。

编译器:翻译时将源程序翻译成独立保存的目标程序。机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的运行过程。

程序设计语言的定义包括:语义,语法,语用

许多程序设计语言规定,程序中的数据必须具有类型,其作用是:
便于为数据合理分配存储单元
便于对参与表达式计算的数据对象进行检查
便于规定数据对象的取值范围及能够进行的运算


程序设计语言分类:
命令式和结构化程序设计语言
面向对象的程序设计语言
函数式程序设计语言lisp
逻辑型程序设计语言prolog

程序设计语言的基本成分包括:数据,运算,控制,传输

二、编译程序基本原理


编译方式:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成
解释方式:词法分析、语法分析、语义分析

编译器和解释器都不可省略词法分析、语法分析、语义分析且顺序不可交换
编译器方式中中间代码生成和代码优化不是必要,可省略。

符号表:不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中。记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。


(1)词法分析

输入:源程序

输出:记号流

词法分析阶段的主要作用是:分析构成程序的字符及由字符按照构造规则构成的符号,是否符合程序语言的规定。
(2)语法分析

输入:记号流

输出:语法树(分析树)

语法分析阶段的主要作用是:对各条语句的结构进行合法性分析,分析程序中的句子结构是否正确。

(3)语义分析

输入:语法树(分析树)

语义分析阶段的主要作用是进行类型分析和检查

语义分析阶段可以发现程序中所有的语法错误

语义分析阶段不能发现程序中所有的语义错误

语义分析阶段可以发现静态语义错误,不能发现动态语义错误,动态语义错误运行时才能发现(除数为0,死循环),与具体的机器结构无关

(4)中间代码生成

常见的中间代码有:后缀式、三地址码、三元式、四元式和树(图)等形式。

中间代码与具体的机器无关(不依赖具体的机器),可以将不同的高级程序语言翻译成同一种中间代码。

中间代码可以跨平台。

因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性。


(5)目标代码生成

目标代码生成阶段的工作与具体的机器密切相关

寄存器的分配工作处于目标代码生成阶段

三、词法分析工具

1.正规式与正规集

2.有限(穷)自动机
有限自动机是词法分析的一个工具,它能正确地识别正规集
确定的有限自动机( DFA ):对每一个状态来说识别字符后转移的状态是唯一的
不确定的有限自动机( NFA ):对每一个状态来说识别字符后转移的状态是不唯一的

初态,终态,跳空

四、语法分析方法


上下文无关文法
G[S]=(Vn,Vt,P,S),非终结符,终结符,产生式集(由非终结符和终结符构成的串),开始符号

产生式集:

A→α,其中A∈N(左部),α∈(N∪T)*(右部)

N是可以出现在产生式左边符号的集合,T是绝不出现在产生式左边符号的集合


自顶向下语法分析法:
LL(1)文法
递归下降分析法
预测分析法


自底向上语法分析法:
移近-归约分析法
LR分析法
算符优先分析法

五、中缀式、后缀式(对应语法树中、后序遍历)

中缀式:a ?b    后缀式(逆波兰式):ab?       

中缀式转后缀式:按优先级,同优先级从左往右

 后缀式转中缀式可以用:栈

后缀表达式不需要使用括号来标识操作符的优先级

中间代码有多种形式,其中树与后缀表示形式适用于解释器,而编译器多采用与机器指令格式较接近的四元式形式。

六、补充

1.汇编语言与计算机硬件体系结构密切相关。

2.python没有switch-case,用raise手动抛出异常。

3.html基本标签:

  alink:设置正在被击中的链接的颜色

  background:设置背景图片的URL

  bgcolor:设置文档整体背景颜色

  vlink:设置已访问链接的颜色

4.c/c++变量不强制赋初值,不报错,但结果随机。

5.脚本语言又被称为扩建的语言,或者动态语言,如python,php

解释型语言包括脚本语言。

6.领域类模型中不包含领域对象

7.PHP适合用来作动态网页处理。

8.pip安装命令:pip install +模块名

9.python中x=(1)不能定义一个元组,x=input(123),输出为‘123’。

10.指针变量可以是全局变量和局部变量。

11.标记语言:html,xml,wml

12.编译分配逻辑地址,运行分配物理地址

13.链表在运行时数据空间必须采用存储分配

14.c/c++内存分配:

15.java采用即时编译(运行时编译)

16.python列表list是一种可变的、有序的序列结构,元素可重复

     python元组tuple是一种不可变的、有序的序列结构,元素可重复

     python3中,list(range(11))[10:0:-2]的值为[10,8,6,4,2]

     不可变数据:Number(数字),String(字符串),Tuple(元组)

      可变数据:List(列表),Dictionary(字典),Set(集合)

17Matplotib不支持深度学习模型。

18.html创建指向邮箱地址的链接:<a href="mailto:test@test.com@test.com

19.网页代码的起始和中止:<html></html>

20.编译全过程:预处理--编译--汇编--链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值