语法糖

语法糖(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自身原本就支持基本类型。比如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大的文章中学习下,总之学习思路都很类似,就是通过反编译的方式了解解糖后的代码或者字节码是怎样的。


福利时间

感谢大家一直以来的陪伴与支持

今天给大家赠送6本书

北京大学出版社赞助

分布式一致性算法

赵辰 著

系统 详尽 生产级 完整

自己动手 从零开始编写Raft算法来实现分布式一致性算法!

《分布式一致性算法开发实战》内容简介:本书分析了分布式一致性Raft算法以及Raft算法所依赖的理论,在此基础上讲解并实现Raft算法以及基于Raft算法的KV服务。通过本书,你可以深入了解Raft算法的运行机制,也可以学习到如何正确地实现Raft。

本书分为11章,第一章介绍分布式一致性算法,第二章详细分析Raft算法,第三章在第二章基础上整体设计,第四章到第八章逐个讲解基于Raft算法的KV服务的各个组件的实现,第九章讲解Raft算法的主要优化之一的日志快照,第十章是生产环境必须的服务器成员变更功能,最后一章介绍其他一些相关的Raft优化。

本书详细介绍了Raft的核心算法、服务器成员变更以及各种优化的实现,适合想尝试实现Raft算法或者在生产环境中加入Raft算法的读者,以及对于分布式一致性算法有兴趣的读者。

也欢迎大家自行购买

本次送书不需要评论,也不需要转发

采用最公平的抽奖方式。

关注公众号:码出未来

公众号后台回复:送书

即可参与抽奖


关于作者漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。

推荐阅读:

  • 漫话:为什么Java中的main方法必须是public static void的?

  • 漫话:如何给女朋友解释什么是删库跑路?

  • 漫话:如何给女朋友解释为什么计算机中 0.2 + 0.1 不等于 0.3 ?

  • 漫话:为什么计算机用补码存储数据?

喜欢我可以给我设为星标哦

好文章,我“在看”

漫话:如何给女朋友解释什么是语法糖?相关推荐

  1. 漫话:如何给女朋友解释什么是Mock?

    某天晚上,接到测试的电话,他问为什么在日常环境我的接口使用不同的用户测试返回的内容都一样,我回答他:接口数据被我mock掉了,现在返回的都是mock数据.需要调一下mock的逻辑才行. 挂断电话之后, ...

  2. java反编译工具_漫话:如何给女朋友解释什么是编译与反编译

    戳蓝字"CSDN云计算"关注我们哦! 来源 | 漫话编程 某天下班后,我在家里进行电话面试,问到面试者这样一个问题:"你知道使用哪些办法可以反编译Java代码吗?&quo ...

  3. 漫话:如何给女朋友解释什么是3PC?

    一顿愉快的小火锅之后,悠哉悠哉的回家了,于是只能开始新一轮的家庭科普了. 分布式一致性 幸好在<漫话:如何给女朋友解释什么是2PC(二阶段提交)?>中介绍过关于2PC的知识,要不然这事儿可 ...

  4. 漫话:如何给女朋友解释什么是适配器模式?

    本文经授权转载自微信公众号:漫话编程 周末窝在家里面打王者荣耀,女朋友在旁边玩我的电脑,我嫌她播放的综艺节目声音比较大,于是建议她戴耳机. 适配器模式 Adapter Pattern,通常被翻译成适配 ...

  5. 漫话:如何给女朋友解释什么是BIO、NIO和AIO?

    本文经授权转载自微信公众号:漫话编程 周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO.NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很 ...

  6. java 日期加一天_漫话:如何给女朋友解释为什么一到年底,部分网站就会出现日期混乱的现象?...

    2019年最后一天,在家里看着跨年晚会,享受着这一年最后一天的闲暇时光,女朋友在旁边玩手机.看了一会之后她突然问我一些很奇怪的问题. 于是我拿过他的手机,看到了下面这一幕: 这是微信官方出的公众号管理 ...

  7. 漫话:如何给女朋友解释什么是 3PC?

    作者 | 漫话编程 本文经授权转载自漫话编程(ID:mhcoding) 责编 | 胡巍巍 一顿愉快的小火锅之后,悠哉悠哉的回家了,于是只能开始新一轮的家庭科普了. 分布式一致性 幸好在<漫话:如 ...

  8. 漫话:如何给女朋友解释为什么吴某凡会被中间人攻击?

    中间人攻击 中间人攻击(Man-in-the-middle attack,缩写:MITM)在密码学和计算机安全领域中是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们 ...

  9. 漫话:如何给女朋友解释什么是大案牍术?

    听说最近<长安十二时辰>比较火,于是趁着一个周末赶紧补一补剧.相信很多人都对其中的"大案牍术"比较感兴趣,靖安司说"大案牍术"选中了张小敬. 看到这 ...

最新文章

  1. html字体效果标签,纯CSS模拟fieldset标签效果把文字写在边框上
  2. 本机镜像仓库base64解密
  3. Windows Server 2012 下安装MySQL 5.6 X64位包
  4. java json jar包_jsonobject jar包下载
  5. jsp mysql登录 demo_java jsp+servlet+mysql实现登录网页设计
  6. POJ1661 Help Jimmy(dp)
  7. C++女程序员一个人留在北京
  8. org.apache.catalina.loader.StandardClassLoader@1af33d6
  9. python和c先学哪个-先学C语言还是Python?资深程序员往往是这样建议的!
  10. 微信小程序中字符串转JSON
  11. springboot分层构建Docker镜像实践,统统都会!
  12. 【推荐算法论文】矩阵分解算法
  13. uni-app时间格式转换
  14. 《清单革命》对程序开发的一些启示
  15. 基于固件的漏洞挖掘方法梳理
  16. Telnet - 访问8080端口并发送数据
  17. ntfs磁盘 0字节 0byte 文件目录损坏且无法读取 RAW chkdsk失败
  18. 终极实践:部署LNMP服务
  19. 程序员多赚20k的接私活必备网站
  20. pyqt中treeview控件右键单击操作

热门文章

  1. 六大任务赏金平台,带你深度参与区块链的发展
  2. 回忆--上海滩奋斗的日子
  3. 国王分金币(超详细版)
  4. 在photoshop中,从1寸到24寸的大小是多少
  5. React-Navigation的goBack()跳转到指定页面,以及不同栈之间的页面的返回操作
  6. 企业应该怎样选择mes系统?
  7. NO.79——BFS,DFS,Astar,爬山法,最抖爬山法,模拟退火法解决八数码问题Python实现
  8. KTV 歌房如何实现伴奏与人声同步功能
  9. 基于人脸识别的课堂签到管理系统【学习三】
  10. 怎么恢复删除的文件?实用小妙招