一种面向数据加工DSL的代码翻译算法

简介: 背景面向数据加工领域的DSL(特定领域语言,Domain-Specific Language)无需使用者编写较为复杂的通常程序语言,具有较好的用户体验,应用较为广泛。如何将DSL翻译为机器可执行的程序是每种DSL均需面对的问题,并且传统的DSL翻译通常采用直译的方式,运行时执行效率较低。本文,提出一种面向数据加工领域语言的代码翻译算法,针对不同的DSL函数分别设计了代码翻译方案,不仅保证了语义的正

背景

面向数据加工领域的DSL(特定领域语言,Domain-Specific Language)无需使用者编写较为复杂的通常程序语言,具有较好的用户体验,应用较为广泛。如何将DSL翻译为机器可执行的程序是每种DSL均需面对的问题,并且传统的DSL翻译通常采用直译的方式,运行时执行效率较低。

本文,提出一种面向数据加工领域语言的代码翻译算法,针对不同的DSL函数分别设计了代码翻译方案,不仅保证了语义的正确性,而且翻译得到的运行时代码执行效率较高。

怎么实现的?

本文提出了一种面向数据加工领域语言的代码翻译算法,函数功能丰富,具有较广的应用场景,翻译DSL时兼顾了运行时的执行速度,数据处理能力好,吞吐率较高。系统模块设计分为三部分:语言设计、代码翻译、发布运行。

   A)语言设计,用于设计面向数据加工服务的特定领域语言。本步骤通过包含的5类基本函数(事件处理函数、值处理函数、操作符函数、资源池函数、类型相关函数)构成功能丰富的DSL,函数是此语言的基本组成单元。

事件处理函数表示处理当前事件的函数,此类函数均以e_开头,并且省略了表示“当前事件”的默认参数,比如:操作整个事件函数、操作事件某个属性的函数、字段提取函数和事件检查函数等等。

值处理函数表示处理值的函数,值可以是任意数据类型,此类函数的第一个参数均为“处理值”,比如:json提取函数、json转换函数、ip信息富化函数、正则表达式函数、

操作符函数表示通用的流程控制、算术计算、逻辑、数值比较等操作相关的函数,此类函数均以op_开头。

资源池函数表示可以将客户可以维护的外部资源加载到数据加工服务,同时提供了加载间隔时间以满足客户的实时性要求,加载的外部资源包含:数据库、阿里云OSS存储和阿里云SLS存储等等。

类型相关函数表示与数据类型紧密相关的函数,比如:类型转换函数、算术函数、字符串函数、日期时间函数、列表函数和字典函数等等。

   B)代码翻译,分析各个函数的所属类型及参数并将其翻译为运行时代码。本步骤在保证语义正确性的前提下,将DSL翻译为执行效率较高的运行时代码,以提升数据加工服务的吞吐率。

¬¬¬1.将DSL经过词法语法解析成为AST(抽象语法树,Abstract Syntax Tree)。

2.预处理,遍历抽象语法树,如果当前节点是为名称“v”函数且参数有且只有一个,则将函数名替换为“e_single_field_value”。“v”函数实现了取属性值功能,使用频度较高,当参数只有一个时,无需循环遍历参数列表,性能提升了30%。

3.常量检查,遍历抽象语法树,根据名称和参数设置函数“是否为常量函数名称const_func_name”、“是否所有参数均为常量const_attr”、“是否部分参数均为常量part_const_attr”。

(1)函数Call

如果函数名称为“str_format”,且第一个参数为常量字符串,则设置“是否部分参数均为常量part_const_attr”为True,否则设置“是否部分参数均为常量part_const_attr”为False。

如果函数名称为"json_select\regex\regex_select\regex_findall\regex_match\regex_replace\regex_split",且第二个参数为常量字符串,后面的其他参数也均为常量,则设置“是否部分参数均为常量part_const_attr”为True,否则设置“是否部分参数均为常量part_const_attr”为False。

