硬件功能模块化,软件功能配置化(业务化)
软件功能配置化
软件系统模块化设计是实现可配置性的基础。通过将系统拆分为多个独立的模块,可以使得每个模块都拥有独立的配置选项
引入配置文件,提供可视化配置界面,实现动态参数调整-运行时对部分参数进行调整-热插拔
配置文件
ini、xml、json、yaml、properties
配置项toml
toml的设计目标就是极简的配置格式,可以无歧义的映射成哈希表-容易地被解析成各种语言中的数据结
TOML 是大小写敏感的
TOML 文档最基本的构成区块是键值对。
键名在等号的左边而值在右边 ,
键名可以是没有引号的,引号引起来的,或点分隔的;下划线和短横线(A-Za-z0-9_-);点分隔键
键名=值
整数-浮点数-字符串-布尔值
-日期时刻
-数组
-表(键值对的集合-表不保证保持键值对的指定顺序-顶层表,又被称为根表)
-行内表
-表数组
TOML 文件应当使用 .toml 扩展名 互联网上传输 TOML 文件时,恰当的 MIME 类型是 application/toml
https://github.com/toml-lang/toml/blob/1.0.0/toml.abnf
MIME和BNF
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式
MIME 类型通用结构:
type/subtype
正则-有限自动机(FA,Finite Automata)
确定有限状态自动机与非确定有限状态自动机识别的语言都是正则语言
RE 和 FA 可以用于编译器的词法分析器(LA, Lexical Analysis)
NFA 和 DFA
DFA-[Deterministic Finite Automaton]
后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面
语言的文法
Chomsky根据对产生式要求的不同,将文法分为4类,通常称为Chomsky体系
将形式语言分为四个层次:
上下文无关语言、上下文相关语言和递归可枚举语言 正规语言、
0-型文法(无限制文法或短语结构文法)-递归可枚举语言
3-型文法(正规文法)生成正则语言
包含关系
正则语言类包含于上下文无关语言类,
上下文无关语言类包含于上下文相关语言类,
上下文相关语言类包含于递归可枚举语言类。
BNF 巴科斯-诺尔形式(Backus-Naur form)BNF 在编程语言设计、编译原理和形式语言理论等领域中得到广泛应用,
它是许多编程语言的设计和文档化的基础
约翰·巴克斯(John Backus)
参与研发了FORTRAN, ALGOL等语言,以及帮助创建了BNF范式
彼得·诺尔(Peter Naur)-丹麦
Algol 58语言(1958年)
ALGOrithmic Language(算法语言)国际代数语言( International Algebraic Language ,IAL)
ALGOL 60(Algorithmic Language 1960的缩写
ALGOL 60里程碑式地引入了递归、布尔类型和块结构等关键概念,启发了往后无数编程语言
数据学(Dataology)-信息空间(Cyberspace)中数据界(datanature)
程序员应该根据实际需要去选择合适的形式
BNF范式(Bcakus-Naur-Form)用以定义程序设计语言的语法
扩展巴科斯范式(ENBF)或扩充巴科斯范式(ABNF)
典型的元语言BNF,用来描述语法的一种形式体系
| 表示在其左右两边任选一项,相当于"OR"的意思
编译器
商用(GCC、LLVM)的编译器
LLVM
前端、优化器和后端 Frontend Optimizer Backend-不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)
llvm 使用中间表示 (ir) 来表示代码,允许跨平台进行优化
LLVM IR 是一门低级编程语言,语法类似于汇编。
任何高级编程语言(如 C++)都可以用 LLVM IR 表示,基于 LLVM IR 可以很方便地进行代码优化。
Clang: LLVM项目的一个子项目,基于LLVM架构的C/C++/Objective-C编译器前端
GCC 分为三个模块:
相比之下,GCC的前端和后端没分得太开,前端后端耦合在了一起
antlr
ANTLR 根据输入的文法生成由 Java 语言编写的分析器,相当于 Java 界的 Yacc + Lex 或 Bison + Flex
Antlr(ANother Tool for Language Recognition)是一种强大的语法分析器生成器,它可以根据给定的语法规则生成解析器和词法分析器。
antlr是一个包含了词法分析,语法分析两大模块的工具,并且提供了大量主流语言的现成的语法描述grammar文件
Antlr支持多种目标语言,包括Java、C#、Python等,但不直接支持LLVM IR
TinyCC编译器:TinyCC是一个小巧而快速的C编译器
代码混淆:代码混淆是将计算机程序的代码,转换成一种功能上等价,但是难以阅读和理解的形式的行为
lex 代表 lexical analyzar(词法分析器)
Yacc: Yet Another Compiler Compiler
❖lex和yacc是自动编译代码的工具,适合于解析简单 的语言
lex和yacc在UNIX下分别叫flex和bison
yacc语法规则部分和BNF类同
JavaCC 即 Java Compiler Compiler,是开源、轻量的语法分析器生成器和词法分析器生成器,采用纯 Java 编写
LL(*)解析器,而YACC和Bison都生成LALR解析器
"LL解析器自顶向下把树构造出来,而LR解析器自底向上构造
参考
https://github.com/antlr/grammars-v4
标签:LLVM,语言,编译,编译器,toml,组件,TOML,BNF
From: https://www.cnblogs.com/ytwang/p/18278278