Java JDK是什么?JDK安装目录介绍

JDK是SUN提供的一套Java开发环境,全称JavaDevelopmentKit,简称JDK,它是整个Java的核心,其中包括Java编译器、Java运行工具、Java文档生成工具、Java打包工具等。

在JDK安装完毕后,会在硬盘上生成一个目录,该目录被称为JDK的安装目录,如图1所示。

图1 JDK目录结构

为了更好地学习JDK,初学者需要对JDK安装目录下的子目录及文件的作用有所了解,接下来分别对JDK安装目录下的子目录进行介绍。

● bin目录:该目录用于存放一些可执行程序,如javac.exe(Java编译器)、java.exe(Java运行工具)、jar.exe(打包工具)和javadoc.exe(文档生成工具)等。

● db目录:db目录是一个小型的数据库。从JDK 6开始,Java中引入了一个新的成员Java DB,这是一个纯Java实现、开源的数据库管理系统。这个数据库不仅很轻便,而且支持JDBC 4.0所有的规范,在学习JDBC时,不再需要额外地安装一个数据库软件,选择直接使用Java DB即可。

● include目录:由于JDK是通过C和C++实现的,因此在启动时需要引入一些C语言的头文件,该目录就是用于存放这些头文件的。

● jre目录:此目录是Java运行时环境的根目录,它包含Java虚拟机,运行时的类包、Java应用启动器以及一个bin目录,但不包含开发环境中的开发工具。

● lib目录:lib是library的缩写,意为Java类库或库文件,是开发工具使用的归档包文件。

● javafx-src.zip:该压缩文件内存放的是Java FX(Java图形用户界面工具)所有核心类库的源代码。

● src.zip:src.zip为src文件夹的压缩文件,src中放置的是JDK核心类的源代码,通过该文件可以查看Java基础类的源代码。

● README等说明性文档。

在上面的目录中,bin目录是一个非常重要的目录,在其目录中存放着很多可执行程序,其中最重要的就是javac.exe和java.exe,这两个文件的主要作用如下:

● javac.exe是Java编译器工具,它可以将编写好的Java文件编译成Java字节码文件(可执行的Java程序)。Java源文件的扩展名为.java,如“HelloWorld.java”,编译后生成对应的Java字节码文件,文件的扩展名为.class,如“HelloWorld.class”。

● java.exe是Java运行工具,它会启动一个Java虚拟机(JVM)进程,Java虚拟机相当于一个虚拟的操作系统,它专门负责运行由Java编译器生成的字节码文件(.class文件)。

JVM底层原理之解释器和编译器的区别

在计算机科学中,解释器是一种计算机程序,它直接执行由编程语言或脚本语言编写的代码,并不会把源代码预编译成机器码,解释器会一行一行的读取源代码,解释,然后立即执行。

java虚拟机(jvm)启动时,会根据预定义的规范对字节码采用逐行解释的方式执行,也就是将字节码文件中的每条内容都翻译成系统能识别的指令并执行。

注意这里是直接执行,并没有编译出什么文件(就算有也是部分临时的),相当于实时翻译并执行。

编译器负责把一种编程语言(通常为高级语言)“翻译”成另外一种语言(通常为低级语言),后者往往是二进制的形式的机器语言,被称为目标代码(object code),这个转换的过程通常的目的是生成可执行的程序。

在java中,将.java编译为.class文件就是编译器的一种操作。而如果我们又将.class编译成计算机CPU可以直接执行的机器语言,那这就也是编译操作了。

注意这里并没有执行,只负责完整、彻底的翻译,然后生成翻译后的文件,并没有任何执行的操作。

关于这个,有两种说法,我觉得都挺有道理

编译型语言是将源码编译成机器指令的文件,直接就可以执行,C/C++就是这种。而java也是通过编译将源码java文件编译成字节码文件(.class),所以它显然具有编译的特点。

解释型语言是在运行时一句一句的读取源码,一边翻译成机器指令一边执行。而java在运行时也是通过jvm读取字节码文件,一边翻译一边解释成机器指令并执行,所以它显然也具有解释的特点。

所以java是半编译半解释型语言。

jvm支持一种叫即时编译的技术,它被称之为:JIT(Just in time compiler)编译器。也就是jvm不仅仅有解释器的作用,它其实还有编译器的作用。

jvm在执行java程序时,通常会将解释执行和编译执行二者结合起来进行,也就是一边解释一边编译。

所以java是半编译半解释型语言。

这两种说法,我认为都很有道理,而且我们也无需钻牛角尖非要探究Java被这样叫的原因,因为这已经是事实了。

而且,更重要的是JIT,这玩意又是个啥?我们下期再讲……

一文了解 Yacc、Lex、JavaCC、ANTLR 等编译器相关概念

Compiler

定义一种“上下文无关文法”(context-free grammar,CFG),然后写一个 C 程序来解释这种 CFG,那么这个 C 程序就叫做“编译器”(compiler)。只不过这个编译器只能编译特定的 CFG,就像 g++ 只能编译 C++,javac 只能编译 Java 代码,这些都是编译器。

CC