如果函数名称为"e_set \ dt_fromtimestamp ",且所有参数均为常量,则设置“是否部分参数均为常量part_const_attr”为True,否则设置“是否部分参数均为常量part_const_attr”为False。

执行完上面的步骤已可以正确设置“是否部分参数均为常量part_const_attr”。

如果函数是事件处理函数、与当前时间相关的函数和需要定时更新的资源池函数,则设置“是否为常量函数名称const_func_name”为False,否则设置“是否为常量函数名称const_func_name”为True。

如果函数的参数不全为常量,则返回False,否则将“是否为常量函数名称const_func_name”作为结果返回。

(2)键值对keyword

如果值为变量名称,则返回False,否则返回True。

(3)其他类型

遍历所有的参数,如果参数类型为列表,则需遍历列表元素。如果所有参数遍历结果均为True,则设置“是否所有参数均为常量const_attr”为True,并返回True,否则设置设置“是否所有参数均为常量const_attr”为False,并返回False。

4.代码翻译,遍历抽象语法树,根据节点属性翻译为运行时代码。

如果函数名称为“op_and\op_or”,为实现逻辑操作短路,将上述两个函数翻译为if操作。

如果函数“是否所有参数均为常量const_attr”为True,或者“是否部分参数均为常量part_const_attr”为True,则分别对不同的函数类型进行公共模式初始化抽取,此部分只会在模式匹配过程中执行一次。比如:对于具有定时刷新功能的资源池函数res_rds_mysql\res_log_logstore_pull\res_oss_file则返回结果指针,然后通过读写锁实时更新资源池;对于超高频函数e_set,针对参数的个数和常量属性分别进行处理,所有的键值对均为常量则转换为KeyValueConstSetTransformer,所有的键均为常量则转换为KeyConstSetTransformer,其他情况转换为SetTransformer。

如果函数为扩展类函数,比如:e_split、e_coutput,需要将此类函数转换为迭代器循环访问。

如果函数“是否为常量函数名称const_func_name”和“是否所有参数均为常量const_attr”均为True,则表明此函数结果为常量,则可以提取为全局共享变量。

如果函数为“dt_now\dt_today”,且没有参数,则无需进行进行时区处理,则转化为"DtNowExpression\DtTodayExpression"。

同时,所有的事件处理函数都需要加表示当前事件的参数event。

代码翻译参照:

                              

C)发布运行,将代码翻译的结果和输入输出相结合,即可打包成为可以运行的应用程序。并且,此程序将定时发送运行日志到消息队列,继而监控程序读取消息队列里面的监控日志,最终生成方便客户使用的监控界面。

有哪些实际价值?

1)语义丰富:面向数据加工的领域语言支持二百多个函数,具有较为丰富的语义,能够应对广泛的数据加工应用需求。

2)执行速度快:针对不同的函数种类,分别进行了优化处理,尽量抽取数据加工只需执行一次的公共部分,提高了事件处理速度。

相关文章
|
4天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
14天前
|
存储 编解码 负载均衡
数据分片算法
【10月更文挑战第25天】不同的数据分片算法适用于不同的应用场景和数据特点,在实际应用中,需要根据具体的业务需求、数据分布情况、系统性能要求等因素综合考虑,选择合适的数据分片算法,以实现数据的高效存储、查询和处理。
|
16天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
18 3
|
14天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
14天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
27天前
|
机器学习/深度学习 人工智能 算法
"拥抱AI规模化浪潮:从数据到算法,解锁未来无限可能,你准备好迎接这场技术革命了吗?"
【10月更文挑战第14天】本文探讨了AI规模化的重要性和挑战,涵盖数据、算法、算力和应用场景等方面。通过使用Python和TensorFlow的示例代码,展示了如何训练并应用一个基本的AI模型进行图像分类,强调了AI规模化在各行业的广泛应用前景。
29 5
|
28天前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
28天前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
18天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
27 0
|
20天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
16 0