java 与java脚本的区别 ( 积分: 80 )

S

sjjwan

Unregistered / Unconfirmed
GUEST, unregistred user!
java语言其实也是一种解释语言,只不过它先编译成一种中间的二进制代码,然后再通过虚拟机来一条条解释执行,也就是虚拟机再把它翻译成本地的二进制代码再执行,而且是不是不要再连接了?
java脚本也是一种解释语言,只不过它不需要预先编译,直接以文本格式的代码交给脚本引擎来解释执行.脚本引擎是把它翻译成目标代码在执行呢,还是根据脚本语言的意图自己做相应的处理,而没有编译成目标代码,相当于以数据来处理一样?
如果是按翻译成目标代码执行的话,从执行方式的角度来讲的话java与java脚本的区别就是一个先要编译成二进制的中间代码,一个不需要?
 
K

kidneyball

Unregistered / Unconfirmed
GUEST, unregistred user!
>>java语言其实也是一种解释语言,只不过它先编译成一种中间的二进制代码,然后再通过虚拟机来一条条解释执行,也就是虚拟机再把它翻译成本地的二进制代码再执行,而且是不是不要再连接了?
编译是指把原始语言代码转换为等价的目标语言代码的过程,目标语言并不一定是可直接执行的机器代码。因此严格来说,java是编译语言,而不是解释语言。由于存在编译过程,java语言具有编译语言的特征,例如编译期的语义检查(例如类型检查)、静态类型绑定等等。
虚拟机对中间二进制代码(bytecode)逐条执行(跟CPU执行机器指令一样),并不是解释执行。解释执行包括了解释和执行两个步骤,解释是对面向程序员的代码进行语法分析的过程,而bytecode本身是面向虚拟机的,语法分析过程已经在编译过程完成了。虚拟机并没有把bytecode二次编译为本地机器码,也就是说执行动作的发起者是虚拟机,而不是一个与bytecode等价的本地机器码程序。因此,也不存在连接过程。
>>java脚本也是一种解释语言,只不过它不需要预先编译,直接以文本格式的代码交给脚本引擎来解释执行.脚本引擎是把它翻译成目标代码在执行呢,还是根据脚本语言的意图自己做相应的处理,而没有编译成目标代码,相当于以数据来处理一样?
如果所说的java脚本是指javascript: javascript是纯粹的脚本语言。脚本引擎对javascript逐行解释执行,也就是执行到某一行,才对该行进行语法分析,然后由脚本引擎发起等价的动作(脚本本来的意义就是告诉演员怎么演的文档,但实际演出的是演员,而不是脚本本身)。第二次执行到同一行时,脚本引擎往往是重新做一次语法分析并执行。但应注意,
javascript只是一种仿java风格的脚本语言,并不是java出品。无论是语言规范组织和实现厂商都不同。
如果所说的java脚本是指JSP页面脚本:JSP页面是在首次执行时先被编译为等价的servlet类(java类)再进一步编译为bytecode。执行时是在容器上下文中执行bytecode,动作的发起人是与JSP页等价的bytecode,而不存在“JSP脚本引擎”这种东西。
>>如果是按翻译成目标代码执行的话,从执行方式的角度来讲的话java与java脚本的区别就是一个先要编译成二进制的中间代码,一个不需要?
如果仅从“按翻译成目标代码执行的话,从执行方式的角度”来考虑,的确如此。但我个人认为执行方式以及由此引起的执行效率差别对程序员来说并不是最重要的(特别是在做分布式应用时)。例如类型绑定的差别对程序员来说就更为重要,因为它直接影响到思维与编码风格。编译语言往往是静态类型绑定的,因此具有编译期类型检查能力,集成开发环境也通常具有类型相关的辅助开发功能,但程序不能在运行期修改类型定义,不能在变量的生存期内修改变量类型,最基本的是,不能在运行期修改程序自身执行逻辑。而脚本语言往往是动态类型绑定的,允许在变量的生存期内修改变量类型以及类型定义,还允许在运行期改变自身执行逻辑(例如你可以在运行期根据外部文件信息的定义一个类并直接使用)。但因此脚本语言通常只能在运行时进行类型检查(如果某一段代码分支在测试时没有被运行,就会留下隐患),集成开发环境也最多只能提供拼写级别的辅助功能。
 
K

kinneng

