2012-10-11 1 views
6

나는 바이트 코드를 읽을 수있는 루아 코드를 string.dump() 함수로 작성하고있다. 나는 모든 OP_JMP 명령어가 if 구문을 위해 사용될 때 명령어 포인터를 앞으로 증가시키는 것으로 가정한다. (약간의 최적화와 적은 코딩이 가능하기 때문이다.) 기술적으로 sBx 값 (음수 일 수 있음)을 사용하기 때문에 뒤로 이동할 수 있습니다. 표준 루아 5.1 구현의 if 문에 대한 바이트 코드에만 관심이 있습니다.'if'문장이 뒤로 건너 뛰는 루아 바이트 코드를 사용할 수 있습니까?

나는 약간의 샘플에 대한 바이트 코드를보기 위해 chunkspy (awesome tool btw)을 사용했다.

a, b = 1, 2 
if a == b then 
    print '=' 
elseif a < b then 
    print '<' 
else 
    print '>' 
end 

그것은 부정적인 어느 것도 네 점프, 생산 :

[08] jmp 4; to [13] 
[12] jmp 11; to [24] 
[16] jmp 4; to [21] 
[20] jmp 3; to [24] 

나는 Lua source code에서 답을 찾는 노력을하지만, 그냥 결국 문이 경우 다음

는 기본이다 혼란 스럽네요. (내가 그걸 잡기 위해 시간을 보낸다면 나는 훌륭한 우아한 코드라고 확신한다.)

루아의 OP_JMP 명령어가 sBx에 대해 음수 값을 갖고 있거나 항상 양수 값인지 알고있는 'if'구문에 대한 사례를 아는 사람이 있습니까?

+2

'luac -p -l' 또한 바이트 코드 목록을 제공합니다. – lhf

답변

5

짧은 대답 : IF 문은 부정적인 JMP를 생성 할 수 없습니다 (최적화 된 컴파일러에서는 langauage와 무관합니다). 이 그것을 이미 번역 된 특정 코드를 반복해야하는 경우 뒤로 점프 만 어떤 컴파일러에 의해 생성됩니다 때문이다 (: 루아 OP_JMP는 루프와 고토 문 (http://lua-users.org/wiki/GotoStatement)

긴 대답 부정적 일 수있다 for, while .. while 루프). "새로운"IF- 문장을 따라 가면 조건부 JMP와 결과 코드/바이트 코드를 항상 다음 instuctions로 넣을 것입니다.

반면에 "이상한"컴파일러는 음의 IF 점프를 생성 할 수 있습니다. 그러나 그것은 이해가 안갑니다. 특정 위치에 대해 음의 IF JMP를 가지려면 이전에 바로 그 위치 (양수 JMP로)를 건너 뛰어야하므로 실행 속도면에서 최적화 된 코드가 될 수 없습니다.

+0

고마워, 알아두면 매우 유용하다! – Ryan

관련 문제