首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

模拟Javac命令

在前一篇关于Javac编译器文章发布后,公众号后台有小伙伴留言问我javac命令是如何将java文件变成class文件的,我们能否实现一个这样的命令。...所以这篇文章的目的就是以Mac操作系统为例来模拟Javac命令。...首先javac命令在JDK的/bin目录下,其实质可以认为是一个脚本,在Mac系统中javac是一个可执行的 Unix文件,这里我们自己简单制作一个Unix可执行文件。...关于加 "./" 才能运行这里简单的说明下,我们执行一条Linux命令,本质是在运行一个程序,比如我们运行 javac 命令,那么机器首先会去alias中查找命令的含义,然后去内置命令中查找,最后去环境变量的...PATH中查找,所以如果不想加 "./" 我们可以 通过配置环境变量或者设置alias别名来达到这个目的。

1.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    什么是Javac

    Javac 编译器的任务就是讲java语言规范转化成Java虚拟机语言规范,完成 “翻译工作” 什么是Javac Javac 是一种编译器,能将一种语言规范转化成另外一种语言规范。...那么回过头来,javac的编译器也是将Java这种对人非常友好的编程语言编译成对所有机器都非常友好的语言。注意,这种语言不是针对某个机器的,甚至包括不同种类,不同平台的机器。...如何系哦啊出不同种类,不同机器之间的差别,这个任务就由JVM来完成,而Javac的任务就是将Java源代码语言先转化成JVM能够识别的一种语言,然后由JVM将JVM语言再转化成当前这个机器能够识别的机器语言...如下图所示,javac的任务就是将java源码编译成Java字节码,也就是JVM能够识别的二进制码。

    1.3K30

    Javac的实现过程

    主要介绍Javac的实现过程及原理。 首先弄明白什么是JavacJavac是一种编译器,将一种语言转换为另一种语言规范。...javac任务就是将java源代码转换为jvm能够识别的二进制码。将.java文件转换为.class文件,这些.class文件也就是字节码文件只有JVM能够识别。 ?...数据流分析实现的步骤:     1、检查变量在使用之前是否赋值,除了8中基本数据类型之外,还有String类型和其他对象的引用在使用之前都需要赋值。     ...2、使用final修饰的变量不会被重新赋值,如果重复复制会报错;同时如果变量是静态成员变量在定义的时候就必须赋值     3、分析方法返回值类型     4、所有的Checked Exception都必须向上抛出或者捕获...关于javac的基本原理就介绍到这里,有兴趣的可以研究下Javac的源码,可以从OpenJdk下载到源码。

    1.5K50

    Java编译原理(javac)

    词法分析主要由com.sun.tools.javac.parser.Scannaer类来实现。...上述抽象语法树在Java中使用com.sun.tools.javac.tree.JCTree类来表示,之后所有的操作均建立在抽象语法树之上。...语义分析主要包含两个步骤: 标注检查 数据及控制流分析 4.1.1 标注检查 标注检查主要用来检查变量是否已被声明、变量与赋值之间的数据类型是否匹配。在标注检查的步骤中还会实施常量折叠。...局部变量final类型的变量的不变性只能依靠编译来保证,这是因为局部变量在常量池中没有CONSTANT_Fieldref_info的符号引用,没有访问标志的信息,在运行期虚拟机并不确定局部变量是否是final...,就会填充了所有信息的符号表交给com.sun.tools.javac.jvm.ClassWriter类,最后由该类的writeClass()方法输出字节码。

    1.5K10

    Javac的实现过程

    主要介绍Javac的实现过程及原理。 首先弄明白什么是JavacJavac是一种编译器,将一种语言转换为另一种语言规范。...javac任务就是将java源代码转换为jvm能够识别的二进制码。将.java文件转换为.class文件,这些.class文件也就是字节码文件只有JVM能够识别。 ?...数据流分析实现的步骤:     1、检查变量在使用之前是否赋值,除了8中基本数据类型之外,还有String类型和其他对象的引用在使用之前都需要赋值。     ...2、使用final修饰的变量不会被重新赋值,如果重复复制会报错;同时如果变量是静态成员变量在定义的时候就必须赋值     3、分析方法返回值类型     4、所有的Checked Exception都必须向上抛出或者捕获...关于javac的基本原理就介绍到这里,有兴趣的可以研究下Javac的源码,可以从OpenJdk下载到源码。

    80420

    Java和Javac 命令行

    JAVA和JAVAC 命令行 javac和java命令行中的-classpath选项 这是个很基础的问题,但是因为基本上都是用现有的IDE工具 来开发java程序,所以很少有人意识到这一点。...javac -classpath,设定要搜索类的路径,可以是目录,jar文件,zip文件(里面都是class文件),会覆盖掉所有在CLASSPATH里面的设定。...所以一个完整的javac命令行应该是这样的, 假设abc.java在路径c:\src里面,在任何的目录的都可以执行以下命令来编译。...javac -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip -sourcepath c:\source\project1\src;c:\source...java文件列表的分割符为分号 ; 在linux下 文件路径的分隔符位斜杠 / 类或者java文件列表的分隔符为冒号 : 一个linux下编译和运行的例子  /usr/local/java/bin/javac

    47640

    Java底层-Javac编译器

    通常我们也叫Javac编译器为前端编译器,因为一个传统编译器编译结果是由源码到本地机器码的一个过程,而由于Javac编译器只负责源码到字节码这一步,所以叫前端编译器;字节码到本地机器码这一步是由后端运行时编译器来完成的...Javac编译是使用Java语言实现的,是不是很疑惑,用Java语言编写一个javac编译器去编译Java,那Javac的源码又是如何被编译执行的呢(好像鸡生蛋还是蛋生鸡的问题)?...到这里我们知道javac编译器是如何而来的,那么我们程序中能不能使用javac编译器呢?答案是肯定的。...而Javac编译器具体的编译过程可以分为两大步骤(具体可看com.sun.tools.javac.main.JavaCompiler类源码):解析与填充符号表,语义分析及字节码生成。...编译器做一个简单叙述,感兴趣可以通过OpenJDK来下载源码,然后自己编译javac的源码, 也可以通过调用jdk的com.sun.tools.javac.main.Main类来手动编译指定的类

    2K30

    win10配置java环境变量,解决javac不是内部或外部命令等问题

    ,就是刚才安装时所选择的路径D:\java\jdk1.5.0_08,此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat,eclipse等都需要依*此变量);   Path...“开始”->;“运行”,键入“cmd”;   7.键入命令“java -version”,“java”,“javac”几个命令,出现画面,说明环境变量配置成功; 下面来说说这个问题的解决办法,其实很简单...: * 1,首先进入环境变量页面 ?...2,在系统变量下面配置 JAVA_HOME:你自己的jdk的路径 CLASSPATH= ....第三步,也是最重要的一步,配置Path变量,这里win10和其他的不同就出来了,win的path变量,要用jdk的绝对路径,而不能用%JAVA_HOME%这一类的,计算机识别不了。

    4.5K30

    JVM系列五(javac 编译器).

    一、概述 我们都知道 *.java 文件要首先被编译成 *.class 文件才能被 JVM 认识,这部分的工作主要由 Javac 来完成,类似于 Javac 这样的我们称之为前端编译器; 但是 *.class...二、javac 的编译过程 首先,我们先导一份 javac 的源码(基于 openjdk8)出来,下载地址:https://hg.openjdk.java.net/jdk8/jdk8/langtools...我们执行 com.sun.tools.javac.Main 的 main 方法,就和我们在命令窗口中使用 javac 命令一样: ?...从 Sun Javac 的代码来看,编译过程大致可以分为三个步骤: 解析和填充符号表过程 插入式注解处理器的注解处理过程 分析和字节码生成过程 这三个步骤所做的工作内容大致如下: ?...Javac 编译的入口是 com.sun.tools.javac.main.JavaCompiler 类,上述三个步骤的代码都集中在这个类的 compile() 和 compile2() 中: ? ?

    95210
    领券