程序设计语言基础-有限自动机+正规式+常见程序设计语言的特点
不确定的有限自动机 NFA
该状态机在任何一个状态,基于输入的字符都不能做成一个确定的状态转换,这里分为两种状况。
- 对于一个输入,它有两个状态可以转换。
- 存在ε的情况,即没有任何字符输入的情况下,NFA可以从一个状态迁移到另一个状态。
确定的有限自动机 DFA
该状态机在任何一个状态,基于输入的字符都能做成一个确定的状态转换
正规式
常见程序设计语言的特点
Lisp
是一种函数式编程语言,它以S表达式作为程序和数据结构的基础,并强调对函数的运用,包括高阶函数、匿名函数以及递归等概念。在Lisp中,程序可以被当作数据来处理,这体现了函数式编程的核心思想
Prolog
虽然也是一种声明式编程语言,但它主要基于逻辑编程范式,而非函数式编程范式。
Python
既可以支持面向对象编程,也可以支持函数式编程风格,但本身并不是纯粹的函数式编程语言,而是多范式编程语言。
Java和 C++
都是面向对象为主的编程语言,尽管它们在现代版本中也添加了对函数式编程特性的支持(如Java8中的Lambda表达式),但它们并非严格意义上的函数式编程语言。
JAVA是解释型语言,可以生成中间代码后再边解释为目标代码边执行,也就是即时编译。最初,JAVA程序是通过解释器进行解释执行的。当虚拟机发现某个方法或代码块的运行频率很高时,它将其标记为“热点代码”。为了提高热点代码的执行效率,虚拟机在运行时将会把这些代码编译成本地机器码,并进行各种代码优化。这个过程称为即时编译而负责完成这个任务的后端编译器被称为即时编译器。即时编译器可以通过将代码转换为机器码来提高执行速度,并应用优化技术来进一步改善性能。这种编译方式使得JAVA程序在运行时能够获得更高的执行效率。
JAVA可以根据运行机器优化代码,采用的是动态优化编译,当Java程序在虚拟机中执行时,虚拟机会对代码进行解释执行或即时编译。而动态优化编译是即时编译的一个阶段,它与静态编译不同,静态编译是指在程序运行之前将代码编译成机器码。动态优化编译则是在程序运行过程中,根据实际情况对代码进行优化。
JAVA的栈空间只存放基本类型、引用类型变量和方法,而堆中存储实例对象。
代码区:代码区存储程序的执行代码,包括程序的机器指令。这部分通常是只读的,存放着程序的指令,由操作系统加载程序时分配。
静态数据区:静态数据区存储静态变量、全局变量和常量。这些变量在程序运行期间始终存在,不会因为函数的调用而释放。全局变量属于静态存储方式,程序开始运行时就为它们分配内存,并在程序结束时释放。
栈区:栈区存储函数的局部变量、函数参数和返回地址等。栈空间在函数调用时动态分配,在函数结束时自动释放。
堆区:堆区用于动态分配内存,它的分配和释放不由编译器控制,需要手动管理,通常通过 malloc()、free()等函数来操作。
在高级程序语言中,程序员可以定义变量名、函数名,也可以自定义数据类型,如在C++中还可以使用命名空间和标识符来重命名或引用数据类型,例如,可以使用typedef或using语句来创建数据类型的别名/定义别名
typedef OriginalClassName RenamedClassName,/ 使用别名
RenamedClassName obj;/ 使用 using 创建别名using RenamedClassName = OriginalClassName/ 使用别名
RenamedClassName obj
文法
短语结构文法:这种文法描述语言的句子结构,通常用来进行句法分析,如描述句子的成分和结构。
正规文法:这种文法包含正则表达式描述的文法,适用于有限状态自动机描述的语言,通常用来描述词法分析阶段的语法规则,如标识符、数字等
上下文无关文法:这种文法中,产生式的左侧只包含一个非终结符,不依赖于上下文信息。程序设计语言的大多数语法规则可以用上下文无关文法来描述,例如变量声明、表达式语法等
上下文有关文法:这种文法中,产生式的左侧可以是一个非终结符和一个上下文相关的环境(终结符和非终结符的序列),虽然程序设计语言的语法有时涉及上下文相关的特征,但它们大多数情况下更接近上下文无关文法,