Thông thường, mã đã biên dịch là tập hợp chính xác các lệnh mà CPU yêu cầu để "thực thi" chương trình. Trong Java, mã đã biên dịch là một bộ hướng dẫn chính xác cho một "CPU ảo" được yêu cầu để hoạt động giống nhau trên mọi máy vật lý.
Vì vậy, theo một nghĩa nào đó, các nhà thiết kế của ngôn ngữ Java đã quyết định rằng ngôn ngữ và mã được biên dịch sẽ độc lập với nền tảng, nhưng vì mã cuối cùng phải chạy trên nền tảng vật lý, họ đã chọn đặt tất cả mã phụ thuộc vào nền tảng JVM.
Yêu cầu này đối với JVM trái ngược với ví dụ Turbo C của bạn. Với Turbo C, trình biên dịch sẽ tạo ra mã phụ thuộc vào nền tảng và không cần JVM làm việc giống nhau vì chương trình Turbo C đã biên dịch có thể được thực thi trực tiếp bởi CPU.
Với Java, CPU thực thi JVM, nó phụ thuộc vào nền tảng. JVM đang chạy này sau đó thực thi mã bytecode của Java độc lập với nền tảng, miễn là bạn có sẵn JVM để nó thực thi. Bạn có thể nói rằng viết mã Java, bạn không lập trình để mã được thực thi trên máy vật lý, bạn viết mã để thực thi trên Máy ảo Java.
Cách duy nhất để tất cả các bytecode Java này hoạt động trên tất cả các máy ảo Java là một tiêu chuẩn khá nghiêm ngặt đã được viết cho cách hoạt động của các máy ảo Java. Điều này có nghĩa là bất kể bạn đang sử dụng nền tảng vật lý nào, phần mà mã byte Java giao tiếp với JVM được đảm bảo chỉ hoạt động theo một chiều. Vì tất cả các JVM hoạt động hoàn toàn giống nhau, nên cùng một đoạn mã hoạt động hoàn toàn giống nhau ở mọi nơi mà không cần biên dịch lại. Nếu bạn không thể vượt qua các bài kiểm tra để đảm bảo nó giống nhau, bạn không được phép gọi máy ảo của mình là "máy ảo Java".
Tất nhiên, có nhiều cách mà bạn có thể phá vỡ tính di động của một chương trình Java. Bạn có thể viết một chương trình tìm kiếm các tệp chỉ được tìm thấy trên một hệ điều hành (ví dụ: cmd.exe). Bạn có thể sử dụng JNI, cho phép bạn đặt mã C hoặc C ++ đã biên dịch vào một lớp một cách hiệu quả. Bạn có thể sử dụng các quy ước chỉ hoạt động cho một hệ điều hành nhất định (như giả sử ":" phân tách các thư mục). Nhưng bạn được đảm bảo sẽ không bao giờ phải biên dịch lại chương trình của mình cho một máy khác trừ khi bạn đang làm điều gì đó thực sự đặc biệt (như JNI).