QLExpress脚本语言技术讲解(2) -----QL的基本执行过程
?
安装好maven 执行eclipse命令,导入eclipse 之后,运行 com.ql.util.express.test.ExpressTest 单元测试
可以运行处结果:
表达式计算:10 * 10 + 1 + 2 * 3 + 5 * 2 = 117
?
?
?
日志信息:
?
[2012-02-20 22:07:07,844] [main] (ExpressParse.java:486) DEBUG com.ql.util.express.parse.ExpressParse - 执行的表达式:10 * 10 + 1 + 2 * 3 + 5 * 2[2012-02-20 22:07:07,844] [main] (ExpressParse.java:487) DEBUG com.ql.util.express.parse.ExpressParse - 单词分解结果:{10},{*},{10},{+},{1},{+},{2},{*},{3},{+},{5},{*},{2}[2012-02-20 22:07:07,844] [main] (ExpressParse.java:491) DEBUG com.ql.util.express.parse.ExpressParse - 预处理后结果:{10},{*},{10},{+},{1},{+},{2},{*},{3},{+},{5},{*},{2}[2012-02-20 22:07:07,860] [main] (ExpressParse.java:502) DEBUG com.ql.util.express.parse.ExpressParse - 单词分析结果:10:CONST_INTEGER,*:*,10:CONST_INTEGER,+:+,1:CONST_INTEGER,+:+,2:CONST_INTEGER,*:*,3:CONST_INTEGER,+:+,5:CONST_INTEGER,*:*,2:CONST_INTEGER[2012-02-20 22:07:07,860] [main] (ExpressParse.java:506) DEBUG com.ql.util.express.parse.ExpressParse - Block拆分后的结果:1: main:FUNCTION_DEFINE FUNCTION_DEFINE2: 10:CONST_INTEGER CONST2: *:* *2: 10:CONST_INTEGER CONST2: +:+ +2: 1:CONST_INTEGER CONST2: +:+ +2: 2:CONST_INTEGER CONST2: *:* *2: 3:CONST_INTEGER CONST2: +:+ +2: 5:CONST_INTEGER CONST2: *:* *2: 2:CONST_INTEGER CONST[2012-02-20 22:07:07,860] [main] (ExpressParse.java:511) DEBUG com.ql.util.express.parse.ExpressParse - 语句拆分后的结果:1: main:FUNCTION_DEFINE FUNCTION_DEFINE2: ;:; STAT_SEMICOLON_EOF3: 10:CONST_INTEGER CONST3: *:* *3: 10:CONST_INTEGER CONST3: +:+ +3: 1:CONST_INTEGER CONST3: +:+ +3: 2:CONST_INTEGER CONST3: *:* *3: 3:CONST_INTEGER CONST3: +:+ +3: 5:CONST_INTEGER CONST3: *:* *3: 2:CONST_INTEGER CONST[2012-02-20 22:07:07,860] [main] (ExpressParse.java:520) DEBUG com.ql.util.express.parse.ExpressParse - 最后的语法树:1: main:FUNCTION_DEFINE FUNCTION_DEFINE2: ;:; STAT_SEMICOLON_EOF3: +:+ EXPRESS_LEVEL54: +:+ EXPRESS_LEVEL55: +:+ EXPRESS_LEVEL56: *:* EXPRESS_LEVEL47: 10:CONST_INTEGER CONST7: 10:CONST_INTEGER CONST6: 1:CONST_INTEGER CONST5: *:* EXPRESS_LEVEL46: 2:CONST_INTEGER CONST6: 3:CONST_INTEGER CONST4: *:* EXPRESS_LEVEL45: 5:CONST_INTEGER CONST5: 2:CONST_INTEGER CONST[2012-02-20 22:07:07,860] [main] (ExpressRunner.java:491) DEBUG com.ql.util.express.ExpressRunner - 1:LoadData 102:LoadData 103:OP : * OPNUMBER[2]4:LoadData 15:OP : + OPNUMBER[2]6:LoadData 27:LoadData 38:OP : * OPNUMBER[2]9:OP : + OPNUMBER[2]10:LoadData 511:LoadData 212:OP : * OPNUMBER[2]13:OP : + OPNUMBER[2][2012-02-20 22:15:36,090] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 10[2012-02-20 22:15:36,090] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 10[2012-02-20 22:15:36,090] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - *(10,10)[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 1[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - +(100,1)[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 2[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 3[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - *(2,3)[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - +(101,6)[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 5[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 2[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - *(5,2)[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - +(107,10)表达式计算:10 * 10 + 1 + 2 * 3 + 5 * 2 = 117
由这个简单的例子,我们看到了整个QL的执行过程:单词分解-->单词类型分析-->语法分析-->生成运行期指令集合-->执行生成的指令集合。
其中前4个过程涉及语法的匹配运算等非常耗时,所以我们看到了 execute方法的??isCache 是否使用Cache中的指令集参数,它可以缓存前四个过程。
即把 expressString 本地缓存乘一段指令,第二次重复执行的时候直接执行指令,极大的提高了性能。?