2011-12-23 8 views
15

Tôi hiện đang làm việc trên một công cụ trò chơi dựa trên văn bản trong Ruby, với ứng dụng chia thành mã Ruby trong/data lib và YAML trong/data, được nạp khi cần thiết bởi các trò chơi . Tôi muốn cho phép các tập tin dữ liệu chứa các kịch bản cơ bản, chủ yếu là trong một mô hình sự kiện/quan sát. Tuy nhiên, tôi cũng muốn người dùng có thể tạo và chia sẻ các kịch bản tùy chỉnh mà không cần phải lo lắng về mã độc nhúng trong kịch bản.của Ruby sandboxing vs tích hợp một ngôn ngữ kịch bản

Hợp đồng bổ sung: Kế hoạch ban đầu của tôi là có nội dung do người dùng tạo thành hai loại, "mô-đun" chỉ có dữ liệu (và an toàn) và bổ sung chức năng bổ sung (nhưng rõ ràng không an toàn). Để thực hiện tương tự để chơi game bàn, mô-đun sẽ như kịch bản cuộc phiêu lưu xuất bản và nội dung, và các plugin sẽ rulebooks chứa quy tắc và hệ thống bổ sung.

Mẫu kịch bản (cú pháp của chủ đề khóa học để thay đổi dựa trên giải pháp):

--- 
Location: 
    observers: 
    on_door_open: | 
     monster = spawn_monster(:goblin); 
     monster.add_item(random_item()); 
     monster.hostile = true; 

Từ một quan điểm an ninh, nó sẽ là lý tưởng nếu kịch bản là đúng opt-in, có lẽ thông qua một mixin kèm theo một chút DSL, ví dụ:

class Frog 
    include Scriptable 

    def jump; ... ; end # this can be called from a script 
    allow_scripting :jump 

    def ribbit; ... ; end # this cannot be called from a script 
end 

tôi đã nhìn ba bốn lựa chọn, nhưng tôi không chắc chắn đó là cách tiếp cận tốt nhất để thực hiện:

  1. Sử dụng của Ruby kịch bản, nhưng trong một sandbox của một số loại.

    Ưu điểm: Rất quen thuộc với Ruby, không cần mã "keo" hoặc các vấn đề tích hợp đối tượng giữa các ngôn ngữ.

    Nhược điểm: Không quen thuộc với các vấn đề bảo mật hoặc hộp cát, không tìm thấy bất kỳ giải pháp nào có thể phù hợp.

  2. Triển khai Nhúng ngôn ngữ tập lệnh khác, ví dụ: Lua.

    Ưu điểm: Ruby và Lua dựa trên C, do đó các ràng buộc phải đơn giản hợp lý. Lua là một ngôn ngữ phổ biến hợp lý, vì vậy trợ giúp có sẵn nếu tôi gặp sự cố sau này. Bảo mật, vì mọi chức năng tôi không ràng buộc cụ thể sẽ không có sẵn từ tập lệnh.

    Nhược điểm: Các ràng buộc Ruby-Lua hiện tại dường như là một chiều, cũ và kém được duy trì hoặc cả hai. Có vẻ một mite tinh ranh để nhúng một ngôn ngữ kịch bản bên trong một ngôn ngữ kịch bản.

  3. Triển khai ngôn ngữ tập lệnh tùy chỉnh với trình thông dịch Ruby. Tôi đã thử nghiệm với Treetop và không quá khó để tạo ra một ngữ pháp đơn giản đủ cho các tập lệnh.

    Ưu điểm: Không cần nhúng ngôn ngữ khác. Chỉ chức năng tôi đã triển khai cụ thể mới có sẵn cho tập lệnh.

    Nhược điểm: Quá mức cần thiết. "Không được xây dựng ở đây" hội chứng. Có thể là những con bọ khủng khiếp đang chờ xảy ra.

  4. Triển khai hoàn toàn tệp dữ liệu bằng Ruby, sử dụng ngôn ngữ dành riêng cho miền.

    Ưu điểm: Đơn giản và dễ dàng.

    Nhược điểm: Không có dữ liệu do người dùng tạo là đáng tin cậy.

