CN115185526A - 一种能够逆向推理的编程语言的编译系统及方法 - Google Patents
一种能够逆向推理的编程语言的编译系统及方法 Download PDFInfo
- Publication number
- CN115185526A CN115185526A CN202210591039.XA CN202210591039A CN115185526A CN 115185526 A CN115185526 A CN 115185526A CN 202210591039 A CN202210591039 A CN 202210591039A CN 115185526 A CN115185526 A CN 115185526A
- Authority
- CN
- China
- Prior art keywords
- code
- function
- activity record
- flag bit
- current
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N5/00—Computing arrangements using knowledge-based models
- G06N5/04—Inference or reasoning models
- G06N5/042—Backward inferencing
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Artificial Intelligence (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种能够利用规则约束进行自动推导并利用函数的正向执行过程进行逆向推理的编程语言的编译系统及方法,该系统包括交互模块、编译模块、预执行模块和执行模块,通过编译模块和预执行模块将接收到的包含规则约束以及函数正向执行过程的源代码转换为拓展代码,再通过执行模块执行拓展代码获得结果,从而使得使用者只需要向该能够自动推导与逆向推理的编程语言的编译系统中输入问题的规则与约束或所需逆推问题的正向求解过程即可获得问题的解算结果或逆推结果,极大地降低了使用者的工作难度和错误量。
Description
技术领域
本发明涉及一种能够逆向推理的编程语言的编译系统及方法,尤其涉及一种能够利用规则约束进行自动推导并利用函数的正向执行过程进行逆向推理的编程语言的编译系统及方法。
背景技术
目前主流的科学计算系统实现方法通常是将用户交互界面与基于过程的编程语言的编译器、虚拟机结合,基于此构建的科学计算系统需要用户手动编写解决科学计算问题的过程代码,而过程代码的编写需要很强的专业性,出现错误的概率较高,所以存在用户工作量大且容易出错的系统性缺陷。
在具体工作过程中,函数的逆向过程的编写输入难度较大,出错率极高,而相对应地,函数的正向计算过程则比较容易理解和输入,一般出错率较低,但是现有技术中,并不能自动实现从函数的正向计算过程到函数的逆向过程的自动转换,即不能根据正向函数的逻辑逆向推理逆向函数,所以现有的系统中只能输入正向函数。
由于上述原因,本发明对函数的正向计算过程代码和函数的逆向过程代码做了深入研究,以期待设计出一种能够解决上述问题的编译系统及方法。
发明内容
为了克服上述问题,本发明人进行了锐意研究,设计出一种能够利用规则约束进行自动推导并利用函数的正向执行过程进行逆向推理的编程语言的编译系统及方法,该系统包括交互模块、编译模块、预执行模块和执行模块,通过编译模块和预执行模块将接收到的包含规则约束以及函数正向执行过程的源代码转换为拓展代码,再通过执行模块执行拓展代码获得结果,从而使得使用者只需要向该能够自动推导与逆向推理的编程语言的编译系统中输入问题的规则与约束或所需逆推问题的正向求解过程,即可获得问题的解算结果或逆推结果,极大地降低了使用者的工作难度和错误量,从而完成本发明。
具体来说,本发明的目的在于提供以一种能够自动推导逆向函数的编程语言的编译系统,该系统包括:
交互模块,其用于接收源代码;
编译模块,其用于对源代码进行预处理和编译,得到字符码表;
预执行模块,其用于预执行所述字符码表,获得拓展代码表;
执行模块,其用于执行拓展代码表,获得问题的解。
本发明所具有的有益效果包括:
根据本发明提供的能够利用规则约束进行自动推导并利用函数的正向执行过程进行逆向推理的编程语言的编译系统及方法,能够根据使用者输入的问题的规则约束和函数的正向计算过程自动推导出该函数的逆向过程从而使得使用者不需要再花费大量时间思考函数的逆向过程,在降低使用者工作强度的同时,也能够降低出现错误的可能性。
附图说明
图1示出根据本发明一种优选实施方式的能够自动推导逆向函数的编程语言的编译系统整体结构逻辑图;
图2示出脱离表达式语法树的代码片段;
图3示出语法树产生环状结构;
图4示出代码段在预执行结束后表达式与函数的绑定效果;
图5示出代码块内的具体内容;
图6示出以代码块[12]为根结点且结点数目为4的依赖关系树以及对应代码段;
图7示出将依赖关系树T={[12],[11],[4],[3]}合并至根节点[12]的过程;
图8示出由代码块队列B所逆推得到的函数体结构。
附图标记
1-交互模块
2-编译模块
3-预执行模块
4-执行模块
具体实施方式
下面通过附图和实施例对本发明进一步详细说明。通过这些说明,本发明的特点和优点将变得更为清楚明确。
在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
根据本发明提供的一种能够利用规则约束进行自动推导并利用函数的正向执行过程进行逆向推理的编程语言的编译系统,如图1中所示,该系统包括交互模块1、编译模块2、预执行模块3和执行模块4。所述逆向推理过程是依赖于利用规则约束进行自动推导的。
在一个优选的实施方式中,所述交互模块1用于接收源代码,所述源代码是指用户通过输入端口输入的代码,所述源代码包括问题的规则约束和需要逆向推理的问题的正向计算过程的对应函数。
所以用户可以以源代码的形式,将待求解的逆向函数问题的问题规则约束和正向函数直接输入到所述编译系统中,系统对其进行约束求解和逆向推理并获得的问题的解,从而极大地简化了用户的输入工作量,在提高工作效率的情况下还能够降低出错风险。
本申请中所述的问题的正向计算过程对应函数即为函数的正向计算过程,也称之为正向函数,其具体是指所有函数参数均确定,函数返回值待定的函数,正向函数的执行过程即利用输入参数推导函数的返回值。本申请中所述的函数的逆向过程也称之为逆向函数,具体是指函数返回值确定,函数输入参数中存在待定参数的函数;逆向函数的执行过程即利用函数的返回值与确定的输入参数推导待定的输入参数。本申请中,函数逆推是一种通过正向函数定义逆向函数的特殊方式。例如:
@买(a)斤单价(b)元的苹果的价格{
return:a*b;
}=>@单价(b)元的苹果可买($a)斤;
其中“=>”表示推导。在本申请实现此功能的算法中使用这种定义方法的必要条件是:逆向函数的函数声明中的所有参数与正向函数的函数声明中的所有参数的名称必须一一对应;逆向函数中的待定参数及依赖此参数的变量只参与正向函数的顺序结构,不参与函数体的循环、分支结构;正向函数的函数体代码不修改函数体作用域外参数、函数体作用域内不存在同名不同作用域的变量。
本申请中,正向函数与逆向函数均针对返回运算值的函数而言;返回表达式的函数不具备此属性。
本申请中,返回表达式的函数:返回表达式的函数返回的是表达式而非运算值,这种函数用来表述表达式的变换规则,用户不能直接调用返回表达式的函数。
返回运算值的函数:返回运算值的函数返回的是运算值,用户可以直接调用返回运算值的函数。
函数的权重:函数权重被用于控制推理系统的推理方向,用户可以在函数声明时为更容易导向正确推理结果的变换(即函数)赋予更大的权重,为不容易导向正确推理结果的变换赋予更小的权重。
在一个优选的实施方式中,所述编译模块2用于对源代码进行预处理和编译,得到字符码表;
具体来说,所述编译模块2包括预处理子模块和编译子模块,
其中,所述预处理子模块用于对源代码进行预处理并生成预编译代码,在所述预处理的过程中,所述预处理子模块根据源代码的具体内容,执行下述步骤中的任意一个或多个:
步骤1,删除源代码注释;
步骤2,删除源代码中的空格、换行符;
步骤3,将多个文件中的源代码进行合并;
步骤4,语句替换;
步骤5,对无效源代码进行删除;其中,所述无效源代码为被用户通过预处理指令标注不需要编译的代码和由于用户编写不规范导致的一定不会被执行的代码;
步骤6,将源代码标识符中出现的非ASCII码替换为ASCII码字符串;
步骤7,对源代码中的由字符串与参数构成的函数声明及其调用语句进行变形;
其中,在步骤7中,将所有的未在函数名字字符串后面的函数参数移动至函数名字字符串后面,并保持函数参数的顺序不变;同时,在函数参数原来的位置处用特定字符串代替形成新的字符串,所述特定字符串用以标识此位置原先对应一个参数,例如:“_Arg_”;具体来说,add(A)and(B)to(C)在预编译后变形成为add_Arg_and_Arg_to(A,B,C)。
所述编译子模块通过词法分析算法和语法分析算法对预编译代码进行编译,生成字符码,并存储在字符码表中;词法分析算法是将预编译代码的字符序列转换为单词序列的算法;语法分析算法是将单词序列组合成各类语法短语并将其输出为字符码的算法。所述字符码由三部分组成,包括代码类型标志位、四元式、四元式参数类型标志位数组;
所述代码类型及其所描述的功能包括:
“变量声明”,声明一个变量;
“函数操作”,包括将函数声明作用域与函数体作用域绑定的操作和将权重、返回类型与函数声明作用域进行绑定的操作;
“推导函数”,根据正向函数的函数体作用域推导逆向函数的实现逻辑;
“域起始”,用于声明作用域的起始;
“域结束”,用于声明作用域的结束;
“表达式”,表明此行代码的四元式是表达式的一部分;运算、函数调用、将属性(“$”、“#”、“out”)赋予变量均属于“表达式”;本申请中优选地,“$”符号作用于参数x,表明参数x在该表达式中待定,对于一个表达式中多次出现的待定变量,只需要使用“$”修饰一次即可;“#”符号作用于参数x,表明参数x在该表达式中可以待定也可以确定,对于一个表达式中多次出现的可以待定也可以确定的变量,只需要使用“#”修饰一次即可;逆向函数的函数体中出现的变量“ans”代表的函数的返回值,为已知参数,可以不使用;用户调用逆向函数时,需要用$修饰所要推导的待定变量,例如:1*$a^2+(-2)*a+1==0;告知计算机需要推导满足条件的a,执行结束后a为1。
“跳转”,当跳转条件为真时跳转到地址对应处代码进行执行;
“表达式结束”,表明当前执行代码的上一行代码所在表达式已经结束,起到截断表达式的作用;
“返回”,此行代码为函数的返回语句;
“类操作”,包括定义类、将类名称与作用域绑定、定义类之间的继承关系;
四元式及四元式参数类型标志位数组在代码类型为“表达式”时用于储存四元式的左运算对象、右运算对象、运算符、运算结果以及分别对应的数据类型;当代码为其他类型时仅用于存储相关参数及对应的数据类型。
关于所述字符码四元式,当字符码类型为“表达式”时,所述字符码四元式用于表述基本的一元、二元、零元运算表达式并存储运算符、运算对象、运算结果;当字符码类型不是“表达式”时,所述字符码四元式仅用于储存参数;
所述四元式参数类型标志位数组用于标明字符码四元式所存储的左运算对象、右运算对象、运算符、运算结果的参数类型,具体来说:当所述标志位数组中的标志位置为“地址”时,能够标明字符码四元式中对应参数类型为地址;当所述标志位数组中的标志位置为“数字”时,能够标明字符码四元式中对应参数类型为数字;当所述标志位数组中的标志位置为“标识符”时,能够标明字符码四元式中的对应参数类型为标识符;当所述标志位数组中的标志位置为“字符串”时,能够标明字符码四元式中的对应参数类型为字符串。
优选地,所述字符码表具体为:以单级地址为键、汇编四元式为值的二维表;其中,单级地址指通过一个整数表示的地址,字符码表中代码的单级地址即为该代码在字符码文件中所在行的行数,字符码表中各键值对根据单级地址的大小由小到大、从前往后排列;
在一个优选的实施方式中,所述预执行模块3用于预执行所述字符码表,获得拓展代码表;同时生成作用域表、函数表、类表;以便于执行时更容易获取所需信息。
其中所述拓展代码表是以代码地址为键、拓展代码为值的二维表;表中各键值对根据地址由小到大、从前往后排列;
拓展代码具体包括:代码所在作用域的地址、代码可执行标志位、代码类型标志位、四元式、四元式参数类型标志位数组、四元式形参标志位数组、四元式本作用域参数标志位数组、四元式参数待定标志位数组、绑定函数地址、函数根节点标志位。各部分功能为:
代码所在作用域的地址:用于标识此行代码所在的作用域在作用域表中的地址;
代码可执行标志位:用于标识代码是否可以被执行,函数声明作用域对应的代码不能被执行,此标志位为“假”;函数体作用域以及条件语句所跳转部分需要满足一定条件才可以执行,此标志位为“一定条件执行”;其他情况下此标志位为“真”;
代码类型标志位、四元式、四元式参数类型标志位数组:与字符码中功能相同;
四元式形参标志位数组:当代码的可执行标志位为“假”(即代码位于函数声明作用域)时有效,用于标识四元式中参数是否为形式参数;
四元式本作用域参数标志位数组:与四元式形参标志位数组共用存储空间,当代码的可执行标志位不为“假”(即代码不位于函数声明作用域)时有效,用于标识查询四元式中对应参数时是从当前代码所在作用域内开始查询还是从当前代码所在作用域的上层作用域开始查询;
四元式参数待定标志位数组:用于标识在此行代码被执行时四元式中对应参数的值是否待定,若参数待定(标志位为“真”),则此参数的值将被视作未知,即使此参数此时有对应值其值也会被视作无效值;若参数确定(标志位为“假”),则此参数的值将被视作已知条件;特别的,对于返回表达式的函数,由于很多情形下其代表的规则无论变量是否待定均可使用,故允许其函数声明中的参数具有“待定”、“确定”、“无关”三种状态,相应地,标志位也有“真”、“假”、“无关”三种状态;
绑定函数地址:用以标识代码(段)所绑定的函数的地址;由于本申请的编译系统中所有函数声明均为表达式,因此调用某个函数需要将此函数的函数声明表达式和与之结构相同的表达式进行绑定,在执行此行段代码时就会调用所绑定的函数。
函数根节点标志位:此标志位为真,说明此行代码对应所绑定函数的函数声明表达式的根结点,为假则对应子结点。用于处理当出现一段代码与相同函数连续绑定多次的情况(即连续调用同一个函数)时,由于各行代码的绑定函数地址均相同,因而无法直接区分各次函数调用的情况。
所述作用域表是以作用域的地址为键、作用域信息为值的二维表;作用域表中各键值对根据地址由小到大、从前往后排列。
作用域信息具体包括:作用域类型标志位、作用域起始地址、作用域结束地址、参数查询作用域地址;各部分功能为:
作用域类型标志位:用于描述作用域为函数声明作用域,或,函数体作用域;
所述作用域起始地址:作用域起始代码在代码表中的地址;
所述作用域结束地址:作用域结束代码在代码表中的地址;
参数查询作用域地址:用于查询此作用域内涉及但并未在此作用域以及此作用域的外层作用域中声明的参数时所需访问的作用域的地址。函数实现作用域的参数查询作用域地址即对应的函数声明作用域地址;
所述函数表是以函数地址为键、函数信息为值的二维表;函数表中各键值对根据地址的大小由小到大、从前往后排列;
函数信息具体包括:函数声明作用域地址、函数声明根结点地址、函数体作用域地址、返回代码地址数组、函数返回表达式标志位、是否逆向函数标志位、函数权重值;各部分功能为:
函数声明作用域地址:标识函数声明的作用域地址;
函数声明根节点地址:函数声明表达式的根节点四元式所在代码的地址;
函数体作用域地址:函数体作用域的地址
返回代码地址数组:函数体作用域中所有返回语句的代码地址;
函数返回表达式标志位:用以标识函数返回表达式或是返回运算值;
是否逆向函数标志位:用以标识函数为正向函数或逆向函数;
函数权重值:标识函数的权重值;
所述类表是以类地址为键、类信息为值的二维表;类表中各键值对根据地址的大小由小到大、从前往后排列;
类信息具体包括:类作用域地址、类名、父类地址数组;各部分功能为:
类作用域地址:类的作用域地址,作为类表的键值,即类的地址;
类名:类的名称;
父类地址数组:储存类所直接继承的类的地址的数组;
在一个优选的实施方式中,所述预执行模块3的预执行过程是程序推理与函数查询过程,在预执行过程中,所有地址均被视作多级地址,以便于代码表的插入与删除操作。
所述多级地址是由一个一维整数数组构成且数组首位和最后一位均不为零的地址;数组内只有一个数字的多级地址为单级地址,数组内有零个数字的多级地址为空地址;多级地址之间大小比较方式为从多级地址数组起始位置开始向后依次取各自对应位数字比较:如果每位数字都相等,则两个多级地址相等,如果出现两个数字不相等,则较大的数字所在数组对应的地址较大;如果一个多级地址的数组比另一个多级地址的数组短,比较时较短数组相对较长数组的空缺位置的数字默认为零:
优选地,从拓展代码表从前往后依次按照以下规则对每行代码进行预执行:
步骤a:对于“代码可执行标志位”为“假”的代码,直接跳过当前执行代码;所述当前执行代码,即正在预执行处理的代码;
步骤b:对于“代码可执行标志位”为“一定条件下执行”或为“真”的代码,根据“代码类型标志位”设置执行过程,具体执行下述子步骤中的任意一个或多个步骤:
子步骤b-1,当“代码类型标志位”为“跳转”时,跳过当前执行代码;
子步骤b-2,当“代码类型标志位”为“返回操作”时,跳过当前执行代码;
子步骤b-3,当“代码类型标志位”为“函数操作”时,解析函数信息并更新函数表;
子步骤b-4,当“代码类型标志位”为“域起始”时,解析作用域信息并更新作用域表,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录附加信息,并将所创建的活动记录标记为当前活动记录,解析作用域信息并更新作用域表;
所述活动记录用于记录一个作用域内代码的特定的执行前后所涉及的上下文信息和执行过程中产生的信息,具体包括:数据表和活动记录信息;
其中数据表是二维表,该二维表的键为标识符名称,或,参数所在地址,或,活动记录作用域地址,该二维表的值为数字,或,字符串,或,访问成员的路径,或,活动记录,或,其他被支持的数据类型。
其中活动记录信息,具体包括:形参实参对照表,活动记录作用域地址、指向父活动记录的指针、指向返回活动记录的指针、当前活动记录的返回地址、用于储存参数查询活动记录指针的数组;
所述形参实参对照表是以形式参数标识符为键,实际参数标识符或实际参数地址为值的二维表;当且仅当此活动记录是函数体作用域的活动记录时此表才会被创建;在预执行过程中,此表仅通过分析函数声明作用域获得,只储存形式参数,形式参数对应的实际参数为默认值;在执行过程中,此表通过对比函数声明作用域与调用此函数的代码段获得,储存形式参数与对应的实际参数;
所述活动记录作用域地址是此活动记录对应的作用域的地址;
所述父活动记录是指数据表值域直接包含此活动记录的活动记录;
所述返回活动记录是指从当前活动记录离开后,应当被设置为当前活动记录的活动记录,一个活动记录的返回活动记录默认为它的父活动记录;若一个活动记录因为函数调用而创建,则它的返回活动记录应当为记录此函数调用动作的活动记录;查询实际参数时需要访问返回活动记录进行查询;
所述当前活动记录的返回地址是指从当前活动记录返回后应当标记为当前执行代码的地址,默认为当前执行代码的下一行代码,若当前活动记录是因为函数调用或类的实例化而创建,则该返回地址应为函数调用处或创建类实例的代码的下一行代码。
所述参数查询活动记录是指查询当前活动记录的数据表和形参实参对照表中均未出现的变量时需要访问的活动记录,创建子类实例时所生成的父类实例是此子类实例对应活动记录的参数查询活动记录;
子步骤b-5,当“代码类型标志位”为“域结束”时,解析作用域信息并更新作用域表;若当前作用域不是类实例时,销毁并离开当前活动记录,同时将返回活动记录标记为当前活动记录;若当前作用域是类实例时,离开当前活动记录但不销毁,同时将返回活动记录标记为当前活动记录;
子步骤b-6,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,以参数默认值为值的键值对;
子步骤b-7,当“代码类型标志位”为“表达式”且当前代码所在作用域不是返回表达式的函数的函数体时,具体执行下述亚子步骤中的任意一个或多个步骤:
亚子步骤b-7-1,在当前执行代码已与函数进行绑定时,即当前执行代码的匹配函数地址不为空时,直接跳过当前代码。
亚子步骤b-7-2,在当前执行代码未与函数进行绑定时,即匹配函数地址为空时,对当前执行代码进行代码替换和函数绑定;
在该亚子步骤b-7-2中,定义一种数据的表示格式a(b|c),表示数据a在b周期(匹配轮数)内被创建或赋值,在周期c内被使用;定义一种键值对的表示方式<a,b>,表示以a为键、b为a对应的值。
在该亚子步骤b-7-2中,依次执行:初始化(第0轮匹配)、第k轮匹配、匹配停止,具体来说,该亚子步骤b-7-2执行如下操作:
b-7-2-1,复制当前执行代码所在最长的表达式对应代码段e,获得以初始累计权重值0为键、复制代码段为值的键值对<0,e>;
b-7-2-2,将复制代码段键值对添加至当前代码仓S,其中,s为一个以累计权重值为键、代码段为值的二维表,也被视作键值对的集合;
s(0|1)={<0,e>};
此时,s(0|1)中只有<0,e>作为元素;
所述代码仓是以累计权重值为键,代码段为值的二维表,代码仓中各键值对根据累计权重值大小由小到大、从前往后排列,代码仓的可储存键值对的最大数目m由用户设定;
优选地,向代码仓中添加元素需满足以下要求a和b:
a、当尝试向一个已满的代码仓添加新键值对时,如果键值对中的累计权重值大于代码仓所有键中累计权重值的最小值,则代码仓先删除其头部键值对然后添加新的键值对,如果键值对中的累计权重值小于等于所有键中累计权重值的最小值,则代码仓不会对已添加的键值对做任何处理。也不会添加新的键值对;
b、代码仓中允许存在键相同、值不同的键值对,不允许存在两个完全一样的键值对。
b-7-2-3,对于k∈N*,在当前代码仓S(k-1|k)不为空时,对于所有<wi,ei>∈S(k-1|k),{i|i∈N∧i<card(S(k-1|k))};将ei中所有满足,任何结点所在代码均未与函数进行绑定的语法树分支对应的局部代码段,与所有可以访问到的函数进行匹配,优先匹配最先访问到的函数;每当ei的一个语法树分支与一个函数fun匹配成功,根据函数的类型对ei进行代码替换或函数绑定,生成代码段ej;ej对应权重值为将fun的权重值与ei的权重值相加的结果,即:
wj=wi+wfun。
优选地,所述可以访问到的函数指的是在当前位置之前声明、且位于当前作用域或当前作用域的上层作用域中的函数,以及,若当前代码所在作用域为一个类的作用域或其子域,则此类所继承的类的成员函数也可以被访问;代码段匹配函数,指将代码段代表的表达式exp1与函数声明表达式exp2进行比较,exp1与exp2的语法树结构相同,且任取exp1的一个结点node1以及exp2中与node1对位的节点node2,node1与node2均满足以下五种情况之一,则匹配成功:
·node1是具体值且node2是相同的值
·node1是具体值且node2是类型相同的形式参数
·node1是变量且node2是类型相同的形式参数
·node2是实际参数且node2与node1是同一个变量,例如:
·若node1或node2是某个变量的访问路径,则取路径所指向的变量代替原节点进行比较,比较结果满足前述四种情况之一;
对ei进行代码替换或函数绑定具体为:
若fun是返回表达式的函数,记其函数声明表达式为efuAnnounce,函数返回的表达式为efunReturn,权重为wfun,则ej中元素的代码段为将ei的代码段中与efunAnnounce所匹配的一段局部代码段替换为经过参数替换的efunReturn对应的代码段后的代码段,若ei中有多个局部代码段与efunAnnounce匹配,则生成多个ej;
若fun是返回运算值的函数,则ej为将ei的代码段中与efunAnnounce所匹配的一段局部代码段替换为经过参数替换的efunAnnounce对应的代码段后的代码段,新替换部分的每行代码均与fun进行绑定并且其根结点处代码的函数根节点标志位置为真;若ei中有多个局部代码段与efunAnnounce匹配,则生成多个ej;
所述对代码段进行参数替换,即将efunAnnounce中的形式参数替换为ei中对应的实际参数。
当fun代表的是一个化简操作,在使用返回表达式的函数进行代码替换后,可能产生脱离表达式语法树的代码片段(例如变换(x+1)*a+(x+1)*b=>(x+1)*(a+b)会使得一个x+1脱离语法树);如图2中所示;
当fun代表的是一个化繁操作,则在使用返回表达式的函数进行代码替换后,表达式的语法树可能产生环状结构(例如变换(a+b)*(x+1)=>a*(x+1)+b*(x+1)在语法树只有一个x+1分支的时候会导致a*(x+1)和b*(x+1)引用同一个x+1分支的根结点,对x+1的二次引用产生了环状结构);如图3中所示;
基于此,在代码替换后,需要查找并删除代码段中脱离表达式语法树的代码片段,并进行环状结构的检查与展开;环状结构检查具体为,检查语法树的新替换部分是否出现了对同一语法树分支进行至少两次引用的情况,若出现这种情况,则存在环状结构,展开环状结构具体为,复制根节点被至少两次引用的语法树分支对应的代码段,用未被使用的地址替换复制的语法树分支对应代码段的代码地址与用于存储运行时生成的中间变量的地址以使此语法树分支复制代码段可以在不与原语法树分支对应代码段冲突的情况下插入进行代码替换后的代码段中并位于原语法树分支的根节点的第二次被引用位置之前,随后将修改后的语法树分支复制代码段插入代码替换后的代码段中并将引起环状结构的对语法树分支的根结点的第二次引用改为对所插入的语法树分支复制代码段的根结点的引用,重复进行环状结构检查与展开直至语法树的新替换部分不存在环状结构。
b-7-2-4,当满足以下情况之一时,匹配结束:
·当ej满足所有代码均与函数绑定时,匹配过程以成功结束,用ej替换掉当前执行代码所在最长的表达式在代码表中的对应代码段;否则将<wj,ej>添加到S(k|k+1)中并继续进行匹配:
S(k|k+1)=S(k|k+1)∪{<wj,ej>}
·当匹配轮数超出用户规定上限kmax时以失败结束;
·当本轮和下一轮均无可用元素参与匹配时以失败结束:
优选地,图4示出了以下代码段在预执行结束后表达式与函数的绑定效果:
@由(x)与(y)得结果{
new:a=x+y;
$x+1==y;
new:z=0;
1*$z^2+x*z+y==100;
return:a+x+z;
}
子步骤b-8,当“代码类型标志位”为“表达式结束”时,可知当前执行代码的上一行代码所在的最长的表达式已经结束,跳过当前执行代码;
子步骤b-9,当“代码类型标志位”为“推导函数”时,利用正向函数的函数实现推导逆向函数的函数实现;
优选地,所述利用正向函数实现推导逆向函数实现,需要执行以下亚子步骤:
亚子步骤b-9-1,将正向函数的函数体代码段拆解为代码块;
亚子步骤b-9-2,利用代码块推导逆向函数的执行过程。
优选地,在亚子步骤b-9-1中,所述代码块,由序号、代码段、代码块信息组成,序号在代码块创建时生成,越早创建的代码块其序号越小,代码块信息包括:代码块的类型,用于反映代码段中代码的类型,可以为“表达式”“域起始”“域结束”“返回”“默认”;代码块依赖待定输入参数标志位,用于说明代码段中是否存在依赖待定输入参数的变量;一个变量依赖于待定输入参数,指的是在正向执行函数体代码的过程中,确定待定输入参数的值是确定这个变量的值的必要条件。反之,一个变量独立于待定输入参数,指的是在正向执行函数体代码的过程中,确定待定输入参数的值不是确定这个参数的值的必要条件。
优选地,在亚子步骤b-9-1中,拆解过程从前向后逐行分析正向函数的函数体的每一行代码,若当前分析代码的“代码可执行标志位”为“假”,跳过当前代码;若当前分析代码的“代码可执行标志位”为“直接执行”或“一定条件下执行”,根据代码类型标志位执行以下步骤:
b-9-1-1,代码类型标志位为“域起始”时:创建代码块,代码块的类型为“域起始”,代码块依赖待定输入参数标志位为“假”(即不依赖),代码块的代码段为当前分析代码;将代码块从末端加入代码块队列B中;
b-9-1-2,代码类型标志位为“域结束”时:创建代码块,代码块的类型为“域结束”,代码块依赖待定输入参数标志位为“假”,代码块的代码段为当前分析代码;将代码块从末端加入代码块队列B中;
b-9-1-3,代码类型标志位为“表达式结束”时,跳过当前代码;
b-9-1-4,代码类型标志位为“表达式”且函数根节点标志位为“真”时,复制当前代码所在函数调用表达式对应的代码段,并对此复制代码段依次执行以下操作创建代码块:
b-9-1-4-1,对代码中的变量进行替换:
当一个变量被修改后,它就不是原来的变量了,逆推过程中为避免修改后的变量与修改前的变量产生混淆,需要用一个新的变量表示修改后的变量,以与原变量区分;具体需根据以下规则进行处理:
如果一个非临时变量待定,那么用一个新的变量替换掉这个变量,并将该新变量添加到集合Areplace中,同时将以被替换掉的旧变量为键,用以替换旧变量的新变量为值的键值对添加到变量替换表中;其中,变量替换表是一个一一映射的表,键值相同的情况下,新添加的键值对会覆盖之前添加的键值对;
如果一个非临时变量确定,那么在变量替换表中查询以该变量为键的新变量,如果新变量存在,需要用新变量替换掉该变量;
如果一个变量是赋值表达式的左操作数,那么用一个新的变量替换掉这个变量,并将以被替换掉的变量为键,用于替换的新变量为值的键值对添加到变量替换表中;
函数调用代码段内的一个变量最多只能被替换为另外一个变量,不允许代码段内一个变量被替换为多个不同变量;其中函数调用代码段,即这段代码中所有代码均与同一个函数绑定,且代码段中有且只有最后一行代码的函数根节点标志位为“真”,函数调用代码段的语法树结构与所绑定函数的函数声明语法树结构完全一致,执行函数调用代码段将调用所绑定函数;
b-9-1-4-2,确定代码中各变量对待定输入参数的依赖性:
包含依赖待定输入参数的变量的代码段被用来逆推待定输入参数,而不包含待定输入参数的变量的代码段充当逆推过程中的已知条件;具体需根据以下规则确定代码中每个变量对待定输入参数的依赖性并进行处理:
如果一个变量在语法树中的任意子结点依赖于待定输入参数,那么这个变量也依赖于待定输入参数;
如果一个变量是待定变量,且其所在语法树中存在依赖于待定输入参数的变量,那么这个变量也依赖于待定输入参数;
如果一个变量是赋值表达式的左操作数,且右操作数依赖于待定输入参数,那么这个变量也依赖于待定输入参数;
如果一个变量依赖于待定输入参数,但其原本为确定变量,则将其改为待定变量(即,令参数待定标志位为“真”),因为依赖待定输入参数的变量在正向执行函数体代码的过程中一定待定。
优选地,所述临时变量,即没有声明便被使用的变量,一个临时变量在首次使用时应被用以存储四元式的运算结果;非临时变量即使用前被用户声明的变量;
b-9-1-4-3,利用修改后的代码段创建代码块:
创建代码块,其类型为“表达式”;如果代码段中存在依赖待定输入参数的变量,则将代码段中所有代码取消与函数的绑定,并将代码块的依赖待定输入参数标志位置为“真”;如果代码段中不存在依赖待定输入参数的变量,则将代码块的依赖待定输入参数标志位置为“假”;将代码块从末端加入代码块队列B中;
优选地,所述取消与函数的绑定,即将代码的匹配函数地址置为空,函数根节点标志位置为“假”;
b-9-1-5,代码类型标志位为“表达式”且函数根节点标志位为“假”时,跳过;
b-9-1-6,代码类型标志位为“返回”时,创建代码块,代码块的类型为“返回”,代码块依赖待定输入参数标志位为“假”;由于需要利用已知的返回值逆推,故在代码段中将返回值ans赋予被返回的变量,同时代码类型“返回”修改为“表达式”;将代码块从末端加入代码块队列B中;
b-9-1-7,其他情况,复制当前分析代码所在的单行代码段,并利用此复制代码段创建一个代码块,代码块的类型为“默认”,代码块依赖待定输入参数标志位为“假”,将其从末端加入代码块队列B中;
例如,将以下代码拆解为代码块:
@由(x)与(y)得结果{
new:a=x+y;
$x+1==y;
new:z=0;
1*$z^2+x*z+y==100;
return:a+x+z;
}=>@由($x)与(y)得结果;
则拆解后
B={[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14]}
其中[n]代表序号为n的代码块,代码块内的具体内容如图5中所示。
优选地,在亚子步骤b-9-2中,利用代码块推导逆向函数的执行过程,具体依次执行以下操作:
b-9-2-1,将代码块队列B中的代码块根据是否依赖待定输入参数重组为依赖待定输入参数代码块队列Bdepedent和独立(不依赖)于待定输入参数代码块队列Bindepedent,重组的两个队列中代码块均根据代码块的序号从小到大、从前往后排列;
b-9-2-2,当依赖待定输入参数代码块队列Bdepedent不为空时,通过动态规划算法进行逆推,具体需要重复执行以下操作:
b-9-2-2-1,以依赖待定输入参数代码块队列最末端的代码块为根结点代码块,回溯确定代码块之间的依赖关系树,且依赖关系树的结点数目不超过由用户确定的最大数目;
其中,依赖关系树中子结点与父节点满足:子结点代码块中代码段的至少一个待定变量被其父结点代码块中的代码段使用;例如,以代码块[12]为根结点且结点数目为4的依赖关系树以及对应代码段如图6中所示。
b-9-2-2-2,根据优先顺序选取依赖关系树,将所选取的依赖关系树的各个结点重新合并成代码段,并对代码段进行代码替换与函数绑定;若没有可供选取的依赖关系树,则逆推失败;
本申请中所采用的优先顺序,具体为,依赖关系树的依赖待定输入参数的必要变量的数目越少越优先,在此基础上,依赖关系树的结点数越少越优先;一般而言,依赖关系树的依赖待定输入参数的必要变量越少,其组合成的代码段越可能与函数绑定成功。其中,依赖关系树的依赖待定输入参数的必要变量,即,依赖待定输入参数、且同时被依赖关系树的结点和Bdepedent中的非依赖关系树结点的代码块(非依赖关系树结点的代码块,即Bdepedent与依赖关系树所包含代码块的差集,亦即属于Bdepedent但不属于依赖关系树的代码块)使用的变量;与之相对,如果一个依赖待定输入参数的变量仅在依赖关系树的结点中被使用,而没有被Bdepedent中其他不属于依赖关系树的代码块使用,那么这个变量为依赖关系树的依赖待定输入参数的非必要变量;例如:对于依赖关系树T1={[12],[11]},变量$-ARG_1为依赖待定输入参数的必要变量,因为其在代码块[4]中被使用,变量$tmp7和$ans3则属于非必要变量,因为其仅在T1中被使用。
其中,将依赖关系树的各个结点重新合并成代码段,具体为,从依赖关系树的末端叶结点开始,不断将叶结点代码块的代码段合并到其父结点的代码段并从树中移除合并成功的叶结点,直至依赖关系树只有根结点一个结点,此时依赖关系树合并成功。此时根结点代码段即为由依赖关系树各个结点合并而来的代码段;
合并过程需遵循以下规则:
·如果子结点的代码段的语法树的根结点为赋值表达式,则用子结点代码段的以赋值表达式右值为根结点的语法树(即右子树),将父结点的代码段的语法树中,所有与子结点代码段语法树的根结点赋值表达式左值(即左子结点)相同的变量替换掉;
·如果子结点的代码段的语法树的根结点不为赋值表达式,则用子结点代码段的语法树,将父结点的代码段的语法树中,所有与子结点代码段语法树的根结点变量相同的变量替换掉;
·子结点合并到父结点需要对父结点代码段语法树进行至少一次替换;若一次替换也没有进行,则代码块合并失败,此依赖关系树组合代码段失败,重新执行b-9-2-2-2;
图7展示了将依赖关系树T={[12],[11],[4],[3]}合并至根节点[12]的过程(左侧为合并前,右侧为合并后)。
若一棵依赖关系树合并成功,记原依赖关系树为Torg,合并得到的依赖关系树为Tfinal,Tfinal只有一个结点[root]final,对[root]final的代码段进行代码替换与函数绑定。
若对[root]final的代码段所进行的代码替换与函数绑定成功,则将[root]final从后端压入逆向执行代码块队列Bback;由于[root]final的代码段在被执行后,Torg中所有的待定的变量均被确定,因此在进行下一轮逆推之前,需要将Torg中所有结点从依赖待定输入参数代码块队列Bdepedent中移除,并更新Bdepedent中其他代码块的待定变量,具体为,对Bdepedent中的每个代码块,若其代码段语法树中使用了Torg中的待定变量,则将此待定变量改为确定变量(即,将变量的待定标志位改为“假”),并根据以下规则修改语法树中其他变量的标志位:
·如果一个变量在语法树中的所有子结点均确定,那么这个变量也确定;
·如果一个变量是赋值表达式的左操作数,且右操作数确定,那么这个变量也确定;
完成标志位修改后,重新执行亚子步骤b-9-2以开始下一轮逆推;
若代码替换与函数绑定失败,则重新执行b-9-2-2-2;
b-9-2-3,利用独立于待定输入参数代码块队列Bindepedent和逆推得到的逆向执行代码块队列Bback构造逆向函数的函数体代码eback,具体为:
b-9-2-3-1,弹出Bindepedent中的头部代码块,此被弹出的代码块的类型为“域起始”,将此代码块的代码段追加到逆向函数的函数体代码段eback的末尾;其中弹出元素指从集合中删除并返回特定元素;
b-9-2-3-2,由于在逆推过程中使用了新变量用于替换被修改的变量,这些变量储存在Areplace中且未被声明,因此需要在eback末端,追加用于声明Areplace中元素的代码,代码类型为“变量声明”;
b-9-2-3-3,若Bindepedent中至少有两个元素,弹出Bindepedent中的头部代码块,在eback末端追加弹出的代码块的代码段;当弹出的代码块的类型为“表达式”,且,eback与Bindepedent中所有元素的代码段均不存在共用的临时变量时,在逆向函数的函数体代码段末端追加一行类型为“表达式结束”的代码以标明表达式的结束;重复执行此步骤直到Bindepedent中只有一个元素;
b-9-2-3-4,弹出逆向执行代码块队列Bback的头部代码块,在eback末端追加弹出代码块的代码表;当弹出的代码块的类型为“表达式”且逆向执行代码块队列Bback中不存在eback中使用的临时变量时,则在逆向函数的函数体代码段末端追加类型为“表达式结束”的代码以标明表达式的结束;重复执行此步骤至Bback为空;
b-9-2-3-5,弹出Bindepedent中唯一的代码块,被弹出的代码块的类型为“域结束”,将此代码块的代码段追加到eback末尾;
b-9-2-3-6,用未被使用的地址替换eback的代码地址、用于存储运行时生成的中间变量的地址、作用域地址以使逆向函数的函数体代码段eback可以在不产生地址冲突的情况下插入逆向函数声明位置之后、下一行代码之前,随后将修改后的逆向函数的函数体代码段插入代码表中,并更新作用域表、函数表的信息;
由代码块队列B所逆推得到的函数体,其结构如图8中所示。
子步骤b-10,当“代码类型标志位”为“成员访问”时,在当前活动记录数据表中添加以地址为键,访问路径为值的键值对;
子步骤b-11,当“代码类型标志位”为“类操作”时,解析类信息并更新类表;
本申请中,所述预执行过程不求解具体值,因此预执行过程中不进行实际的数值运算与逻辑运算操作,但仍需根据语句创建变量以保证参数环境正确。
在一个优选的实施方式中,所述执行模块4用于从拓展代码表起始位置开始执行拓展代码表中的代码,最终获得问题的解;
具体来说,执行模块4的执行过程包括如下步骤:
步骤甲,对于“代码可执行标志位”为“假”的代码,直接跳过此代码;
步骤乙,对于“代码可执行标志位”为“一定条件下执行”的代码,且并非由函数调用或条件语句跳转或创建类实例而执行此行代码时,直接跳过整个作用域内部的代码;
步骤丙,对于“代码可执行标志位”为“一定条件下执行”的代码且由函数调用或条件语句跳转或创建类实例而执行此行代码时,或者,代码可执行标志位为“真”时,需根据代码类型执行下述子步骤中的任意一个或多个步骤:
子步骤丙-1,当“代码类型标志位”为“跳转”时,若跳转条件为真,将当前执行代码设置为所跳转地址对应代码并执行,否则直接跳过当前执行代码;
子步骤丙-2,当“代码类型标志位”为“返回操作”时,将结果返回后结束执行此函数并返回函数调用位置;具体来说,被返回的运算值赋值给“形参实参对照表”中“形式返回参数”对应的“实际返回参数”,若“实际返回参数”不存在则不赋值;其中“形式返回参数”即函数声明表达式中的根节点对应参数,“实际返回参数”即与此函数绑定的代码段对应表达式的根节点对应参数(变量);
将当前活动记录标记为待销毁活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,并递推销毁待销毁活动记录,执行当前执行代码;所述递推销毁活动记录的具体处理过程为,若一个待销毁记录的父记录与当前活动记录不是同一个活动记录且不是类实例,则待销毁记录的父活动记录也会被标记为待销毁活动记录,依次递推,最终将所有待销毁活动记录一并销毁。
子步骤丙-3,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
子步骤丙-4,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录信息,并将所创建的活动记录设置为当前活动记录;
子步骤丙-5,当“代码类型标志位”为“域结束”且当前活动记录不是类实例时,将当前活动记录标记为待销毁活动记录,若返回活动记录不存在,则销毁当前活动记录,程序执行结束;否则将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,递推销毁活动记录并继续执行程序;当“代码类型标志位”为“域结束”且当前活动记录是类实例时,不销毁当前活动记录,仅将当前活动记录的返回活动记录标记为当前活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码并继续执行程序;
子步骤丙-6,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,参数默认值为值的键值对;
子步骤丙-7,当“代码类型标志位”为“表达式”时,对于当前代码所在最长表达式代码段,先正向依次执行最长表达式中的正向函数,再反向执行逆向函数;
具体依次执行以下两个操作:
子步骤丙-7-1,从最长表达式代码段起始位置向后执行,若函数根结点标志位为假,则跳过当前执行代码;若函数根结点标志位为真且所绑定函数为正向函数,则调用所绑定函数;若函数根结点标志位为真且所绑定函数为逆向函数,则仅初始化调用绑定函数所需的变量而不调用;直至到达最长表达式的末尾;
子步骤丙-7-2,从最长表达式代码段的结束位置向起始位置执行,若函数根结点标志位为假或所绑定函数为正向函数,则跳过当前执行代码;若函数根结点标志位为真且所绑定函数为逆向函数,则调用所绑定函数,并将为函数调用创建的活动记录的返回地址设置为在最长表达式代码段中、位于调用此逆向函数的函数调用代码段起始位置的上一行代码的地址,若调用此逆向函数的函数调用代码段起始位置与最长表达式代码段的起始位置重合,则将返回地址设置为最长表达式代码段结束位置的下一行代码的地址。
子步骤丙-8,当“代码类型标志位”为“表达式结束”时,表明当前执行代码的上一行代码所在表达式已经结束,跳过当前执行代码;
子步骤丙-9,当“代码类型标志位”为“推导函数”时,跳过此行代码;
子步骤丙-10,当“代码类型标志位”为“成员访问”时,在当前活动记录数据表中添加以地址为键,访问路径为值的键值对;
子步骤丙-11,当“代码类型标志位”为“类操作”时,跳过此行代码。
本发明还提供一种编程语言的编译方法,该方法是基于所述能够逆向推理的编程语言的编译系统实现的,具体来说,该方法包括如下步骤:
S1:通过交互模块1接收源代码;
其中,所述源代码是指用户通过输入端口输入的代码,所述源代码包括函数的正向计算过程。
S2:通过编译模块2对源代码进行预处理和编译,得到字符码表;
其中,首先通过预处理子模块对源代码进行预处理并生成预编译代码;具体来说包括如下步骤:
步骤1,删除源代码注释;
步骤2,删除源代码中的空格、换行符;
步骤3,将多个文件中的源代码进行合并;
步骤4,语句替换;
步骤5,对无效源代码进行删除;
步骤6,将源代码标识符中出现的非ASCII码替换为ASCII码字符串;
步骤7,对源代码中的由字符串与参数构成的函数声明及其调用语句进行变形;
然后通过编译子模块对预编译代码进行编译,生成具有字符码类型标志位、字符码四元式、字符码四元式参数类型标志位数组的字符码,并储存在字符码表中。
S3:通过预执行模块3预执行所述字符码表,获得拓展代码表;
其中,预执行过程根据字符码表生成拓展代码表,并从前向后逐行执行并修改拓展代码表,具体包括以下步骤:
步骤a:对于“代码可执行标志位”为“假”的代码,直接跳过当前执行代码;
步骤b:对于“代码可执行标志位”为“一定条件下执行”或为“真”的代码,根据“代码类型标志位”设置执行过程,具体执行下述子步骤中的任意一个或多个步骤:
子步骤b-1,当“代码类型标志位”为“跳转”时,跳过当前执行代码;
子步骤b-2,当“代码类型标志位”为“返回操作”时,跳过当前执行代码;
子步骤b-3,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
子步骤b-4,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录,并将所创建的活动记录标记为当前活动记录,解析作用域信息并更新作用域表;
子步骤b-5,当“代码类型标志位”为“域结束”时,解析作用域信息并更新作用域表;若当前作用域不是类实例时,销毁并离开当前活动记录,同时将返回活动记录标记为当前活动记录;若当前作用域是类实例时,离开当前活动记录但不销毁,同时将返回活动记录标记为当前活动记录;
子步骤b-6,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,以参数默认值为值的键值对;
子步骤b-7,当“代码类型标志位”为“表达式”时,具体执行下述亚子步骤中的任意一个或多个步骤:
亚子步骤b-7-1,在当前执行代码已与函数进行绑定时,即此匹配函数地址不为空时,直接跳过当前代码;
亚子步骤b-7-2,在当前执行代码未与函数进行绑定时,即匹配函数地址为空时,利用累计权重法对当前执行代码进行代码替换和函数绑定;
子步骤b-8,当“代码类型标志位”为“表达式结束”时,跳过当前执行代码;
子步骤b-9,当“代码类型标志位”为“推导函数”时,利用正向函数的函数实现推导逆向函数的函数实现;
子步骤b-10,当“代码类型标志位”为“成员访问”时,在当前活动记录数据表中添加以地址为键,访问路径为值的键值对;
子步骤b-11,当“代码类型标志位”为“类操作”时,解析类信息并更新类表;
S4:通过执行模块4执行拓展代码表,获得问题的解。
其中,执行模块4的执行过程包括如下步骤:
步骤甲,对于“代码可执行标志位”为“假”的代码,直接跳过此代码;
步骤乙,对于“代码可执行标志位”为“一定条件下执行”的代码,且并非由函数调用或条件语句跳转或创建类实例而执行此行代码时,直接跳过整个作用域内部的代码;
步骤丙,对于“代码可执行标志位”为“一定条件下执行”的代码且由函数调用或条件语句跳转或创建类实例而执行此行代码时,或者,代码可执行标志位为“真”时,需根据代码类型执行下述子步骤中的任意一个或多个步骤:
子步骤丙-1,当“代码类型标志位”为“跳转”时,若跳转条件为真,将当前执行代码设置为所跳转标签所在代码的下一行代码,否则直接跳过当前执行代码;
子步骤丙-2,当“代码类型标志位”为“返回操作”时,将结果返回后结束执行此函数并返回函数调用位置;具体来说,被返回的运算值赋值给“形参实参对照表”中“形式返回参数”对应的“实际返回参数”,若“实际返回参数”不存在则不赋值;其中“形式返回参数”即函数声明表达式中的根节点对应参数,“实际返回参数”即与此函数绑定的代码段对应表达式的根节点对应参数(变量);
将当前活动记录标记为待销毁活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,并递推销毁待销毁活动记录,执行当前执行代码;
子步骤丙-3,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
子步骤丙-4,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录信息,并将所创建的活动记录设置为当前活动记录;
子步骤丙-5,当“代码类型标志位”为“域结束”且当前活动记录不是类实例时,将当前活动记录标记为待销毁活动记录,若返回活动记录不存在,则销毁当前活动记录,程序执行结束;否则将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,递推销毁活动记录并继续执行程序;当“代码类型标志位”为“域结束”且当前活动记录是类实例时,不销毁当前活动记录,仅将当前活动记录的返回活动记录标记为当前活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码并继续执行程序;
子步骤丙-6,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,参数默认值为值的键值对;
子步骤丙-7,当“代码类型标志位”为“表达式”时,对于当前代码所在最长表达式代码段,先正向依次执行最长表达式中的正向函数,再反向执行逆向函数;
子步骤丙-8,当“代码类型标志位”为“表达式结束”时,表明当前执行代码的上一行代码所在表达式已经结束,跳过当前执行代码;
子步骤丙-9,当“代码类型标志位”为“推导函数”时,跳过此行代码;
子步骤丙-10,当“代码类型标志位”为“成员访问”时,在当前活动记录数据表中添加以地址为键,访问路径为值的键值对;
子步骤丙-11,当“代码类型标志位”为“类操作”时,跳过此行代码。
实施例
设置能够逆向推理的编程语言的编译系统,该系统对输入的源程序做如下处理:
通过交互模块接收该源代码;
通过编译模块对源代码进行预处理和编译,得到字符码表;
其中,首先通过预处理子模块对源代码进行预处理并生成预编译代码;具体来说包括如下步骤:
步骤1,删除源代码注释;
步骤2,删除源代码中的空格、换行符;
步骤3,将多个文件中的源代码进行合并;
步骤4,语句替换;
步骤5,对无效源代码进行删除;
步骤6,将源代码标识符中出现的非ASC I I码替换为ASC I I码字符串;
步骤7,对源代码中的由字符串与参数构成的函数声明及其调用语句进行变形;
然后通过编译子模块对预编译代码进行编译,生成具有字符码类型标志位、字符码四元式、字符码四元式参数类型标志位数组的字符码,存储在字符码表中。
通过预执行模块预执行所述字符码表,获得拓展代码表;
其中,预执行过程根据字符码表生成拓展代码表,并从前向后逐行执行并修改拓展代码表,具体包括以下步骤:
步骤a:对于“代码可执行标志位”为“假”的代码,直接跳过当前执行代码;
步骤b:对于“代码可执行标志位”为“一定条件下执行”或为“真”的代码,根据“代码类型标志位”设置执行过程,具体执行下述子步骤中的任意一个或多个步骤:
子步骤b-1,当“代码类型标志位”为“跳转”时,跳过当前执行代码;
子步骤b-2,当“代码类型标志位”为“返回操作”时,跳过当前执行代码;
子步骤b-3,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
子步骤b-4,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录,并将所创建的活动记录标记为当前活动记录,解析作用域信息并更新作用域表;
子步骤b-5,当“代码类型标志位”为“域结束”时,解析作用域信息并更新作用域表;若当前作用域不是类实例时,销毁并离开当前活动记录,同时将返回活动记录标记为当前活动记录;若当前作用域是类实例时,离开当前活动记录但不销毁,同时将返回活动记录标记为当前活动记录;
子步骤b-6,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,以参数默认值为值的键值对;
子步骤b-7,当“代码类型标志位”为“表达式”时,具体执行下述亚子步骤中的任意一个或多个步骤:
亚子步骤b-7-1,在当前执行代码已与函数进行绑定时,即此匹配函数地址不为空时,直接跳过当前代码;
亚子步骤b-7-2,在当前执行代码未与函数进行绑定时,即匹配函数地址为空时,利用累计权重法对当前执行代码进行代码替换和函数绑定;
子步骤b-8,当“代码类型标志位”为“表达式结束”时,跳过当前执行代码;
子步骤b-9,当“代码类型标志位”为“推导函数”时,利用正向函数的函数实现推导逆向函数的函数实现;
子步骤b-10,当“代码类型标志位”为“成员访问”时,在当前活动记录数据表中添加以地址为键,访问路径为值的键值对;
子步骤b-11,当“代码类型标志位”为“类操作”时,解析类信息并更新类表。
通过执行模块执行拓展代码表,获得问题的解。
其中,执行模块的执行过程包括如下步骤:
步骤甲,对于“代码可执行标志位”为“假”的代码,直接跳过此代码;
步骤乙,对于“代码可执行标志位”为“一定条件下执行”的代码,且并非由函数调用或条件语句跳转或创建类实例而执行此行代码时,直接跳过整个作用域内部的代码;
步骤丙,对于“代码可执行标志位”为“一定条件下执行”的代码且由函数调用或条件语句跳转或创建类实例而执行此行代码时,或者,代码可执行标志位为“真”时,需根据代码类型执行下述子步骤中的任意一个或多个步骤:
子步骤丙-1,当“代码类型标志位”为“跳转”时,若跳转条件为真,将当前执行代码设置为所跳转标签所在代码的下一行代码,否则直接跳过当前执行代码;
子步骤丙-2,当“代码类型标志位”为“返回操作”时,将结果返回后结束执行此函数并返回函数调用位置;具体来说,被返回的运算值赋值给“形参实参对照表”中“形式返回参数”对应的“实际返回参数”,若“实际返回参数”不存在则不赋值;其中“形式返回参数”即函数声明表达式中的根节点对应参数,“实际返回参数”即与此函数绑定的代码段对应表达式的根节点对应参数(变量);
将当前活动记录标记为待销毁活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,并递推销毁待销毁活动记录,执行当前执行代码;
子步骤丙-3,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
子步骤丙-4,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录信息,并将所创建的活动记录设置为当前活动记录;
子步骤丙-5,当“代码类型标志位”为“域结束”且当前活动记录不是类实例时,将当前活动记录标记为待销毁活动记录,若返回活动记录不存在,则销毁当前活动记录,程序执行结束;否则将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,递推销毁活动记录并继续执行程序;当“代码类型标志位”为“域结束”且当前活动记录是类实例时,不销毁当前活动记录,仅将当前活动记录的返回活动记录标记为当前活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码并继续执行程序;
子步骤丙-6,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,参数默认值为值的键值对;
子步骤丙-7,当“代码类型标志位”为“表达式”时,对于当前代码所在最长表达式代码段,先正向依次执行最长表达式中的正向函数,再反向执行逆向函数;
子步骤丙-8,当“代码类型标志位”为“表达式结束”时,表明当前执行代码的上一行代码所在表达式已经结束,跳过当前执行代码;
子步骤丙-9,当“代码类型标志位”为“推导函数”时,跳过此行代码;
子步骤丙-10,当“代码类型标志位”为“成员访问”时,在当前活动记录数据表中添加以地址为键,访问路径为值的键值对;
子步骤丙-11,当“代码类型标志位”为“类操作”时,跳过此行代码。
针对以下数学问题:
对两个数字量x,y依次进行以下操作:
1、将x,y求和,结果记为a;
2、修改x的值,使其满足x+1的值等于y;
3、求解变量z,满足z^2+x*z+y等于100;
4、对a,x,z求和,得到最终结果;
已知第四步得到的结果为50,且y的初始值为3,则x的初始值为多少?
选择10位操作水平和经验基本一致,且都完全了解语法规则的用户,请其中的任意5位基于上述能够逆向推理的编程语言的编译系统,通过编辑输入函数正向执行过程的源代码利用编译系统自动逆推求解,5位用户编辑源代码所用时间分别为113s、130s、106s、125s、124s;且5位用户的源代码都能够在编译系统中予以执行,且能够获得预期的执行结果,其中一位用户输入的源程序如下:
最终得到的输出结果为:
debug output
Data:[dataFlagBit:1addrFlagBit:0content_i:36.1005content_s:content_a:]
通过该结果可知,x的初始值为36.1005,代入验证后,解算获得的数值准确。
请另外5位用户,针对相同的具体问题,直接编辑函数的逆向求解过程来解决该问题,其源程序的编写时间分别为127s、141s、134s、135s、131s,且其中第一位和第五位用户的计算结果存在错误。
通过上述实施例和对比例可知,能够逆向推理的编程语言的编译系统能够根据使用者输入的函数的正向计算过程即正向函数自动推导出该函数的逆向过程从而使得使用者不需要再花费大量时间思考函数的逆向过程,并且获得准确的逆向过程的解,能够在降低使用者工作量的基础上,进一步降低编程过程中错误的出现率。
以上结合了优选的实施方式对本发明进行了说明,不过这些实施方式仅是范例性的,仅起到说明性的作用。在此基础上,可以对本发明进行多种替换和改进,这些均落入本发明的保护范围内。
Claims (10)
1.一种能够逆向推理的编程语言的编译系统,其特征在于,该系统包括:
交互模块(1),其用于接收源代码;
编译模块(2),其用于对源代码进行预处理和编译,得到字符码表;
预执行模块(3),其用于预执行所述字符码表,获得拓展代码表;
执行模块(4),其用于执行拓展代码表,获得问题的解。
2.根据权利要求1所述的能够逆向推理的编程语言的编译系统,其特征在于,
所述源代码包括问题的规则约束和需要逆向推理的问题的正向计算过程的对应函数。
3.根据权利要求1所述的能够逆向推理的编程语言的编译系统,其特征在于,
所述编译模块(2)包括预处理子模块和编译子模块;
其中,所述预处理子模块用于对源代码进行预处理并生成预编译代码;
所述编译子模块用于对预编译代码进行编译,生成字符码,并储存在字符码表中。
4.根据权利要求3所述的能够逆向推理的编程语言的编译系统,其特征在于,
在所述预处理的过程中,所述预处理子模块执行下述步骤中的任意一个或多个:
步骤1,删除源代码注释;
步骤2,删除源代码中的空格、换行符;
步骤3,将多个文件中的源代码进行合并;
步骤4,语句替换;
步骤5,对无效源代码进行删除;
步骤6,将源代码标识符中出现的非ASCII码替换为ASCII码字符串;
步骤7,对源代码中的由字符串与参数构成的函数声明及其调用语句进行变形。
5.根据权利要求3所述的能够逆向推理的编程语言的编译系统,其特征在于,
在所述编译子模块中,通过词法分析算法和语法分析算法生成具有字符码类型标志位、字符码四元式、字符码四元式参数类型标志位数组的字符码。
6.根据权利要求1所述的能够逆向推理的编程语言的编译系统,其特征在于,
所述预执行模块(3)的预执行过程根据字符码表生成拓展代码表,并从前向后逐行执行并修改拓展代码表,具体包括以下步骤:
步骤a:对于“代码可执行标志位”为“假”代码,直接跳过当前执行代码;所述当前执行代码,即正在预执行处理的代码;
步骤b:对于“代码可执行标志位”为“一定条件下执行”或为“真”的代码,根据“代码类型标志位”设置执行过程,具体执行下述子步骤中的任意一个或多个步骤:
子步骤b-1,当“代码类型标志位”为“跳转”时,跳过当前执行代码;
子步骤b-2,当“代码类型标志位”为“返回操作”时,跳过当前执行代码;
子步骤b-3,当“代码类型标志位”为“函数操作”时,解析函数信息并更新函数表;
子步骤b-4,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录,并将所创建的活动记录标记为当前活动记录,解析作用域信息并更新作用域表;
子步骤b-5,当“代码类型标志位”为“域结束”时,解析作用域信息并更新作用域表;若当前作用域不是类实例时,销毁并离开当前活动记录,同时将返回活动记录标记为当前活动记录;若当前作用域是类实例时,离开当前活动记录但不销毁,同时将返回活动记录标记为当前活动记录;
子步骤b-6,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,以参数默认值为值的键值对;
子步骤b-7,当“代码类型标志位”为“表达式”时,具体执行下述亚子步骤中的任意一个或多个步骤:
亚子步骤b-7-1,在当前执行代码已与函数进行绑定时,即当前执行代码的匹配函数地址不为空时,直接跳过当前代码;
亚子步骤b-7-2,在当前执行代码未与函数进行绑定时,即匹配函数地址为空时,利用累计权重法对当前执行代码进行代码替换和函数绑定;
子步骤b-8,当“代码类型标志位”为“表达式结束”时,跳过当前执行代码;
子步骤b-9,当“代码类型标志位”为“推导函数”时,利用正向函数的函数实现推导逆向函数的函数实现;
优选地,所述利用正向函数实现推导逆向函数实现,需要执行以下亚子步骤:
亚子步骤b-9-1,将正向函数的函数体代码段拆解为代码块;
亚子步骤b-9-2,利用代码块推导逆向函数的执行过程;
子步骤b-10,当“代码类型标志位”为“成员访问”时,在当前活动记录数据表中添加以地址为键,访问路径为值的键值对;
子步骤b-11,当“代码类型标志位”为“类操作”时,解析类信息并更新类表。
7.根据权利要求6所述的能够逆向推理的编程语言的编译系统,其特征在于,
在亚子步骤b-7-2中,定义一种数据的表示格式a(b│c);表示数据a在b周期(匹配轮数)内被创建或赋值,在周期c内被使用;定义一种键值对的表示方式<a,b>,表示以a为键、b为a对应的值;具体来说,该亚子步骤b-7-2执行如下操作:
b-7-2-1,复制当前执行代码所在最长的表达式对应代码段e,获得以初始累计权重值0为键、复制代码段为值的键值对<0,e>;
b-7-2-2,将复制代码段键值对添加至当前代码仓S,其中,S为一个以累计权重值为键、代码段为值的二维表,也被视作键值对的集合;
5(0|1)={<0,e>L
此时,S(0|1)中只有<0,e>作为元素;
b-7-2-3,对于k∈N*,在当前代码仓S(k-1|k)不为空时,对于所有<wi,ei>∈S(k-1|k),{i|i∈N∧i<card(S(k-1|k))};将ei中所有满足,任何结点所在代码均未与函数进行绑定的语法树分支对应的局部代码段,与所有可以访问到的函数进行匹配,优先匹配最先访问到的函数;每当ei的一个语法树分支与一个函数匹配成功,根据函数的类型对ei进行代码替换或函数绑定,生成代码段ej,同时根据wi与所匹配到的函数的权重值生成代码段ej的权重值wj;
b-7-2-4,当ej满足所有代码均与函数绑定时,匹配过程以成功结束,用ej替换掉当前执行代码所在最长的表达式在代码表中的对应代码段;否则将<wj,ej>添加到S(k|k+1)中。
8.根据权利要求1所述的能够逆向推理的编程语言的编译系统,其特征在于,
所述执行模块(4)的执行过程包括如下步骤:
步骤甲,对于“代码可执行标志位”为“假”的代码,直接跳过此代码;
步骤乙,对于“代码可执行标志位”为“一定条件下执行”的代码,且并非由函数调用或条件语句跳转或创建类实例而执行此行代码时,直接跳过整个作用域内部的代码;
步骤丙,对于“代码可执行标志位”为“一定条件下执行”的代码,且当前条件是函数调用或条件语句执行时,或者,对于“代码可执行标志位”为“直接执行”的代码时,具体执行下述子步骤中的任意一个或多个步骤:
子步骤丙-1,当“代码类型标志位”为“跳转”时,若跳转条件为真,将当前执行代码设置为所跳转地址对应代码并执行,否则直接跳过当前执行代码;
子步骤丙-2,当“代码类型标志位”为“返回操作”时,将结果返回后结束执行此函数并返回函数调用位置;具体来说,被返回的运算值赋值给“形参实参对照表”中“形式返回参数”对应的“实际返回参数”,若“实际返回参数”不存在则不赋值;
将当前活动记录标记为待销毁活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,并递推销毁待销毁活动记录,执行当前执行代码;
子步骤丙-3,当“代码类型标志位”为“函数操作”时,跳过当前执行代码;
子步骤丙-4,当“代码类型标志位”为“域起始”时,在当前活动记录内为以当前执行代码为起始的作用域创建一个空的活动记录并初始化活动记录信息,并将所创建的活动记录设置为当前活动记录;
子步骤丙-5,当“代码类型标志位”为“域结束”且当前活动记录不是类实例时,将当前活动记录标记为待销毁活动记录,若返回活动记录不存在,则销毁当前活动记录,程序执行结束;否则将当前活动记录的返回地址对应代码标记为当前执行代码,将当前活动记录的返回活动记录标记为当前活动记录,递推销毁活动记录并继续执行程序;当“代码类型标志位”为“域结束”且当前活动记录是类实例时,不销毁当前活动记录,仅将当前活动记录的返回活动记录标记为当前活动记录,将当前活动记录的返回地址对应代码标记为当前执行代码并继续执行程序;
子步骤丙-6,当“代码类型标志位”为“变量声明”时,在当前活动记录的数据表中添加以参数标识符为键,参数默认值为值的键值对;
子步骤丙-7,当“代码类型标志位”为“表达式”时,对于当前代码所在最长表达式代码段,先正向依次执行最长表达式中的正向函数,再反向执行逆向函数;
子步骤丙-8,当“代码类型标志位”为“表达式结束”时,表明当前执行代码的上一行代码所在表达式已经结束,跳过当前执行代码;
子步骤丙-9,当“代码类型标志位”为“推导函数”时,跳过此行代码;
子步骤丙-10,当“代码类型标志位”为“成员访问”时,在当前活动记录数据表中添加以地址为键,访问路径为值的键值对;
子步骤丙-11,当“代码类型标志位”为“类操作”时,跳过此行代码。
9.根据权利要求8所述的能够逆向推理的编程语言的编译系统,其特征在于,
在子步骤丙-7中,具体依次执行以下两个操作:
子步骤丙-7-1,从最长表达式代码段起始位置向后执行,若函数根结点标志位为假,则跳过当前执行代码;若函数根结点标志位为真且所绑定函数为正向函数,则调用所绑定函数;若函数根结点标志位为真且所绑定函数为逆向函数,则仅初始化调用绑定函数所需的变量而不调用;直至到达最长表达式的末尾;
子步骤丙-7-2,从最长表达式代码段的结束位置向起始位置执行,若函数根结点标志位为假或所绑定函数为正向函数,则跳过当前执行代码;若函数根结点标志位为真且所绑定函数为逆向函数,则调用所绑定函数,并将为函数调用创建的活动记录的返回地址设置为在最长表达式代码段中、位于调用此逆向函数的函数调用代码段起始位置的上一行代码的地址,若调用此逆向函数的函数调用代码段起始位置与最长表达式代码段的起始位置重合,则将返回地址设置为最长表达式代码段结束位置的下一行代码的地址。
10.一种编程语言的编译方法,其特征在于,
该方法包括如下步骤:
S1:通过交互模块(1)接收源代码;
S2:通过编译模块(2)对源代码进行预处理和编译,得到字符码表;
S3:通过预执行模块(3)预执行所述字符码表,获得拓展代码表;
S4:通过执行模块(4)执行拓展代码表,获得问题的解。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210591039.XA CN115185526B (zh) | 2022-05-27 | 2022-05-27 | 一种能够逆向推理的编程语言的编译系统及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210591039.XA CN115185526B (zh) | 2022-05-27 | 2022-05-27 | 一种能够逆向推理的编程语言的编译系统及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115185526A true CN115185526A (zh) | 2022-10-14 |
CN115185526B CN115185526B (zh) | 2023-10-10 |
Family
ID=83514173
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210591039.XA Active CN115185526B (zh) | 2022-05-27 | 2022-05-27 | 一种能够逆向推理的编程语言的编译系统及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115185526B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1315018A (zh) * | 1997-07-29 | 2001-09-26 | 凯萨罗恩产品公司 | 最优控制计算机网络程序存储传递的计算机化系统及方法 |
CN101814053A (zh) * | 2010-03-29 | 2010-08-25 | 中国人民解放军信息工程大学 | 一种基于功能模型的二进制代码漏洞发现方法 |
CN102232295A (zh) * | 2008-09-30 | 2011-11-02 | 松下电器产业株式会社 | 再现装置、记录介质及集成电路 |
WO2013096894A1 (en) * | 2011-12-23 | 2013-06-27 | The Arizona Board Of Regents On Behalf Of The University Of Arizona | Methods of micro-specialization in database management systems |
CN105589728A (zh) * | 2015-12-16 | 2016-05-18 | 西安文理学院 | 一种基于子图语义同构的指令习语识别方法 |
US20180024911A1 (en) * | 2016-03-07 | 2018-01-25 | T Komp Tomasz Kruszewski | Software code debugger for quick detection of error root causes |
CN111249736A (zh) * | 2020-01-16 | 2020-06-09 | 网易(杭州)网络有限公司 | 代码处理方法及装置 |
CN114201406A (zh) * | 2021-12-16 | 2022-03-18 | 中国电信股份有限公司 | 基于开源组件的代码检测方法、系统、设备及存储介质 |
-
2022
- 2022-05-27 CN CN202210591039.XA patent/CN115185526B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1315018A (zh) * | 1997-07-29 | 2001-09-26 | 凯萨罗恩产品公司 | 最优控制计算机网络程序存储传递的计算机化系统及方法 |
CN102232295A (zh) * | 2008-09-30 | 2011-11-02 | 松下电器产业株式会社 | 再现装置、记录介质及集成电路 |
CN101814053A (zh) * | 2010-03-29 | 2010-08-25 | 中国人民解放军信息工程大学 | 一种基于功能模型的二进制代码漏洞发现方法 |
WO2013096894A1 (en) * | 2011-12-23 | 2013-06-27 | The Arizona Board Of Regents On Behalf Of The University Of Arizona | Methods of micro-specialization in database management systems |
CN105589728A (zh) * | 2015-12-16 | 2016-05-18 | 西安文理学院 | 一种基于子图语义同构的指令习语识别方法 |
US20180024911A1 (en) * | 2016-03-07 | 2018-01-25 | T Komp Tomasz Kruszewski | Software code debugger for quick detection of error root causes |
CN111249736A (zh) * | 2020-01-16 | 2020-06-09 | 网易(杭州)网络有限公司 | 代码处理方法及装置 |
CN114201406A (zh) * | 2021-12-16 | 2022-03-18 | 中国电信股份有限公司 | 基于开源组件的代码检测方法、系统、设备及存储介质 |
Non-Patent Citations (2)
Title |
---|
J. MÍŠEK 等: "Mapping of Dynamic Language Constructs into Static Abstract Syntax Trees", 《2010 IEEE/ACIS 9TH INTERNATIONAL CONFERENCE ON COMPUTER AND INFORMATION SCIENCE》, pages 625 - 630 * |
包竹苇 等: "Java网络传输中字符编码问题的研究", 《计算机工程与应用》, vol. 43, no. 04, pages 93 - 95 * |
Also Published As
Publication number | Publication date |
---|---|
CN115185526B (zh) | 2023-10-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6662354B1 (en) | Determining destinations of a dynamic branch | |
US5355494A (en) | Compiler for performing incremental live variable analysis for data-parallel programs | |
Bulyonkov | Polyvariant mixed computation for analyzer programs | |
Hoare | Proof of correctness of data representations | |
US8555266B2 (en) | Managing variable assignments in a program | |
US8346697B2 (en) | Direct construction of finite state machines | |
US5367683A (en) | Smart recompilation of performing matchup/difference after code generation | |
US20080178149A1 (en) | Inferencing types of variables in a dynamically typed language | |
JP4638484B2 (ja) | データ処理装置におけるデータ整合性 | |
US20040154009A1 (en) | Structuring program code | |
Mazzotta et al. | Compilation of aggregates in ASP systems | |
US20030233640A1 (en) | Structuring program code | |
Rosen | A compiler-building system developed by Brooker and Morris: including a comprehensive discussion of the major features of the system | |
US5535392A (en) | Using hint generation to cause portions of object files to remain the same | |
US20090064092A1 (en) | Visual programming language optimization | |
CN115185526B (zh) | 一种能够逆向推理的编程语言的编译系统及方法 | |
Hughes et al. | Polish parsers, step by step | |
Saraiva et al. | Data structure free compilation | |
Frost et al. | Memoizing purely functional top-down backtracking language processors | |
Willis et al. | Garnishing parsec with parsley | |
CN114675831B (zh) | 一种编程语言的编译系统及方法 | |
WO2018182454A1 (ru) | Способ разработки, хранения и использования компилированных в бинарное представление программ в таблицах баз данных | |
US7565646B2 (en) | Method for compression of object code interpreted by tree-structured expression factorization | |
Krall | Implementation techniques for Prolog. | |
Bransen | On the Incremental Evaluation of Higher-Order Attribute Grammars |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |