Chạy thành công một chương trình yêu cầu ba điều phù hợp:
- Bộ hướng dẫn CPU (Ví dụ: x86 trong PC, ARM trong điện thoại di động của bạn, PowerPC trong một số máy Mac của Apple, mã byte Java cho Applet Java, CLI cho các ứng dụng ".Net" / Mono)
- Định dạng tệp nhị phân (Ví dụ: PE / COFF ".exe" cho Microsoft Windows, .jar cho Java Applet, PE32 ".exe", ELF trên Unix / Linux)
- Giao diện lập trình ứng dụng ; (Ví dụ: POSIX trên Linux / Unix, Ca cao cho Mac OSX, Win32 trên Microsoft Windows, Thư viện lớp cơ sở cho các ứng dụng ".Net" / Mono).
Bạn có thể tăng cơ hội khớp cả ba bằng cách có trình giả lập / trình thông dịch (đối với các bộ hướng dẫn CPU khác), bằng cách có thêm trình tải tệp (đối với định dạng tệp nước ngoài) và có thêm thư viện lập trình cung cấp thêm API.
Cũng lưu ý rằng một số bộ xử lý có thể thực thi nhiều hơn một tập lệnh; một PC khá thường có các tập lệnh x86 và amd64 ; một bộ xử lý ARM có thể thực thi bốn: ARM32 / Thumb / Java bytecode / ThumbEE . Một số hệ điều hành có thể cung cấp nhiều hơn một API nguyên bản (Microsoft Windows cung cấp Win32 và POSIX ).
Đối với mọi thứ khác, bạn cần phần mềm bổ sung. Để chạy các chương trình Java, bạn cần ba phần được liệt kê ở trên để làm cho nó hoạt động: một chương trình Máy ảo Java để chạy mã byte; một cách khởi chạy các chương trình Java và Thư viện lớp Java để các chương trình gọi. "Java" là một tên thương hiệu ở đây cho một số công nghệ riêng biệt do Sun phát triển, nhưng với người dùng, chúng thường được tải xuống dưới dạng một.
Điều tương tự cũng áp dụng cho ".Net", là một thương hiệu tiếp thị cho một số công nghệ khác nhau được phát triển đầu tiên bởi Microsoft: Thư viện lớp thời gian chung / Thư viện lớp cơ sở (CLR) là API; VES là trình tải và Giao diện ngôn ngữ chung (CLI) là tập lệnh.
Bạn không cần phải tải xuống các công nghệ đó từ Microsoft, từ Sun hoặc từ Intel chỉ vì ban đầu họ đã phát minh ra thứ gì đó. AMD làm cho bộ xử lý tương thích với các tiêu chuẩn của Intel; cả Apache ("Harmony") và Google ("Android Dalvik") đều tạo ra một bộ giống như Java; và Mono cung cấp bộ CLR / CLI / VES. Điều quan trọng là mọi người đều sử dụng các tiêu chuẩn giống nhau, làm cho chúng tương thích. Một đĩa DVD sẽ phát trên bất kỳ trình phát DVD nào đáp ứng tiêu chuẩn và một trang web HTML sẽ hiển thị trong mọi Trình duyệt web đáp ứng các tiêu chuẩn HTML.
- Mono là bộ CLR / CLI / VES có thể chạy trên Mac OSX, MS Windows và Linux.
- Wine là một triển khai API Win32 có thể chạy trên Mac OSX, MS Windows và Linux.
- Bạn có thể chạy Mono trên Wine , trên bất kỳ hệ điều hành nào.
- Bạn có thể chạy Wine trên đỉnh Qemu , trên bất kỳ kiến trúc CPU nào.
Vì vậy, Mono làm cho các ứng dụng CLR .exe chạy và Wine làm cho các ứng dụng Win32 .exe chạy. Điểm chung duy nhất là tên tệp kết thúc bằng ".exe"; nội dung hoàn toàn khác nhau và không tương thích, vì vậy bạn cần đúng .
Giống như trình thông dịch Python sẽ báo lỗi khi được trình bày với Perl (và ngược lại), trình thông dịch CLR sẽ báo lỗi khi được trình bày với mã byte x86 + Win32 hoặc JVM + Java. Nếu bạn có thể đăng một liên kết đến chương trình cụ thể mà bạn muốn chạy, bản thân tôi hoặc ai đó sẽ có thể cho bạn biết tập lệnh chính xác, định dạng tệp và API mà nó được thiết kế và những gì bạn cần cài đặt trên Linux để chạy nó Mong rằng sẽ giúp!
(Đôi khi bạn thậm chí có thể cần cả hai. Ví dụ, Openbve tàu mô phỏng là C # và biên soạn để PE / COFF + CLI + CLR, nhưng có thể tùy chọn sử dụng C plugins nhị phân được biên soạn cho PE / COFF + Win32 + x86. Trong trường hợp này, bạn cần một phiên bản Win32 của Mono theo Wine. Nếu kiến trúc CPU cũng vậy, khác với nhu cầu mô phỏng, vì vậy Mono dưới Wine theo Qemu).