上口糖和双糖是什么意思(什么是语法糖如何解糖)

什么是语法糖,如何解糖

语法糖(Syntactic Sugar)也称糖衣语法,是由英国计算机学家Peter.J.Landin发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。

有意思的是,在编程领域,除了语法糖,还有语法盐和语法糖精的说法,篇幅有限,这里不做扩展了。

我们所熟知的编程语言中几乎都有语法糖。很多人说Java是一个“低糖语言”,其实从Java 7开始。Java在语言层面上一直在添加各种“糖”,主要是在“Project Coin”项目下研发,未来还会持续向着“高糖”的方向发展。

Switch对String的支持、泛型、自动拆装箱、枚举、for-each等其实都是语法糖,在介绍相关知识时,我们为了讲解原理,对这些语法糖做了解语法糖(简称解糖)操作。那么,什么是解糖呢?

1. 解语法糖

前面提到,语法糖的存在主要是方便开发人员使用。其实,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。

在Java中,javac命令可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机中的字节码。

如果查看com.sun.tools.javac.main.JavaCompiler的源码,就会发现在compile()中有一个步骤就是调用desugar(),这个方法就是负责解语法糖的。

想要学习Java中的语法糖,必备的一项技能就是对Class文件进行反编译。

2. 反编译

因为JVM在编译过程中,会把语法糖解糖,还原成基本语法结构。所以如果我们知道一个语法糖被JVM解糖之后的代码是什么样的,那么就知道了这个语法糖的实现方式。

编译后的Class文件是二进制文件,如何变成程序员可以看得懂的文件呢?这就需要反编译了。

我们可以通过编译器,把高级语言的源代码编译成低级语言,反之,可以通过低级语言进行反向工程,获取其源代码,这个过程就叫作反编译。

虽然很难将机器语言反编译成源代码,但我们可以把中间代码进行反编译。就像我们虽然不能把经过虚拟机编译后的机器语言进行反编译,但我们把javac编译得到的Class文件进行反编译还是可行的。

所以,一般说Java的反编译,就是指将Class文件转换成Java文件。

Java中有很多反编译工具,下面简单介绍几种。

javap

javap是JDK自带的一个工具,可以对代码进行反编译,也可以查看Java编译器生成的字节码。javap生成的文件并不是Java文件,而是程序员可以看得懂的Class字节码文件。

jad

jad是一个比较不错的反编译工具,只要下载一个执行工具,就可以实现对Class文件的反编译了。

jad可以把Class文件反编译成Java文件。

但是,jad已经很久不更新了,在对Java 7生成的字节码进行反编译时,偶尔会出现不支持的问题,在对Java 8的Lambda表达式反编译时就会彻底失败。

CFR

相比jad来说,CFR的语法可能会稍微复杂一些。

JD-GUI

JD-GUI是一个独立的图形实用程序,可以显示Class文件的Java源代码。可以使用JD-GUI浏览重建的源代码,以便立即访问方法和字段。

内容摘自《深入理解Java核心技术》,作者是Hollis,张洪亮,阿里巴巴技术专家,51CTO 专栏作家,CSDN 博客专家,掘金优秀作者,《程序员的三门课》联合作者,《Java工程师成神之路》系列文章作者;热衷于分享计算机编程相关技术,博文全网阅读量数千万。

上口糖和双糖是什么意思(什么是语法糖如何解糖)(1)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页