2010-06-13 31 views
15

Tôi đã làm ví dụ trong Java nhưng tôi nghĩ (không được kiểm tra) rằng nó hoạt động trong các ngôn ngữ khác (tất cả?).Việc biên dịch phụ thuộc vòng tròn hoạt động như thế nào?

Bạn có 2 tệp. Thứ nhất, M.java:

public class MType { 
    XType x; 
    MType() {x = null;} 
} 

Thứ hai, một tập tin (trong cùng thư mục), XType.java:

public class XType { 
    MType m; 
    public XType(MType m) {this.m = m;} 
} 

Ok đó là lập trình xấu, nhưng nếu bạn chạy javac XType nó biên dịch: biên dịch thậm chí MTypeXType nhu cầu nó. Nhưng ... MType cần XType ... cách thức hoạt động? Trình biên dịch biết điều gì đang xảy ra?

Tôi muốn biết trình biên dịch (javac hoặc bất kỳ trình biên dịch nào khác mà bạn biết) quản lý tình huống đó, chứ không phải cách tránh nó.

Tôi hỏi vì tôi đang viết trình biên dịch trước và tôi muốn quản lý tình huống đó.

Trả lời

4

Bạn cần phải thực hiện một 2-pass, hoặc multi-pass cách tiếp cận:

Ngôn ngữ như Java đòi hỏi một trình biên dịch đa-pass vì định nghĩa của x sẽ không bị yêu cầu phải đi trước khi sử dụng:

public class Example { 
public static void main(String [] args) { 
    assert(x==0);   
    x++; 
    assert(x==1); 
} 
static int x=0; 
} 

có cách tiếp cận khác nhau, ví dụ bạn có thể làm như sau:

đèo đầu tiên có thể tìm kiếm tất cả variabl e khai báo, thứ hai cho khai báo phương pháp, vv cho đến khi vượt qua cuối cùng sử dụng tất cả các thông tin này để biên dịch mã cuối cùng.

+0

Vì vậy, khi biên dịch tệp thứ hai trình biên dịch đã biết đầu tiên là gì? –

+1

@Fabio - Mỗi lần chuyển trình biên dịch xử lý tất cả các tệp thu thập thông tin cần thiết cho lần truyền tiếp theo. – ChrisF

4

Tệp đầu tiên không cần biết bất kỳ điều gì về XType ngoại trừ loại tệp này, và tương tự cho MType trong tệp thứ hai. Ngoài ra, trong Java, tất cả các đối tượng có hiệu quả cùng kích thước (vì mọi thứ đều được truy cập thông qua các tham chiếu), do đó kích thước của đối tượng là không cần thiết. Điều này không phải là như vậy trong các ngôn ngữ khác - mã của bạn như nó đứng sẽ không biên dịch trong C + +, ví dụ (cú pháp ngôn ngữ ngoài).

+2

nhưng nếu sử dụng phương pháp XType? Nó phải biết phương pháp của Xtype .. không? –

+0

Ngoài ra, tôi không chắc chắn những gì bạn có nghĩa là bởi "tất cả các đối tượng có hiệu quả cùng kích thước". – asgs

+1

Ông đang đề cập đến thực tế là (ví dụ) 'm' giữ một tham chiếu, và tất cả các tài liệu tham khảo có cùng kích thước. Nhưng đó không phải là thông tin duy nhất được yêu cầu về một loại. Nó cũng là cần thiết để biết các thành viên của nó và rất nhiều thông tin về hệ thống phân cấp siêu loại của nó. –

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