2015-09-25 20 views
7

Tôi đã làm việc trên Java từ hơn 8 năm.Kiến trúc nội bộ của trình biên dịch Java

Tuần trước, trong một cuộc họp nhỏ trong công ty của tôi, một trong những đồng nghiệp của tôi đã hỏi tôi chính xác làm thế nào để Java Compiler hoạt động? Tôi không có câu trả lời.

Tôi đã thử giải thích, như Java Compiler nhận từng câu một và chuyển đổi chúng thành mã byte không được nhắm mục tiêu đến bất kỳ OS nào nhưng đến JVM.

Không ai hài lòng với câu trả lời đó ngay cả tôi.

Bây giờ câu hỏi chính là cách trình biên dịch java hoạt động chính xác. tức là có bao nhiêu bước hoặc giai đoạn hoặc giai đoạn sẽ được trình biên dịch thực hiện trong trường hợp biên dịch tệp Java.

Kiến trúc Java's compiler chính xác là gì?

Điều gì xảy ra nếu có nhiều Java classes trong cùng một tệp .java. Sau đó bao nhiêu lớp sẽ được biên dịch.

Điều gì xảy ra nếu có nhập khẩu trỏ đến các lớp Java chưa được biên dịch? Sau đó, các lớp chưa biên dịch được biên soạn hoặc bỏ qua?

Tôi googled trong hơn nửa ngày và tất cả đều cung cấp câu trả lời giống như tôi đã cung cấp cho đồng nghiệp của mình.

Nhưng cuối cùng tôi đã tìm thấy một số hướng dẫn hữu ích here.

Nhưng hướng dẫn cũng bao gồm không quá sâu và tôi không thể hình dung hướng dẫn đó.

Tôi vẫn không hài lòng và mong muốn tìm hiểu thêm về điều này từ bạn.

Vì vậy, nếu có ai biết điều gì đó hơn tôi và blog ở trên, một cái gì đó bằng cách sử dụng mà tôi có thể hình dung chính xác cấu trúc nội bộ của Java Compiler, hãy giải thích cho tôi.

+0

Đặc tả JVM khá chi tiết: https://docs.oracle.com/javase/specs/jvms/se8/html/index.html –

+0

