scanf类是判断输入的数值是否符合格式
while(true){//把while中的判断放到了while内部
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
if(a == null b == null)
System.out.print(a ◆ " " ◆ b);
else
return;
}
按照我的理解,可以的,代码生成器是跨平台,而且是跨语言的(至少是跨文本语言的,UML暂时不好说,).
代码生成器作为一种开发工具,一般不直接作为程序的一部分,通常也不直接或间接(如通过AOP)被程序调用,他是通过编程的方式生成所需要的代码,然后将生成的代码作为源文件,复制到开发工具的代码区,然后进行编译.由于代码生成器是在编译之前运行的,所以呢它可以跨语言,你不但可以用代码生成器生成高级语言,也可以生成汇编语言,甚至机器码(0、1代码).
但编写代码生成器是一个难点,它需要你了解目标编程语言的语法.如果别人已经把你需要的代码生成器写好了,你只需按要求使用即可,此时就不需要了解目标编程语言的语法.
JNI是通过Java调用C语言(或其他语言,一般是C),它的实现机制与代码生成器不同(JNI是通过代码调用实现功能,而代码生成器是生成代码,复制代码进行使用),由于C是底层语言,一些底层操作单靠Java无法实现,所以才需要JNI.
好了,全部的我对代码生成器的个人理解,虽然提问时间已过了很久,但依然希望能对你及其他网友有所帮助.
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能.解决JAVA对本地操作的一种方法就是JNI.
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式).通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法.
简单介绍及应用如下:
第一段:JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static
{
System.loadLibrary("goodluck");
今天这一节,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断.
还需要对将要调用的方法做本地声明,关键字为native.并且只需要声明,而不需要具体实现.如下:
public
native
void
set(int
i);
int
get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C◆◆的头文件.
例如程序testdll.java,内容为:
class
testdll
main(String[]
args)
test
=
new
testdll();
test.set(10);
System.out.println(test.get());
用javac
testdll.java编译它,会生成testdll.class.
再用javah
testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C◆◆程序调用来生成所需的库文件.
第二段:C/C◆◆中所需要做的工作
对于已生成的.h头文件,C/C◆◆所需要做的,就是把它的各个方法具体的实现.然后编译连接成库文件即可.再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C◆◆所实现的功能了.
接上例子.我们先看一下testdll.h文件的内容:
/*
DO
NOT
EDIT
THIS
FILE
-
it
is
machine
generated
*/
#include
jni.h
Header
for
#ifndef
_Included_testdll
#define
#ifdef
__cplusplus
extern
"C"
#endif
*
Class:
Method:
get
Signature:
()I
JNIEXPORT
jint
JNICALL
Java_testdll_get
(JNIEnv
*,
jclass);
set
(I)V
Java_testdll_set
jclass,
jint);
在具体实现的时候,我们只关心两个函数原型
和
这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的.而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用.函数的名称是JAVA_再加上java程序的package路径再加函数名组成的.参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它.
好,下面我们用testdll.cpp文件具体实现这两个函数:
"testdll.h"
i
0;
jclass)
return
i;
j)
j;
编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件.并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll
把goodluck.dll拷贝到testdll.class的目录下,java
testdll运行它,就可以观察到结果了.
首选,直接内嵌是没法编译通过的.一般通过jni方式调用c或者c◆◆,或者c最后生成可移植性文件,通过java的api直接调用命令行.
用java是可以写语言编译器的,用任何语言工具写都可以. 各语言开发工具间只有开发效率的差异,没有可行不可行的区别.
编译器其实就是一个翻译工具,它可以把代码直接翻译成二进制文件交给CPU执行(二进制指令就是CPU的指令集,当然可以直接操作内存),当然,这个二进制文件需要符合操作系统的可执行文件的格式(PE格式或ELF格式)才能执行.
换个角度理解:
linux gcc实际上就是一个工具集合,包含编译器,汇编器,连接器等
编译器就是把c语言程序翻译为一种叫做目标文件的中间表示形式,然后交给汇编器,翻译为汇编程序,而汇编执行直接对应二进制机器码,链接之后就可以变成可执行文件了.
而用java实现的编译器完全可以代替gcc工具集合中的编译器,生成相同的目标文件的中间表示形式,在交给gcc汇编器,连接器等处理.
以上就是土嘎嘎小编大虾米为大家整理的相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!