Tôi muốn xây dựng một Máy ảo, có tài liệu tham khảo nào tốt không? [đóng cửa]


22

Tôi đang tìm cách xây dựng Máy ảo như một cách độc lập với nền tảng để chạy một số mã trò chơi (về cơ bản là kịch bản).

Các máy ảo mà tôi biết trong các trò chơi khá cũ: Z-Machine của Infocom , SCUMM của LucasArts , Quake 3 của Phần mềm id . Là một Nhà phát triển .net, tôi quen thuộc với CLR và xem Hướng dẫn CIL để có cái nhìn tổng quan về những gì bạn thực sự triển khai ở cấp VM (so với cấp độ ngôn ngữ). Tôi cũng đã học được một chút về 6502 Trình biên dịch trong năm ngoái.

Vấn đề là, bây giờ tôi muốn thực hiện nó, tôi cần đào sâu hơn một chút. Tôi biết rằng có các VM dựa trên stack và đăng ký, nhưng tôi không thực sự biết cái nào tốt hơn cái gì và nếu có nhiều cách tiếp cận lai hay hơn. Tôi cần phải xử lý việc quản lý bộ nhớ, quyết định loại cấp thấp nào là một phần của VM và cần hiểu lý do tại sao những thứ như ldstr hoạt động theo cách của nó.

Cuốn sách tham khảo duy nhất của tôi (ngoài công cụ Z-Machine) là Tiêu chuẩn chú thích CLI , nhưng tôi tự hỏi liệu có một bài giảng cơ bản, tổng quát / cơ bản hơn cho VM không? Về cơ bản một cái gì đó giống như Dragon Book , nhưng đối với VM? Tôi biết về Nghệ thuật lập trình máy tính của Donald Knuth sử dụng máy ảo dựa trên đăng ký, nhưng tôi không chắc chắn loạt ứng dụng đó vẫn còn, đặc biệt là vì nó vẫn còn dang dở?

Làm rõ: Mục tiêu là xây dựng một VM chuyên dụng. Ví dụ: Z-Machine của Infocom chứa OpCodes để đặt Màu nền hoặc phát âm thanh. Vì vậy, tôi cần phải tìm ra bao nhiêu đi vào VM như OpCodes so với trình biên dịch lấy tập lệnh (ngôn ngữ TBD) và tạo mã byte từ nó, nhưng tôi cần hiểu những gì tôi đang làm.


Tôi biết, công nghệ hiện đại sẽ cho phép tôi diễn giải một ngôn ngữ kịch bản cấp cao một cách nhanh chóng. Nhưng đâu là niềm vui trong đó? :) Điều này cũng hơi khó với google vì các máy ảo hiện nay thường được liên kết với ảo hóa hệ điều hành kiểu VMWare ...


6
lưu ý rằng để một cỗ máy dựa trên ngăn xếp được hoàn thiện, nó cần bộ nhớ bên ngoài ngăn xếp nếu không nó chỉ là một chiếc PDA
ratchet freak

1
Câu hỏi đầu tiên là: bạn muốn đi bao xa? Tôi chưa bao giờ nhìn vào SCUMM / SCUMMVM nhưng cho rằng mức độ khá cao khi biết về những thứ đồ họa di chuyển xung quanh, v.v. trong khi CIL là ... vì vậy bạn phải xác định mô hình bộ nhớ của mình (dựa trên thanh ghi xếp chồng, hỗn hợp, lộn xộn, ..) và opcodes ( tức là hướng dẫn do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);trình biên dịch ) và sau đó là phiên bản đầu tiên của VM là một vòng lặp, sau đó có thể là trình biên dịch ... và sau đó, trò vui bắt đầu - tối ưu hóa để làm cho nó thực sự hoạt động
johannes

3
Hãy thử bắt đầu với việc thực hiện một thời gian chạy Forth đơn giản.
SK-logic

1
Làm thế nào chính xác là Quake 3một máy ảo?
Ramhound

3
@Ramhound các công cụ công nghệ id từ lâu đã sử dụng một số hình thức ảo hóa nội bộ, bài viết này hoặc thông tin của Wikipedia có thể giải thích rõ hơn.
Daniel B

Câu trả lời:


18

Tôi sẽ bắt đầu bằng cách kiểm tra Lua . Cả hai như là một triển khai mẫu và như là một VM / ngôn ngữ rất có thể sử dụng được nếu bạn cuối cùng quyết định không tự mình thực hiện.

Mã nguồn rất dễ đọc và cũng có mã nguồn được chú thích . Và một số tài liệu thiết kế được viết bởi tác giả chính, Roberto Ierusalimschy.

Cuối cùng, nếu bạn chọn sử dụng nó thay vì của riêng bạn, bạn sẽ thấy rằng nó đã được các nhà phát triển trò chơi yêu thích từ lâu và có triển khai JIT hiệu suất rất cao .

Về stack- vs dựa trên đăng ký, tôi nghĩ VM dựa trên stack dễ thiết kế hơn, nhưng trình biên dịch có thể phức tạp hơn. Như giấy ghi chú Iesualimschy, Lua là một trong những máy ảo ngôn ngữ dựa trên đăng ký đầu tiên, nhưng sau đó, một số máy khác đã mọc lên, đáng chú ý nhất là LLVM, Dalvik và một số máy ảo JavaScript hiện đại.


2
Về stack vs máy đăng ký: Tôi nhớ một câu trích dẫn từ Parrot / Perl6 devs: "xây dựng một máy dựa trên thanh ghi khó hơn, nhưng chúng tôi hưởng lợi từ hàng tấn nghiên cứu hiện có cho phía trình biên dịch của chúng tôi" (không phải bằng chữ)
johannes

