2012-04-01 15 views
15

Đối với trò chơi lập trình nhiều người chơi, tôi đang làm việc trên máy chủ biên dịch nền cho Scala hỗ trợ biên soạn nhiều cây nguồn độc lập do người chơi gửi. Tôi thành công trong việc chạy nhanh, sưu tập tuần tự mà không cần tải lại trình biên dịch bởi instantiating đối tượng Global biên dịch quaTrình biên dịch Scala có reentrant không?

val compilerGlobal = new Global(settings, reporter) 

và sau đó chạy công việc biên dịch cá nhân thông qua

val run = new compilerGlobal.Run 
run.compile(sourceFilePathList) 

tôi sẽ hiện lý tưởng muốn parallelize máy chủ (tức là làm cho nhiều trình biên dịch chạy đồng thời), nhưng vẫn không tải lại trình biên dịch (chủ yếu để tránh phân tích lại lib) từ đầu mỗi lần. Điều này có thể xảy ra, tức là phần thứ hai được hiển thị ở trên (an toàn :-) tái nhập, hay nó giữ trạng thái toàn cầu? Nếu không, có cái gì khác tôi có thể thử? Tôi hiện đang tập trung vào việc hỗ trợ Scala 2.9.1.

+0

Nó giữ 'trạng thái toàn cầu' của bảng biểu tượng, để bắt đầu. – EJP

+2

Sử dụng một nhóm các phiên bản trình biên dịch. – retronym

+0

@retronym Cảm ơn bạn đã đề xuất. Câu hỏi chính của tôi là "tôi có thể tái chế bao nhiêu?". Nhận xét của bạn cho thấy rằng không có trạng thái chia sẻ chung nào giữa các cá thể trình biên dịch (trong bộ nhớ) (lớp Toàn cầu), đây là một khởi đầu tốt. Nhưng bạn cũng gợi ý rằng cá nhân chạy DO chia sẻ trạng thái (vượt quá tiêu chuẩn phân tích lib)? Tôi cần thêm thông tin. –

Trả lời

4

Có, trình biên dịch Chạy trạng thái chia sẻ, vì vậy bạn không nên chia sẻ chúng giữa các luồng. Đó là một trong những vấn đề nảy sinh trong plugin Eclipse. Như @EJP đã lưu ý, bảng biểu tượng được chia sẻ. Điều này không quan trọng trong trường hợp của bạn, nhưng đi kèm trong một IDE: trình biên dịch sử dụng sự lười biếng trong các loại, nghĩa là tính toán bổ sung (và đột biến) có thể xảy ra khi gọi các phương thức trên Symbol. Do vấn đề về khả năng hiển thị, điều quan trọng là các phương pháp này được gọi trên chủ đề giống nhau là một phương pháp đã tạo chúng.