>>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脚本的区别就是一个先要编译成二进制的中间代码,一个不需要?
如果仅从“按翻译成目标代码执行的话,从执行方式的角度”来考虑,的确如此。但我个人认为执行方式以及由此引起的执行效率差别对程序员来说并不是最重要的(特别是在做分布式应用时)。例如类型绑定的差别对程序员来说就更为重要,因为它直接影响到思维与编码风格。编译语言往往是静态类型绑定的,因此具有编译期类型检查能力,集成开发环境也通常具有类型相关的辅助开发功能,但程序不能在运行期修改类型定义,不能在变量的生存期内修改变量类型,最基本的是,不能在运行期修改程序自身执行逻辑。而脚本语言往往是动态类型绑定的,允许在变量的生存期内修改变量类型以及类型定义,还允许在运行期改变自身执行逻辑(例如你可以在运行期根据外部文件信息的定义一个类并直接使用)。但因此脚本语言通常只能在运行时进行类型检查(如果某一段代码分支在测试时没有被运行,就会留下隐患),集成开发环境也最多只能提供拼写级别的辅助功能。