2009-05-02 7 views
16

Tôi đang tìm trình biên dịch Lua front-end được kiểm tra kiểu tại thời gian biên dịch, nhưng đầu ra chuẩn mã byte Lua 5.1 (chỉ có kiểu thời gian chạy). Những gì tôi muốn là một số tiền phong nha tĩnh, biên dịch cú pháp thời gian phân tích và đánh máy tùy chọn, để phát hiện lỗi tầm thường sớm hơn thời gian chạy. Mã byte kết quả sẽ phải chơi độc đáo với mã byte Lua hiện có đã được biên dịch với tiêu chuẩn LoadString().Kiểu tĩnh Lua

Để rõ ràng - bất kỳ sự khác biệt nào cũng chỉ xảy ra ở thời gian biên dịch byte. Trong thời gian chạy, mã byte sẽ không có ý tưởng rằng bất cứ điều gì khác nhau/bất thường xảy ra với nó trong giai đoạn biên dịch.

Điều tôi nhớ có vẻ rất giống ActionScript; Tôi thậm chí sẽ không quan tâm đến một trình biên dịch ActionScript xuất ra mã byte Lua!

Có ai đã từng nghe về nỗ lực đó không? Tôi đã nhìn thấy một số tài liệu tham khảo để sử dụng MetaLua để làm điều này, nhưng thành thật tôi không đủ sáng để làm cho đầu đuôi của tài liệu của họ

+6

Nhân tiện, bạn nói gõ mạnh, nhưng tôi nghĩ bạn có nghĩa là gõ tĩnh. Có một sự khác biệt. Ví dụ, Python được gõ mạnh mẽ, nhưng được gõ động. C bị gõ nhẹ, nhưng gõ tĩnh. – Zifre

Trả lời

14

Vào mùa hè năm 2005 hoặc ở nơi khác, tôi đã làm việc với một số incredibly smart undergraduate student về vấn đề thực hiện một số suy luận kiểu biên dịch cho Lua, có thể được hỗ trợ bởi chú thích. Vấn đề này hóa ra là cực kỳ khó! (Học ​​sinh của tôi đã viết một lưu ý ngắn về kỹ thuật, nhưng nó không thực sự dành cho lưu thông chung.)

Nếu tôi muốn giải quyết vấn đề bạn đã đặt ra, với các ràng buộc đôi là cho phép kiểm tra kiểu tĩnh quan trọng và nó tương thích với mã Lua được biên dịch bytecode chuẩn, Tôi sẽ thiết kế một ngôn ngữ mới từ đầu để đáp ứng hai ràng buộc này. Nó sẽ là một số lượng đáng kể công việc nhưng dễ dàng hơn nhiều so với cố gắng trang bị thêm một hệ thống kiểu cho Lua.

+0

Tôi nghe những gì bạn đang nói; Tôi đã đặt rất nhiều suy nghĩ vào điều này, và mặc dù có vẻ rất đơn giản để bao gồm các trường hợp cơ bản nhất (tức là đánh bắt địa phương x: int = "hello" như một lỗi) mọi thứ trở nên rất khó khăn khi bạn bắt đầu lo lắng về các bảng hoặc trả về các tệp đã nhập từ các hàm. Nhưng những người ở Adobe đã tìm ra nó bằng Javascript! – Armentage

+0

Bảng và số lượng vô hạn các cách chúng được sử dụng chắc chắn là vấn đề. Nếu bạn sẵn sàng có nhiều chú thích, mọi thứ có thể trở nên đơn giản hơn. –

+2

Norman, kiến ​​thức cần được chia sẻ. Tôi cho một người sẽ rất quan tâm đến việc tìm hiểu những kết luận của nghiên cứu của bạn là gì! – alphazero

4

Không có điều đó. Có thể mở rộng MetaLua để làm điều này nhưng không ai đã làm điều đó, và AFAIK, không có kế hoạch để làm điều đó. Lua có nghĩa là một ngôn ngữ động, nếu bạn muốn một ngôn ngữ gõ tĩnh, hãy sử dụng một ngôn ngữ.

