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

Java编译原理(javac)

Java中的编译分为两个部分: 源码文件编译成字节码文件(前端编译) 字节码文件被虚拟机加载以后编译成机器码(后端编译) 对于开发来说接触的一般都是第一个步骤也就是源码编译成字节码文件(class文件)...前端编译 前端编译大致主要有以下流程: 对源文件进行词法分析产生字符流 对字符流进行语法分析产生抽象语法树 对语法树进行语义分析,确保语义正常 语义分析通过以后生成中间代码(字节码) 下面我们站在javac...词法分析主要由com.sun.tools.javac.parser.Scannaer类来实现。...上述抽象语法树在Java中使用com.sun.tools.javac.tree.JCTree类来表示,之后所有的操作均建立在抽象语法树之上。...4.2.2 字节码生成 字节码生成是javac编译的最后一个阶段。字节码生成阶段不仅仅是把各个步骤生成的信息转换成字节码写到磁盘,还进行了代码的添加和转换工作。

1.4K10
您找到你想要的搜索结果了吗?
是的
没有找到

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类来手动编译指定的类

1.9K30

JVM系列五(javac 编译器).

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

90910

java和javac编译运行java程序

目录 目录 前言 编译命令介绍 javac java 代码编译与运行 java类发现规则 分离class和java文件 参考链接 前言 给自己定了一个月学习JVM虚拟机的计划,不管有没有卵用,学点新东西总是好的...下面,主要是总结一些如何在命令行中编译java程序。主要是想记录总结一下java的类发现原则。 编译命令介绍 其实,java编译过程主要使用了javac和java两个命令。...javac javac用于将java文件编译成byte-code class文件。...代码编译与运行 这里介绍一个带package的测试用例。以前大家在学习javac编译的时候,都是在默认包下进行的编译,一般不会出问题,但是遇到带package的类就不一样了。...在src/jvm目录下,我们禁用classpath,编译TestClass1.java: javac -classpath "" TestClass1.java 大家执行之后,发现是可以编译通过的(至于能否执行大家先不要在意

2.9K30

Javac 编译速度缓慢的 JDK Bug 定位

:原本只需要一分钟就可以完成的编译,现在需要动辄一个多小时;如果在本机进行编译,甚至几个小时都编译不完。...首先我们对编译缓慢的项目启动编译构建,默认情况下是基于 Maven 的,因此需要找出是不是 Maven 导致的问题。我们采用的 JDK 版本是 1.8.0_202....当程序运行一段时间后,我们找出了热点方法(见图 4),即 javac 编译起内部的 List 相关调用;通过仔细追踪调用链,发现是 checkWithinBounds 方法过于缓慢。...图 4:找出热点方法 既然热点方法找到了,那么下面就需要探究这个方法在 javac 编译器中是做什么的,它的算法为什么这么慢,以及是否有优化的方式。...在这个 2014 年就提出的 JEP-215 中,开发者设计了一种新的 javac 方法类型检测机制 TA(Tiered Attribution)来代替现有的 SA(Speculative Attribution

57630

Skywalking的编译打包

Skywalking作为一款优秀的开源APM监控系统,对于性能监控帮助挺大,去年开始我们自己就对这个开源的系统做了些改动和本地化的开发,改完后就会涉及到编译打包,现在我们从网上找到挺多这方面的文章...现在我重新整理一下这方面的思路,并且做些简化,也参考了别人的方法: 基础环境: jdk: 1.8 maven: maven 3 git: 版本随意 IDE: intelliJ IDEA (依个人习惯,我编译打包有时候根本没用到...# 编译 agent 包 ....dist文件: 独立编译成的UI dist文件,也是可以放到apm-webapp中打包的,可以将上图dist中的文件拷贝到apm-webapp\target\classes\public下,然后修改apm-webapp...\pom.xml,将npm install和build过程都注释了: 这样就实现了独立构建的skywalking-ui结果文件放到整体包中一起打包(这样就忽略了skywalking-ui在构建时,因为网络原因导致整体打包被中断

3.3K40

一次 Javac 编译速度缓慢的 JDK Bug 定位

,但是编译所需时间越来越长,且并非线性增长:原本只需要一分钟就可以完成的编译,现在需要动辄一个多小时;如果在本机进行编译,甚至几个小时都编译不完。...首先我们对编译缓慢的项目启动编译构建,默认情况下是基于 Maven 的,因此需要找出是不是 Maven 导致的问题。...当程序运行一段时间后,我们找出了热点方法(见图 4),即 javac 编译起内部的 List 相关调用;通过仔细追踪调用链,发现是 checkWithinBounds 方法过于缓慢。...4.png 既然热点方法找到了,那么下面就需要探究这个方法在 javac 编译器中是做什么的,它的算法为什么这么慢,以及是否有优化的方式。...在这个 2014 年就提出的 JEP-215 中,开发者设计了一种新的 javac 方法类型检测机制 TA(Tiered Attribution)来代替现有的 SA(Speculative Attribution

2K51

前端打包编译和优化

打包目前前端世界主流的前 3 名模块打包器仍然是 Webpack 、 Rollup 和 Esbuild 。...对于生产环境,Vitejs 使用 Rollup 进行打包。文档:https://vitejs.cn/编译工具编译工具(Compiler)可以理解为将一种语言编写的源代码转换为另一种语言的过程。...25.5KRustesbuild (https://esbuild.github.io/)一款超级快且融合编译&打包的工具,宣称比现在生态(说的就是你:webpack + babel)快10-100倍。...编译工具,替代 Babel打包器,替代 Webpack,目前正在建设中:swcpack (https://swc.rs/docs/usage/bundling)类型检查器,替代 TSC压缩器,替代 Terseresbuildesbuild...更多是作为打包工具被大众熟知,我们在打包工具章节也做了介绍。

1.8K61

Taro编译打包优化实践

不过,由于业务比较多,项目编译后代码接近12M。在日常开发阶段执行构建命令,只是编译打包新的开发相关部分文件就需要耗时近1分钟。在生产环境下执行构建命令,编译打包项目中所有文件,则长达10分钟。...针对上述问题,我们尝试优化Taro编译打包工作。为了优化Taro的编译打包,我们需要了解Taro内置的Webpack的配置,然后使用webpack-chain提供的方法链式修改配置。...二、 Taro内置的Webpack配置 我们知道Taro编译打包的工作是由webpack来完成的,既然想要优化打包速度,首先要知道Taro是如何调用webpack进行打包的,同时也要了解其内置的webpack...因此在使用执行编译打包命令时,需要注意当前的打包环境是否能够将缓存保留下来,否则缓存配置无法带来速度优化效果。...将多核和缓存优化策略配置到Taro的webpack中,来提升编译打包速度。

1.5K30

一次 Javac 编译速度缓慢的 JDK Bug 定位

:原本只需要一分钟就可以完成的编译,现在需要动辄一个多小时;如果在本机进行编译,甚至几个小时都编译不完。...首先我们对编译缓慢的项目启动编译构建,默认情况下是基于 Maven 的,因此需要找出是不是 Maven 导致的问题。我们采用的 JDK 版本是 1.8.0_202....当程序运行一段时间后,我们找出了热点方法(见图 4),即 javac 编译起内部的 List 相关调用;通过仔细追踪调用链,发现是 checkWithinBounds 方法过于缓慢。...图 4:找出热点方法 既然热点方法找到了,那么下面就需要探究这个方法在 javac 编译器中是做什么的,它的算法为什么这么慢,以及是否有优化的方式。...在这个 2014 年就提出的 JEP-215 中,开发者设计了一种新的 javac 方法类型检测机制 TA(Tiered Attribution)来代替现有的 SA(Speculative Attribution

74810

Android的编译打包流程详解

阅读本文可以让获得如下知识:(1)Android编译打包流程。(2) Android是如何通过R文件引用到真正的资源文件?(3)打包流程中的的对齐是什么,为什么要对齐?...(4)aapt工具为何把xml编译成二进制文件? 一、官方说明 下图的是官网对于Android编译打包流程的介绍。 ?...官方的介绍非常笼统,简而言之,其大致流程就是: 编译–>DEX–>打包–>签名和对齐 (好像什么都没Get到,有一种意犹未尽的感觉……) 二、细化的流程 来一张外国大神的图片(注:这张图少了签名的步骤)...如果项目中有使用AIDL,那么就会把.aidl文件编译成.java文件。 将所有.java文件(包括R文件和AIDL生成的.java文件),通过javac工具生成class文件。...(优化思想类似于内存对齐,可以参看官网说明) 好了,编译打包的详细流程说完了,接下来我们看看是否能回答开篇的那些问题。 三、问题 1. Android是如何通过R文件引用到真正的资源文件?

1.4K100

CC++ Qt 编译打包项目

Qt程序编译后,需要去qt目录拷贝几个文件,与qt程序放在一起该程序才可以脱离开发环境而独立运行下去,在开发环境下编译好代码以后,还需要进行以下操作将其打包才可以在别的机器上正常运行。...,第一种是自己打包项目,此方法需要将我们需要用到的库手动拷贝出来,并放入工程目录下。...如果是自动打包我们可以进入Qt提供的命令行页面,跳转到需要打包程序的目录下,执行以下命令。...打包命令: windeployqt untitled.exe 如果打包时需要去掉不需要的库文件,我们可以指定--no-参数排除多余的动态链接库。...打包命令: windeployqt --no-angle --no-opengl-sw untitled.exe 当我们打包完成后,可以手动删除多余文件,只保留如下文件即可,其他的可全部裁掉。

73940

离线环境下 Maven 编译打包

Part1背景 某些离线场景下我们可能无法连接 Maven 中央库或其他内网私服,又想通过 Maven 对源码进行编译打包。 本文给出了在离线环境下使用 Maven 编译打包的方案。...Part2前置条件 假设目标环境已经安装好了 JDK 和 Maven,并且将要编译的源码工程 demo-project 放置在了 /maven-offline/build 路径下。...Part3解决方案 1准备编译所需依赖 先在联网环境成功执行一次编译,保证使用的 Maven 本地缓存仓库(默认路径 ~/.m2/repository)中包含了编译所需的依赖。.../repository -name "_remote.repositories" -exec rm {} \; 2Maven 离线编译配置 在 /maven-offline/build/ 下新建 settings.xml...配置文件中只需设定两个 Simple Values[1]: localRepository:指定清理过 _remote.repositories 文件的路径 offline:使用离线模式 3指定配置文件执行编译

13910

CC++ Qt 编译打包项目

Qt程序编译后,需要去qt目录拷贝几个文件,与qt程序放在一起该程序才可以脱离开发环境而独立运行下去,在开发环境下编译好代码以后,还需要进行以下操作将其打包才可以在别的机器上正常运行。...,第一种是自己打包项目,此方法需要将我们需要用到的库手动拷贝出来,并放入工程目录下。...如果是自动打包我们可以进入Qt提供的命令行页面,跳转到需要打包程序的目录下,执行以下命令。...打包命令: windeployqt untitled.exe如果打包时需要去掉不需要的库文件,我们可以指定--no-参数排除多余的动态链接库。...打包命令: windeployqt --no-angle --no-opengl-sw untitled.exe当我们打包完成后,可以手动删除多余文件,只保留如下文件即可,其他的可全部裁掉。图片

1K00
领券