Tôi cũng mở cho các đề xuất khác không có trong danh sách mà tôi có thể không nghĩ đến. Giải pháp tốt nhất để triển khai một cách an toàn các tập lệnh được nhúng trong các tệp dữ liệu là gì?

Chỉnh sửa 2011 年 12 月 23 日: Đã thêm tùy chọn thứ tư với DSL, thêm "phụ lục" ở trên cùng với các suy nghĩ/ngữ cảnh bổ sung.

+0

Rất tiếc, tôi không quen với kịch bản trò chơi, nhưng tại sao không sử dụng V8 và Javascript? Nó rất nhanh và hầu hết mọi người sẽ cảm thấy thoải mái khi làm việc với JS. – omninonsense

+0

Chúc mừng ngày lễ, mọi người! –

+1

Nó thực sự phụ thuộc vào những gì bạn muốn đạt được, nếu các plugin trong ruby ​​nó sẽ khó ngăn chặn một trong số họ mở lại một lớp lõi và làm bất cứ điều gì họ muốn trong cùng một cách ruby ​​trên rails plugin có thể làm bất cứ điều gì nó muốn . Ngoài việc sử dụng bất kỳ ngôn ngữ nào khác làm ngôn ngữ plugin quá mức cần thiết, bạn sẽ thực hiện nhiều công việc hơn bản thân trò chơi;) – Schmurfy

Trả lời

4

Bạn có thể xem xét sử dụng Shikashi gem, cho phép bạn tạo các hộp cát và xác định danh sách trắng các cuộc gọi phương thức được phép trên các đối tượng riêng lẻ.

+0

Shikashi trông rất thú vị, nhiều hơn dọc theo dòng ý định ban đầu của tôi ở đây. Bạn (có ai) có kinh nghiệm, câu chuyện chiến tranh, mẹo hoặc nhận xét chung về nó không? –

+0

Được chọn làm câu trả lời vì nó trả lời tốt nhất câu hỏi mà tôi đã có trong đầu. –

+0

Đá quý Shikashi có hoạt động với Rails 5 beta ruby ​​2.3 không?Nó không cài đặt cho tôi. – abrocks

1

Cân nhắc sử dụng jRuby thay vì Ruby. Java ban đầu được triển khai để hỗ trợ mã di động (trở lại trong những ngày đầu tiên) và có kiểm tra tốt security model/implementation có thể, tôi nghi ngờ, bao gồm đủ jRuby để giữ cho các kịch bản/lớp người dùng không bị tàn phá với phần còn lại của hệ thống trò chơi . jRuby cũng hỗ trợ embedding, điều này có thể giúp tách lõi trò chơi khỏi các ứng dụng của người dùng, mặc dù tôi không biết nó mạnh đến mức nào vào lúc này.

Và, tất nhiên, jRuby là Ruby!

+0

Ý tưởng hay với jruby. Nhưng các bài kiểm tra tôi đã thực hiện với jruby & jsr 223 không thực sự thành công (biến đổi). Hy vọng rằng điều này sẽ thay đổi trong tương lai. – plang

+0

Ngoại trừ thực tế (và tôi nhận ra rằng tôi có lợi ích của 2 năm bên sau trong thời gian hoặc bình luận của tôi), rằng Java đã trở nên khó khăn với các lỗ hổng bảo mật sandbox. Tất nhiên điều này không thực sự là một vấn đề Java rất nhiều - bảo mật của mã chạy trên máy của một người là một cơn ác mộng tin cậy, bởi vì nó cuối cùng đi xuống để tin tưởng của các lập trình viên khác (s). Tin tưởng sandbox bởi vì nó được quảng cáo như một sandbox có lẽ tốt hơn là không bao giờ tin tưởng bất cứ ai, nhưng nó vẫn tin tưởng. – jefflunt