CC 即 compiler-compiler,意思是“编译器的编译器”,另外还可以叫做 compiler generator。

对于任意给定的 CFG,如果可以写出一个 C 程序,生成另一段 C 程序代码,这段 C 程序代码是给定 CFG 的编译器。那么,这个 C 程序就叫做 CC。

Yacc、Bison

Yacc 即 Yet Another Compiler-Compiler,是经典的生成语法分析器的工具,将任何一种编程语言的所有语法翻译成针对此种语言的 Yacc 语法解析器。

Yacc 采用自下而上(LALR)语法分析方法,输入是巴科斯范式(Backus-Naur Form,BNF)表达的语法规则以及语法规约的处理代码,输出的是基于表驱动的编译器,包括输入的语法规约的处理代码部分。

Yacc 最初由 AT&T 的 Steven C. Johnson 为 Unix 操作系统开发,后来一些兼容程序如 Berkeley Yacc(byacc)、GNU Bison 相续出现。它们在原先基础上做了一些改进或者扩展,但基本概念是相通的。

GNU Bison 是 Yacc 的 GNU 自由软件版本,基本兼容 Yacc,并做了一些改进。在新近版本中,除了与 Yacc 相同的 LALR 语法分析,Bison 还增加了对 GLR(Generalized LR) 语法分析的支持。

Lex、Flex

Lex 是 LEXical compiler 的缩写,是一个词法分析器(scanner)的生成工具,它使用正则表达式(regular expression)来描述各个词法单元的模式,由此给出一个词法分析器的规约,并生成相应的实现代码。 Lex 程序的输入方法称为 Lex 语言,而 Lex 程序本身被称为 Lex 编译器。

Yacc 生成的编译器主要是用 C 语言写成的语法解析器(Parser),需要与词法分析器一起使用(一般为 Lex),再把两部分产生的 C 程序代码一起编译。描述词法分析器的文件 *.l,经过 Lex 编译后,生成一个 lex.yy.c 的文件,然后由 C 编译器编译生成一个词法分析器。词法分析器,简单来说,其任务就是将输入的各种符号,转化成相应的标识符(token),转化后的标识符很容易被后续阶段处理。

Flex 是 Lex 的开源版本,是 Lex 编译器的一种替代实现。

JavaCC

JavaCC 即 Java Compiler Compiler,是开源、轻量的语法分析器生成器和词法分析器生成器,采用纯 Java 编写,可生成 Java、C++ 和 C# 代码。ANTLR 根据输入的文法生成由 Java 语言编写的分析器,相当于 Java 界的 Yacc + Lex 或 Bison + Flex。

和 YACC 类似,JavaCC 由(Extended Backus-Naur Form,EBNF) 格式的形式文法生成语法分析器。不同的是,JavaCC 生成的是自顶向下 LL 语法分析器对 CFG 进行解析。同时,JavaCC 生成词法分析器的方式也和 Lex 很像。JavaCC 还提供 JJTree 帮助使用者构建语法树,JJDoc 工具为源文件生成 BNF 范式文档。

JavaCC 源自著名的 Sun 公司。1996 年,Sun 推出了一个名为 Jack 的语法解析器生成器。后来,负责“Jack”的开发者创办了自己的公司 Metamata,并将 Jack 改名为 JavaCC。Metamata 最后成为了WebGain 的一部分,后 WebGain 关闭。目前 JavaCC 代码以 BSD 许可证托管在 GitHub。

很多著名开源项目用到了 JavaCC,包括:

  • Apache ActiveMQ
  • Apache Zookeeper
  • Apache Lucene
  • Apache Tomcat
  • Apache Avro
  • Apache Camel
  • Apache Calcite

ANTLR

ANTLR 即 ANother Tool for Language Recognition,是基于自顶向下的递归下降 LL 算法实现的语法解析器生成器(parser generator),采用纯 Java 语言编写。ANTLR 能够自动生成解析器,并将用户编写的 ANTLR 语法规则直接生成目标语言的解析器。所生成的解析器客户端将输入的文本生成抽象语法树,并提供遍历树的接口,以访问文本的各个部分。

ANTLR 是 Terence Parr 在普渡大学攻读硕士学位时的创作,在著名编译器领域大师 Hank Dietz 教授的指导下,开始研究构造自动化的分析器。1993年,Parr 取得博士学位,并于同年发布 ANTLR 1.10 版。最早的 ANTLR 只支持 Java, 直到 ANTLR 3 以后开始支持 Ada95、C、C#、JavaScript、Objective-C、Perl、Python、Ruby、C++ 和 Standard ML。

ANTLR 生成的代码与使用递归下降法(构造手工分析器的主要方法)产生的代码非常相似,便于程序员阅读和理解,与 Yacc 产生的晦涩代码相比进步了很多。与 JavaCC 相比,ANTLR 功能更加全面,开箱即用,另外支持语言更丰富,不止局限于 Java 语言。

使用 ANTLR 的著名项目包括:

  • Groovy
  • Jython
  • Hibernate
  • Apache Cassandra
  • WebLogic Server
  • 本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

    点赞 0
    收藏 0

    文章为作者独立观点不代本网立场,未经允许不得转载。