大家好,今天小编关注到一个比较有意思的话题,就是关于java 语言翻译的问题,于是小编就整理了5个相关介绍Java 语言翻译的解答,让我们一起看看吧。
- 自然语言是怎样互相翻译的,有类似于Java的字节码吗?
- 不同的编程语言都打包成exe执行,速度是不是都一样?为什么?
- java解释执行后是否常驻内存?为何需要JIT技术?
- 编译器具有怎样的作用?
- 如何理解java中的反射?
自然语言是怎样互相翻译的,有类似于JAVA的字节码吗?
从一种语言A翻译成另外一种语言B,一种比较好的方式确实是首先将A翻译成通用的语言C(如英语)再将语言C翻译成语言A。
通常来说这也是一种可行的方式,也是在小语种间翻译常用的方式!
两种语言互译,在机器学习中是一个典型的序列生成问题,并且生成序列长度和输入的序列长度不一致。常用的技术手段是使用Encoder-Decoder方式进行模型训练,例如Seq2Seq和注意力机制都取得了较好的效果。
模型需要的训练集为两种语言(A和B)的互译文本作为训练集。但是对于两种小语种来说这种训练集往往是难以获得的,所以通常的解决办法为找到一种中间语言C(通常为大语种,如英语),并且找到A和C以及B和C的互译训练集分别进行Encoder-Decoder模型训练,并将两个模型进行叠加以获得A和B的互译模型。
不同的编程语言都打包成exe执行,速度是不是都一样?为什么?
不一样。
简单的解释一下,计算机只认识0和1。而j***a,php,c,python等等各种语言,都需要各自的编译器来将程序代码“翻译”成0和1。
这个翻译的过程比较复杂,各自的能力水平侧重点都不一样,导致这个翻译的时间长短也不一样啦。
不要说不同语言,同一种语言的不同版本的编译器效率都不同。比如icc编译优化过的程序跑在intel架构cpu上可能就比gcc编译的快一点。当然现在的主流是靠cpu性能硬上,编译上的优化差不多过得去就行。
答案当然是不一样,具体原因涉及到编译原理,下面详细解释一下。
一种是编译型的语言,典型代表就是C/C++,编译型语言会将程序代码直接转换为可在特定机器上运行的二进制(机器语言)程序,它的特点是运行速度快,但是编译需要较长时间,编译后的程序无法跨平台运行。
还有一种是解释型语言(可以细分,比如基于本地的解释器,如Basic,Python等,还有基于虚拟机的解释器,如J***a,C#等),这种语言不是把程序直接编译成机器代码,而是在运行时把代码逐条翻译成机器代码(基于虚拟机的语言会先将代码编译成中间语言代码,然后再在虚拟机上解释执行这些中间语言),解释器语言的特点是结果即时可见,可以跨平台运行,但是运行效率相比编译型语言要慢一些。
此外,即使对同一种语言编写的代码,不同的编译器编译后的程序,运行速度也会存在一定的差异,因为现代的编译器里面都加入了优化机制,然而优化策略、优化算法等实现细节却不尽相同,导致最终生成的exe也就有一些差异了。
j***a解释执行后是否常驻内存?为何需要JIT技术?
也不是J***a程序员,简单谈谈我的看法。
1,一般意义上的垃圾回收是针对对象实例,而非类型本身,要回收类型,需要从 Classloader 入手;
2,J***a是编译型语言,但不是原生编译,编译结果是中间代码(字节码),这就是能跨平台的原因,因此程序运行时需要从中间代码转换为机器码;
3,将中间代码编译成机器码有时间开销,而且和中间代码的量是成正比的,就是说要编译的越多,花费的时间就越多,程序的启动速度就越慢; 这也是所有使用中间语言(如J***a、C#等)开发的程序,启动速度明显比原生编译型程序要慢的原因;
4,JIT的作用是按需编译,用到才编译,编译后缓存,可以提高程序的加载速度,效果立竿见影;
某***炸天的编译器,就是在中间代码的编译阶段,直接编译成机器码,相当于原生编译,这样输出的程序虽然加载和运行速度有所提高,但失去了跨平台的能力。
什么是 JIT ?
为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler),简称 JIT 编译器
编译器:把源程序的每一条语句都编译成机器语言,并[_a***_]成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;
解释器:只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的;
通过命令将 J***a 程序的源代码编译成 J***a 字节码,即我们常说的 class 文件。这是我们通常意义上理解的编译。
字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令。这个过程是J***a 虚拟机做的,这个过程也叫编译。是更深层次的编译。(实际上就是解释,引入 JIT 之后也存在编译)
此时又有疑惑了,J***a不是解释执行的吗?
没错,J***a 需要将字节码逐条翻译成对应的机器指令并且执行,这就是传统的 JVM 的解释器的功能,正是由于解释器逐条翻译并执行这个过程的效率低,引入了 JIT 即时编译技术。
必须指出的是,不管是解释执行,还是编译执行,最终执行的代码单元都是可直接在真实机器上运行的机器码,或称为本地代码
附一张图来理解
编译原理参考:深入分析J***a的编译原理
编译器具有怎样的作用?
J***ac编译器读取J***a源代码,并将其编译成字节代码,说的直白一点就是把j***a语言翻译成计算机可以识别的二进制代码。
j***a的编译器有很多种,有sun公司的jdk,有oracle的jdk,还有其他一些公司的,多***用sun公司的jdk。
j***a同时需要集成开发环境,它集成了j***a的编译器,让我们不必通过命令行来编译j***a类文件,通过它我们可以快速的开发我们需要的程序。目前用的比较多的集成开发环境有eclipse和myeclipse,eclipse有很多具有针对性的版本来应对不同的开发,而myeclipse则是相对来说功能比较全面,当然也需要购买,个人建议myeclipse。
如何理解j***a中的反射?
反射就是为了程序运行中的时候通过反射获取类的方法和属性,可以进行修改,现在大众都知道的spring框架里面的IOC就是应用了反射创建类,当业务需要的时候可以直接注入,不需要自己去创建
反射就是在运行期获取类型信息,J***a反射更进一步,还允许修改一些信息。至于如何实现的,是在编译期间将相关信息(类型元数据)放在class文件中,在运行时候可以将这些信息封装成特定J***a对象供系统使用。其实C++和Delphi等语言都可以提供(但程度稍低)RTTI信息供运行时使用,但是以函数形式提供。
因为编译器在编译期知道所有的类型细节信息,所以,只要需要,任何语言都可以提供反射功能。
J***A中的反射无处不在,不仅在jdk中存在,还在诸如spring,mybatis,设计模式等中广泛使用!
首先要知道的是,J***A可以算做编译型语言,大多数的类,方法都在编译时已经明确,这显然不能满足于我们所有的需求,使用反射就可以在运行时加载,通过类可以构造对象,准确的知道它的属性,方法等全部信息!
J***A中的反射方式有以下几种:
①Class.forName(“类全路径”);
②对象名.getClass
③基本类型的包装类:Boolean.TYPE,Integer.TYPE等!
反射的作用有:
1,可以在运行时动态获得对象,
2,在运行时动态获取一个类的构造器,方法,变量,注解等!
反射机制提供的功能是很强大的 但是客观性和维护性很差一般反射用在 构造框架 以及工具开发等等但是实际开发软件运用的并不多下面是一个简单的例子package com.wqx.test4;public class Test {public void sayhello(String name){System.out.println("hello:"+name);}public static void main(String[] args) {try {//把test 这个类载入内存Class c=Class.forName("com.wqx.test4.Test");//创建这个类的实例Object obj=c.newInstance();//通过class来取得这个方法对象 并且声明 这个类的参数类型j***a.lang.reflect.Method method=c.getMethod("sayhello", Class.forName("j***a.lang.String"));//invoke 来执行方法对象 记得参数类型要跟这里的参数匹配method.invoke(obj, "wqx");} catch (Exception e) {// TODO: handle exception}}}
到此,以上就是小编对于j***a 语言翻译的问题就介绍到这了,希望介绍关于j***a 语言翻译的5点解答对大家有用。