2014-07-23 16 views
9

Khi tôi tìm kiếm mã nguồn Java, tôi tìm thấy một số tệp bất thường, chủ yếu liên quan đến ByteBuffer s trong gói java.nio có mã nguồn rất lộn xộn và được gắn nhãn This file was mechanically generated: Do not edit!.Các tệp nguồn java được tạo cơ học trong mã nguồn Java

Những tệp này cũng chứa một phần lớn các dòng trống (một số thậm chí ở giữa javadocs (!!?)), Có lẽ để ngăn các số dòng thay đổi. Tôi cũng đã thấy một vài trình giải mã java, chẳng hạn như procyon-decompiler, có tùy chọn để giữ số dòng, nhưng tôi nghi ngờ đó là trường hợp, bởi vì đặt các dòng trống trước khi giải thưởng cuối cùng không thay đổi gì cả. Dưới đây là một vài trong số các tệp này (Tôi không thể tìm thấy bất kỳ liên kết nào đến chúng trực tuyến và không ghi đè chúng vì tôi không muốn phá vỡ bất kỳ bản quyền nào, nhưng bạn có thể tìm thấy chúng trong thư mục src.zip tại thư mục gốc của thư mục cài đặt JDK của bạn):

  • java.nio.ByteBuffer
  • java.nio.DirectByteBufferR
  • java.nio.Bits
  • java.nio.BufferOverflowException

Tôi tò mò muốn được biết:

  • Những công cụ tạo ra những tập tin này?
  • Tại sao công cụ giữ số dòng giống nhau? Là nó để làm cho gỡ lỗi (stacktraces) dễ dàng hơn?
  • Tại sao một công cụ được sử dụng để tạo ra chúng, trong khi tất cả các lớp khác được lập trình bởi con người?
  • Tại sao công cụ sẽ đặt các dòng trống ngẫu nhiên bên trong dấu ngoặc đơn, trước giải thưởng cuối cùng hoặc thậm chí trong javadocs?
+0

Tôi nghi ngờ bạn sẽ nhận được câu trả lời vì mã đó dường như đã có một thời gian dài kiểm tra [bài đăng trên blog này từ năm 2006] (http://www.iggdawg.com/blog/2006/09/jaaaavaaaaa /), khi Java vẫn thuộc sở hữu của Sun. – APC

+2

Dường như các tệp này được tạo trong quá trình xây dựng bởi một số bộ tiền xử lý từ tệp mẫu: http://hg.openjdk.java.net/jdk9/dev/jdk/file/3b298c230549/src/share/classes/java/nio/ ByteBufferAs-X-Buffer.java.template –

+0

IIRC, bộ tiền xử lý C chèn các dòng trống do bỏ qua sau #if hoặC#else. Ở đây, lý do là rõ ràng, tôi nghĩ rằng: nếu một số trình biên dịch cờ một lỗi trong ouput, bạn sẽ tìm thấy nó trong đầu vào ban đầu. – laune

Trả lời

9

tôi có thể có thể không trả lời tất cả các câu hỏi, nhưng một số nền là:

Trong Makefile tại http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/Makefile, họ đang tạo ra file nguồn java khác nhau từ cùng một tập tin mẫu thông qua một số tiền xử lý:

... 
$(BUF_GEN)/CharBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH) 
    $(prep-target) 
    @$(RM) [email protected] 
    TYPE=char SRC=$< [email protected] $(GEN_BUFFER_CMD) 
    $(MV) [email protected] [email protected] 
$(BUF_GEN)/ShortBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH) 
    $(prep-target) 
    @$(RM) [email protected] 
    TYPE=short SRC=$< [email protected] $(GEN_BUFFER_CMD) 
    $(MV) [email protected] [email protected] 
... 

$(X_BUF_TEMPLATE) dùng để chỉ X-Buffer.java.template, là nguồn cho bộ đệm được nhập như CharBuffer, ShortBuffer và một số thứ khác.

Lưu ý: URL có thể thay đổi trong tương lai. Cũng xin lỗi vì đề cập đến Java 7 - trong Java 8 họ đã sửa đổi hệ thống xây dựng, tôi đã không tìm thấy các Makefiles tương ứng cho đến nay.

Công cụ nào đã tạo các tệp này?

GEN_BUFFER_SH/GEN_BUFFER_CMD cuối cùng đề cập đến genBuffer.sh, vì vậy kịch bản mà tạo ra những tập tin này là http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/genBuffer.sh.

Tại sao công cụ được sử dụng để tạo chúng, trong khi tất cả các lớp khác được lập trình bởi con người?

Tôi không có một câu trả lời có thẩm quyền đối với trường hợp cụ thể này, nhưng thông thường bạn đang sử dụng các công cụ sinh mã

  • nếu bạn cần phải tạo ra rất nhiều các lớp học tương tự/phương pháp mà chỉ khác nhau ở một số chi tiết, nhưng đủ tinh tế để bạn không thể sử dụng các cơ chế được thiết lập như generics hoặc tham số phương pháp (có thể là trường hợp ở đây, vì bộ đệm được tạo cho các kiểu nguyên thủy không thể sử dụng với Generics)
  • nếu bạn cần tạo các thuật toán phức tạp từ một biểu diễn đơn giản hơn nhiều (như tạo trình phân tích cú pháp từ ngữ pháp).

Tại sao công cụ giữ số dòng giống nhau? Là nó để làm cho gỡ lỗi (stacktraces) dễ dàng hơn?

Tôi đoán: có, nó giữ lại số dòng trong ngăn xếp dấu vết sao cho chúng khớp với tệp mẫu. Các công cụ khác như bộ xử lý trước C tương tự.

+1

Có những lớp học này đa dạng cho các loại nguyên thủy (ngắn, char, ...). Một trường hợp hiếm hoi. Có một số điều tra để có các kiểu nguyên thủy được bao bọc trong một số java trong tương lai, vì vậy bạn có thể có 'Bộ đệm '. –

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