Trình biên dịch Java và JVM được viết bằng ngôn ngữ nào?


195

Trong các ngôn ngữ nào là trình biên dịch Java ( javac), máy ảo (JVM) và trình javakhởi động được viết?


23
Tôi làm việc trên java vì vậy tôi muốn biết về ngôn ngữ ... :)
Rahul Garg

25
Đó là quan điểm của bạn. Hãy nói rằng bạn đã làm việc trên một số công nghệ trong 20 năm và người phỏng vấn hỏi bạn viết nó bằng ngôn ngữ gì hoặc nó hoạt động như thế nào thì bạn có thể nói rằng bạn không quan tâm nó có nghĩa là bạn chỉ muốn viết nếu ngôn ngữ khác không muốn để thực sự hiểu ngôn ngữ.
Rahul Garg

21
và hơn thế nữa tôi nghĩ kiến ​​thức không bao giờ lãng phí. Vì vậy, biết một cái gì đó không lãng phí thời gian.
Rahul Garg

1
... một kỹ sư cơ khí hoặc một tay đua (để kéo dài ẩn dụ)
Epaga

2
@paxdiablo lái xe là việc bạn làm, nhưng không phải nghề của bạn. Trình điều khiển xe đua có thể quan tâm làm thế nào động cơ làm việc. Tôi không nói rằng tất cả họ đều quan tâm .. nhưng nếu một người lái xe đua muốn biết thêm về cách động cơ hoạt động trên chiếc xe mà anh ta được trả để lái, bạn có nghĩ điều đó là không hợp lý?
JD Isaacks

Câu trả lời:


171

Các cụm từ chính xác của câu hỏi hơi sai lệch: nó không phải là "JVM" hay "trình biên dịch" vì có nhiều nhà cung cấp JVM (jrockit là một, IBM khác) và nhiều trình biên dịch ngoài đó.

  • Sun JVM được viết bằng C, mặc dù điều này không cần phải như vậy - JVM khi nó chạy trên máy của bạn là một tệp thực thi phụ thuộc vào nền tảng và do đó có thể được viết bằng bất kỳ ngôn ngữ nào. Ví dụ, IBM JVM ban đầu được viết bằng Smalltalk

  • Các thư viện Java ( java.lang, java.utilv.v., thường được gọi là API Java ) tự viết bằng Java, mặc dù các phương thức được đánh dấu là nativesẽ được viết bằng Choặc C++.

  • Tôi tin rằng trình biên dịch Java do Sun cung cấp cũng được viết bằng Java. (Mặc dù một lần nữa, có nhiều trình biên dịch ngoài kia)


Tôi nghĩ rằng anh ấy có nghĩa là "java" chương trình mà bạn sử dụng để bắt đầu một JVM.
Stephen C

1
Trên thực tế, một thư viện trong JRE của Sun được viết bằng NetRexx. (Đây là một trong những thư viện toán học chính xác tùy ý, cả BigInteger, BigNum hay BigDecimal. Tôi quên mất cái nào.) Về lý thuyết, bạn có thể sử dụng bất kỳ ngôn ngữ nào để thực hiện JRE, miễn là nó có thể biên dịch thành biểu diễn mà chương trình Java có thể hiểu biết.
Jörg W Mittag

18
Vui lòng cung cấp một tham chiếu đến Sun JVM được viết bằng C.
Mohamed Bana

8
JVM của HotSpot được viết bằng C ++ - www2.research.att.com/~bs/appluggest.html
devdimi

5
@devdimi liên kết bị hỏng và hiện cư trú tại: stroustrup.com/appluggest.html
flup

80

Trình biên dịch Java đầu tiên được phát triển bởi Sun microsystems và được viết bằng C sử dụng một số thư viện từ C ++. Ngày nay, trình biên dịch Java được viết bằng Java, trong khi JRE được viết bằng C.

Chúng ta có thể tưởng tượng cách trình biên dịch Java được viết bằng Java như thế này:

Trình biên dịch Java được viết dưới dạng chương trình Java và sau đó được biên dịch bằng trình biên dịch Java được viết bằng C (trình biên dịch Java đầu tiên). Vì vậy, chúng ta có thể sử dụng trình biên dịch Java mới được biên dịch (viết bằng Java) để biên dịch các chương trình Java.