[Làm thế nào để biên dịch java chính xác diễn ra] (http: // stackoverflow. com/questions/3406942/how-exact-does-java-compilation-take-place). – YoungHobbit

+0

[Máy ​​ảo Java] (https://www.artima.com/insidejvm/ed2/jvmP.html). – YoungHobbit

Trả lời

7

Một số bước cơ bản:

  1. phân tích cú pháp: Đọc một tập hợp các tập tin * nguồn java và bản đồ kết quả thẻ chuỗi vào AST (Abstract Syntax Tree) -Nodes.
  2. nhập: Nhập ký hiệu cho các định nghĩa vào bảng biểu tượng.
  3. chú thích quy trình: Nếu được yêu cầu, xử lý các chú thích được tìm thấy trong các đơn vị biên dịch được chỉ định.
  4. thuộc tính: Thuộc tính cây Cú pháp. Bước này bao gồm độ phân giải tên là , nhập kiểm tra và gấp liên tục.
  5. luồng: Thực hiện phân tích dữ liệu trên cây từ bước trước. Điều này bao gồm séc cho bài tập và khả năng truy cập.
  6. desugar: Viết lại AST và dịch đi một số đường cú pháp.
  7. tạo: Tạo tệp nguồn hoặc tệp lớp.

Trong biết thêm chi tiết:

  1. Lex - Phá vỡ các tập tin nguồn vào từ riêng lẻ, hoặc thẻ.
  2. Phân tích cú pháp - Phân tích cấu trúc cụm từ của chương trình.
  3. Hành động ngữ nghĩa - Tạo một đoạn cây cú pháp trừu tượng tương ứng với từng cụm từ.
  4. Phân tích ngữ nghĩa - Xác định ý nghĩa của từng cụm từ, liên quan việc sử dụng các biến cho định nghĩa của chúng, kiểm tra các loại biểu thức, yêu cầu dịch của từng cụm từ.
  5. Bố cục khung - Đặt biến, tham số chức năng, v.v ... vào bản ghi kích hoạt (khung ngăn xếp) theo cách phụ thuộc vào máy.
  6. Dịch - Tạo cây đại diện trung gian (cây IR), ký hiệu không được gắn với bất kỳ ngôn ngữ nguồn cụ thể hoặc kiến ​​trúc targetmachine nào.
  7. Canonicalize - Hoist tác dụng phụ ngoài biểu thức và làm sạch các nhánh có điều kiện, để thuận tiện cho các giai đoạn tiếp theo.
  8. Lựa chọn lệnh - Nhóm các nút IR-tree thành các khối tương ứng với các hành động của các lệnh máy đích.
  9. Phân tích lưu lượng điều khiển - Phân tích chuỗi hướng dẫn thành biểu đồ luồng điều khiển cho thấy tất cả các luồng kiểm soát có thể có của chương trình có thể theo sau khi thực thi.

  10. Phân tích dữ liệu - Thu thập thông tin về luồng thông tin thông qua các biến của chương trình; ví dụ, phân tích tính liveness tính toán những nơi mà mỗi biến chương trình giữ một giá trị vẫn còn cần thiết (là trực tiếp).

  11. Đăng ký phân bổ - Chọn đăng ký để giữ mỗi biến và giá trị tạm thời được chương trình sử dụng; các biến không tồn tại cùng một lúc có thể chia sẻ cùng một thanh ghi.

  12. Phát xạ mã - Thay thế tên tạm thời trong từng lệnh máy bằng thanh ghi máy.

Có một cuốn sách đẹp:

Thực hiện biên dịch hiện đại trong Java

Bạn có thể muốn nhìn vào bên trong đang javac:

Javac Documentation

OpenJDK source code

Hacker's guide to javac

Don't Panic! To help newcomers to javac navigate their way around the code base

JVM JLS

+0

Vui lòng bao gồm địa chỉ trang web tệp PDF mà bạn đã đưa vào và xóa. – Jagadeesh

+0

Tôi đã đặt lại. Cảm ơn – ACV

6

Có những bước khác nhau trên một trình biên dịch nhưng đây là quan trọng nhất:

phân tích từ vựng Bước đầu tiên là phân tích từ vựng. Về cơ bản này bước thẻ chiết xuất từ ​​mã java (từ khóa, khai thác, tách, bình luận, tên biến ...)

phân tích cú pháp (parser) Bước thứ hai là phân tích cú pháp. Các thẻ được lấy làm đầu vào từ phân tích từ vựng và được kết hợp để tạo thành các biểu thức và hướng dẫn.

Tối ưu hóa và chuyển đổi thành mã byte Bước macro cuối cùng là chuyển đổi bước trước sang mã byte. Ở đây mã có thể được sửa đổi để tương đương với mã gốc nhưng hiệu quả hơn.


Lưu ý: Quá trình này không chỉ liên quan đến java, nhưng nó là chung cho tất cả các trình biên dịch. Ngoài ra các trình biên dịch không tạo ra một mã byte trung gian nhưng là một mã máy (như các trình biên dịch cho C hoặc C++).

Thông thường, có các công cụ để tạo một trình phân tích từ vựng và trình phân tích cú pháp vì các bước này có nhiều phần chung giữa các ngôn ngữ khác nhau.

Một nguồn mở Analizer từ vựng là flex Một Analizer cú pháp hữu ích là yacc

Cả hai làm việc với C và C++ đó là những ngôn ngữ sử dụng nhiều nhất để tạo ra các trình biên dịch (java và những người khác quá), nhưng cũng có những lựa chọn thay thế tương tự đối với các ngôn ngữ lập trình khác (để tạo trình biên dịch trong một ngôn ngữ khác, không phải cho ngôn ngữ khác). Về cơ bản, ngôn ngữ mà trình biên dịch được viết không liên quan đến ngôn ngữ mà trình biên dịch biên dịch.

Các vấn đề liên quan