皮皮网

【淘宝代付源码】【redfire源码】【stickylistview 源码】antlr 源码

来源:人事资料源码 时间:2024-11-24 22:31:24

1.PASO:一个基于网页的solidity语言分析器
2.和昊昊聊前端转译器之parser综合篇
3.领域特定语言设计技巧
4.MySQL Shell 8.0.32 for GreatSQL编译二进制包

antlr 源码

PASO:一个基于网页的solidity语言分析器

       智能合约的守护者:PASO——Web版Solidity语言分析器

       智能合约,作为分布式账本上的数字合同,正日益成为商业逻辑的核心执行者。其中,Solidity以其广泛流行,主导了以太坊区块链上的淘宝代付源码编程。然而,随着Solidity语言的迅速迭代,确保其代码质量成为开发者的重要任务。在这个背景下,一款强大的分析工具PASO应运而生,它是一款基于网页的Solidity语言分析器,让专业程序员能够轻松评估智能合约的品质。

       PASO的诞生源于对现有工具的挑战。市面上的Pharo Solity Parser和SolMet虽然在某些方面有所贡献,但它们依赖本地安装,部署繁琐,无法实时跟踪Solidity和以太坊EVM的快速更新。PASO则是为了解决这一痛点,它作为一个网页应用,无需用户安装,只需通过浏览器就能获取智能合约的软件度量结果,适应了Solidity语言的实时性要求。

       PASO的构建灵感来源于软件工程中的度量原则,即“你无法管理你没有度量的事物”。它由四个关键组件组成:Solidity语法,PASO解析器,度量模块,以及直观易用的GUI。Solidity语法部分,通过ANTLR4的细致表达,精确捕捉语言结构。PASO解析器则通过Parser Generator生成,解析源代码,构建出解析树,展示了代码的语法结构,非终端节点和终端节点的细致划分,确保了代码分析的准确性。

       度量模块是PASO的核心,它将通用度量与Solidity特有的redfire源码特性结合,为智能合约提供全面的评估。每个度量指标都有清晰的解释,为开发者提供了深入理解代码质量的窗口。GUI部分,虽然未详细展开,但无疑是提升用户体验的关键,它将复杂度量结果以用户友好的方式呈现。

       PASO的实现,是对Web技术在智能合约分析领域的创新应用。通过ANTLR,它实现了跨语言解析器的生成,使得JavaScript解析器与GUI无缝协作。与传统的本地工具相比,PASO的优势在于其灵活性和易用性,用户无需额外安装,只需通过简单的网页访问,即可获取实时的度量结果。

       然而,PASO的潜力远不止于此。尽管本文讨论的指标尚有限,但PASO代表了未来基于Web的智能合约分析工具的先驱。随着深度研究的推进,PASO有望扩展其功能,提供更全面的度量指标,为开发者提供更深入的洞察,为用户提供更直观的分析体验,从而推动智能合约编程的持续优化和提升。

