语言按语法分类
- 非形式语言(阿拉伯文,很多其他语言)
- 中文,英文
形式语言(乔姆斯基谱系)
- 0型 无限制文法(相对于其他文法无限制)?::=?
- 1型 上下文相关文法 ??::=??
- 2型 上下文无关文法 ::=?
- 3型 正则文法(正则表达式)::=?
四种文法,从0型到3型,其规则和约定越来越多,限制条件也越来越多
BNF范式
BNF(Backus-Naur Form)是描述编程语言的文法。巴科斯范式是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。
文法:自然语言存在不同程度的二义性。这种模糊、不确定的方式无法精确定义一门程序设计语言。必须设计一种准确无误地描述程序设计语言的语法结构,这种严谨、简洁、易读的形式规则描述的语言结构模型称为文法**。
BNF规定是推导规则(产生式)的集合,写为:
符号 ::= <使用符号的表达式>
- 用尖括号括起来的名称来表示语法结构名
- 语法结构分成基础结构和需要用其他语法结构定义的复合结构
- 基础结构称终结符
- 复合结构称非终结符
- 引号和中间的字符表示终结符
- 可以有括号
- *表示重复多次
- |表示或
- +表示至少一次
终结符和非终结符
终结符:终结符是一个形式语言的基本符号。就是说,它们能在一个形式语法的推到规则的输入或输出字符串存在,而且他们不能被分解为更小的单位。
非终结符:非终结符是可以被取代的符号。一个形式文法中必须有一个起始符号,这个起始符号属于非终结符的集合。在上下文无关文法中,每个推到规则的左边只能有一个非终结符而不能有两个以上的非终结符或中介符。(并非所有的语言都可以被上下文无关文法产生)BNF范式的语法
在BNF中,双引号中的字(“word”)代表着这些字符本身。而double_quote用来代表双引号。
在双引号外的字(有可能有下划线)代表着语法部分。
例如,Java语言总的< > : 内包含的为必选项。
[ ] : 内包含的为可选项。
{ } : 内包含的为可重复0至无数次的项。
| : 表示在其左右两边任选一项,相当于"OR"的意思。
::= : 是“被定义为”的意思
"..." : 术语符号
[...] : 选项,最多出现一次
{...} : 重复项,任意次数,包括 0 次
(...) : 分组
| : 并列选项,只能选一个
for
语句的BNF范式定义如下:FOR_STATEMENT ::=
"for" "(" ( variable_declaration |
( expression ";" ) | ";" )
[ expression ] ";"
[ expression ]
")" statement
参考链接:
http://sighingnow.github.io/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/bnf.html
http://icodeit.org/2015/09/write-a-parser/
图灵完备性
概念
- 图灵完备性
- 命令式”有时也被称作“指令式”,“命令式”强调的是how,如果你是在写命令式的程序,那么你将step-by-step的告诉计算机如何完成一项工作,大多数的程序都是这样的。在命令式场景下,计算机是不具备“智能”的,只是很机械的完成你交代的事情,至于结果如何,要看你的水平
- “声明式”有时也被成为“描述式”或者“申明式”,为告诉计算机你想要什么,“声明”你想要的what,由计算机自己去设计执行路径,需要计算机或者是“运行时”具备一定的“智能”。在这种情况下,计算机显然不会实现所有你想要的what,用专业术语说就是“非图灵完备”,但是针对特定的任务,“声明式”要远比“命令式”方便,最常见的声明式语言就是SQL—— 告诉计算机你想要的结果集,SQL语言的运行时,即数据库,帮你设计获取这个结果集的执行路径,并返回结果集。众所周知,使用SQL语言获取数据,要比自行编写处理过程去获取数据容易的多。
声明式和命令式
声明式语⾔言:SQL HTMl XML CSS VUE
命令式语⾔言:C++ Java JavaScript
命令式——图灵机
- goto
- if和while
声明式——lambda
- 递归
参考链接:
微信公众号 - EAWorld(eaworld),作者:宋潇男 https://cloud.tencent.com/developer/article/1080886
动态与静态
动态
- 在用户设备/在线服务器
- 产品实际运行时
- Runtime
静态
- 在程序员设备上
- 产品开发时
- Compiletime
类型系统
- 动态类型系统和静态类型系统
- 强类型与弱类型
- 复合类型
- 结构体
- 函数签名
- 子类型
- 逆变/协变
动态类型语言(Dynamically Typed Language)
- 运行期间才做数据类型检查的语言,即动态类型语言编程时,永远不用给任何变量指定数据类型。该语言会在第一次赋值给变量时,在内部将数据类型记录下来。
- JavaScript,Python和Ruby就是典型动态类型语言
- 优点:方便阅读,不需要写非常多的类型相关的代码;
-
静态类型语言(Statically Typed Language)
编译期间做检查数据类型的语言,即写程序时要声明所有变量的数据类型,是固定的。使用数据之前,必须先声明数据类型(int ,float,double等)。相当于使用之前,首先要为它们分配好内存空间。
- 例如:C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等
- 优点:结构非常规范,便于调试,方便类型安全
-
强类型定义语言(Explicit type conversion,,类型安全的语言)
强制数据类型定义,语言一旦变量被指定某个数据类型,如果不经强制转换,即永远是此数据类型。
强类型语言是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如C/C++/Java/C#
弱类型定义语言(Implicit type conversion,类型不安全的语言)
数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
参考链接:https://www.jianshu.com/p/336f19772046
编程语言
- atom
- laentfier
- literal
- expression
- atom
- operator
- punctuator
- statement
- expression
- keyword
- punctuator
- structure
- function
- class
- process
- namespace
- program
- program
- module
- package
- library