本发明专利技术公开了一种类java语言基于JVM的函数式编程语法实现方法,包括以下具体步骤:S1:语法解析,转化为语法中间表示层对象,S2:在解析的过程中,将代码分解为左侧表达式、符号和右侧表达式三部分,S3:解析符号。本发明专利技术通过语法解析,将公式分为左侧表达式、符号和右侧表达式三个部分,先对左侧表达式进行处理并通过右侧表达式推断出类型以及赋予默认值,然后再对右侧表达式进行处理,避免了空指针错误的发生,让使用平台的非专业人员可配置处高质量无空指针的逻辑,提高了平台操作的便捷性。提高了平台操作的便捷性。提高了平台操作的便捷性。
【技术实现步骤摘要】
一种类java语言基于JVM的函数式编程语法实现方法
[0001]本专利技术涉及程序语言编译
,特别涉及一种类java语言基于JVM的函数式编程语法实现方法。
技术介绍
[0002]java语言通过JVM虚拟机技术实现了跨平台特性,通过一套字节码作为中间表示层,在运行时翻译成目标平台的机器码执行。在此基础上业界诞生了许多基于JVM的前端语言,例如kotlin、scala、groovy。JVM在执行字节码时主要是通过栈进行解释执行的,通过局部变量表、操作数栈来存取修改数据。
[0003]class文件是一种文件格式作为JVM的标准执行输入,定义了一套承载字节码的二进制规范。
[0004]Antlr是一个语言工具,可以将符合BNF范式的语法自动生成对应的词法语法解析器。
[0005]ASM是一个通用java字节码操作框架,常用在动态系统中使用,同样也可以用于编译器中,例如OpenJDK中lambda表达式的实现、Groovy编译器 、Kotlin编译器。
[0006]IR Node 中间表示层是在编译中常见的与机器无关的抽象,通过中间表示层保留的信息可以对代码进行机器无关的优化。
[0007]qLang作为java的分叉语言,用于启业云平台图形化低代码编程,可以将用户生成的图形化配置编译成qLang语言最终生成目标class或其他目标语言。
[0008]空指针错误是基于jvm虚拟机语言编程中最常见的错误之一,由于低代码平台的通用性,平台的目标用户通常不是专业的技术人员,空指针异常更容易产生,因此需要一种方法使得用户无需了解直接配置出高质量无空指针的逻辑。
技术实现思路
[0009]本专利技术的目的在于提供一种类java语言基于JVM的函数式编程语法实现方法,以解决上述
技术介绍
中提出的问题。
[0010]为实现上述目的,本专利技术提供如下技术方案:一种类java语言基于JVM的函数式编程语法实现方法,包括以下具体步骤:S1:语法解析,转化为语法中间表示层对象。
[0011]S2:在解析的过程中,将代码分解为左侧表达式、符号和右侧表达式三部分。
[0012]S3:解析符号,处理步骤如下:S31:对左侧表达式进行处理,计算出左侧表达式在locals中的位置x,并根据左侧表达式推断出类型添加load指令。
[0013]S32:解析符号,对符号左侧执行判断是否为null的跳转指令。
[0014]S33:此时会生成一个跳转标记label1和一个跳出标记label2,写入非null跳转指令ifnonull label1。
[0015]S34:左侧表达式为null时顺序执行,此时需要根据左侧表达式推断出类型所占字节长度写入pop、pop2,将load_x在栈内的值弹出。
[0016]S35:根据右侧表达式推断出的类型赋予默认值。
[0017]S36:此时左侧表达式为null的情况已执行完,需要写入无条件跳转指令goto label2,并标记label1为当前所在位置。
[0018]S37:对右侧表达式进行处理,根据方法调用和对象引用写入正常调用指令。
[0019]S38:整体表达式已执行完,标记label2为当前所在位置,此位置表示表达式整体执行结束。
[0020]优选的,在所述步骤S31中,每当解析到一组{}时,qLang编译器会生成一个对应的作用域对象,同时在当前作用域里的IR Node都会持有此作用域的引用,当解析到定义节点时会将定义的类型和变量名称记录到当前作用域中。
[0021]优选的,在所述步骤S31中,根据左侧表达式先判断是否为方法调用,若为方法调用则通过方法调用的左侧表达式和参数类型 通过jdk的内置MethodFinder.findMethod方法查找到对应的方法,若此方法为当前编译上下文中qLang解析的方法,则通过编译时存储的上下文获取,根据方法返回值推断出该表达式对外整体表达的类型,若为引用类型,则通过作用域向上查找出同名变量对应类型。
[0022]优选的,在所述步骤S32中,需要为跳转判断指令提供一份左侧表达式的副本,正常情况无需提供副本。
[0023]优选的,在所述步骤S32中,根据左侧表达式推断出的类型所占字节长度写入dup或dup2指令:若为long或double占8个字节,此时写入dup2指令。
[0024]若为int或对象占四个字节,此时写入dup指令。
[0025]优选的,在所述步骤S35中,数字默认值为0可分为四种类型:int类型写入iconst_0指令。
[0026]boolean类型默认为false,false在字节码中表示为0,写入iconst_0指令。
[0027]其他对象类型默认为null,写入指令aconst_null。
[0028]void类型无返回值无需向栈内压入值,无指令写入。
[0029]优选的,在所述步骤S36中:label1所在的位置为非null的代码执行开始位置。
[0030]本专利技术的技术效果和优点:本专利技术通过语法解析,将代码分为左侧表达式、符号和右侧表达式三个部分,先对左侧表达式进行处理并通过右侧表达式推断出类型以及赋予默认值,然后再对右侧表达式进行处理,避免了空指针错误的发生,让使用平台的非专业人员可配置处高质量无空指针的逻辑,提高了平台操作的便捷性,同时增强了在java语法上的分叉语言的编译。
附图说明
[0031]图1为本专利技术实施例解析示意图。
[0032]图2为本专利技术实施例计算左侧表达式对应栈中的位置示意图。
[0033]图3为本专利技术实施例的代码示意图。
[0034]图4为本专利技术调用情况示意图。
具体实施方式
[0035]下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本专利技术保护的范围。
[0036]下面通过具体的实施例对本专利技术进一步阐述,但并不限制本专利技术。
[0037]实施例一一种类java语言基于JVM的函数式编程语法实现方法,为了便于说明本专利技术,本实施例给出如下示例代码:如图1
‑
4所示,包括以下具体步骤:S1:语法解析,转化为语法中间表示层对象,一套qLang抽象出的中间层IR Node。
[0038]S2:在解析的过程中,将 分解为左侧表达式o、符号和右侧表达式getField()三部分,此过程见图1,直接调用情况见图4。
[0039]S3:解析符号,处理步骤如下:S31:对左侧表达式进行处理,计算出左侧表达式在locals中的位置x,如图2所示,每当解析到一组{}时,qLang编译器会生成一个对应的作用域对象,同时在当前作用域里的IR Node都会持有此作用域的引用本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种类java语言基于JVM的函数式编程语法实现方法,其特征在于,包括以下具体步骤:S1:语法解析,转化为语法中间表示层对象;S2:在解析的过程中,将代码分解为左侧表达式、符号和右侧表达式三部分;S3:解析符号,处理步骤如下:S31:对左侧表达式进行处理,计算出左侧表达式在locals中的位置x,并根据左侧表达式推断出类型添加load指令;S32:解析符号,对符号左侧执行判断是否为null的跳转指令;S33:此时会生成一个跳转标记label1和一个跳出标记label2,写入非null跳转指令ifnonull label1;S34:左侧表达式为null时顺序执行,此时需要根据左侧表达式推断出类型所占字节长度写入pop、pop2,将load_x在栈内的值弹出;S35:根据右侧表达式推断出的类型赋予默认值;S36:此时左侧表达式为null的情况已执行完,需要写入无条件跳转指令goto label2,并标记label1为当前所在位置;S37:对右侧表达式进行处理,根据方法调用和对象引用写入正常调用指令;S38:整体表达式已执行完,标记label2为当前所在位置,此位置表示表达式整体执行结束。2.根据权利要求1所述的一种类java语言基于JVM的函数式编程语法实现方法,其特征在于,在所述步骤S31中,每当解析到一组{}时,qLang编译器会生成一个对应的作用域对象,同时在当前作用域里的IR Node都会持有此作用域的引用,当解析到定义节点时会将定义的类型和变量名称记录到当前作用域中。3.根据权利要求1所述的一种类java语言基于JVM的函数式编程语法实现方法,其特征在于,在所...
【专利技术属性】
技术研发人员:王三明,王聪明,王圆博,
申请(专利权)人:启业云大数据南京有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。