Unregistered / Unconfirmed
GUEST, unregistred user!
>>解释语言和编译语言的由是其最终代码能否让CPU直接执行来界定。
解释语言就是需要专用程序边解释边执行的语言,编译语言是编译后直接由CPU执行的语
言,与最终代码的产生,形式和数据结构等无关,这个概念我差不多20多年前就学过了。
>>CPU才是真正的执行者,虚拟机实际就是解释器,只是负责解释转换,虚拟执行,不是
真正执行,这点要搞清楚。
>>JAVA的编译只是前期处理,尽管看上去有编译语言的特征,但只是伪编译,出来的是所
谓中间代码,即是P-code伪代码,无论它是如何处理得出的结果,最后都要无法摆脱虚拟
机程序来解释转换,才能让CPU真正执行,对于文本格式的其实都入内存之后一般都会先
“伪编译”一次才执行,伪编译与真编译的有天渊之别。
>>现在有人将虚拟机,冠名为虚拟处理器,当成真的CPU看待,我觉得是商业宣传,因为
虚拟机就是解释转换器,其实是另一种API的包装形式。
>>有些东西可以随便你怎样说,现在的CPU也不是当年的硬逻辑形式,而是内置执行微指
令的小CPU,来解释执行所谓的CPU指令,在这个角度来看,任何语言都是解释语言,但微
指令是封闭的,所以绝对不能从这个角度去看。
 
K

kidneyball

Unregistered / Unconfirmed
GUEST, unregistred user!
多谢楼上提醒,关于编译部分我说得笼统了点,展开一下:
1. 关于编译的定义我用的是一般编译原理的定义。至于具体到编译语言和解释语言的界定,我有点想当然了。或者应该这样说,如果楼主关心的是编译语言与脚本语言的区别所带来的编程思维与模式的区别,应该把java作为一种编译语言来看。如果楼主关心的是执行效率,应该把java看作一种稍经优化的解释语言来看。如果楼主的问题是为了考试,那么请一定要严格按照课本上的说法。
2.sun声称可以选择是否使用Just-in-time compiler。使用Just-in-time compiler的话中,bytecode将被二次编译为本地机器码执行,sun声称使用JIT会对性能有帮助。但实际上是不是这样做我也没有深究,毕竟对我现在工作上所接触的应用,Java的效率可以接受。但楼主如果是在做效率敏感的系统,还是不要对java的执行效率抱太大期望为好。
3.关于kinneng兄提出的几点天壌之别,我个人觉得还是要视乎楼主提问的角度去看。就好比一个人开BMW上班,一个人骑自行车上班,在方式上是天壌之别。但只要他们都按时报到,对经理来说可以说是没有差别的。
 
B

bbscom

Unregistered / Unconfirmed
GUEST, unregistred user!
JAVA功能强大,而且扩展性非常强。脚本就不如了。
从网上搜索一下,会有一大把说明信息的。
 
J

jjg000

Unregistered / Unconfirmed
GUEST, unregistred user!
如果你想花最少的钱学习流行的计算机技术,本人低价提供
计算机专业高清晰 视 频 教 程,所有教程由业内名家讲解,物超所值,
特快专递全国三天内到货.
联系方式:手 机:1 3 5 76145612(手机联系佳) Q Q:108410943
E-mail:ncncldjjg@126.com
1、Oracle9iOCP(Oracle认证专家DBA)视频教程(23CD)
2、SQL语言、数据挖掘、SQLServer2000视频教程(6CD)
3、计算机网络原理视频教程(4CD)
4、计算机实用组网技术视频教程(3CD)
5、MCSE(微软认证系统工程师)认证视频教程(11CD)
6、windows2003即学即会视频教程(6CD)
7、J2EE Web程序开发定向班/Java就业班视频教程
(java基础jsp核心技术UML设计)(13CD)
8、J2EE基础高级案例分析视频教程(9CD)
9、马士兵J2SE入门与精通(含坦克大战、BBS实例)视频教程(6CD)
10、java语言深入详解视频教程(12CD)
11、java技术从入门到精通视频教程(21CD)
12、javascript全接触视频教程(13CD)
13、各类网站源程序(9CD)
14、unix原理视频教程(3CD)
15、Linux软件开发工程师(C语言)视频教程(4CD)
16、Linux配置、管理、优化实战工程师视频教程(8CD)
17、Linux内核编程视频教程(11CD)
18、C语言详解视频教程(2CD)
19、VC++6.0(MFC)开发技术术详解视频教程(6CD)
20、ASP.NET中文视频教程(3CD)
21、洪恩C#入门多媒体教程(1CD)
22、XML技术视频教程(2CD)
23、操作系统视频教程(3CD)
24、网络技术基础视频教程(2CD)
25、数据结构视频教程(5CD)
26、清华大学计算机专业多媒体教程(数据结构、汇编、编译原理等)(13CD)
27、大学数学[离散数学线性代数概率与数理统计微积分]视频教程(22CD)
28、LearnKey Asp.Net (老外用英语讲课)(13CD)
29、LearnKey Asp.Net Webservice(老外用英语讲课)(5CD)
30、AppDev Asp.Net2.0 UsingC# (老外用英语讲课)(1CD)
31、APPDev .Net Framework(老外用英语讲课)(2CD)
32、林清安pro/e2001(野火版)视频教程(18CD)
33、深圳大学3D设计视频教程(4CD)
34、3DMAX建模视频教程(老外用英语讲课)(6CD)
35、3DMAX纹理与贴图材质灯光视频教程(老外用英语讲课)(5CD)
36、3DMAX格式500个常用模型库(4CD)
37、lightscape基础入门视频教程(2CD)
38、聚光制造(lightscape3.2入门与精通视频教程)(4CD)
39、coreldraw12中文版入门与精通swf格式视频教程(2CD)
 