Điều bạn đang tìm kiếm cơ bản là Java hoặc C#. Trong trường hợp đó, bạn có thể sử dụng một dự án như Lua.NET để tích hợp mã Lua hiện có với C#. Ngoài ra còn có Kahlua cho Java.

+0

Tôi không tìm kiếm LUA.NET. LUA.NET ngụ ý một số loại thời gian chạy .NET. Thời gian chạy .NET không giống với VM ByteCode LUA. Những gì tôi đang tìm kiếm sẽ chỉ áp dụng gõ mạnh vào thời gian biên dịch byte, và sau đó chạy mã kết quả blissfully không biết rằng bất cứ điều gì bất thường xảy ra với nó tại thời gian biên dịch. – Armentage

+0

Thật không may, tôi đã làm việc với một cơ sở mã LUA lớn (và đang phát triển). Do tính chất của LUA, việc thay đổi bất kỳ mã thư viện hiện tại nào cũng không thể thực hiện được. An * tùy chọn * kết thúc trước mạnh mẽ gõ sẽ giải quyết vấn đề này, mà không nhất thiết phải thay đổi cảm giác cơ bản của ngôn ngữ. – Armentage

+5

@Armentage, Lua không phải là một từ viết tắt, nó là một danh từ thích hợp. Nó được viết "Lua", không phải "LUA". Xem http://www.lua.org/about.html#name cho câu chuyện chính thức. – RBerteig

6

Vui lòng xem this Metalua blog post.

-{ extension "types" } 

function sum (x :: list(number)) :: number 
    local acc :: number = 0 
    for i=1, #x do acc=acc+x[i] end 
    return acc 
end 

Điều này trông giống như giải pháp chạy thời gian.

Dù sao, vui lòng đặt câu hỏi của bạn theo số Metalua mailing list. Nếu bạn muốn mở rộng cú pháp Lua, Metalua là công cụ đầu tiên để xem xét.

P.S. Vui lòng never write Lua as all-caps!

3

Có một giấy mới "Typed Lua: Một loại hệ thống tùy chọn cho Lua" từ PUC-Rio vừa được xuất bản trong Dyla'14. http://dl.acm.org/citation.cfm?id=2617553

Đó là về "thiết kế ban đầu của Typed Lua, một phần mở rộng tùy chọn-gõ của ngôn ngữ kịch bản Lua". Nó vẫn đang được tiến hành, và hệ thống kiểu vẫn tương đối đơn giản. Không có công cụ kiểm tra loại/suy luận loại nào được cung cấp.

Về hệ thống nhập dựa trên metalua, Khóa thủy triều: kiểm tra kiểu tĩnh tùy chọn và suy luận cho Lua từ Fabien. http://lua-users.org/lists/lua-l/2013-02/msg00403.html.

+0

Các trang trình bày cho giấy Dyla14 có sẵn: http://www.lua.org/wshop14/Murbach.pdf –

4

Câu hỏi này là sáu tuổi ... nhưng đây là một câu trả lời mới: http://terralang.org/

Giống như C, Terra là một đơn giản, tĩnh đánh máy, biên soạn ngôn ngữ với quản lý bộ nhớ bằng tay. Nhưng không giống như C, nó được thiết kế từ bắt đầu tương thích với Lua. Các hàm của Terra là các giá trịgiá trị đầu tiên được tạo bằng cách sử dụng từ khóa terra. Khi cần, chúng được JIT biên dịch thành mã máy.

+1

Điều này thực sự trông khá thú vị. – Tomis

2

Ngoài ra còn có Ravi https://github.com/dibyendumajumdar/ravi

Ravi Ngôn ngữ lập trình là một dẫn xuất của Lua 5.3 với hạn chế gõ tĩnh tùy chọn và LLVM và libgccjit dựa biên dịch JIT

Tôi thực sự thích lập trình trong Terra (xem ở trên)