最近忽然想做个JAVA编译器,于是就在家天天抱着一本编译原理看,结果越看越是心惊,似乎懂了许多,似乎又什么都不懂,所以就想问几个问题。
1.如果是想从头到尾做出来一个JAVA编译器,包括前端和后端,就相当于是自己做了一个JAVA虚拟机啊?
2.像JCreator这样的开发工具是不是只是做了个编译器的前台,方便代码的编写和提供一些有用的功能!而并没有真正的去实现它的前台和后台。而是调用了本地安装的JDK里的javac编译器和java解释器?若是那么它是怎么调用javac编译器的?我想是想做出一个这样的编译器,就是不知道它是如何去调用的?
3.像JAVA里面有那么多的类,每个类里又有那么多的字段和方法,应该用什么办法来进行判断用户输入的类型是属于API里的类还是属于用户自己定义的类?是一个一个找出来(这个不太现实吧,工作量巨大),还是API里面有专门这样的类?比如说JCreator里它的错误提示是做工具的人自己做的,还是调用了javac的错误报告进行相应的提示的?
4.就是关于关键字变色的问题应该怎么实现?JTextArea里面好像没有哪个方法是给局部某个字或词变色吧,只能设置背景色和前景色。
5.Eclipse是用JAVA编写的吧,记得老师曾这么说过。那我从哪里下它的源代码呢?本来是想着做个完整的编译器出来,现在看来似乎不太现实,所以就做个简单点的前台吧,其它的等以后随学习的深入再做说

