CN114253526A - 在线计价方法、装置、设备及存储介质 - Google Patents
在线计价方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN114253526A CN114253526A CN202111571671.XA CN202111571671A CN114253526A CN 114253526 A CN114253526 A CN 114253526A CN 202111571671 A CN202111571671 A CN 202111571671A CN 114253526 A CN114253526 A CN 114253526A
- Authority
- CN
- China
- Prior art keywords
- target
- java
- java bytecode
- function
- statement
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q30/00—Commerce
- G06Q30/02—Marketing; Price estimation or determination; Fundraising
- G06Q30/0283—Price estimation or determination
Landscapes
- Engineering & Computer Science (AREA)
- Business, Economics & Management (AREA)
- Development Economics (AREA)
- Theoretical Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Accounting & Taxation (AREA)
- Finance (AREA)
- General Engineering & Computer Science (AREA)
- Strategic Management (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- Entrepreneurship & Innovation (AREA)
- General Business, Economics & Management (AREA)
- Marketing (AREA)
- Economics (AREA)
- Game Theory and Decision Science (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请是关于一种在线计价方法、装置、设备及存储介质,具体涉及金融计算领域。所述方法包括:获取目标交易数据与目标公式语句;当检测到缓存中存在目标公式语句的JAVA类时,调用目标公式语句所对应的JAVA类,对目标交易数据进行处理以获得目标计价结果,目标公式语句所对应的JAVA类为加载目标公式语句对应的JAVA字节码文件得到的;JAVA字节码文件是基于目标公式语句的逆波兰表达式中,运算符以及运算分量的排列顺序生成的。上述方案将编译过程以及计算过程分开,避免计算机设备解释一句再执行一句的繁琐操作,简化了计算逻辑,提高了在线计价的运算速度。
Description
技术领域
本发明涉及金融计算领域,具体涉及一种在线计价方法、装置、设备及存储介质。
背景技术
在线计价是采用互联网技术将计价过程搬到线上进行操作,具有一次操作各处都能查看的特点,支持对计价文件进行协同修改等优点。
在线计价计算过程中,除了固定的计算逻辑,在费用组成、费用汇总等业务还涉及到对特定的公式进行结果的计算。目前,为了实现在线计价,可以通过解释执行的计算引擎对公式进行计算并得到计算结果。解释执行不依赖于平台,因为编译器会根据不同的平台进行解析,它将源语言直接作为源程序输入,解释执行解释一句后就提交计算机执行一句,并不形成目标程序。
上述方案中,通过解释执行的计算引擎对公式进行计算,计算逻辑复杂,运行速度较慢。
发明内容
本申请提供了一种在线计价方法、装置、设备及存储介质,提高了在线计价的运算速度,该技术方案如下。
一方面,提供了一种在线计价方法,所述方法包括:
获取目标交易数据与目标公式语句;
当检测到缓存中存在所述目标公式语句的JAVA类时,调用所述目标公式语句所对应的JAVA类,对所述目标交易数据进行处理以获得目标计价结果;
其中,所述目标公式语句所对应的JAVA类为加载所述目标公式语句对应的JAVA字节码文件得到的;所述JAVA字节码文件是基于所述目标公式语句的逆波兰表达式中,运算符以及运算分量的排列顺序生成的。
又一方面,提供了一种在线计价装置,所述装置包括:
公式获取模块,用于获取目标交易数据与目标公式语句;
类调用模块,用于当检测到缓存中存在所述目标公式语句的JAVA类时,调用所述目标公式语句所对应的JAVA类,对所述目标交易数据进行处理以获得目标计价结果;
其中,所述目标公式语句所对应的JAVA类为加载所述目标公式语句对应的JAVA字节码文件得到的;所述JAVA字节码文件是基于所述目标公式语句的逆波兰表达式中,运算符以及运算分量的排列顺序生成的。
在一种可能的实现方式中,所述装置还包括:
表达式获取模块,用于当检测到所述缓存中不存在所述目标公式语句对应的JAVA类时,对所述目标公式语句中的运算分量与运算符进行标注,获得所述目标公式语句的逆波兰表达式;
字节码文件生成模块,用于按照所述逆波兰表达式中运算分量与运算符的排列顺序,生成所述JAVA字节码文件,并对应加载为所述目标公式语句所对应的JAVA类。
在一种可能的实现方式中,所述字节码文件生成模块,还用于,
遍历所述逆波兰表达式,当遍历到目标运算分量时,将所述运算分量封装为JAVA字节码置于JAVA字节码暂存列表;
当遍历到目标运算符时,在所述JAVA字节码暂存列表中对应取出JAVA字节码,与所述目标运算符的JAVA字节码进行拼接,并将拼接后的JAVA字节码置于JAVA字节码暂存列表;
基于遍历所述逆波兰表达式得到的所述JAVA字节码暂存列表中的JAVA字节码,生成所述JAVA字节码文件。
在一种可能的实现方式中,所述逆波兰表达式中还包括目标函数;
所述字节码文件生成模块,还用于,
当遍历到目标函数时,根据所述目标函数名称,在所述JAVA字节码暂存列表中对应取出JAVA字节码,并与所述调用所述目标函数的JAVA字节码拼接为调用函数格式的JAVA字节码;
将所述调用函数格式的JAVA字节码置于所述JAVA字节码暂存列表。
在一种可能的实现方式中,所述装置还包括:
逆波兰表达式读取模块,用于获取所述逆波兰表达式中的目标运算符,以及所述目标操作符所对应的运算分量;
第一检测模块,用于检测所述运算分量的数据类型,与所述目标运算符的执行数据类型是否匹配,若不匹配则生成第一错误消息。
在一种可能的实现方式中,所述装置还包括:
第二检测模块,用于当所述逆波兰表达式中存在目标函数时,检测所述目标函数的函数名是否存在,若不存在则生成第二错误消息。
在一种可能的实现方式中,所述装置还包括:
函数参数分析模块,用于获取所述目标函数的参数定义数量,以及所述目标函数的参数调用数量;
第三检测模块,用于当所述目标函数的参数定义数量与参数调用数量不相同时,则生成第三错误消息。
再一方面,提供了一种计算机设备,所述计算机设备中包含处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、至少一段程序、代码集或指令集由处理器加载并执行以实现上述在线计价方法。
又一方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令,所述至少一条指令由处理器加载并执行以实现上述的在线计价方法。
再一方面,提供了一种计算机程序产品还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述的在线计价方法。
本申请提供的技术方案可以包括以下有益效果:
在进行在线计价前,计算机设备构建目标公式语句的逆波兰表达式,从而表征出目标公式语句的运算顺序;计算机设备再根据逆波兰表达式中的运算顺序,编译并封装为JAVA字节码文件,并对应的生成JAVA类以保存在计算机设备的缓存中,此时计算机设备需要对目标交易数据进行计算时,可以直接调用该JAVA类对目标交易数据进行数据计算,将编译过程以及计算过程分开,避免计算机设备解释一句再执行一句的繁琐操作,简化了计算逻辑,提高了在线计价的运算速度。
附图说明
为了更清楚地说明本申请具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据一示例性实施例示出的一种在线计价系统的结构示意图。
图2是根据一示例性实施例示出的在线计价方法的方法流程图。
图3是根据一示例性实施例示出的在线计价方法的方法流程图。
图4示出了一种逆波兰表达式的转换流程图。
图5示出了本申请实施例涉及的一种在线计价方法的流程方框图。
图6是根据一示例性实施例示出的提供了一种在线计价装置的结构方框图。
图7是根据本申请一示例性实施例提供的一种计算机设备示意图。
具体实施方式
下面将结合附图对本申请的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
应理解,在本申请的实施例中提到的“指示”可以是直接指示,也可以是间接指示,还可以是表示具有关联关系。举例说明,A指示B,可以表示A直接指示B,例如B可以通过A获取;也可以表示A间接指示B,例如A指示C,B可以通过C获取;还可以表示A和B之间具有关联关系。
在本申请实施例的描述中,术语“对应”可表示两者之间具有直接对应或间接对应的关系,也可以表示两者之间具有关联关系,也可以是指示与被指示、配置与被配置等关系。
本申请实施例中,“预定义”可以通过在设备(例如,包括终端设备和网络设备)中预先保存相应的代码、表格或其他可用于指示相关信息的方式来实现,本申请对于其具体的实现方式不做限定。
本申请实施例中提供的在线计价方法可以应用于具有较强数据处理能力的计算机设备中。例如,本申请实施例提供的在线计价方法可以应用于个人计算机、工作站或服务器中,即通过个人计算机、工作站以及服务器中至少一者对输入的公式进行处理,以实现对输入的数据进行计算的过程。
图1是根据一示例性实施例示出的一种在线计价系统的结构示意图。该图像分类系统中包含服务器110以及终端120。其中,终端120与服务器110之间通过通信网络进行数据通信,该通信网络可以是有线网络也可以是无线网络。
可选的,终端120中安装有具有在线计价中功能的应用程序,该应用程序可以是专业金融应用程序、社交类应用程序,或者具有公式计算功能的AI应用程序,本申请实施例对此不做限定。
可选的,该终端120可以是具有数据采集组件的终端设备,该数据采集组件用于根据接收用户的输入操作,将用户输入的计算数据存储于终端120中的数据存储模块中;该终端120还可以是具有数据传输接口的终端设备,该数据传输接口用于接收具有数据采集组件的设备所采集到的计算数据。
可选的,该终端120可以是智能手机、平板电脑,膝上便携式笔记本电脑等移动终端,也可以是台式电脑、投影式电脑等终端,或是具有数据处理组件的智能终端,本申请实施例对此不设限制。
服务器110可以实现为一台服务器,也可以实现为一组服务器构成的服务器集群,其可以是物理服务器,也可以实现为云服务器。在一种可能的实现方式中,服务器110是终端120中应用程序的后台服务器。
在本申请实施例的一种可能的实现方式中,当终端120接收到用户输入的计算数据以及计算公式时(例如接收到用户在应用程序中输入的计算数据以及计算公式),该终端120可以将该计算数据以及计算公式发送至应用程序所对应的后台服务器。此时后台服务器可以根据对该计算公式进行处理,生成计算公式所对应的JAVA类并保存在缓存中,再调用该计算公式对应的JAVA类以对该计算数据进行计算,从而得到计算结果。后台服务器再将该计算结果返回至终端120以完成在线计价过程。
在本申请实施例的另一种可能的实现方式中,当终端接收到计算公式时,直接在终端120中对该计算公式进行处理,生成该计算公式所对应的JAVA字节码文件,并通过JVM加载为对应的JAVA类保存在缓存中,以便调用该计算公式对应的JAVA类对该计算数据进行计算。
在一种可能的实现方式中,当该终端生成了该计算公式所对应的JAVA字节码文件后,可以将该字节码文件发送至该终端中的应用程序(即专业金融类应用程序)所对应的后台服务器中,以便其他设备需要使用该公式时,可以直接从后台服务器中获取该计算公式所对应的JAVA字节码文件,避免了对公式的重复处理过程。
可选的,上述服务器可以是独立的物理服务器,也可以是由多个物理服务器构成的服务器集群或者是分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(内容分发网络,ContentDelivery Network)、以及大数据和人工智能平台等技术运计算服务的云服务器。
可选的,该系统还可以包括管理设备,该管理设备用于对该系统进行管理(如管理各个模块与服务器之间的连接状态等),该管理设备与服务器之间通过通信网络相连。可选的,该通信网络是有线网络或无线网络。
可选的,上述的无线网络或有线网络使用标准通信技术和/或协议。网络通常为因特网,但也可以是其他任何网络,包括但不限于局域网、城域网、广域网、移动、有限或无线网络、专用网络或者虚拟专用网络的任何组合。在一些实施例中,使用包括超文本标记语言、可扩展标记语言等的技术和/或格式来代表通过网络交换的数据。此外还可以使用诸如安全套接字层、传输层安全、虚拟专用网络、网际协议安全等常规加密技术来加密所有或者一些链路。在另一些实施例中,还可以使用定制和/或专用数据通信技术取代或者补充上述数据通信技术。
图2是根据一示例性实施例示出的在线计价方法的方法流程图。该方法由计算机设备执行,该计算机设备可以是如图1所示的在线计价系统中的服务器或终端。如图2所示,该在线计价方法可以包括如下步骤:
步骤201,获取目标交易数据与目标公式语句。
当需要进行在线计价时,通常会涉及到计算公式,此时计算机设备可以获取到对目标交易数据进行计算时需要应用的目标公式语句。
可选的,该目标公式语句为中缀表达式格式的公式语句。
步骤202,当检测到缓存中存在该目标公式语句的JAVA类时,调用该目标公式语句所对应的JAVA类,对该目标交易数据进行处理以获得目标计价结果。
其中,该目标公式语句所对应的JAVA类为加载该目标公式语句对应的JAVA字节码文件得到的;该JAVA字节码文件是基于该目标公式语句的逆波兰表达式中,运算符以及运算分量的排列顺序生成的。
即在一种可能的实现方式中,目标公式语句所对应的JAVA类生成过程可以如下所示。
首先,对该目标公式语句中的运算分量与运算符进行标注,并根据标注结果构建逆波兰表达式。
在对目标公式语句进行分析之前,可以先对该目标公式语句中的运算分量以及运算符进行标注,识别出该目标公式语句中的各个运算分量以及运算符,再根据标注的结果,对目标公式的逻辑进行识别,从而构建逆波兰表达式。
此时计算机设备对标注后的各个分词进行分析,构造逆波兰表达式。逆波兰表达式又叫做后缀表达式,把运算量写在前面,把运算符写在后面,如1+2写为[1,2,+]。实现逻辑为将标注后的分词数组进行逐个提取处理,操作数入操作数列表和结果列表,操作符进行一元二元区分处理和优先级判断后在所需操作数入结果列表之后再入结果列表,左右括号进行特殊的入栈处理,形成逆波兰表达式。
然后,按照该逆波兰表达式中运算分量与运算符的排列顺序,生成JAVA字节码文件并对应加载为该目标公式语句所对应的JAVA类。
当构建出目标公式语句的逆波兰表达式后,由于逆波兰表达式的语序实际上就为该目标公式语句的执行语句,因此根据该逆波兰表达式的语序即可以生成相应的JAVA字节码文件,并通过计算机设备中的JVM生成JAVA类。
例如当读取到逆波兰表达式中的1+2时,计算机设备可以识别常数1以及常数2,生成对应的JAVA字节码,再识别出逆波兰表达式中的运算符+,并生成对应的JAVA字节码,将常数1、常数2以及运算符+的JAVA字节码拼接,即可以生成该1+2的JAVA字节码。
并且当公式具有多重运算时,可以按照逆波兰表达式的语序,将运算优先级高的运算语句形成的JAVA字节码作为参数,与运算优先级低的运算语句形成的JAVA字节码进行拼接,从而实现较为复杂的公式的JAVA字节码文件的形成。
当形成了JAVA字节码后,计算机设备可以通过JVM将class文件字节码内容加载到内存(例如缓存)中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的Class对象。
最后,当检测到缓存中存在所述目标公式语句的JAVA类时,调用该目标公式语句所对应的JAVA类,对输入的目标交易数据进行计算,得到目标计价结果。
当JVM将Class文件字节码容加载到内存中,计算机设备则可以直接调用该class对象,对输入的目标交易数据进行计算,从而得到将目标交易数据代入目标公式语句后得到的目标计价结果。
综上所述,在进行在线计价前,计算机设备构建目标公式语句的逆波兰表达式,从而表征出目标公式语句的运算顺序;计算机设备再根据逆波兰表达式中的运算顺序,编译并封装为JAVA字节码文件,并对应的生成JAVA类以保存在计算机设备的缓存中,此时计算机设备需要对目标交易数据进行计算时,可以直接调用该JAVA类对目标交易数据进行数据计算,将编译过程以及计算过程分开,避免计算机设备解释一句再执行一句的繁琐操作,简化了计算逻辑,提高了在线计价的运算速度。
图3是根据一示例性实施例示出的在线计价方法的方法流程图。该方法由计算机设备执行,该计算机设备可以是如图1所示的在先计价系统中的服务器或终端。如图3所示,该在线计价方法可以包括如下步骤:
步骤301,获取目标交易数据与目标公式语句。
当计算机设备需要进行公式计算时,可以先获取到用户输入的目标交易数据,以及对该目标交易数据进行计算的目标公式语句。
在一种可能的实现方式中,当该计算机设备为终端时,该终端上运行有金融类应用程序的客户端,该用户可以在通过终端的数据采集组件(如键盘,触控屏幕)等执行数据输出操作,将该目标交易数据以及目标公式语句输入该终端。
在另一种可能的实现方式中,当该计算机设备为服务器时,该服务器上运行有金融类应用程序的服务端,该服务器可以与运行有金融类应用程序的客户端的终端进行通信,以接收该目标交易数据以及目标公式语句,并在服务器中进行计算,再将计算得到的计价结果返回至终端。
步骤302,检测缓存中是否存在该目标公式语句对应的JAVA类。
在计算机设备接收到目标公式语句时,可以先在计算机设备的缓存中进行检测,查看计算机设备的缓存中是否存在与该目标公式语句所对应的JAVA类,从而确定后续对该目标公式语句所执行的操作。
在一种可能的实现方式中,当检测到缓存中存在该目标公式语句对应的JAVA类时,调用该目标公式语句所对应的JAVA类,对输入的目标交易数据进行计算,得到该目标计价结果。
当检测到缓存中存在该目标公式语句所对应的JAVA类时,则说明该目标公式语句已经被解析过并且构建为JAVA的Class文件,此时计算机设备无需对目标公式语句进行解析,可以直接调用缓存中已经加载的JAVA类,对输入的目标交易数据进行计算,从而得到目标计价结果。
步骤303,当检测到该缓存中不存在该目标公式语句对应的JAVA类时,对该目标公式语句中的运算分量与运算符进行标注,并根据标注结果构建逆波兰表达式。
当检测到缓存中不存在与目标公式语句对应的JAVA类时,则说明该目标公式语句之前并未解析过,需要重新对该目标公式语句进行处理。
而在对目标公式语句进行处理的过程中,首先需要对该目标公式语句中的运算分量以及运算符进行标注,以标注区分各种运算符、括号、变量、函数等。
在本申请实施例中,在对目标公式语句进行标注时,可以将公式字符串逐字符进行解析,对前后字符进行是否同类判断以及字符后是否需要更多字符的判断进行切割处理,并将切割后的字符串进行类型标注,形成标注后的分词数组。
例如,先将该目标公式语句中的常用运算符(如四则运算符等)进行标记,再依次对其他字符进行标记,例如当出现数据100时,计算机设备识别到1、0、0三个相邻字符为相同类型的字符,因此可以将该三个相邻字符合并标记为一个常量。
当标记出公式中的各个运算符以及运算分量后,则可以对该中缀式的目标公式语句进行解析,将其变换为后缀式的逆波兰表达式,如图4所示,其示出了一种逆波兰表达式的转换流程图,如图4所示,该逆波兰表达式的转换逻辑如下。
当获取到目标公式语句的运算符以及运算分量后,先在计算机设备中输入运算符之间的优先级关系;并从左到右扫描中缀表达式。
当扫描到运算分量时直接输出该与运算分量。
当扫描到运算符时,判断此时的操作栈(W栈)是否为空,当该W栈为空时,将该运算符进行入栈操作。当该W栈不为空时,比较当前运算符与W栈顶的运算符的优先级,若当前运算符的优先级更大时,进行入栈操作;若当前运算符的优先级更小时,则退栈输出。
当扫描到左括号时,直接进行入栈操作;
当扫描到右括号时,判断此时的栈顶是否为左括号,再判断此时的W栈是否为空,若W栈为空,则执行程序错误;若W栈不为空,则退栈输出。
当扫描完成后,判断W栈是否为空,若W栈为空则流程结束;若W栈不为空,判断栈顶是否为左括号,若栈顶为左括号则执行程序错误;若栈顶不为左括号,则退栈输出。
在一种可能的实现方式中,获取该逆波兰表达式中的目标运算符,以及该目标操作符所对应的运算分量;检测该运算分量的数据类型,与该目标运算符的执行数据类型是否匹配,若不匹配则生成第一错误消息。
在获取到逆波兰表达式后,为了保证该逆波兰表达式的正确性,需要对该逆波兰表达式进行校验。
当获取到逆波兰表达式后,可以对该逆波兰表达式中的各个运算符(以目标运算符为例)进行检验,即检测目标运算符所需要执行的数据类型,以及运算分量的数据类型是否一致,当目标运算符所需要执行的数据类型以及运算分量的数据类型不一致时,显然该逆波兰表达式是无法正常运行的,此时计算机设备生成第一错误消息。
在一种可能的实现方式中,当该逆波兰表达式中存在目标函数时,检测该目标函数的函数名是否存在,若不存在则生成第二错误消息。
计算机设备还可以对该逆波兰表达式中的目标函数的函数名进行验证,若计算机设备在缓存中未检测到该目标函数的函数名,则说明该目标函数在计算机设备中未定义,该目标函数无法正常执行运算,此时生成第二错误消息。
在一种可能的实现方式中,获取该目标函数的参数定义数量,以及该目标函数的参数调用数量。
当该目标函数的参数定义数量与参数调用数量不相同时,则生成第三错误消息。
计算机设备还可以对该目标函数进行进一步检验,获取该目标函数中的参数定义数量,例如该目标函数定义了三个数据,而该目标函数所调用的参数大于三个数据,也就是说,该目标函数调用了未定义的数据,此时显然逆波兰表达式也是存在异常的,因此生成该第三错误消息。
步骤304,按照该逆波兰表达式中运算分量与运算符的排列顺序,生成JAVA字节码文件并对应加载为该目标公式语句所对应的JAVA类。
在本申请实施例中,由于逆波兰表达式的运算分量与运算符的排列顺序即为该逆波兰表达式的执行顺序,因此将该逆波兰表达式中运算分量以及运算符的排列顺序,生成的JAVA字节码文件,该JAVA字节码文件中的各个二进制数据,即可以指示计算机按照运算符的排列顺序对各个运算分量的处理过程。
在本申请实施例的一种可能的实现方式中,当目标公式语句中存在目标函数时,该逆波兰表达式中同样存在目标函数时,该逆波兰表达式中即存在运算分量、运算符以及目标函数,同理,上述三者的排列顺序同样为该逆波兰表达式的执行顺序。
以下对逆波兰表达式编译为JAVA字节码的原理进行示意性的介绍。
在一种可能的实现方式中,遍历该逆波兰表达式,当遍历到目标运算分量时,将该运算分量封装为JAVA字节码置于Java字节码暂存列表;当遍历到目标运算符时,在该JAVA字节码暂存列表中对应取出JAVA字节码,与该目标运算符的JAVA字节码进行拼接,并将拼接后的JAVA字节码置于JAVA字节码暂存列表;基于遍历该逆波兰表达式得到的该JAVA字节码暂存列表中的JAVA字节码,生成该JAVA字节码文件。
计算机设备遍历逆波兰表达式,当遍历到目标运算分量时,将该运算分量封装为JAVA字节码格式,并放置于JAVA字节码暂存列表中。
当计算机设备遍历到目标运算符时,则在JAVA字节码暂存列表中取出JAVA字节码,例如当该目标运算符为四则运算符时,则在该JAVA字节码暂存列表中取出后入栈的两个JAVA字节码格式的参数,与该目标运算符所对应的JAVA字节码拼接,并封装为一个JAVA字节码返回至JAVA字节码暂存列表。
例如,当遍历到目标运算符“+”时,计算机设备从JAVA字节码暂存列表中取出两个JAVA字节码格式的参数,如“1”“2”,则此时计算机设备将“1”、“2”、“+”的JAVA字节码拼接为一个JAVA字节码入栈,也就是说,此时计算机设备将“1+2”作为一个运算结果保存为JAVA字节码格式。
当遍历各个目标运算符后,经过JAVA字节码之间的合并操作后剩下的唯一一个JAVA字节码,即代表这个目标文件语句所对应的整个计算流程,也就是该目标公式语句所对应的JAVA字节码文件。
由于逆波兰表达式本身即代表了目标公式语句的运算逻辑,因此按照顺序遍历该目标公式语句,所生成的JAVA字节码,同样可以表示出目标公式允许的运算逻辑,且JAVA字节码文件通过JVM进行加载后,计算机设备可以识别出该目标公式语句的运算逻辑,并按照JAVA字节码文件中的内容,执行目标公式语句的运算逻辑。
在一种可能的实现方式中,当遍历到目标函数时,根据该目标函数名称,在该JAVA字节码暂存列表中对应取出JAVA字节码,并与该调用该目标函数的JAVA字节码拼接为调用函数格式的JAVA字节码;将该调用函数格式的JAVA字节码置于该JAVA字节码暂存列表。
当目标公式语句中具有目标函数时,此时逆波兰表达式中同样存在目标函数,当遍历到逆波兰表达式中的目标函数时,则需要判断该目标函数所需要调用参数的个数,并按照目标函数所需要调用参数的个数,取出对应个数的JAVA字节码,与调用目标函数的JAVA字节码进行拼接,得到调用函数格式的JAVA字节码。
例如,当遍历到函数F(X,Y,Z)时,从函数名F开始标记,到结尾括号位置处,发现该F(X,Y,Z)需要调用三个参数,此时在JAVA字节码暂存列表中取出三个JAVA字节码,与F(X,Y,Z)的调用JAVA字节码进行拼接,最后拼接得到的JAVA字节码即代表着将三个参数代入F(X,Y,Z)计算所得到的结果。
在一种可能的实现方式中,当获取到目标函数,将该目标函数的函数头进行入函数栈处理,当遍历到目标函数中的逗号时,此时若函数栈顶函数的参数列表个数为0,则从JAVA字节码暂存列表中取出两个参数写入函数栈顶函数的参数列表,此时若函数栈顶函数的参数列表个数不为0,则从JAVA字节码暂存列表中取出一个参数写入函数栈顶函数的参数列表。
例如,对于F(X,Y,Z)时,先将函数头写入函数栈,此时函数栈顶的函数即为“F(X,Y,Z)”,此时计算机设备继续对F(X,Y,Z)进行检测,当检测到F(X,Y,Z)中存在的第一个逗号时,此时参数列表还未执行写入操作,参数列表中参数为0,因此在JAVA字节码暂存列表取两个参数写入参数列表(作为X与Y);而当检测到F(X,Y,Z)中存在的第二个逗号时,此时参数列表中存在参数了,因此在在JAVA字节码暂存列表取一个参数写入参数列表(作为Z),从而完成了在JAVA字节码暂存列表中取出目标函数调用的参数个数的JAVA字节码的操作。
当生成了目标公式语句所对应的JAVA字节码文件后,计算机设备即可以通过JVM加载该JAVA字节码文件,以生成目标公式语句所对应的JAVA类。
在一种可能的实现方式中,本申请实施例中逆波兰表达式的常量、变量等是通过new BigDecimal()的Java字节码封装的。
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。
因此通过BigDecimal封装为JAVA字节码,可以实现更高精度的数据计算。
步骤305,调用该目标公式语句所对应的JAVA类,对目标交易数据进行计算,得到目标计价结果。
计算机设备调用该目标公式语句所对应的JAVA类,即可以对输入的目标交易数据进行计算,从而得到将该目标交易数据代入该目标公式语句所得到的目标计价结果。
综上所述,在进行在线计价前,计算机设备构建目标公式语句的逆波兰表达式,从而表征出目标公式语句的运算顺序;计算机设备再根据逆波兰表达式中的运算顺序,编译并封装为JAVA字节码文件,并对应的生成JAVA类以保存在计算机设备的缓存中,此时计算机设备需要对目标交易数据进行计算时,可以直接调用该JAVA类对目标交易数据进行数据计算,将编译过程以及计算过程分开,避免计算机设备解释一句再执行一句的繁琐操作,简化了计算逻辑,提高了在线计价的运算速度。
请参考图5,其示出了本申请实施例涉及的一种在线计价方法的流程方框图。如图5所示,本申请实施例实现了计算表达式的编译执行,计算基于BigDecimal进行计算,精度高,支持基本四则等运算,支持变量和自定义函数,支持对公式进行校验。
本申请实施例的实现逻辑如下:
本申请实施例中的实现流程包括词法分析、语法分析、语义分析、编译、动态加载、执行6个模块。
词法分析模块对公式进行分词标注,标注区分各种运算符、括号、变量、函数等。实现逻辑为将公式字符串逐字符进行解析,对前后字符进行是否同类判断以及字符后是否需要更多字符的判断进行切割处理,并将切割后的字符串进行类型标注,形成标注后的分词数组。
语法分析模块对标注后的分词进行分析,构造逆波兰表达式。逆波兰表达式又叫做后缀表达式,把运算量写在前面,把运算符写在后面,如1+2写为[1,2,+]。实现逻辑为将标注后的分词数组进行逐个提取处理,操作数入操作数列表和结果列表,操作符进行一元二元区分处理和优先级判断后在所需操作数入结果列表之后再入结果列表,左右括号进行特殊的入栈处理,形成逆波兰表达式。
语义分析模块对构造好的逆波兰表达式进行分析校验,校验针对操作符做操作数的数据类型校验,提取函数名进行函数名是否存在的校验,对函数调用的参数个数与对应函数的定义参数个数范围进行校验,抛出友好的公式错误提示。
编译模块加载逆波兰表达式,经过JAVA字节码语法处理及封装,编译成一个实现特定接口的类的JAVA字节码形态,生成对应的JAVA字节码文件。
JAVA字节码语法处理及封装过程是这样的,首先生成JAVA字节码的类头、构造方法、成员方法头存到类生成器中。第二步,遍历逆波兰表达式,对常量操作数如123生成形如new BigDecimal()的JAVA字节码封装后将JAVA字节码数组放到JAVA字节码暂存列表中;对变量生成变量获取的JAVA字节码放到JAVA字节码暂存列表中。
当遍历到函数时,对函数头进行入函数栈处理;对于逗号,如果函数栈顶函数的参数列表个数为零,则从JAVA字节码暂存列表中取出两个参数入函数栈顶函数的参数列表,否则从JAVA字节码暂存列表中取出一个参数入函数栈顶函数的参数列表,从逆波兰表达式中移除对应参数个数的节点;对于函数结尾,进行参数处理并封装为函数的JAVA字节码调用写法,将函数的JAVA字节码存入当前节点,设置节点为结果类型;对于结果类型,获取节点的JAVA字节码放到JAVA字节码暂存列表中。
当遍历到运算符时,从JAVA字节码暂存列表中取出并移除两个参数的JAVA字节码,生成包含当前计算的JAVA字节码并存入当前节点,同时设置节点为结果类型,从逆波兰表达式中移除对应参数个数的节点。
第三步,针对于仅剩的唯一一个节点进行类型判断,为常量操作数的生成形如newBigDecimal()的JAVA字节码封装,为变量的生成变量获取的JAVA字节码,为结果的获取节点内存储的JAVA字节码,将最终生成的JAVA字节码存到类生成器中。最后生成成员方法结尾和其他JAVA字节码所需结尾内容到类生成器中,完成整个JAVA字节码文件的生成。
动态加载模块将编译出来的JAVA字节码文件作为类加载到JVM的类加载器中,并存储到缓存中以备调用。
执行公式时首先判断缓存中是否有该公式对应的JAVA类,没有则先进行词法分析等处理进行分析及编译,找到对应JAVA类后则进行调用,并得到结果。
本申请实施例所示出的公式运算的特点是运行速度上除首次执行需要编译一次外,与原生JAVA代码性能等同(class文件一致)。不需要额外的中间变量支持,多长的公式都会写成等同于一行的JAVA代码,人工编写代码很难写成这样简化。调试支持方面,开启debug会生成class文件到本地,也可以输出编译的代码,自定义函数可以直接打断点。
图6是根据一示例性实施例示出的提供了一种在线计价装置的结构方框图,如图6所示,所述装置包括:
公式获取模块601,用于获取目标交易数据与目标公式语句;
类调用模块602,用于当检测到缓存中存在所述目标公式语句的JAVA类时,调用所述目标公式语句所对应的JAVA类,对所述目标交易数据进行处理以获得目标计价结果;
其中,所述目标公式语句所对应的JAVA类为加载所述目标公式语句对应的JAVA字节码文件得到的;所述JAVA字节码文件是基于所述目标公式语句的逆波兰表达式中,运算符以及运算分量的排列顺序生成的。
在一种可能的实现方式中,所述装置还包括:
表达式获取模块,用于当检测到所述缓存中不存在所述目标公式语句对应的JAVA类时,对所述目标公式语句中的运算分量与运算符进行标注,获得所述目标公式语句的逆波兰表达式;
字节码文件生成模块,用于按照所述逆波兰表达式中运算分量与运算符的排列顺序,生成所述JAVA字节码文件,并对应加载为所述目标公式语句所对应的JAVA类。
在一种可能的实现方式中,所述字节码文件生成模块,还用于,
遍历所述逆波兰表达式,当遍历到目标运算分量时,将所述运算分量封装为JAVA字节码置于JAVA字节码暂存列表;
当遍历到目标运算符时,在所述JAVA字节码暂存列表中对应取出JAVA字节码,与所述目标运算符的JAVA字节码进行拼接,并将拼接后的JAVA字节码置于JAVA字节码暂存列表;
基于遍历所述逆波兰表达式得到的所述JAVA字节码暂存列表中的JAVA字节码,生成所述JAVA字节码文件。
在一种可能的实现方式中,所述逆波兰表达式中还包括目标函数;
所述字节码文件生成模块,还用于,
当遍历到目标函数时,根据所述目标函数名称,在所述JAVA字节码暂存列表中对应取出JAVA字节码,并与所述调用所述目标函数的JAVA字节码拼接为调用函数格式的JAVA字节码;
将所述调用函数格式的JAVA字节码置于所述JAVA字节码暂存列表。
在一种可能的实现方式中,所述装置还包括:
逆波兰表达式读取模块,用于获取所述逆波兰表达式中的目标运算符,以及所述目标操作符所对应的运算分量;
第一检测模块,用于检测所述运算分量的数据类型,与所述目标运算符的执行数据类型是否匹配,若不匹配则生成第一错误消息。
在一种可能的实现方式中,所述装置还包括:
第二检测模块,用于当所述逆波兰表达式中存在目标函数时,检测所述目标函数的函数名是否存在,若不存在则生成第二错误消息。
在一种可能的实现方式中,所述装置还包括:
函数参数分析模块,用于获取所述目标函数的参数定义数量,以及所述目标函数的参数调用数量;
第三检测模块,用于当所述目标函数的参数定义数量与参数调用数量不相同时,则生成第三错误消息。
综上所述,在进行在线计价前,计算机设备构建目标公式语句的逆波兰表达式,从而表征出目标公式语句的运算顺序;计算机设备再根据逆波兰表达式中的运算顺序,编译并封装为JAVA字节码文件,并对应的生成JAVA类以保存在计算机设备的缓存中,此时计算机设备需要对目标交易数据进行计算时,可以直接调用该JAVA类对目标交易数据进行数据计算,将编译过程以及计算过程分开,避免计算机设备解释一句再执行一句的繁琐操作,简化了计算逻辑,提高了在线计价的运算速度。
请参阅图7,其是根据本申请一示例性实施例提供的一种计算机设备示意图,所述计算机设备包括存储器和处理器,所述存储器用于存储计算机程序,所述计算机程序被所述处理器执行时,实现上述方法。
其中,处理器可以为中央处理器(Central Processing Unit,CPU),或者,处理器还可以为其他支持JAVA运行的处理器。
存储器作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序、非暂态计算机可执行程序以及模块,如本发明实施方式中的方法对应的程序指令/模块。处理器通过运行存储在存储器中的非暂态软件程序、指令以及模块,从而执行处理器的各种功能应用以及数据处理,即实现上述方法实施方式中的方法。
存储器可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储处理器所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施方式中,存储器可选包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至处理器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
在一示例性实施例中,还提供了一种计算机可读存储介质,用于存储有至少一条计算机程序,所述至少一条计算机程序由处理器加载并执行以实现上述方法中的全部或部分步骤。例如,该计算机可读存储介质可以是只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、只读光盘(Compact Disc Read-Only Memory,CD-ROM)、磁带、软盘和光数据存储设备等。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。
Claims (10)
1.一种在线计价方法,其特征在于,所述方法包括:
获取目标交易数据与目标公式语句;
当检测到缓存中存在所述目标公式语句的JAVA类时,调用所述目标公式语句所对应的JAVA类,对所述目标交易数据进行处理以获得目标计价结果;
其中,所述目标公式语句所对应的JAVA类为加载所述目标公式语句对应的JAVA字节码文件得到的;所述JAVA字节码文件是基于所述目标公式语句的逆波兰表达式中,运算符以及运算分量的排列顺序生成的。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当检测到所述缓存中不存在所述目标公式语句对应的JAVA类时,对所述目标公式语句中的运算分量与运算符进行标注,获得所述目标公式语句的逆波兰表达式;
按照所述逆波兰表达式中运算分量与运算符的排列顺序,生成所述JAVA字节码文件,并对应加载为所述目标公式语句所对应的JAVA类。
3.根据权利要求2所述的方法,其特征在于,所述按照所述逆波兰表达式中运算分量与运算符的排列顺序,生成所述JAVA字节码文件,包括:
遍历所述逆波兰表达式,当遍历到目标运算分量时,将所述运算分量封装为JAVA字节码置于JAVA字节码暂存列表;
当遍历到目标运算符时,在所述JAVA字节码暂存列表中对应取出JAVA字节码,与所述目标运算符的JAVA字节码进行拼接,并将拼接后的JAVA字节码置于JAVA字节码暂存列表;
基于遍历所述逆波兰表达式得到的所述JAVA字节码暂存列表中的JAVA字节码,生成所述JAVA字节码文件。
4.根据权利要求3所述的方法,其特征在于,所述逆波兰表达式中还包括目标函数;
所述生成所述JAVA字节码文件之前,还包括:
当遍历到目标函数时,根据所述目标函数名称,在所述JAVA字节码暂存列表中对应取出JAVA字节码,并与所述调用所述目标函数的JAVA字节码拼接为调用函数格式的JAVA字节码;
将所述调用函数格式的JAVA字节码置于所述JAVA字节码暂存列表。
5.根据权利要求2至4任一所述的方法,其特征在于,所述按照所述逆波兰表达式中运算分量与运算符的排列顺序,生成JAVA字节码文件之前,还包括:
获取所述逆波兰表达式中的目标运算符,以及所述目标操作符所对应的运算分量;
检测所述运算分量的数据类型,与所述目标运算符的执行数据类型是否匹配,若不匹配则生成第一错误消息。
6.根据权利要求2至4任一所述的方法,其特征在于,所述按照所述逆波兰表达式中运算分量与运算符的排列顺序,生成JAVA字节码文件之前,还包括:
当所述逆波兰表达式中存在目标函数时,检测所述目标函数的函数名是否存在,若不存在则生成第二错误消息。
7.根据权利要求6所述的方法,其特征在于,所述方法还包括:
获取所述目标函数的参数定义数量,以及所述目标函数的参数调用数量;
当所述目标函数的参数定义数量与参数调用数量不相同时,则生成第三错误消息。
8.一种在线计价装置,其特征在于,所述方法包括:
公式获取模块,用于获取目标交易数据与目标公式语句;
类调用模块,用于当检测到缓存中存在所述目标公式语句的JAVA类时,调用所述目标公式语句所对应的JAVA类,对所述目标交易数据进行处理以获得目标计价结果;
其中,所述目标公式语句所对应的JAVA类为加载所述目标公式语句对应的JAVA字节码文件得到的;所述JAVA字节码文件是基于所述目标公式语句的逆波兰表达式中,运算符以及运算分量的排列顺序生成的。
9.一种计算机设备,其特征在于,所述计算机设备中包含处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、至少一段程序、代码集或指令集由处理器加载并执行以实现如权利要求1至7任一所述的在线计价方法。
10.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令,所述至少一条指令由处理器加载并执行以实现如权利要求1至7任一所述的在线计价方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111571671.XA CN114253526A (zh) | 2021-12-21 | 2021-12-21 | 在线计价方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111571671.XA CN114253526A (zh) | 2021-12-21 | 2021-12-21 | 在线计价方法、装置、设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114253526A true CN114253526A (zh) | 2022-03-29 |
Family
ID=80796298
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111571671.XA Pending CN114253526A (zh) | 2021-12-21 | 2021-12-21 | 在线计价方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114253526A (zh) |
-
2021
- 2021-12-21 CN CN202111571671.XA patent/CN114253526A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109976761B (zh) | 软件开发工具包的生成方法、装置及终端设备 | |
US9524175B2 (en) | Target typing of overloaded method and constructor arguments | |
US10613844B2 (en) | Using comments of a program to provide optimizations | |
CN112015430A (zh) | JavaScript代码翻译方法、装置、计算机设备及存储介质 | |
US9928042B2 (en) | Automatic classification of compilers | |
CN113961919B (zh) | 恶意软件检测方法和装置 | |
CN110673837B (zh) | 代码修复方法及装置、电子设备、计算机可读存储介质 | |
US20140372993A1 (en) | Overloading on constants | |
CN106796525A (zh) | 按需加载动态脚本语言代码以减少内存使用 | |
CN112948828A (zh) | 一种二进制程序恶意代码检测方法、终端设备及存储介质 | |
US6625807B1 (en) | Apparatus and method for efficiently obtaining and utilizing register usage information during software binary translation | |
CN113312618A (zh) | 程序漏洞检测方法、装置、电子设备及介质 | |
CN115599386A (zh) | 代码生成方法、装置、设备及存储介质 | |
CN111488573A (zh) | 链接库检测方法、装置、电子设备和计算机可读存储介质 | |
CN113885876A (zh) | 一种参数校验方法、装置、存储介质及计算机系统 | |
CN112445706A (zh) | 程序异常代码获取方法、装置、电子设备以及存储介质 | |
CN116719579A (zh) | Ai模型可观测性实现方法、装置、电子设备及存储介质 | |
CN111240728A (zh) | 应用程序更新方法、装置、设备和存储介质 | |
CN115629762A (zh) | 一种json数据处理方法、装置、电子设备及存储介质 | |
CN114253526A (zh) | 在线计价方法、装置、设备及存储介质 | |
CN114706586A (zh) | 代码编译、代码运行方法、装置、计算机设备及存储介质 | |
CN110489124B (zh) | 源代码执行方法、装置、存储介质及计算机设备 | |
US20020038454A1 (en) | Method of compiling code in an object oriented programming language | |
CN110110299B (zh) | 文本变换方法、装置以及服务器 | |
CN111151008A (zh) | 游戏运营数据的校验方法、装置、配置后台及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |