周末话题-语法糖

不知道此类文章是否合适发在首页,如果不合适,请管理团队告知,我将马上撤走,不过周末人很少,明天一到肯定是发帖高峰期,我的这篇也会马上被淹没,应该没有什么大问题。

 

正文:

众所周之,C#是一个含有丰富的语法糖的语言,每次C#推出一些新的特性的时候,很多开发者都丢下这句话:不过是个syntax sugar而已。一边我们为C#为我们带来很多简洁的语法,“优雅“的编程风格而高兴不已,一边我们又在”鄙视“这种只在其表而没有内涵的做法。

这里很想和引起大家一番对语法糖的讨论。

 

首先还是关注一下syntax sugar的历史吧,俗话说要了解一个东西还是先知其历史。

 

我们从google开始:

Wiki里我找到了关于语法糖的一些历史介绍,语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编程)创造的一个词语,它意指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜“的语法。语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。不过其并没有给语言添加什么新东西。

Wiki的介绍上来看,好像这个语法糖还是一个好东西。Wiki上还举了一个例子:在C语言里用a[i]表示*(a+i),a[i][j]表示*(*(a+i)+j),看来语法糖不是“现代语言“才有啊,连我们的老大哥C也有,而且这种写法简洁明了,也更好懂了。

Wiki里还提到,实际上从面向过程到面向对象也是一种语法糖啊,C语言可以通过它的指针、类型转换,结构实现面向对象的编程风格,但是C++更进一步的推广了这种风格,更好用了,不过到了C#OO的风格发挥得淋漓尽致。OO的编程风格对于面向过程来说是不是一种语法糖呢?如果按照Wiki的理解,只有计算机硬件指令才不算语法糖,而其他一切利用编译器、汇编器将代码抽象,和自然语言更相近的手段都算语法糖。

现在很多很多编程思想,编程理论层出不穷,当然,对于学习来说我们是要抓住技术的核心,但对于工程来说如何提高工程质量,如何提高工程效率也是我们要关注的,既然这些语法糖能辅助我们以更好的方式编写代码为什么要“抵制“呢?

我想语法糖和其他编程思想一样重要,什么duck type,人本接口,最小接口,约定优于配置,其实不都是一些思想上的“语法糖“?

不过也并不是没有反对的声音,这其中就有图灵奖的第一个获得者: Alan Perlis

 

.net2.03.03.5底层CLR并没有做更新,没有添加任何新的IL指令,所以C#2.03.0中所有的特性都是语法糖,就算从1.02.0,也只有一个泛型不是语法糖,其余的新特性也都是如此,但是每一次C#发布新特性的时候我们不得不为之而鼓舞,为之而喝彩。新的语法可以酿造更好的编程风格,以前一些难以实现的方面现在也轻而易举了。

 

欢迎大家一起来讨论语法糖,品品语法糖的甜头。

 

PS:在搜集有关语法糖的资料的时候还搜集到一个以前不了解的名词:Syntactic salt(难道叫做语法盐”?)。它的意思和语法糖相反,它促使程序员难以书写坏代码。

posted @ 2008-07-20 12:02 横刀天笑 阅读(1640) 评论(23)  编辑 收藏 所属分类: 周末话题

  回复  引用  查看    
#1楼 2008-07-20 12:18 | 飄lá┽蕩去      
偶喜欢吃糖,不过不要太甜,过尤不及
  回复  引用  查看    
#2楼 2008-07-20 12:32 | 金色海洋(jyk)      
以前要写很多代码才能实现的功能,在新的版本里,自动实现了。简单调用一下就可以了,其实这些在早期的版本里也应该自己进行封装的。
  回复  引用  查看    
#3楼 [楼主]2008-07-20 13:02 | 横刀天笑      
@飄lá┽蕩去 和我爱好一样啊,

@金色海洋(jyk) 现在由语言自己实现了不更好,肯定经过严密的测试,各方面都比较放心

  回复  引用  查看    
#4楼 2008-07-20 13:25 | 真见      
写得很好啊。
  回复  引用  查看    
#5楼 2008-07-20 14:21 | 金色海洋(jyk)      
是呀,程序员就可以越来越懒了,比如可以不会SQL,可以不知道数据库访问连接池,可以不知道DateReader打开后是要关闭的。

总之就是可以
  回复  引用    
#6楼 2008-07-20 14:22 | Cooper [未注册用户]
抓住核心,吃吃糖块还是不错的。不过别吃太多,小心糖尿病:)
  回复  引用  查看    
#7楼 [楼主]2008-07-20 14:39 | 横刀天笑      
我觉得语法糖可以吃,还可以大吃特吃,但却不要不知道糖是啥做的,只知道剥开糖纸就吃,最后牙齿都被虫蛀了就麻烦了
  回复  引用  查看    
#8楼 2008-07-20 16:37 | 金色海洋(jyk)      
那么你知道口香糖是怎么做的吗?至少我不知道,呵呵。
  回复  引用  查看    
#9楼 2008-07-20 16:54 | Zhuang miao      
哎呀,哥们牛掰了!不在群里混了~最近狂发表文章啊!祝早日取得MVP啊!
  回复  引用  查看    
#10楼 2008-07-20 16:55 | Zhuang miao      
语法糖?哪有卖的啊?
  回复  引用  查看    
#11楼 2008-07-20 17:42 | Angel Lucifer      
过犹不及。不是所有东西都可以塞在语法层面,看看 C++ 。

C++ 0x 引入的 Concept 估计会有很多人抵制的。

这种非侵入式的接口,需要大多数人改变思维方式,重新培训,也不见得是一种好事。
  回复  引用  查看    