解决方案 »

  1.   

    1.是的
    2.jcreator只是个IDE,与编译器无任何关系
    3.这个貌似一般有包做管理,看import里有没有自己写的包
    5.不一定是
      

  2.   

    eclips是用java写的,界面使用的是SWT,SWT使用JNI和C写出来的,   它完全使用操作系统底层的UI部件,   所以速度快.   其他的都是用纯Java写的.
    源码在www.eclipse.org上。
      

  3.   

    .如果是想从头到尾做出来一个JAVA编译器,包括前端和后端,就相当于是自己做了一个JAVA虚拟机啊? 
    JAVA编译器是先把.JAVA文件编译成.CLASS文件。而JVM是将.class字节码文件编译成机器语言
      

  4.   

    1 java编译器和虚拟机是两个东西,一个是开发,一个是运行
    2 jdk本身提供了编译支持,直接从java调用,或者参看java.exe的源代码是如何把class载入到jvm
    3 我见过的是先建立索引,然后语法判断
    4 网上有很多变色程序,可以搜索
    5 eclipse.org
      

  5.   

    源代码地址:http://archive.eclipse.org/eclipse/downloads/drops/R-3.4.1-200809111700/download.php?dropFile=eclipse-sourceBuild-srcFetch-3.4.1.zip
      

  6.   

    你可以关注一下OpenJDK项目,它包含JVM,也包含Java编译器,也包含很多其他的工具,比如HotSpot。、Eclipse的源码上http://eclipse.org上面找,以cvs方式check out~1.如果是想从头到尾做出来一个JAVA编译器,包括前端和后端,就相当于是自己做了一个JAVA虚拟机啊? 
    编译器的前端和后端和JVM关系不大,前端一般是Java源码解析的问题,后端是Java 字节码生成的问题。
    你可以自己写编译器,然后用Sun或者IBM的JVM去跑你的code~2.像JCreator这样的开发工具是不是只是做了个编译器的前台,方便代码的编写和提供一些有用的功能!而并没有真正的去实现它的前台和后台。而是调用了本地安装的JDK里的javac编译器和java解释器?若是那么它是怎么调用javac编译器的?我想是想做出一个这样的编译器,就是不知道它是如何去调用的? 
    我不了解JCreator,
    3.像JAVA里面有那么多的类,每个类里又有那么多的字段和方法,应该用什么办法来进行判断用户输入的类型是属于API里的类还是属于用户自己定义的类?是一个一个找出来(这个不太现实吧,工作量巨大),还是API里面有专门这样的类?比如说JCreator里它的错误提示是做工具的人自己做的,还是调用了javac的错误报告进行相应的提示的? 
    这个问题等你了解更多编译细节再考虑吧,错误提示是编译器工作的一部分。4.就是关于关键字变色的问题应该怎么实现?JTextArea里面好像没有哪个方法是给局部某个字或词变色吧,只能设置背景色和前景色。 

    这个和编译器就没啥关系了,但是需要用到词法分析的东东。词法分析是编译器的最前端。
    5.Eclipse是用JAVA编写的吧,记得老师曾这么说过。那我从哪里下它的源代码呢? 
    我最先说的就是这个了。
      

  7.   

    JTextPane 中有个 setStyledDocument 方法可以更改局部样式。
      

  8.   

    想写个 Java 编译器,那还有可能,但是如果你想写一个 JVM 那几乎是不可能的!JDK 中的 Java 编译器是用 Java 写的,一共有 100 多个类。
      

  9.   

    1.不是,编译和虚拟机没有必然的联系。
    2.据说sun提供了用于编译的API。不过我没用过。如果没有,你可以调用系统命令来编译。前提是系统中已经装了jdk了。试想,如果没有eclipse你如何编译java文件呢?无非就是到cmd里输入javac命令。你可以用bat,shell,perl,c等等你会用的语言来调用系统命令进行java编译。但要注意将参数弄对了。
    3.ClassLoader就是专门干这个的。从环境变量CLASSPATH中取得Class Library,然后结合你的java文件中的import信息,确定你使用的是哪个class。如果无法确定,则编译报错。
    4.IDE里用的可能不是JTextArea。即便是,也有办法变颜色的,只是你不知道方法。
    5.Eclipse是用java做的,但是Eclipse使用的是另外一个GUI框架:SWT。它在各个方面已经超越了swing。现在很成熟了。源码?我不知道哪有下载,也许没有。6.如果只是想做个简单的,网上有很多。搜搜就知道了。我记得csdn里就看到过几次了。
    要是想做成eclipse那样,劝你趁早放弃。
      

  10.   

    恩,有办法通过调用代码编译java文件,不过不太懂类装载的机制,后面执行不太会弄。
    com.sun.tools.javac.Main.compile(new String[] { srcFile.getCanonicalPath() });
    该类需要jdk下面的包:【%jdk_home%\lib\tool.jar】
      

  11.   

    Quote=引用 12 楼 bayougeng 的回复:]
    1.不是,编译和虚拟机没有必然的联系。
    2.据说sun提供了用于编译的API。不过我没用过。如果没有,你可以调用系统命令来编译。前提是系统中已经装了jdk了。试想,如果没有eclipse你如何编译java文件呢?无非就是到cmd里输入javac命令。你可以用bat,shell,perl,c等等你会用的语言来调用系统命令进行java编译。但要注意将参数弄对了。对啊这个我清楚,用这种方法的话可是如果这个程序有错误,需要给出提示该怎办呢?3.ClassLoader就是专门干这个的。从环境变量CLASSPATH中取得Class Library,然后结合你的java文件中的import信息,确定你使用的是哪个class。如果无法确定,则编译报错。这个没怎么看懂,能不能说的具体点4.IDE里用的可能不是JTextArea。即便是,也有办法变颜色的,只是你不知道方法。我翻完了所有的JTextArea类和他所有父类的方法没找到一个改变某一部分字体颜色的方法,估计不是用这个类做的5.Eclipse是用java做的,但是Eclipse使用的是另外一个GUI框架:SWT。它在各个方面已经超越了swing。现在很成熟了。源码?我不知道哪有下载,也许没有。6.如果只是想做个简单的,网上有很多。搜搜就知道了。我记得csdn里就看到过几次了。
    要是想做成eclipse那样,劝你趁早放弃。
    呵呵,在学校闲得无聊,正好下学期开JAVA,就想做出个像JCreator这样的工具,简简单单,加上自己的一些觉得比较常用的而一般的编译器里没有的比如说定时保存之类的功能。就想通过来做个编译器来多学点东西,要不然像没有目的的看书,感觉效率太低!eclipse想都不敢想还做呢!呵呵</
    [/Quote]
      

  12.   

    楼主是想做一个类似javac的东东呢?
    还是想用java语言编写一个解释器?
    如果是后者,建议楼主看看javacc这个东东,如果是前者,俺底子薄,没法给你建议了。
      

  13.   

    现在先做个像JCreator这样的一个简单的前端方便开发用的,等以后学多点编译底层的东西再自己开发编译和解释器
      

  14.   

    肯定要先编译java文件生成class啊,然后执行class。编译java生成class就用com.sun.tools.javac.Main.compile(new String[] { srcFile.getCanonicalPath() });
    此处srcFile指java文件的路径,用到【%jdk_home%\lib\tool.jar】执行class的话,要用classloader,不太熟悉其机制,没法帮你。
      

  15.   

    之前有个牛人写了一个可以拖拉swing组件的编译器,叫做swingdesigner,公开了源代码,你可以从
    http://blog.sina.com.cn/s/blog_4b6047bc01000bw4.html看看,应该对你很有帮助。
      

  16.   

    谢谢大家,问题1,4,5已经解决了!
    现在就剩两问题了,我总结了一下就是:
    比如我现在要做一个像JCreator这样的工具我应该如何对它编译使它生成Class文件然后再如何执行它!
    我自己的想法是通过调用javac和java命令来执行(),可是这样一来如果程序有错误也不会在你自己做的那个工具里显示啊,我就想读取出系统提示的错误,可是不会弄?或者自己做个错误提示出来,那样需要把API中所有的包,类,方法,字段,及它们之间的继承关系给弄出来,这个也不知道该怎么弄?
      

  17.   

    2.上面回答的时候说过了。我知道的有两种途径:
    a.调用系统命令:javac。
    Process pro = Runtime.getRuntime().exec("javac ....")后面的参数需要你根据用户的输入来配置。至于错误提示,输入输出,用pro.getInputStream()和pro.getOutputStream()就OK了。System有三个流:in,out,err。其实err就是out的一个别名,实际上对应的都是标准输出。
    b.sun提供的用于编译的API。这个可能会更方便一些。具体如何获得提示,请参考javadoc,我也不知道。
    3.调用系统命令的方式编译,只需要你指定-d参数即可,你不用关心javac怎么去找这些类。