2013-03-06 5 views
5

Section 4.1 of Programming in Lua.여러 할당은 어떻게 작동합니까?

다중 할당에서 Lua는 먼저 모든 값을 평가하고 은 할당을 실행합니다. 따라서, 우리는

X에서와 같이 두 개의 값을 교환하기 위해 다중 할당 을 사용할 수 있습니다, y는 Y, X = - 스왑 x' for y '를

어떻게 할당 작업을 실제로합니까?

+1

"실제로 일"이란 무엇을 의미합니까? 이 책은 어떻게 작동하는지 설명했다. 너는 무엇을 더 찾고 있니? –

답변

10

여러 할당을 구현하는 방법은 사용중인 Lua 구현에 따라 다릅니다. 구현은 어쨌든 의미를 보존하는 한 자유롭게 수행 할 수 있습니다. 즉, 어떤 일이 구현 되더라도 Lua에 설명 된대로 LHS에 LHS를 할당하기 전에 RHS에 모든 값을 저장 한 것과 같은 결과를 얻게됩니다. 당신은 여전히 ​​실제 구현에 대한 호기심이 있다면


, 당신이 할 수있는 한 가지 특정 프로그램에 대한 제작됩니다 바이트 코드 무엇인지 볼 수 있습니다. 예를 들어, 다음 프로그램

local x,y = 10, 11 
x,y = y,x 

복용 루아 5.2 바이트 코드 컴파일러 (luac -l)로 전달하면 (

main <lop.lua:0,0> (6 instructions at 0x9b36b50) 
0+ params, 3 slots, 1 upvalue, 2 locals, 2 constants, 0 functions 
    1 [1] LOADK  0 -1 ; 10 
    2 [1] LOADK  1 -2 ; 11 
    3 [2] MOVE  2 1 
    4 [2] MOVE  1 0 
    5 [2] MOVE  0 2 
    6 [2] RETURN  0 1 

이동 오피 왼쪽 레지스터에 적절한 레지스터에 값을 할당 준다 자세한 내용은 Lua 소스의 lopcodes.h를 참조하십시오). 외관상으로는, 계속되고있는 것은 xy에 레지스터 0과 1이 사용되고 슬롯 2가 임시 추가 슬롯으로 사용되고 있다는 것입니다. xy은 당신이 손으로 할 것 가지처럼, 처음 두 연산 코드와 스왑은 "일시적으로"두 번째 슬롯을 사용하여 수행됩니다 향후 3 3 옵 코드에 상수로 초기화 얻을 :

tmp = y -- MOVE 2 1 
y = x -- MOVE 1 0 
x = tmp -- MOVE 0 2 

방법을 감안할 때 루아 스와핑 할당과 정적 초기화를 할 때 다른 접근 방식을 사용했는데 여러 가지 다른 종류의 할당에 대해 다른 결과를 얻는다면 놀라지 않을 것입니다 (테이블 필드 설정은 아마도 매우 다르게 보일 것입니다. metamethods로 인해 ...). 우리는 바이트 코드가 100 % 확실하게 방출되는 곳에서 소스에서 부분을 찾아야 할 것입니다. 앞서 언급했듯이이 모든 것은 루아 버전과 구현 사이에서 다를 수 있습니다. 특히 LuaJIT vs PUC Lua를 살펴 본다면 더욱 그렇습니다.

관련 문제