31
+1 để giải thích cách trình biên dịch Java có thể được viết bằng Java :)
Eduard Luca

2
fyi quá trình "nâng cấp" này lên các trình biên dịch mới bằng cách biên dịch mã của chúng trong các trình biên dịch cơ bản hơn được gọi là "bootstrapping", như trong "tự nâng cấp lên bởi bootstraps", là nơi "khởi động" máy xuất phát. Computerphile trên YouTube có một video hay về điều này và "sơ đồ T"
iono

Điều đó cũng trả lời cho vấn đề gà và trứng :)
Skynet

@Skynet gà tự lưu trữ
sportzpikachu

65

Từ tài liệu Java

Trình biên dịch được viết bằng Java và thời gian chạy được viết bằng ANSI C


1
Trình biên dịch Java đầu tiên được phát triển bởi Sun microsystems đã được viết bằng C bằng cách sử dụng một số thư viện từ C ++ en.wikipedia.org/wiki/Java_compiler
Rahul Garg

4
Đây thực sự là một tài liệu cũ (> 10 năm bởi vẻ ngoài của mọi thứ). Ví dụ, nó nói "mã byte Java được dịch nhanh chóng theo hướng dẫn của máy gốc (được giải thích) và không được lưu trữ ở bất cứ đâu" , điều này không đúng trong khoảng 5 năm!
oxbow_lakes

2
Chà, từ khi nào tài liệu đã thực sự cập nhật, đặc biệt là sau những thay đổi lớn? :)
Esko

Chà - câu trả lời không thực sự chính xác; Sun JVM được viết bằng C và trình biên dịch Sun java được viết bằng Java. IBM JVM đầu tiên được viết bằng Smalltalk.
oxbow_lakes

8
Cái gì biên dịch Java? Java. Chà, làm thế nào để bạn có được Java? Biên dịch nó. Huh?


9

Liên kết này sẽ trả lời câu hỏi của bạn

Có vẻ như trình biên dịch hiện được viết bằng Java, nhưng thời gian chạy được viết bằng ANSI C


8

Về nguyên tắc hầu hết mọi thứ, thường là C


3

Jike RVM , một JVM tự lưu trữ được sử dụng rộng rãi cho mục đích nghiên cứu được viết bằng Java. Đó không phải là người chạy trên máy tính để bàn của họ, nhưng nó xuất hiện trong danh sách "bây giờ hãy thể hiện sức mạnh chung của ngôn ngữ".


Đó là rùa tất cả xuống ? Liệu nó có một số loại vi hạt? Nếu vậy, ngôn ngữ đó được viết bằng gì?
Raedwald

3

Giả sử bạn đang nói về Hotspot JVM, được iirc cung cấp, nó được viết bằng C ++. Để biết thêm thông tin về các máy ảo khác nhau cho Java, bạn có thể kiểm tra liên kết này . javac , giống như hầu hết các trình biên dịch Java, được viết bằng Java.


0
  • Khi Java được Sun microsystem giới thiệu, trình biên dịch java được viết bằng C sử dụng một số thư viện từ C ++.
  • Vì có một khái niệm trong Thiết kế trình biên dịch gọi là Khởi động, chủ yếu được sử dụng trong Phát triển trình biên dịch, Bootstrapping là quá trình viết một trình biên dịch (Hoặc Trình biên dịch) Trong ngôn ngữ lập trình nguồn mà nó dự định biên dịch. Nó được sử dụng để sản xuất một trình biên dịch tự lưu trữ. Việc phát triển trình biên dịch cho các ngôn ngữ lập trình mới trước tiên được phát triển theo ngôn ngữ hiện có và sau đó viết lại bằng ngôn ngữ mới và được biên dịch bởi chính nó. Đó là lý do tại sao ngày nay, trình biên dịch Java được viết bằng chính Java .
  • Máy ảo Java : Máy ảo Java là một máy trừu tượng. Giống như một máy tính thực, Nó có một tập lệnh và thao tác các vùng bộ nhớ khác nhau trong thời gian chạy. Thông thường JVM diễn giải mã byte thành mã Máy.

(Để biết thêm thông tin Bạn có thể kiểm tra liên kết này: https://docs.oracle.com/javase/specs/jvms/se7/html/ )

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.