#12楼 2008-07-20 17:46 | Angel Lucifer      
过多的语法糖,只会无谓提高语言的门槛。

简单才是美。
  回复  引用  查看    
#13楼 2008-07-20 18:06 | 丁学      
--引用--------------------------------------------------
金色海洋(jyk): 是呀,程序员就可以越来越懒了,比如可以不会SQL,可以不知道数据库访问连接池,可以不知道DateReader打开后是要关闭的。

总之就是可以
--------------------------------------------------------
你这个不对不,不是程序员越来越懒,而是工具越来越强大不,当一个入门的程序员不需要考虑太多乱七八糟的事情时,这根本就是一种巨大的进步,就好像,我们做ASP.NET应用,如果不是想非常非常NB,有必要懂指针式的内存分配吗?这不是降低了学习和工作的难度吗?
反过来说,语言能够提供一些功能,但因为语言提供了,就不求甚解了,想来很难成为一个很拽的程序员
  回复  引用  查看    
#14楼 2008-07-20 18:08 | 丁学      
--引用--------------------------------------------------
Angel Lucifer: 过多的语法糖,只会无谓提高语言的门槛。

简单才是美。
--------------------------------------------------------
老兄这个是不对滴,机器语言简单,好学吗?
汇编也还可以,好学吗?
我倒认为是相反的,语法糖并不会提高语言的门槛,反而会大大的降低,比如那个linq,你不如这个,可以和以前一样的学法用法使用C#,但你只需要使用很少的时间学习一点儿这个,是不是就可以省下大把的时间去学习那个集合之类的复杂的使用方法?
  回复  引用  查看    
#15楼 [楼主]2008-07-20 21:28 | 横刀天笑      
如果一个语法糖使得语言在复杂度上增加了,我想这个也不叫做语法糖,语法糖一般带来的是更好的可读性,更容易编写,比如这个a[i][j]和*(*(a+i)+j)的问题

语法糖第一可以提高我们的生产力,第二 如果你想比别人知道的多一点,那可以去研究语法糖后面的细节,两不误,何乐而不为呢?
  回复  引用  查看    
#16楼 [楼主]2008-07-20 21:29 | 横刀天笑      
@Angel Lucifer
对简单才是美,不过你所说的和你下的结论却背道而驰
@丁学
认同
  回复  引用  查看    
#17楼 2008-07-21 01:11 | dawave      
所有人都知道糖吃多了不好?那坏处具体在哪里呢?让我抛砖引玉地举两个例子:

1、performance
文中提到“只有计算机硬件指令才不算语法糖,而其他一切利用编译器、汇编器将代码抽象,和自然语言更相近的手段都算语法糖。”,简单地说,只有二进制代码才不是语法糖,所有高级语言,甚至汇编都是严格意义上的语法糖。

这样就好理解了,从汇编开始,一直到今天的.NET,每一次进化都会带来一定程度的性能损失。当然,因为硬件的计算能力在不断的提高,好像不是很明显。但想到.net java对机器要求,就很容易理解了。

2、knowledge
C/C++的出现使得程序员们很少关心处理器有几个寄存器了;现在的C#程序员们要理解指针不是那么容易了(还好有函数指针)。

当程序员们越来越沉浸LING这个大礼包的时候,越来越少人会知道怎么优化自己的数据库查询语言了。

忘了说一句,搂主好文。
  回复  引用  查看    
#18楼 [楼主]2008-07-21 08:47 | 横刀天笑      
@dawave
你说的对,所以我文中特意提到“工程角度”这几个字,我的意思是说从工程角度来说考虑的不仅仅是性能问题,还要权衡很多其他因素,这样比较着来看,看收益和成本的比较,我觉得这才是区别高级程序员和普通程序员的差别之所在,高级程序员不仅知道各种sugar如何用,还知道他背后的东西,并且知道他会给计算机性能带来多大的损失,在选择的时候知道权衡,而普通程序员只知道sugar如何用,至于背后是什么不知道或者没心思知道,所以.net是一个大众化的语言,从普通到高级的都可以适用,如果普通程序员想变成高级那就不但要知其然,还要知其所以然

PS:当然我也是个普通的coder,背后的很多事儿我也没弄明白,有的时候就睁一只眼,闭一只眼算了,呵呵
  回复  引用  查看    
#19楼 2008-07-21 09:11 | 装配脑袋      
面向对象是否是语法糖?IL是否是汇编的语法糖?汇编是否是机器语言的语法糖?No..我们不能把所有的编译器工作都叫成语法糖。编译器自动帮助我我们做了一些事情,是为了提高抽象性,以便我们可以用更简单的概念理解更复杂的问题,写出更强大的程序。
  回复  引用  查看    
#20楼 2008-07-21 09:52 | 随风逝去(叶进)      
支持一句话:简单才是美!
  回复  引用  查看    
#21楼 [楼主]2008-07-21 10:20 | 横刀天笑      
@装配脑袋 那你眼下的语法糖是?
@随风逝去(叶进) 不错,简单才是美

  回复  引用  查看    
#22楼 2008-07-24 13:27 | 生鱼片      
必要的语法糖是好事,做的太好吃的语法糖就不是好事了。
  回复  引用  查看    
#23楼 [楼主]2008-07-24 13:33 | 横刀天笑      
@生鱼片 呵呵,你的“太好吃”是什么意思呢?是指更简单么?我倒是认为语法糖越好吃越好,但是也不要光顾着好吃,而忘记了核心。不过也好,语法糖真是一个壁垒嘛,想知道内幕的程序员他自会去研究语法糖后面的事儿,不想知道的就不去知道呗。


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-20 12:10 编辑过


相关链接: