Eri*_*ric 5 java performance compilation
我有一个非常大的 Java 项目,其中有很多类和方法。
我在维基百科上读到“像 Java 这样的语言需要多遍编译器,因为 x 的定义不需要在使用之前出现”。如果我使用c / c++规则构建代码,以便在类的代码中使用类中的所有方法之前声明它们,这会加快编译过程(相对于使用后定义的所有方法),因为它不会在编译期间进行额外的传递?如果属实,那么如果在使用之前在代码中仅定义部分方法(相对于使用之后定义的所有方法),是否也会加快编译速度?
我知道可读性/维护应该放在第一位,但只考虑我的问题的性能影响。
简而言之,不,没有任何好处。
\nJava 编译器甚至不会尝试执行单遍处理,因此您的代码安排是否允许它并不重要。
\nC 编程语言仅具有全局函数,这使得可以轻松推理特定代码位置处的一组已定义函数。
\n相比之下,Java根本没有全局函数。上下文特定的解析包括在与调用者相同的类中声明的方法(您想到的)、从超类或接口继承的方法、在外部类中声明的方法、由外部类继承的方法以及通过一个import static声明。
此外,与 C 不同,Java 支持方法重载。因此,对于方法的解析,仅仅找到一个适用的方法是不够的,Java语言要求编译器找到最具体的方法。因此,即使调用者上方有匹配的方法声明,编译器也必须检查调用者下方是否有更具体的方法或从超类继承的方法。
\n换句话说,调用解析为同一源文件中调用之前的最具体方法的情况是一种罕见的极端情况,没有编译器供应商会尝试优化。
\n虽然细节取决于实现,但您可以预期处理基本上如问题中链接的维基百科文章中所述。\xe2\x80\x99ve 。首先,在语法分析过程中构建抽象语法树,然后对该数据结构进行语义分析和代码生成。单次传递必须以不同的方式工作,因此,需要维护替代实现,但没有任何好处,因为它不适用于现实生活中的情况。
\n为了更多地说明在句法分析之后进行语义分析的要求,请考虑以下示例:
\nSystem.out.println("hello world");\nRun Code Online (Sandbox Code Playgroud)\n虽然该语句的目的对于读者来说是显而易见的,但对于编译器来说却不是:
\nSystem成员变量。outprintlnSystem内部类。outprintlnSystem具有静态成员变量的类型out,该类型具有println方法。(答对了)System嵌套类的类型。outprintlnSystem.out具有静态println方法的类型。由于变量优先于类型,而类型又优先于包,因此编译器必须按上述顺序进行检查。换句话说,即使是这个惯用的 print 语句也需要处理整个类声明,以检查是否存在\xe2\x80\x99sSystem范围内命名的变量(包括继承的成员变量)。即使没有,编译器也必须检查System本地作用域和嵌套作用域以及当前包中的类,因为隐式导入的类java.lang具有最低优先级。
因此,即使是 hello-world 示例也不允许一次性编译。
\n| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |