1.PASO:一个基于网页的solidity语言分析器
2.和昊昊聊前端转译器之parser综合篇
3.领域特定语言设计技巧
4.MySQL Shell 8.0.32 for GreatSQL编译二进制包
PASO:一个基于网页的solidity语言分析器
智能合约的守护者:PASO——Web版Solidity语言分析器智能合约,作为分布式账本上的数字合同,正日益成为商业逻辑的核心执行者。其中,Solidity以其广泛流行,主导了以太坊区块链上的德州扑克php源码编程。然而,随着Solidity语言的迅速迭代,确保其代码质量成为开发者的重要任务。在这个背景下,一款强大的分析工具PASO应运而生,它是一款基于网页的Solidity语言分析器,让专业程序员能够轻松评估智能合约的品质。
PASO的诞生源于对现有工具的挑战。市面上的Pharo Solity Parser和SolMet虽然在某些方面有所贡献,但它们依赖本地安装,部署繁琐,无法实时跟踪Solidity和以太坊EVM的快速更新。PASO则是为了解决这一痛点,它作为一个网页应用,无需用户安装,只需通过浏览器就能获取智能合约的软件度量结果,适应了Solidity语言的实时性要求。 PASO的构建灵感来源于软件工程中的度量原则,即“你无法管理你没有度量的事物”。它由四个关键组件组成:Solidity语法,PASO解析器,度量模块,以及直观易用的GUI。Solidity语法部分,通过ANTLR4的细致表达,精确捕捉语言结构。PASO解析器则通过Parser Generator生成,解析源代码,构建出解析树,展示了代码的语法结构,非终端节点和终端节点的细致划分,确保了代码分析的准确性。 度量模块是PASO的核心,它将通用度量与Solidity特有的matlab源码隐藏特性结合,为智能合约提供全面的评估。每个度量指标都有清晰的解释,为开发者提供了深入理解代码质量的窗口。GUI部分,虽然未详细展开,但无疑是提升用户体验的关键,它将复杂度量结果以用户友好的方式呈现。 PASO的实现,是对Web技术在智能合约分析领域的创新应用。通过ANTLR,它实现了跨语言解析器的生成,使得JavaScript解析器与GUI无缝协作。与传统的本地工具相比,PASO的优势在于其灵活性和易用性,用户无需额外安装,只需通过简单的网页访问,即可获取实时的度量结果。 然而,PASO的潜力远不止于此。尽管本文讨论的指标尚有限,但PASO代表了未来基于Web的智能合约分析工具的先驱。随着深度研究的推进,PASO有望扩展其功能,提供更全面的度量指标,为开发者提供更深入的洞察,为用户提供更直观的分析体验,从而推动智能合约编程的持续优化和提升。和昊昊聊前端转译器之parser综合篇
昊昊,你了解前端领域的转译器吗?
昊昊:转译器(transpiler)在前端领域用途广泛,比如babel、typescript、terser、eslint、prettier、postcss、posthtml、vue template compiler等。
我:这些转译器包括了大部分,还有像taro、oled时钟源码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这三个阶段,纵向对比各种转译器的pipe实现源码实现。
先从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,它速度更快,1100的源码支持新语法,并且支持插件扩展,全面超越了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 )好友,待社区助手拉您进群。