和昊昊聊前端转译器之parser综合篇

       昊昊,你了解前端领域的转译器吗?

       昊昊:转译器(transpiler)在前端领域用途广泛,比如babel、typescript、terser、eslint、prettier、postcss、posthtml、vue template compiler等。

       我:这些转译器包括了大部分,还有像taro、stickylistview 源码uniapp这样的基于上述转译器的小程序转译器。当然,也有用rust写的类似babel的swc,以及用go写的esbuild自带的js transpiler,这些不是js写的,我们先不讨论。

       昊昊:转译器的实现原理是什么?

       我:转译器是源码转源码,大致分为三个步骤:parse、transform、generate。

       第一步,parse,将源码解析为抽象语法树AST,通过树形结构记录源码信息,以便计算机理解。

       第二步,transform,解析源码后,进行各种转换,转译器主要工作是转换,对AST进行目的不同的增删改。

       第三步,generate,转换后的AST进行递归打印,生成新的代码,并生成源码和目标源码关联关系的sourcemap。

       虽然三个阶段大同小异,但具体名字可能不同,例如vue template compiler中将transform称为optimize,强调优化渲染的转换;postcss第三步被称为stringifier。

       昊昊:你能详细讲讲parse、transform、generate三个阶段吗?

       我:当然,转译器都分为这三个阶段,我们换个角度,分别深入分析parse、transform、generate这三个阶段,纵向对比各种转译器的meitulu源码实现。

       先从JS Parser开始。昊昊,你认为为什么用JS写JS Parser?

       昊昊:是因为前端工程化,有了node后,可以用js写js代码的工具链,包括语法转换、压缩混淆、打包工具等,这些都需要Parser的支持。

       我:确实,工程化工具链驱动了Parser的需求。最早的JS写的Parser是esprima,当时Mozilla公布了SpiderMonkey JS引擎的Parser API和AST标准。esprima基于此实现了Parser。后来形成了estree标准,这是对SpiderMonkey AST的兼容和扩展,最早的实现是esprima。Terser文档中将其称为SpiderMonkey AST。

       昊昊:SpiderMonkey API是参照物,estree是对它的兼容和扩展,最早的实现是esprima。

       我:对,有了esprima这个Parser,许多JS转译工具可以基于它进行开发,比如eslint。eslint早期基于esprima,发展顺利。但随着JS到ES6后,更新速度加快,esprima更新跟不上,导致eslint用户频繁抱怨。于是eslint fork了一份esprima,扩展语法,形成espree,espree自立门户,但也遵循estree标准。后来社区迎来了更快的JS Parser,如acorn,它速度更快,党课源码支持新语法,并且支持插件扩展,全面超越了esprima。因此,大量之前基于esprima的工具改用acorn,其中当然包括eslint,在espree2.0后,底层的Parser实现改为acorn。

       acorn的插件机制允许开发者扩展新语法,比如创建一个关键字ssh,实现ssh;使用,这需要注册关键字、注册新语法类型,并在Parser中覆盖相关方法。实现方式并不复杂,完整代码展示了这一过程。

       昊昊:acorn可以扩展新语法,是怎么实现的?

       我:通过acorn插件实现新语法扩展,插件是一个函数,接受旧Parser,返回继承旧Parser的新Parser。新Parser通过重写方法实现扩展。这里以ssh关键字为例,首先修改构造器注册ssh关键字,然后在Parser中注册新语法类型。在parse逻辑中判断是否处理ssh关键字,并进入自定义解析逻辑。实现新语法扩展并不难。

       昊昊:acorn插件机制很棒,还能扩展新语法。除了acorn,还有其他JS Parser有插件机制吗?

       我:印象中没有,如esprima、typescript等没有语法插件,这种扩展只能等待官方实现。

       昊昊:babel、espree等基于acorn,它们做了哪些改动和扩展?

       我:espree仅增加了一些属性,保持estree兼容性。而@babel/parser除了添加节点属性,还扩展了许多新节点,不兼容estree标准,主要修改包括新增节点定义、属性添加等。

       昊昊:其他JS转译器,如prettier、terser的Parser是什么?

       我:prettier基于@babel/parser和typescript,terser有自己的AST标准。terser使用自己标准的原因是其AST方法丰富,有继承关系,而estree标准的AST仅是数据结构。改动成本大,所以terser没有改变。详细原因可以查看官方文章。

       昊昊:其他转译器的Parser?

       我:CSS转译器流行的是postcss,用于增强CSS能力的less、sass等与postcss这类专业转译器定位不同。postcss支持插件机制,默认支持CSS语法扩展。接下来在postcss语法插件中应用一个acorn语法插件,实现CSS支持新JS语法。

       昊昊:把JS新语法编译到CSS,很酷。

       我:不仅是Parser,stringifier也能自定义,比如实现语法高亮等。

       昊昊:HTML的Parser呢?

       我:HTML的Parser与CSS类似,支持各种模板引擎编译为HTML。主要转译器是postcss,其Parser使用htmlparser2。流程与postcss相似,但不支持语法扩展插件,仅支持转换插件。可以拿到某个节点后获取内容,自行解析生成HTML AST,如Markdown转HTML、模板引擎转HTML等。

       昊昊:感觉Parser种类繁多,既有acorn、htmlparser2、postcss等通用Parser,也有各种转译器自带的Parser。

       我:学习时不要只关注使用,了解Parser类型拓宽视野。深入学习Parser需要理解词法分析和语法分析,而不是学习某个Parser的使用。通常不会手写复杂的Parser,比如HTML Parser,可以用如ANTLR的Parser生成器。

       转译的开始在解析阶段,之后的转换与生成才是重头戏。

领域特定语言设计技巧

       领域特定语言(Domain-Specific Language,DSL)专注于特定领域的计算机语言,其设计旨在简化复杂领域中的问题解决过程。在设计领域特定语言时,有几个关键的技巧和步骤,以下将探讨这些要点。

       首先,理解领域特定语言的定义:领域特定语言是一种专注于特定应用程序领域的语言,它既可编译也可解释执行。与通用编程语言相比,领域特定语言的源代码在经过编译后通常不会直接生成可执行程序,但可以转换为兼容核心应用程序操作环境的资源或通用编程语言。这种设计允许领域特定语言更加聚焦于特定问题的解决。

       在设计领域特定语言时,应注意以下几点:

       1. **简化业务呈现**:领域特定语言旨在简化业务场景的描述,通过特定的呈现模式解析源代码,转化为所需的数据结构。

       2. **定义数据结构**:在设计领域特定语言时,关注于定义数据结构,这一步骤与通用语言的编译过程类似,但领域特定语言的中间表示形式通常对应于实际需要的数据结构。

       3. **提炼领域特定名词**:通过与领域专家合作,从领域知识中提炼名词,这与领域驱动设计(Domain-Driven Design,DDD)中的问题域提炼过程相似,目的是获得更准确、专业的领域特定语言。

       4. **从用例开始**:与领域专家协作,从具体的业务用例出发,理解用户在特定场景下的操作流程,从而设计统一的语言。用例描述了达到目标所需的步骤,包括用户与系统之间的交互。

       5. **关键字、值和属性的提取**:基于用例,提取关键信息,如关键字、值、属性等,为后续设计提供基础。

       6. **关联关系与语法设计**:设计领域特定语言时,关注领域内名词之间的关系,以及如何通过语法准确表达这些关系。这包括考虑领域内类之间的关系,如继承、实现等。

       7. **实现用例与简化设计**:实现用例的过程应遵循人类思维习惯,力求简化设计,同时保留足够的信息,以供未来维护和理解。

       8. **使用解析器生成器**:在设计领域特定语言时,通常使用解析器生成器,如ANTLR、Lex & Yacc等工具,来自动化实现语言的解析,减轻开发人员的负担。

       9. **测试驱动开发与自动化语言迁移**:采用测试驱动开发(Test-Driven Development,TDD)方法,确保语言设计覆盖所有可能的场景,并能适应未来的需求变化。同时,考虑自动化语言迁移策略,以提高系统的可维护性和适应性。

       领域特定语言设计的核心在于聚焦特定领域的解决方案,通过精简的表达和高效的数据结构,提升复杂问题的处理效率。通过遵循上述技巧和步骤,开发者能够更有效地设计和实现领域特定语言,以满足特定业务领域的复杂需求。

