作者macbuntu (邀怪)
看板PLT
标题[问题] compiler 该如何处理这种 circular dependency
时间Tue Jul 14 12:11:00 2009
以 java 的语法为例 (这种 dependency 是合法的):
class A {
void funcA(B b) {
b.funcB(this); // A depends on B
}
}
class B {
void funcB(A a) {
a.funcA(this); // B depends on A
}
}
Compiler 在处理 A 的时候, 必须知道 B 的定义才能处理 b.funcB(),
但是要定义 B, 又必须知道 A 的定义才能处理 a.funcA()...
我现在写的 compilier 是先扫第一次只定义所有型别的介面, 再扫第二次
处理 method 内的 statements; 但是在处理 statements 的时候可能会遇到
新的型别, 就又要回去定义, 整个架构变得有点乱...
想问问有没有人知道一般 compiler 是用什麽架构处理这种问题的?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.251.144.115
1F:推 noctem:我知道有些 compiler 会在第一个 pass 先把 interface 的 07/14 15:07
2F:→ noctem:相关资讯写到一个档案里面,然後再做第二个 pass. 07/14 15:07
3F:→ noctem:基本上都是要两个 pass 罗..? 07/14 15:08
4F:→ Schelfaniel:为什咩扫第二次时会出现新的型别?? 07/14 18:33
5F:推 godfat:因为实作里可能用到介面没出现的型别? 07/14 20:17
6F:→ godfat:所以扫型别时,可能要连实作都要扫,不能只看介面? 07/14 20:18
7F:→ macbuntu:对, 譬如实作里出现 Foo o; 宣告, 这个 Foo 就是新的 07/14 21:58
8F:→ macbuntu:在所有型别介面没确定前, 直接扫实做也不行, 譬如 07/14 22:01
9F:→ macbuntu:X.Y.Z(); 就无法知道 Y 是 package 还是 field name, 07/14 22:02
10F:→ macbuntu:得定义完 X 才能确定, 所以也没办法第一次就连实做扫 :( 07/14 22:04
11F:→ Schelfaniel:可是型别不是会要事先宣告?? 07/15 11:04
12F:→ Schelfaniel:Java 有 package 名称建议小写,大概就是怕混淆。 07/15 11:10
13F:推 godfat:宣告也是在实作里宣告,没写在介面上,至於 package... 07/15 11:42
14F:→ godfat:我想这大概是为什麽 ActionScript 强迫你用 import 吧 :s 07/15 11:43