Tag: 编译器构造

Java中的类型安全方法reflection

是否有任何实用的方法以类型安全的方式引用类的方法? 一个基本的例子是,如果我想创建类似以下实用程序函数: public Result validateField(Object data, String fieldName, ValidationOptions options) { … } 为了打电话,我必须这样做: validateField(data, “phoneNumber”, options); 这迫使我要么使用魔法字符串,要么用该字符串声明一个常量。 我很确定没有办法用库存Java语言解决这个问题,但是有某种(生产级)预编译器或替代编译器可以提供解决方法吗? (类似于AspectJ如何扩展Java语言)做以下事情会很好: public Result validateField(Object data, Method method, ValidationOptions options) { … } 并称之为: validateField(data, Person.phoneNumber.getter, options);

如何制作符号表

我们有一个编译器的作业。 我们已经进行了词法和语法分析,但我们仍然坚持生成中间代码。 我们意识到我们必须实现一个符号表,以便进行中间代码生成,我们不知道,如何做以及它包含什么。 鉴于下面的代码,符号表应包含什么? (代码用教育语言编写,如下所述) 另外我们如何在符号表中实现范围? ::= PROGRAM ID ENDPROGRAM ::= { } ::= ε | DECLARE ENDDECLARE ::= ε | ID ( , ID )* ::= ( ) * ::= PROCEDURE ID ENDPROCEDURE | FUNCTION ID ENDFUNCTION ::= ::= ε | ( ) ::= ( , )* ::= IN ID | INOUT ID ::= […]

用于重复方法调用的Java编译器优化?

java编译器(JDK1.6.0_21中的默认javac)是否会优化代码以防止使用相同的参数一遍又一遍地调用相同的方法? 如果我写了这段代码: public class FooBar { public static void main(String[] args) { foo(bar); foo(bar); foo(bar); } } 方法foo(bar)只会运行一次吗? 如果是这样,有没有办法阻止这种优化? (我试图比较运行时的两个算法,一个迭代和一个比较,我想多次调用它们来获得一个代表性的样本) 任何见解都会非常感激; 我把这个问题带到了疯狂的地步(虽然我的计算机很快就疯了,所以我继续添加方法调用,直到我在43671行得到code too large错误)。

在java中实现“import … as …”需要做些什么

如果这是可能的,那么需要重新设计java编译器的哪个部分有一个“import as”语句,所以代码看起来像这样: import java.util.Date; import mypackage.Date as MyDate; //… javaDate = new Date(); myDate = new MyDate(); 更重要的是,需要获得这种语法: import java.util.Date; import path.to.mypackage as MP; //… javaDate2 = new Date(); myDate2 = new MP.Date(); 它会给现有代码带来什么麻烦?

如何用Java编译匿名类?

我听说Java字节码实际上不支持任何类型的未命名类。 javac如何将未经修改的类转换为命名类?

从32位程序文件夹编译为64位时,更改IntelliJ 13中的jdk路径

我在尝试创建我的java项目时遇到了这个问题。 我刚刚因各种原因卸载了我的64位jdk并安装了32位的。 我收到了错误: 无法运行程序“C:\ Program Files \ Java \ jdk1.7.0_51 \ bin \ java”(在目录“C:\ Users \ $ username.IntelliJIdea13 \ system \ compile-server”中):CreateProcess error = 2,系统找不到指定的文件 如何让编译器在我现在拥有的C:\ Program Files(x86)文件夹中使用jdk?

将Maven Java编译器调试设置为false不会删除行号表?

也许这是我缺乏理解,但我会假设在Maven Java项目中执行此操作会禁用所有调试信息进入Class文件: org.apache.maven.plugins maven-compiler-plugin false 但是,我刚刚测试了它,当局部变量表消失了,并且源文件引用消失了,行号表仍然存在。 我做了一个javap -l MyClass ,仍然有类似的东西: protected com.mycorp.myapp.randomMethod(); LineNumberTable: line 197: 0 line 68: 4 line 69: 9 line 70: 14 line 198: 19 显然,这些东西还在那里……我想。

invokespecial和invokeinterface的方法调用

为什么invokespecial用于在java中调用方法? 我在多个地方读过但却无法理解完美的理由? 任何帮助,将不胜感激。

不同的Java编译器(供应商不同)会产生不同的字节码

给定相同的主要版本,比如Java 7,做不同的Java编译器(例如,Oracle的热点,JRockit或IBM的J9等……)将给定的java源代码文件编译成相同的bytcode? 扫描Java 7语言规范似乎正在讨论的是语言的语义,而不是将代码转换为字节码。 这个问题与不同的major.minor版本不同,给定供应商生成相同的字节码。 这个问题已在这里得到解答 – 可能是 。 从以下答案到Java类文件的创建是否确定? 并且对这个答案的评论引用了这个问题以及对于1和2上面的major.minor问题的两个答案,我认为我的问题的答案是肯定的 。 上述摘录如下: JLS留下了许多实现细节,从一个实现到另一个实现。 和 但是,JLS没有指定从源代码到生成的字节代码的1:1映射,因此您不应该依赖于生成完全相同的字节代码。 然而, 这里的评论意味着不同: 它是编译器,即javac,使用BLAH BLAH BLAH创建代码。 这与HotSpot无关。 这意味着给定代码X所有javac实现(相同版本/不同供应商)必须生成相同的Y字节码。 我不明白这是怎么回事,但我无法证实它不是(或者我认为,见上文)是正确的。 能给出明确的答案吗?

Javagenerics:这里的编译器问题是什么? (“没有唯一的最大实例”)

我有以下方法: public T fromJson( Reader jsonData, Class clazz ) { return fromJson( jsonData, (Type)clazz ); } public T fromJson( Reader jsonData, Type clazz ) { … } 编译器说的是第一种方法: type parameters of T cannot be determined; no unique maximal instance exists for type variable T with upper bounds T,java.lang.Object return fromJson( jsonData, (Type)clazz ); ^ 问题是什么?