2013-03-06 32 views
5

Từ Section 4.1 of Programming in Lua.Cách phân công nhiều công việc?

Trong phép gán nhiều lần, trước hết Lua đánh giá tất cả các giá trị và chỉ sau đó thực hiện các nhiệm vụ. Do đó, chúng ta có thể sử dụng một bội số phân để trao đổi hai giá trị, như trong

x, y = y, x - swap x' for y'

Làm thế nào để công việc phân công thực sự?

+1

Bạn có ý nghĩa gì bởi "công việc thực sự"? Cuốn sách * giải thích * cách nó hoạt động. Bạn đang tìm gì hơn? –

Trả lời

10

Cách thực hiện nhiều nhiệm vụ phụ thuộc vào việc triển khai Lua bạn đang sử dụng. Việc thực hiện là miễn phí để làm những việc dù sao nó thích miễn là nó bảo tồn ngữ nghĩa. Đó là, bất kể mọi thứ được thực hiện như thế nào, bạn sẽ nhận được kết quả tương tự như khi bạn đã lưu tất cả các giá trị trong RHS trước khi gán chúng cho LHS, như sách Lua giải thích.


Nếu bạn vẫn tò mò về việc triển khai thực tế, một điều bạn có thể làm là xem mã bytecode được sản xuất cho một chương trình nhất định. Ví dụ, dùng chương trình sau đây

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

và đi qua nó để trình biên dịch bytecode (luac -l) cho Lua 5.2 cho

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 

Các opcode MOVE gán giá trị vào sổ đăng ký quyền thanh ghi bên trái (xem lopcodes.h trong nguồn Lua để biết thêm chi tiết). Rõ ràng, những gì đang xảy ra là các thanh ghi 0 và 1 đang được sử dụng cho xy và khe 2 đang được sử dụng như một khe cắm tạm thời bổ sung. xy được khởi tạo với các hằng số trong hai opcodes đầu tiên và trong ba 3 opcodes tiếp theo một trao đổi được thực hiện bằng cách sử dụng "tạm thời" khe thứ hai, giống như bạn sẽ làm bằng tay:

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

Với cách Lua đã sử dụng một cách tiếp cận khác khi thực hiện một phép chuyển đổi và khởi tạo tĩnh, tôi sẽ không ngạc nhiên nếu bạn có kết quả khác nhau cho nhiều loại khác nhau của nhiều nhiệm vụ (thiết lập các trường bảng có thể sẽ trông rất khác nhau, đặc biệt kể từ đó thứ tự quan trọng do metamethods ...). Chúng tôi sẽ cần phải tìm một phần trong nguồn, nơi bytecode được phát ra là 100% chắc chắn mặc dù. Và như tôi đã đề cập trước đây, tất cả điều này có thể khác nhau giữa phiên bản Lua và triển khai, đặc biệt nếu bạn nhìn vào LuaJIT vs PUC Lua.

Các vấn đề liên quan