Spark SQL 编译原理

写在前面的话:因为本人在职,所以没有充分的时间写博客,所以经常是写好整个框架,再陆陆续续的补充修改。所以如果发现什么错误请留言。

正如大家了解的一样,SparkSQL 它其实是一个SQL的编译器,跟普通数据库不同的是它的底层使用的HDFS存储,使用Spark Core进行计算。
SparkSQL看了一部分下来,发现自己在编译原理这一领域的知识有所欠缺,现在开始补习一下。
题目叫Spark SQL编译原理,可能有蹭热度的嫌疑,因为本文只会将两个部分,一是编译原理基础知识,二是Spark-SQL的编译过程概述。如果对本文期待很高的同学,请绕道。

编译原理基础知识

编译器首先也是一种电脑程序。它会将用某种编程语言写成的源代码(原始语言),转换成另一种编程语言(传说中的汇编语言)。
这里需要说明一下程序语言的两种编译形态。一种是先翻译,再执行(如:Java,C++);另外一种就是执行到哪里就翻译到哪里(如:Python,Shell)。下图是一个示意图。
Spark SQL 编译原理_第1张图片

编译过程概述

无论是哪一种语言都躲不开编译器基本原理的这几个过程,词法分析,语法分析,语义分析中间代码生成等过程。
Spark SQL 编译原理_第2张图片
上图是编译的过程图,一个高级程序语言(C++,Java等)写出来的程序,在提交给编译器后需要经过的处理过程。

  1. 词法分析:词法分析的输入是源程序,输出是识别出的记号流.目的是识别单词. 至少分以下几类:关键字(保留字)、标识符、字面量、特殊符号
  2. 语法分析: 输入是词法分析器返回的记号流,输出是语法树.目的是得到语言结构并以树的形式表示.对于声明性语句,进行符号表的查填,对于可执行语句,检查结构合理的表达式运算是否有意义.
  3. 语义分析:根据语义规则对语法树中的语法单元进行静态语义检查,如类型检查和转换等,目的在于保证语法正确的结构在语义分析上也是合法的.
  4. 中间代码生成(可选):生成一种既接近目标语言,又与具体机器无关的表示,便于代码优化与代码生成。(Spark SQL里生成了可以被SparkCore执行的Scala程序)
    (到这里为止,编译器与解释器基本一致)
  5. 中间代码优化(可选):局部优化、循环优化、全局优化等;优化实际上是一个等价变换,变换前后的指令序列完成同样的功能,但在占用的空间上和程序执行的时间上都更省、更有效
  6. 目标代码生成:不同形式的目标代码—汇编语言形式、可重定位二进制代码形式、内存形式(Load-and-Go)
  7. 符号表管理:合理组织符号,便于各阶段查找\填写等.
  8. 出错处理
    词法错误:指非法字符或拼写错关键字、标识符等
    语法错误:指语法结构出错,如少分号、括号不匹配、begin/end不配对等
    静态语义错误:如类型不一致、参数不匹配等
    动态语义错误(逻辑错误):如死循环、变量为零时作除数等
    下面具体看几个比较重要的编译过程。

词法分析

词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理(去除注释、无用的回车,换行找到包含的文件等)之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别是标识符、保留字、常数、运算符、界符。以便为下面的语法分析和语义分析做准备。

语法分析

这里做个对比:词法分析是一种记号的集合,字符串由字母组成,是线性结构,而语法分析则是句子的集合,句子由记号组成,非线性结构(树)。在SparkSQl中是以逻辑执行计划树表现出来的。
首先词法分析将SQL语句按照设定的词法规则分拆成为特定的词元(Token),并在词元分拆的基础上进行相应的语法分析(主要依据设定的语法规则进行),最后将符合词法与语法要求的LSQL转换成为由若干词元形成的AST(抽象语法树 Abstract SyntaxTree)对象。

语义分析

语法是指语言的结构、即语言的“样子”,而语义是指附着于语言结构上的实际含意,即语言的“意义”。一个语法上正确的句子,它所表达的意义并不一定正确。

SparkSQL 编译过程

你可能感兴趣的:(学习笔记,Hadoop生态圈学习,Hive学习,SparkSQL,源码阅读笔记)