问点关于编译器的东西,请各位大哥帮帮忙!

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

本来是想着做个完整的编译器出来,现在看来似乎不太现实,所以就做个简单点的前台吧,其它的等以后随学习的深入再做说。。。
...全文
201 29 打赏 收藏 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
bayougeng 2010-02-11
  • 打赏
  • 举报
回复
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怎么去找这些类。
xiaoye 2010-02-10
  • 打赏
  • 举报
回复
谢谢大家,问题1,4,5已经解决了!
现在就剩两问题了,我总结了一下就是:
比如我现在要做一个像JCreator这样的工具我应该如何对它编译使它生成Class文件然后再如何执行它!
我自己的想法是通过调用javac和java命令来执行(),可是这样一来如果程序有错误也不会在你自己做的那个工具里显示啊,我就想读取出系统提示的错误,可是不会弄?或者自己做个错误提示出来,那样需要把API中所有的包,类,方法,字段,及它们之间的继承关系给弄出来,这个也不知道该怎么弄?
xiaoye 2010-02-10
  • 打赏
  • 举报
回复
引用 25 楼 focusforce 的回复:
之前有个牛人写了一个可以拖拉swing组件的编译器,叫做swingdesigner,公开了源代码,你可以从
http://blog.sina.com.cn/s/blog_4b6047bc01000bw4.html看看,应该对你很有帮助。

恩,谢谢了
focusforce 2010-02-10
  • 打赏
  • 举报
回复
之前有个牛人写了一个可以拖拉swing组件的编译器,叫做swingdesigner,公开了源代码,你可以从
http://blog.sina.com.cn/s/blog_4b6047bc01000bw4.html看看,应该对你很有帮助。
focusforce 2010-02-10
  • 打赏
  • 举报
回复
引用 21 楼 xiaoye 的回复:
引用 17 楼 focusforce 的回复:恩,有办法通过调用代码编译java文件,不过不太懂类装载的机制,后面执行不太会弄。 com.sun.tools.javac.Main.compile(new String[] { srcFile.getCanonicalPath() }); 该类需要jdk下面的包:【%jdk_home%\lib\tool.jar】
说具体点吧

肯定要先编译java文件生成class啊,然后执行class。

编译java生成class就用com.sun.tools.javac.Main.compile(new String[] { srcFile.getCanonicalPath() });
此处srcFile指java文件的路径,用到【%jdk_home%\lib\tool.jar】

执行class的话,要用classloader,不太熟悉其机制,没法帮你。


xiaoye 2010-02-10
  • 打赏
  • 举报
回复
引用 18 楼 qsrock 的回复:
编译器??估计你想做的不是这个吧!

现在先做个像JCreator这样的一个简单的前端方便开发用的,等以后学多点编译底层的东西再自己开发编译和解释器
bbn9435 2010-02-10
  • 打赏
  • 举报
回复
楼主是想做一个类似javac的东东呢?
还是想用java语言编写一个解释器?
如果是后者,建议楼主看看javacc这个东东,如果是前者,俺底子薄,没法给你建议了。
xiaoye 2010-02-10
  • 打赏
  • 举报
回复
引用 17 楼 focusforce 的回复:
恩,有办法通过调用代码编译java文件,不过不太懂类装载的机制,后面执行不太会弄。
com.sun.tools.javac.Main.compile(new String[] { srcFile.getCanonicalPath() });
该类需要jdk下面的包:【%jdk_home%\lib\tool.jar】

说具体点吧
xiaoye 2010-02-10
  • 打赏
  • 举报
回复
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]
xiaoye 2010-02-10
  • 打赏
  • 举报
回复
引用 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想都不敢想还做呢!呵呵。。。
qsrock 2010-02-10
  • 打赏
  • 举报
回复
编译器??估计你想做的不是这个吧!
focusforce 2010-02-10
  • 打赏
  • 举报
回复
恩,有办法通过调用代码编译java文件,不过不太懂类装载的机制,后面执行不太会弄。
com.sun.tools.javac.Main.compile(new String[] { srcFile.getCanonicalPath() });
该类需要jdk下面的包:【%jdk_home%\lib\tool.jar】
xiaoye 2010-02-10
  • 打赏
  • 举报
回复
引用 10 楼 bao110908 的回复:
JTextPane 中有个 setStyledDocument 方法可以更改局部样式。


恩,回去试试,在网吧里,家里上不了网,郁闷,弄点东西都不方便,还是在学校好啊
xiaoye 2010-02-10
  • 打赏
  • 举报
回复
引用 9 楼 hy158753228 的回复:
真的,我前一段时间还在想用汉语搞个程序设计语言出来呢。
LZ的钻研精神值得我学习。

呵呵,那大家就一起努力吧!
xiaoye 2010-02-10
  • 打赏
  • 举报
回复
引用 6 楼 vcshcn 的回复:
1 java编译器和虚拟机是两个东西,一个是开发,一个是运行
2 jdk本身提供了编译支持,直接从java调用,或者参看java.exe的源代码是如何把class载入到jvm
3 我见过的是先建立索引,然后语法判断
4 网上有很多变色程序,可以搜索
5 eclipse.org

3.我见过的是先建立索引,然后语法判断
对啊,这索引是怎么建的啊?一个一个的弄进去,还是网上有相关代码直接用
  • 打赏
  • 举报
回复
编译器?编辑器?...
bayougeng 2010-02-10
  • 打赏
  • 举报
回复
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那样,劝你趁早放弃。
  • 打赏
  • 举报
回复
想写个 Java 编译器,那还有可能,但是如果你想写一个 JVM 那几乎是不可能的!

JDK 中的 Java 编译器是用 Java 写的,一共有 100 多个类。
  • 打赏
  • 举报
回复
JTextPane 中有个 setStyledDocument 方法可以更改局部样式。
hy158753228 2010-02-10
  • 打赏
  • 举报
回复
真的,我前一段时间还在想用汉语搞个程序设计语言出来呢。
LZ的钻研精神值得我学习。
加载更多回复(8)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