S

sjjwan

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,不管java脚本,还是java语言,最终都是二进制代码在cpu上跑的,像这种语言是不是不存在连接问题?我想像连接其实就是遵循操作系统的规范,让操作系统能看的懂。以便操作系统能将exe文件中的二进制代码交给cpu执行。
 
K

kidneyball

Unregistered / Unconfirmed
GUEST, unregistred user!
>>呵呵,不管java脚本,还是java语言,最终都是二进制代码在cpu上跑的,像这种语言是不是不存在连接问题?
javascript没有连接过程,java是有连接过程的。由于java使用动态类装载体系(也就是允许程序在运行期决定装载哪个类),因此连接行为是发生在运行期的,时机是在类装载之后,进行类初始化动作之前,具体时机由虚拟机或用户程序决定(例如用单参数的Class.forName()来装载类会在装载后立刻自动进行连接,用单参数的ClassLoader.loadClass()来装载则未必立刻进行连接,允许由虚拟机决定连接时机)。
>> 我想像连接其实就是遵循操作系统的规范,让操作系统能看的懂。以便操作系统能将exe文件中的二进制代码交给cpu执行。
JAVA中所谓连接,其实是把符号引用转变成直接引用的过程。例如你在一个类A里引用了类B(这时B在A中是一个名称符号)。在编译,A和B都还没有被装载,没有分配到实际地址,编译程序自然不知道如何引用到实际的B,因此在中间文件里,A到B的引用仍然是符号引用。在装载了A和B之后,这时虚拟机就可以把A里到B的符号引用转为直接的地址引用。那么在访问时,对B的访问将是直接地址访问,而不是通过查符号表进行访问。
正由于这个连接过程存在,令java体现出编译语言的特性。在脚本语言中,由于引用都是符号引用,因此通常允许以某种形式动态修改引用名,修改后下一次查符号引用表,新名称就能生效。而在JAVA中这是不可能的,因为经过连接之后,访问是直接通过地址访问,而没有通过名称符号。显然,使用符号引用访问还是直接地址访问其实是灵活性与效率的平衡问题,在JAVA里是使用地址访问来保证效率,使用动态类装载体系来保证一定程度的灵活性。而脚本语言则强调极高的灵活性。
注意:以上说的“地址”是虚拟机里所使用的地址,未必就是操作系统的内存地址。
如果楼主对虚拟机运作感兴趣,推荐去看一下《深入JAVA虚拟机》这本书。
 

暗夜中独舞

Unregistered / Unconfirmed
GUEST, unregistred user!
JAVA和JAVA脚本是两个完全没有关系的语言。没有必要把他们联系在一起
 
S

sjjwan

Unregistered / Unconfirmed
GUEST, unregistred user!
那脚本语言(vbscript)最终也是脚本引擎解释成二进制代码在cpu上跑的哦?意思就是脚本语言叫cpu具体做些什么,而不是叫脚本引擎具体做些什么。
我以上说法对吗?
 
S

sjjwan

Unregistered / Unconfirmed
GUEST, unregistred user!
嘿嘿,请大家帮忙解答解答啊
 
顶部