MySQL Shell 8.0. for GreatSQL编译二进制包

       构建MySQL Shell 8.0. for GreatSQL

       写在前面

       之前已经写过一篇前传 MySQL Shell 8.0. for GreatSQL编译安装,最近再次编译MySQL Shell二进制包时,发现了一些新问题,因此重新整理更新本文档。

       几处新问题

       这次编译MySQL Shell发现几个新问题,下面一一列举。

       针对这些情况,为了方便社区用户,我直接将整个二进制包编译工作打包成Docker镜像,有需要的直接拉取镜像创建容器,只需耐心等上几分钟即可得到MySQL Shell for GreatSQL二进制包了。

       使用方法很简单,类似下面这样即可:

       接下来回退到宿主机,将容器中的二进制包拷贝出来

       然后解压缩,就可以在宿主机环境下使用了。

       说完用Docker容器构建二进制包的方法,再说下手动编译全过程,有兴趣的同学也可以跟着自己动手做一遍,增加体感。

       手动编译过程

       2.1 准备Docker环境

       参考编译环境要求参考 GreatSQL-Shell Dockerfile ,构建好一个Docker镜像环境,基本上照着做就行,这里不赘述。

       2.2 下载源码包

       先下载准备好下列几个源码包:

       下载完后都放在/opt/ 目录下,并解压缩。

       2.3 修改MySQL Shell源码包

       打开链接: gitee.com/GreatSQL/Grea...,下载GreatSQL补丁包文件 mysqlsh-for-greatsql-8.0..patch。

       为了让MySQL Shell支持GreatSQL仲裁节点(ARBITRATOR)特性,需要打上补丁包:

       2.4 编译相关软件包1..1 antlr4-4.

       编译antlr4:

       如果你的网络环境无法直接从github上下载二进制包,则先自行下载二进制包 github.com/google/googl...,并放到antlr4代码包中相应位置,再修改antlr4代码,略过下载步骤,详见下面的做法:

       之后就可以用上面的方法进行编译,而不会在下载二进制包环节卡住不动。

       2.4.2 patchelf-0..5

       2.4.3 protobuf-3..4

       2.4.4 rpcsvc-proto-1.4

       编译MySQL Shell

       3.1 编译MySQL 8.0.

       在MySQL 8.0.源码目录中,编译生成MySQL客户端相关依赖库,这是编译MySQL Shell之前要先做的事:

       3.2 编译MySQL Shell 8.0. for GreatSQL

       编译完MySQL 8.0.后,切换到MySQL Shell源码目录下,准备继续编译:

       编译完成后,会把二进制文件安装到/usr/local/greatsql-shell-8.0.--Linux-glibc2.-x_ 目录下。

       3.3 运行测试

       运行mysqlsh测试前,还要先将libprotobuf.so动态库文件拷贝放到MySQL Shell目录下,再运行测试:

       好了,开始感受GreatSQL 8.0.-新版本特性,以及MGR仲裁节点的魅力吧 O(∩_∩)O哈哈~

       延伸阅读

       本文完。

       Enjoy GreatSQL :)

       关于GreatSQL

       GreatSQL数据库是一款开源免费数据库,可在普通硬件上满足金融级应用场景,具有高可用、高性能、高兼容、高安全等特性,可作为MySQL或Percona Server for MySQL的理想可选替换。

       相关链接

       GreatSQL社区

       Gitee

       GitHub

       Bilibili

       技术交流群

       微信:添加GreatSQL社区助手好友,微信号wanlidbc发送验证信息加群

       QQ群:

       Enjoy GreatSQL :)

       关于 GreatSQL

       GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

       相关链接: GreatSQL社区 Gitee GitHub Bilibili

       GreatSQL社区:

       社区有奖建议反馈: greatsql.cn/thread--1...

       社区博客有奖征稿详情: greatsql.cn/thread--...

       (对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

       技术交流群:

       微信&QQ群:

       QQ群:

       微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。