博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
漫话:如何给女朋友解释什么是语法糖?
阅读量:4103 次
发布时间:2019-05-25

本文共 2235 字,大约阅读时间需要 7 分钟。

语法糖

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家Peter J. Landin发明的一个技术术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。

类比一下就像我们日常使用的一些缩写、别称或者是"黑话"、"暗语"等。都是用一种更加简练的语言表达复杂的含义。

如我们有人说"基操勿6",直意为“不要大惊小怪,这只是基本操作”,表现一种低调的得意。

当我们形容一个妹子的时候可以说她是"可盐可甜"等等的。

通过使用这些暗语、黑话,可以起到很多作用,如更加简洁、更加自然、效率高、错误少等。

而在编程语言中引入语法糖,在使用上同样可以起到使代码更加简洁、提升代码可读性、提升编程效率、降低程序出现错误的概率等。

有了暗语、黑话,可以让人们交流更加顺畅,有了语法糖,可以让程序员写代码更加爽。是一个道理。

解语法糖

就像我们日常说的一些"暗语"、"黑话",这些被发明出来是方便人们使用的,但是并不是所有人都能看得懂。

在看得懂的人之间使用的话是很方便的,但是如果有人不懂的话,就需要解释给他们听。

同理,语法糖是编程语言中增加的一些语法特性,目的是方便开发人员的使用,拿Java语言举例,虽然Java中有很多语法糖,但是Java虚拟机并不支持这些语法糖,所以这些语法糖在编译阶段就会被还原成简单的基础语法结构,这样才能被虚拟机识别,这个过程就是解语法糖。

如果看过Java虚拟机的源码,就会发现在编译过程中有一个重要的步骤就是调用desugar(),这个方法就是负责解语法糖的实现。

通常情况下,我们可以通过反编译()的方式学习语法糖具体是如何实现的。

Java中的语法糖

Java作为一种高级语言,是有很多语法糖的,而且从Java 7开始,几个重要的版本中提供的新特性都是和语法糖有关系的。

逐渐的,Java已经从一个低糖语言变成一个高糖语言了。

如switch支持枚举及字符串、泛型、条件编译、断言、可变参数、自动装箱/拆箱、枚举、内部类、增强for循环、try-with-resources语句、lambda表达式等。

还有JDK 10中的局部变量类型推断、JDK 13中的文本块(Text Blocks),其实本质上都是语法糖。

关于Java中的语法糖,Hollis大神写过很多文章深入的介绍过他们的原理,如《》、《》等。

摘取一段关于switch对String的支持的分析过程如下:

Java中的swith自身原本就支持基本类型。比如intchar等。对于int类型,直接进行数值的比较。对于char类型则是比较其ascii码。

所以,对于编译器来说,switch中其实只能使用整型,任何类型的比较都要转换成整型。比如byteshortchar(ackii码是整型)以及int

看下switchString得支持,有以下代码:

public class switchDemoString {    public static void main(String[] args) {        String str = "world";        switch (str) {        case "hello":            System.out.println("hello");            break;        case "world":            System.out.println("world");            break;        default:            break;        }    }}

反编译后内容如下:

public class switchDemoString{    public switchDemoString()    {    }    public static void main(String args[])    {        String str = "world";        String s;        switch((s = str).hashCode())        {        default:            break;        case 99162322:            if(s.equals("hello"))                System.out.println("hello");            break;        case 113318802:            if(s.equals("world"))                System.out.println("world");            break;        }    }}

看到边以后的代码,我们就能发现:字符串的switch是通过equals()hashCode()方法来实现的。

其他语法糖就不在这里详细介绍了,感兴趣的可以到H大的文章中学习下,总之学习思路都很类似,就是通过反编译的方式了解解糖后的代码或者字节码是怎样的。

推荐阅读最近聊了一些高P,我慌了十年老码农,现场教你写简历为了让你看技术文章,我们操碎了心。。。编程·思维·职场欢迎扫码关注

转载地址:http://thysi.baihongyu.com/

你可能感兴趣的文章
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
MySQL-分布式架构-MyCAT
查看>>
设计模式六大原则(6):开闭原则
查看>>
阿里面试总结--JAVA
查看>>
Servlet的生命周期
查看>>
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
【设计模式】—-(2)工厂方法模式(创建型)
查看>>
有return的情况下try catch finally的执行顺序(最有说服力的总结)
查看>>
String s1 = new String("abc"); String s2 = ("abc");
查看>>
JAVA数据类型
查看>>
Xshell 4 入门
查看>>
SoapUI-入门
查看>>
Oracle -常用命令
查看>>
JAVA技术简称
查看>>
ORACLE模糊查询优化浅谈
查看>>
2016——个人年度总结
查看>>