Pra*_*ter 1 vb.net compiler-construction
我虽然知道这一个...我不知道.
这个简单的For循环:
Dim i As Integer
Dim n As Integer = 10
Dim s As Integer = 1
For i = 0 To n Step s
Console.WriteLine(i)
Next
Run Code Online (Sandbox Code Playgroud)
编译成这个(我把它放在Refelctor中,所以它更容易阅读).我甚至无法得到所有这些位移的功能:
Dim n As Integer = 10
Dim VB$t_i4$L1 As Integer = 1
Dim VB$t_i4$L0 As Integer = n
Dim i As Integer = 0
Do While (((VB$t_i4$L1 >> &H1F) Xor i) <= ((VB$t_i4$L1 >> &H1F) Xor VB$t_i4$L0))
Console.WriteLine(i)
i = (i + VB$t_i4$L1)
Loop
Run Code Online (Sandbox Code Playgroud)
为什么For循环被这样残缺?
可能是因为它是涵盖所有案例的"通用方式".请记住,/ step/next可以向任何方向移动,并且增量上有任何符号.
您在增量和结束时使用了参数.编译器无法知道您是否要向上或向下计数,以及结束时是否高于或低于起始界限.
我猜这是一种获取代码的方法,无论你在n和s中放置什么(只是一个猜测,我太累了,不能尝试看看是否是这种情况).
它还复制参数以防止外部干扰(如在枚举期间更改s或n).
===更新===
我怀疑还有人在看这个问题,但我只是为了完整而回到这个金块,因为我有一些时间.VB正在做的事情有点偷偷摸摸.S的位移基本上根据S的符号创建一个整数(它复制s的MSB,以&hFFFFFFFF结束,S为负,如果S为正,则为&h00000000).
具有-1的整数值的XOR等效于(-value-1).与0的XOR显然是NOP.因此,如果s是负数,它会反转两个值(-1相互抵消)来比较它们,有效地反转比较的顺序而不需要或有条件,因此没有跳过程序流程.如果s为正数,则仅比较它们.
所以,对于s <0,你最终得到了
while (-i-1)<=(-n-1)
==> while -i <= -n
==> while i>=n
Run Code Online (Sandbox Code Playgroud)
对于s> 0,你最终得到了
while i <= n
Run Code Online (Sandbox Code Playgroud)
让我回到我的68k ASM日,那里有日常用品的技巧(例如XOR.l D0,D0,因为XORing自身的寄存器比加载零的速度快......):p
| 归档时间: |
|
| 查看次数: |
1255 次 |
| 最近记录: |