语法糖
语法糖(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大神写过很多文章深入的介绍过他们的原理,如《不了解这12个语法糖,别说你会Java》、《我反编译了Java 10的本地变量类型推断》等。
摘取一段关于switch对String的支持的分析过程如下:
Java中的swith
自身原本就支持基本类型。比如int
、char
等。对于int
类型,直接进行数值的比较。对于char
类型则是比较其ascii码。
所以,对于编译器来说,switch
中其实只能使用整型,任何类型的比较都要转换成整型。比如byte
。short
,char
(ackii码是整型)以及int
。
看下switch
对String
得支持,有以下代码:
-
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大的文章中学习下,总之学习思路都很类似,就是通过反编译的方式了解解糖后的代码或者字节码是怎样的。
福利时间
感谢大家一直以来的陪伴与支持
今天给大家赠送6本书
由北京大学出版社赞助
分布式一致性算法
赵辰 著
系统 详尽 生产级 完整
自己动手 从零开始编写Raft算法来实现分布式一致性算法!
《分布式一致性算法开发实战》内容简介:本书分析了分布式一致性Raft算法以及Raft算法所依赖的理论,在此基础上讲解并实现Raft算法以及基于Raft算法的KV服务。通过本书,你可以深入了解Raft算法的运行机制,也可以学习到如何正确地实现Raft。
本书分为11章,第一章介绍分布式一致性算法,第二章详细分析Raft算法,第三章在第二章基础上整体设计,第四章到第八章逐个讲解基于Raft算法的KV服务的各个组件的实现,第九章讲解Raft算法的主要优化之一的日志快照,第十章是生产环境必须的服务器成员变更功能,最后一章介绍其他一些相关的Raft优化。
本书详细介绍了Raft的核心算法、服务器成员变更以及各种优化的实现,适合想尝试实现Raft算法或者在生产环境中加入Raft算法的读者,以及对于分布式一致性算法有兴趣的读者。
也欢迎大家自行购买
本次送书不需要评论,也不需要转发
采用最公平的抽奖方式。
关注公众号:码出未来
公众号后台回复:送书
即可参与抽奖
关于作者:漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。
推荐阅读:
喜欢我可以给我设为星标哦
好文章,我“在看”
转载:https://blog.csdn.net/weixin_43167418/article/details/110412540