+1 Lua có cách triển khai mã byte tuyệt vời và thiết kế rất rõ ràng để tìm hiểu về máy ảo từ đó. Ngoài ra, bạn sẽ thấy rằng nhiều người đã tùy chỉnh Lua cho nhu cầu của riêng họ, cho thấy nó khá mở rộng nếu bạn không muốn bắt đầu lại từ đầu.
CodexArcanum

Vẫn đang trải qua điều này. Một tài liệu tuyệt vời khác từ nhà phát triển về VM: inf.puc-rio.br/~roberto/talks/lua-ll3.pdf
Michael Stum

2

Hiện tại tôi không có bất kỳ tài nguyên cụ thể nào để liên kết với bạn, nhưng tôi đã nghiên cứu một chủ đề tương tự trong quá khứ và thấy rằng Smalltalk VM cũng là một công cụ hỗ trợ học tập tốt. Có nhiều bài báo và bài báo học thuật viết về mã byte được sử dụng bởi Smalltalk, cũng như viết trình thông dịch và VM để sử dụng mã byte đó. Một tìm kiếm Google cho smalltalk vm implementationhoặc smalltalk bytecode interpretersẽ mang lại nhiều tài liệu đọc.

Nếu bạn muốn xem một số mã nguồn hoặc thử triển khai, tôi khuyên dùng phiên bản Squeak hoặc Pharo.

Ngôn ngữ / VM Self có liên quan cũng có thể khiến bạn quan tâm, vì Self về cơ bản là Smalltalk với các đối tượng dựa trên nguyên mẫu (tương tự JavaScript).


0

Tôi sẽ bắt đầu từ việc phân tích làm thế nào mã nguồn [script] vào môi trường máy hoặc thời gian chạy của bạn.

Nếu bạn có một cái gì đó giống như trong các tài liệu HTML <a onclick="dosomething();">thì bạn sẽ cần trình biên dịch rất nhanh, tốc độ thực thi mã byte không thực sự quan trọng lắm trong trường hợp này. Nếu các trường hợp sử dụng của bạn gần với Java / .NET hơn, nơi bạn có thể đủ khả năng biên dịch đầy đủ thì kiến ​​trúc VM và cấu trúc mã byte sẽ là mã byte Java hoặc IL gần hơn.

Một tiêu chí khác là cái mà tôi đặt tên là "độ sáng". Các tập lệnh ban đầu được phát triển dưới dạng ngôn ngữ keo - các tập lệnh chỉ xác định cách kết nối các hàm riêng khác nhau với nhau (Perl, Python, Ruby, JS). Trong trường hợp đó, hiệu quả của VM và mã byte ít quan trọng hơn nhiều so với trường hợp Java / .NET khi hầu hết mã của bạn là các hàm được viết bằng chính ngôn ngữ.

Và tiêu chí chính cuối cùng tôi sẽ sử dụng là khả năng mở rộng ngôn ngữ của bạn. Nếu bạn có kế hoạch thêm vào thời gian chạy ngôn ngữ, nhiều đối tượng / hàm riêng được triển khai trong C ++, thì kiến ​​trúc VM của bạn sẽ "thuận tiện" để tích hợp với C ++. Ví dụ: nếu bạn dự định tiếp xúc với các đối tượng C ++ script thì chúng là tùy chọn duy nhất cho bạn sẽ là tham chiếu được tính là quản lý heap (như Python, xem boost :: python như một ví dụ về tích hợp). Nếu bạn có kế hoạch sử dụng di chuyển / nén heap / GC thì đó sẽ là một câu chuyện khác. Cách thêm nội dung gốc của Lua vào thời gian chạy hơi khó khăn [đối với các nhà phát triển C ++].

Nói cách khác, hãy cố gắng xác định trước trường hợp sử dụng thông thường của bạn và sẽ dễ dàng hơn để đề xuất những gì cần đọc cho bạn.


1
Trình biên dịch JavaScript hiện đại khá phức tạp và câu hỏi đặt ra là có bao nhiêu tối ưu hóa mã được tạo mà bạn đặt vào.
johannes

Vấn đề thực thi Javascript. Không phải cho các tập lệnh nhỏ, nhưng đối với các trang web nặng hơn về JS, mà tốt hơn hoặc xấu hơn chiếm một phần đáng kể trong các trang web phổ biến hơn. Có một lý do các công cụ JS sử dụng trình biên dịch JIT (V8 thậm chí không trình thông dịch, nó đi thẳng vào mã máy).

@delnan: Trường hợp sử dụng JS khá khác so với Python. Trong Python khi bạn cần một cái gì đó giống như triển khai thuật toán dò tia, bạn sẽ thực hiện thư viện riêng và gọi nó từ tập lệnh. Điều này luôn luôn nhanh hơn (hoặc ít nhất là không chậm hơn) so với bất kỳ giải pháp JIT nào. Trong vương quốc JS, bạn không có sự xa xỉ như mã gốc, vì vậy lựa chọn duy nhất cho bạn là cố gắng làm cho máy ảo JS của bạn nhanh nhất có thể. Nhưng một lần nữa, với giá cả. Đánh giá "dos somebodynative ()" trong HTML "<button onclick =" dos somebodynative () "> trong trình thông dịch đơn giản có thể theo thứ tự độ lớn nhanh hơn trong V8.
c-smile

@ c-smile Quan điểm của tôi chính xác.

@delnan: nhưng quan điểm của tôi khá khác biệt: phân tích các trường hợp sử dụng phổ biến và chỉ sau đó bạn mới có thể quyết định loại kiến ​​trúc VM, cú pháp ngôn ngữ, v.v. bạn sẽ cần.
c-smile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.