1.如何在github看源代码学习呢?源码阅读
2.Github 源码阅读神器推荐
3.TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现
4.如何轻松阅读github上的项目源码?
5.浏览 GitHub 太卡了?教你两招!||CSDN博客精选
6.小技巧丨加1s,源码阅读像在 VSCode 那样看 GitHub 的源码阅读源码
如何在github看源代码学习呢?
学习GitHub上的源代码并非仅仅是阅读,而是源码阅读要通过运行和调试来深入理解其中的原理。以Node.js为例,源码阅读其源码在Windows 7环境下使用Visual Studio 编译和调试相对简单。源码阅读许老师 lcr 源码
首先,源码阅读从GitHub上克隆源码至本地或下载压缩包。源码阅读
接着,源码阅读利用源码自带的源码阅读vcbuild.bat脚本生成完整的VS项目解决方案文件。
然后,源码阅读使用Visual Studio 打开生成的源码阅读node.sln解决方案文件,将Node设为主项目,源码阅读即可开始编译和调试。源码阅读
通过这个过程,源码阅读可以探索多种问题并有所侧重。学习顶尖开发人员的作品有助于快速提升技能,但付出的努力与汗水会成倍增长。我的学习经历始于一年半前接触Node.js,现在主要项目依赖其完成。分析Node.js的实现机制让我受益匪浅,但最初我并未从实现机制入手自底向上学习,而是自顶向下先学习API的使用方法,并适度查看代码。这样的学习方式更具方向性,与需求紧密结合,易于取得成就感,从而能持续下去。
Github 源码阅读神器推荐
一款高效阅读和学习源码的开源项目,source-code-hunter(doocs.github.io/source-code-hunter),为源码阅读爱好者提供便利。物流系统源码开发
借助source-code-hunter,用户能够系统化阅读各种框架的源码,包括spring全家桶、Mybatis系列、Netty、dubbo等,以及中间件、JDK源码解析。
该项目为初学者和源码学习者提供了学习心得,帮助他们建立学习模式,避免无用阅读,加速学习进程。
对于没有源码阅读经验的用户,建议先阅读学习心得,了解学习方法和思考。在日常学习中,先通过视频了解源码的大致设计和功能点,再结合source-code-hunter阅读源码,同时使用本地调试跟踪实现,提升学习效率。
source-code-hunter涵盖了常见框架的源码解析,为用户提供了丰富的学习资源,帮助用户深入理解源码逻辑,提高编程技能。
TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现
本文是 TiDB 源码阅读系列文章的第五篇,主要内容围绕 SQL Parser 功能实现进行讲解。内容源自社区伙伴马震(GitHub ID:mz)的投稿。系列文章的目的是与数据库研究者及爱好者深入交流,收到了社区的积极反馈。后续,科技公司OA源码期待更多伙伴加入 TiDB 的探讨与分享。
TiDB 的源码阅读系列文章,帮助读者系统性地学习 TiDB 内部实现。最近的《SQL 的一生》一文,全面阐述了 SQL 语句处理流程,从接收网络数据、MySQL 协议解析、SQL 语法解析、查询计划制定与优化、执行直至返回结果。
其中,SQL Parser 的功能是将 SQL 语句按照 SQL 语法规则进行解析,将文本转换为抽象语法树(AST)。此功能需要一定背景知识,下文将尝试介绍相关知识,以帮助理解这部分代码。
TiDB 使用 goyacc 根据预定义的 SQL 语法规则文件 parser.y 生成 SQL 语法解析器。这一过程可在 TiDB 的 Makefile 文件中看到,通过构建 goyacc 工具,使用 goyacc 依据 parser.y 生成解析器 parser.go。
goyacc 是 yacc 的 Golang 版本,因此理解语法规则定义文件 parser.y 及解析器工作原理之前,需要对 Lex & Yacc 有所了解。Lex & Yacc 是用于生成词法分析器和语法分析器的工具,它们简化了编译器的编写。
下文将详细介绍 Lex & Yacc 的工作流程,以及生成解析器的过程。我们将从 Lex 根据用户定义的 patterns 生成词法分析器,词法分析器读取源代码并转换为 tokens 输出,以及 Yacc 根据用户定义的邮箱群发送源码语法规则生成语法分析器等角度进行阐述。
生成词法分析器和语法分析器的过程,用户需为 Lex 提供 patterns 的定义,为 Yacc 提供语法规则文件。这两种配置都是文本文件,结构相同,分为三个部分。我们将关注中间规则定义部分,并通过一个简单的例子来解释。
Lex 的输入文件中,规则定义部分使用正则表达式定义了变量、整数和操作符等 token 类型。例如整数 token 的定义,当输入字符串匹配正则表达式时,大括号内的动作会被执行,将整数值存储在变量yylval 中,并返回 token 类型 INTEGER 给 Yacc。
而 Yacc 的语法规则定义文件中,第一部分定义了 token 类型和运算符的结合性。四种运算符都是左结合,同一行的运算符优先级相同,不同行的运算符,后定义的行具有更高的优先级。语法规则使用 BNF 表达,大部分现代编程语言都可以使用 BNF 表示。
表达式解析是生成表达式的逆向操作,需要将语法树归约到一个非终结符。Yacc 生成的语法分析器使用自底向上的归约方式进行语法解析,同时使用堆栈保存中间状态。通过一个表达式 x + y * z 的解析过程,我们可以理解这一过程。RPG游戏源码java
在这一过程中,读取的 token 压入堆栈,当发现堆栈中的内容匹配了某个产生式的右侧,则将匹配的项从堆栈中弹出,将该产生式左侧的非终结符压入堆栈。这个过程持续进行,直到读取完所有的 tokens,并且只有启始非终结符保留在堆栈中。
产生式右侧的大括号中定义了该规则关联的动作,例如将三项从堆栈中弹出,两个表达式相加,结果再压回堆栈顶。这里可以使用 $position 的形式访问堆栈中的项,$1 引用第一项,$2 引用第二项,以此类推。$$ 代表归约操作执行后的堆栈顶。本例的动作是将三项从堆栈中弹出,两个表达式相加,结果再压回堆栈顶。
在上述例子中,动作不仅完成了语法解析,还完成了表达式求值。一般希望语法解析的结果是一颗抽象语法树(AST),可以定义语法规则关联的动作。这样,解析完成时,我们就能得到由 nodeType 构成的抽象语法树,对这个语法树进行遍历访问,可以生成机器代码或解释执行。
至此,我们对 Lex & Yacc 的原理有了大致了解,虽然还有许多细节,如如何消除语法的歧义,但这些概念对于理解 TiDB 的代码已经足够。
下一部分,我们介绍 TiDB SQL Parser 的实现。有了前面的背景知识,对 TiDB 的 SQL Parser 模块的理解会更易上手。TiDB 使用手写的词法解析器(出于性能考虑),语法解析采用 goyacc。我们先来看 SQL 语法规则文件 parser.y,这是生成 SQL 语法解析器的基础。
parser.y 文件包含 多行代码,初看可能令人感到复杂,但该文件仍然遵循我们之前介绍的结构。我们只需要关注第一部分 definitions 和第二部分 rules。
第一部分定义了 token 类型、优先级、结合性等。注意 union 结构体,它定义了在语法解析过程中被压入堆栈的项的属性和类型。压入堆栈的项可能是终结符,也就是 token,它的类型可以是 item 或 ident;也可能是非终结符,即产生式的左侧,它的类型可以是 expr、statement、item 或 ident。
goyacc 根据这个 union 在解析器中生成对应的 struct。在语法解析过程中,非终结符会被构造成抽象语法树(AST)的节点 ast.ExprNode 或 ast.StmtNode。抽象语法树相关的数据结构定义在 ast 包中,它们大都实现了 ast.Node 接口。
ast.Node 接口有一个 Accept 方法,接受 Visitor 参数,后续对 AST 的处理主要依赖这个 Accept 方法,以 Visitor 模式遍历所有的节点以及对 AST 做结构转换。例如 plan.preprocess 是对 AST 做预处理,包括合法性检查以及名字绑定。
union 后面是对 token 和非终结符按照类型分别定义。第一部分的最后是对优先级和结合性的定义。文件的第二部分是 SQL 语法的产生式和每个规则对应的 aciton。SQL 语法非常复杂,大部分内容都是产生式的定义。例如 SELECT 语法的定义,我们可以在 parser.y 中找到 SELECT 语句的产生式。
完成语法规则文件 parser.y 的定义后,使用 goyacc 生成语法解析器。TiDB 对 lexer 和 parser.go 进行封装,对外提供 parser.yy_parser 进行 SQL 语句的解析。
最后,我们通过一个简单的例子,使用 TiDB 的 SQL Parser 进行 SQL 语法解析,构建出抽象语法树,并通过 visitor 遍历 AST。我实现的 visitor 只输出节点的类型,运行结果依次输出遍历过程中遇到的节点类型。
了解 TiDB SQL Parser 的实现后,我们有可能实现当前不支持的语法,如添加内置函数。这为我们学习查询计划以及优化打下了基础。希望这篇文章对读者有所帮助。
作者介绍:马震,金蝶天燕架构师,负责中间件、大数据平台的研发,今年转向 NewSQL 领域,关注 OLTP/AP 融合,目前在推动金蝶下一代 ERP 引入 TiDB 作为数据库存储服务。
如何轻松阅读github上的项目源码?
在探索GitHub上的项目源码时,利用插件可大幅提升浏览体验。首先,推荐SourceGraph插件,它能够提供文件树浏览与定义跳转功能,还支持引用跳转。在Chrome浏览器上安装SourceGraph插件后,打开任意GitHub项目,点击页面上的SourceGraph图标,即可浏览项目文件,并进行快速搜索,其界面功能与IDE相似,操作便捷,无需本地克隆代码,方便快捷。
此外,针对下载特定仓库中部分代码的需求,可以使用GitZip插件。此插件可帮助用户快速下载项目中的单个子文件夹代码,无需克隆整个仓库。只需在目标子文件夹上右键点击,选择"Download"选项,即可轻松下载所需代码。两个插件配合使用,轻松应对GitHub项目源码浏览与代码下载问题。
浏览 GitHub 太卡了?教你两招!||CSDN博客精选
在国内使用GitHub时遇到卡顿问题?不用担心,这里有两招让你在线查看项目源码更加便捷!
首先,推荐两个浏览器插件:SourceGraph和Octotree。SourceGraph是一个功能强大的开源工具,不仅支持Chrome和Firefox,还包括VSCode、JetBrains全家桶等众多开发工具。它集代码查看、代码审查和搜索于一体,是开发者的好帮手。如果你在国内网络不畅,可以在公众号回复"sourcegraph"获取离线安装包。安装后,只需在GitHub项目上点击SourceGraph图标,就能像使用IDE一样浏览和搜索代码。
而Octotree则以树形结构展示GitHub项目代码,方便查看和下载单个文件,无需下载整个项目。对于Chrome用户,同样提供离线安装包,搜索"Octotree"并安装即可在浏览器右上角看到插件图标。使用时,点击文件名前的图标,即可单独查看文件内容。
这两个神器能让你在GitHub上浏览项目源码的体验大大提升,不妨试试看。立即体验,提升你的代码阅读效率吧!
小技巧丨加1s,像在 VSCode 那样看 GitHub 的源码
项目介绍:github1s
github1s 是一个开源项目,拥有 k+ 星标,其独特功能在于允许用户在浏览器中以类似 VSCode 的方式查看 GitHub 源码,无需额外克隆操作。
使用指南:浏览器访问 GitHub 项目页面。
在项目 URL 后添加 "1s",例如:github1s.com/conwnet/gi...
回车后,页面会自动转换为 Web 版本的 VSCode 环境,展示项目源码。
通过右键点击目录或文件,用户还能实现快速下载功能。
只需记住 "1s"(一秒记住),即可轻松在浏览器中高效查看和管理 GitHub 源码。