一、编程语言通识
语言分类
非形式语言
- 中文
- 英文
- 阿拉伯文、蒙古文…
形式语言(乔姆斯基谱系:是计算机科学中刻画形式文法表达能力的一个分类谱系,是由诺姆·乔姆斯基于 1956 年提出的)它包括四个层次:
- 0型文法(无限制文法或短语结构文法)包括所有的文法。
- 等号左边不止一个 ::= “c”
- 1型文法(上下文相关文法)生成上下文相关语言。
- “a”“c”::=“a”“x”“c”
- 2型文法(上下文无关文法)生成上下文无关语言。
- 3型文法(正则文法)生成正则语言。–>能用正则表达式解析的文法
主流语言都会分文法和词法两部分。
产生式(BNF)
巴科斯诺尔范式:即巴科斯范式(英语:Backus Normal Form,缩写为 BNF)是一种用于表示上下文无关文法(2型)的语言,上下文无关文法描述了一类形式语言。它是由约翰·巴科斯(John Backus)和彼得·诺尔(Peter Naur)首先引入的用来描述计算机语言语法的符号集。
产生式: 在计算机中指 Tiger 编译器将源程序经过词法分析(Lexical Analysis)和语法分析(Syntax Analysis)后得到的一系列符合文法规则(Backus-Naur Form,BNF)的语句
- 用尖括号括起来的名称来表示语法结构名
- 语法结构分成基础机构和需要用其他语法结构定义的复合结构。
基础结构称终结符
符合结构称非终结符 - 引号和中间的字符表示终结符
- 可以有括号
- *表示重复多次
- | 表示或
-
- 表示至少一次
"a"
"b"
<Program>:= "a"+ | "b"+
// 可递归
<Program>:= <Program> "a"+ |<Program> "b"+
abababbbbabab
//定义一个数字
<Number> = "0" | "1" | "2"....|"9"
//十进制
<DecimalNumber> = "0" | (("1" | "2"....|"9") <Number>*)
// 加法
<Expression> = <DecimalNumber> "+" <DecimalNumber>
// 加法--连加
<Expression> =<DecimalNumber> | <Expression> "+" <DecimalNumber>
四则运算:
1+2*3
终结符:---- 终结符: 最终在代码中出现的字符( https://zh.wikipedia.org/wiki/ 終結符與非終結符)
Number
+ - * /
+
非终结符:
MultipcativeExpression
AddtiveExpression
//定义一个数字
<Number> = "0" | "1" | "2"....|"9"
//十进制
<DecimalNumber> = "0" | (("1" | "2"....|"9") <Number>*)
// 加法
<Expression> = <DecimalNumber> "+" <DecimalNumber>
<PrimaryExpression> = <DecimalNumber> |
"(" <LogicalExpression> ")"
// 乘法
<MultipcativeExpression> =<PrimaryExpression> |
<MultipcativeExpression> "*" <PrimaryExpression>|
<MultipcativeExpression> "/" <PrimaryExpression>
// 加法--连加
<AddtiveExpression> =<MultipcativeExpression> |
<AddtiveExpression> "+" <MultipcativeExpression>|
<AddtiveExpression> "-" <MultipcativeExpression>
<LogicalExpression> =<AddtiveExpression> |
<LogicalExpression> "||"
<AddtiveExpression> |
<LogicalExpression> "&&"
<AddtiveExpression>
P:练习 :编写带括号 的四则运算产生式
P:正则表达 四则运算产生式
= /0|[1-9][0-9]*/
JS Grammar Summary
A5 (ES262)
图灵完备性
- 图灵机(Turing machine):又称确定型图灵机,是英国数学家艾伦·图灵于 1936 年提出的一种将人的计算行为抽象掉的数学逻辑机,其更抽象的意义为一种计算模型,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。
图灵完备性:在可计算性理论里,如果一系列操作数据的规则(如指令集、编程语言、细胞自动机)可以用来模拟单带图灵机,那么它是图灵完全的。这个词源于引入图灵机概念的数学家艾伦·图灵。虽然图灵机会受到储存能力的物理限制,图灵完全性通常指“具有无限存储能力的通用物理机器或编程语言”。
图灵完备性 - 命令式---- 图灵机
- goto
- if和while
- 声明式 ---- lambda
- 递归
静态和动态语言:
参考
动态:
在用户的设备/在线服务器上
产品实际运行时
Runtime
静态:(类型检查)
在程序员的设备上
产品开发时
compiletime
类型系统
- 动态类型系统与静态类型系统
- 强类型: 无隐式转换
弱类型: 有隐式转换 - 复合类型
结构体
函数签名 - 子类型
协变与逆变
一般命令式编程语言
Atom
Atom | Expression | statement | structure | Program |
---|---|---|---|---|
Identifier | Atom | Expression | Function | Program |
Literal | Operator | keyword | Class | Program |
Punctuator | Punctuator | Process | Package | |
Namespace | Library |
(语法–语义–运行时)
Brainfuck :一种极小化的程序语言,它是由 Urban Müller 在 1993 年创造的。由于 fuck 在英语中是脏话,这种语言有时被称为 Brainfck 或 Brainf**,或被简称为 BF。
Bjarne Stroustrup(比雅尼·斯特劳斯特鲁普):1950 年 12 月 30 日生于丹麦奥胡斯郡,计算机科学家。他以创造 C++ 编程语言而闻名,被称为“C++ 之父”。
Yacc 与 Lex 快速入门: https://www.ibm.com/developerworks/cn/linux/sdk/lex/index.html
关于元编程: https://www.zhihu.com/question/23856985 生成代码叫元编程
编程语言的自举: https://www.cnblogs.com/lidyan/p/6727184.html
推荐阅读:ECMA-262 Grammar Summary 部分
二、词法、类型
字符–表达式–语句–程序/模块
unicode
https://home.unicode.org/
Unicode
中文字符
字符集:字符编码(英语:Character encoding)、字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8 位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和 ASCII。其中,ASCII 将字母、数字和其它符号编号,并用 7 比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以 1 个字节的方式存储。在计算机技术发展的早期,如 ASCII(1963 年)和 EBCDIC(1964 年)这样的字符集逐渐成为标准。但这些字符集的局限很快就变得明显,于是人们开发了许多方法来扩展它们。对于支持包括东亚 CJK 字符家族在内的写作系统的要求能支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码。
Unicode :中文:万国码、国际码、统一码、单一码。是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。
ASCII :(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本延伸美国标准信息交换码则可以部分支持其他西欧语言,并等同于国际标准 ISO/IEC 646。美国信息交换标准代码是这套编码系统的传统命名,互联网号码分配局现在更倾向于使用它的新名字 US-ASCII[2]。美国信息交换标准代码是美国电气和电子工程师协会里程碑之一。
- Block
- category
InputElement
whiteSpace:tab(\t) vt(纵向制表符 \v) ff(form feed) sp(普通空格) nbsp( 处理排版-单词) zwnbsp(零宽空格) usp
LineTerminator(换行符):LF(\n ) CR(\r 回车) LS(分行符) PS(分段符)
Comment 注释
Token 一切有效的东西
Punctuator 符号, 用于构成代码结构
IdentifierName: 标识符
keywords
Identifier
变量名(不可以和关键字重合) 特例: `get`, `undefined` 全局不可改变量名
属性名(可以重合)
Future reserved Keywords : enum
Literal : 直接量
NumericLiteral
StringLiteral
运行时:Types
- Number
IEEE 754 Double Float
Sign(1) 标识位
Exponent(11)
Fraction(52)- 浮点数比较: Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON
- 97 .toString(2) 转为2进制(97后面有个空格)
Number.MAX_SAFE_INTEGER
var a = 0.1;
var b = 0.2;
const memory = new Float64Array(1);
memory[0] = a;
console.log(memory)
二进制 0b
八进制 0o
十六进制 0x
十进制 科学计数法 小数点前后均可省略
- String
ASCII
Unicode
UCS U+0000 - U+FFFF
GB
GB2312 — 最早版本
GBK(GB13000)
GB18030
IOS-8859 — 欧洲国家标准
BIG5 — 台湾繁体中文 - Boolean
- null
- undefined
JS标准A Grammar Summary
other
计算浮点数的一个工具: https://github.com/camsong/blog/issues/9
正则表达式: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
揭秘 0.1 + 0.2 != 0.3 https://www.barretlee.com/blog/2016/09/28/ieee754-operation-in-js/
ASCII,Unicode 和 UTF-8 : http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
NBSP :不换行空格(英语:no-break space,NBSP)是空格字符,用途是禁止自动换行。HTML 页面显示时会自动合并多个连续的空白字符(whitespace character),但该字符是禁止合并的,因此该字符也称作“硬空格”(hard space、fixed space)。Unicode 码点为:U+00A0 no-break space。
零宽空格:(zero-width space, ZWSP)是一种不可打印的 Unicode 字符,用于可能需要换行处。在 HTML 页面中,零宽空格可以替代。但是在一些网页浏览器(例如 Internet Explorer 的版本 6 或以下)不支持零宽空格的功能。