`
jonson
  • 浏览: 168513 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

编程谏言3

阅读更多
  alan谏言3:Syntactic sugar causes cancer of the semicolon. 语法糖衣导致了代码的弊病。
   语法糖衣是由Peter J. Landin创造的一个术语,是指用在一门语言中,用该语言语法包装程序,使程序语句更适合于人类的思维方式。它使得程序员使用该语言起来更舒适。特别来说,对于某个语言中的某个控件是可以由语言的其它语法来替换,并且不对完成的功能有任何的影响。举个语法糖衣的例子:
   在C语言中,对数组的访问,我们可以同  array[i]这种下标的方式来访问,但是其实这是一个语法糖衣,可以通过 *(array + i)来访问。
   语法糖衣是对原有指令等的包装,但是是否因此就增加了代码出现问题的概率。还不得而知。
1
0
分享到:
评论
7 楼 RednaxelaFX 2009-12-30  
实现编译器的时候,arr[i]比*(arr + i)可以保持更多高级语义,因而可以更方便的支持指针别名分析,所以在现在的优化编译器里反而是前者更容易被优化。
GCC在-O0为*(arr + i)生成了独立的 取偏移量-取基地址-加-移动 的指令序列的罪魁祸首不知道是不是指令选取的步骤,因为这个序列形成的模式完全可以在指令选取时被合并为一条base + scale*offset的寻址模式的指令……求验证。

当然我们完全可以把base + scale*offset的寻址都用下标方式写……也怪怪的。总之怎么用看起来自然就怎么用总没错的。

6 楼 mikeandmore 2009-12-30  
jinleileiking 写道
mikeandmore 写道
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。

要看编译器,我见过的编译器:

KEIL, IAR,都会自动优化。我在项目中做过实验,验证过。。。该死的性能。。。

也许比较老的不会自动优化吧。。ls有什么经验?分享一下。

-O0的时候的确没有*(arr+i)的确没有

*(arr+i)
 80484dd:       8b 84 24 bc 0f 00 00    mov    0xfbc(%esp),%eax                 
 80484e4:       8d 14 85 00 00 00 00    lea    0x0(,%eax,4),%edx                
 80484eb:       8d 44 24 1c             lea    0x1c(%esp),%eax                  
 80484ef:       01 d0                   add    %edx,%eax                        
 80484f1:       8b 00                   mov    (%eax),%eax                      
 80484f3:       89 44 24 04             mov    %eax,0x4(%esp)                   
 80484f7:       c7 04 24 f0 85 04 08    movl   $0x80485f0,(%esp)                
 80484fe:       e8 ed fe ff ff          call   80483f0 <printf@plt>             
 8048503:       83 84 24 bc 0f 00 00    addl   $0x1,0xfbc(%esp)                 
 804850a:       01                                                              
 804850b:       81 bc 24 bc 0f 00 00    cmpl   $0x3e7,0xfbc(%esp)               
 8048512:       e7 03 00 00                                                     
 8048516:       0f 9e c0                setle  %al                              
 8048519:       84 c0                   test   %al,%al                          
 804851b:       75 c0                   jne    80484dd <main+0x19>

arr[i]
 80484dd:       8b 84 24 bc 0f 00 00    mov    0xfbc(%esp),%eax                 
 80484e4:       8b 44 84 1c             mov    0x1c(%esp,%eax,4),%eax           
 80484e8:       89 44 24 04             mov    %eax,0x4(%esp)                   
 80484ec:       c7 04 24 e0 85 04 08    movl   $0x80485e0,(%esp)                
 80484f3:       e8 f8 fe ff ff          call   80483f0 <printf@plt>             
 80484f8:       83 84 24 bc 0f 00 00    addl   $0x1,0xfbc(%esp)                 
 80484ff:       01                                                              
 8048500:       81 bc 24 bc 0f 00 00    cmpl   $0x3e7,0xfbc(%esp)               
 8048507:       e7 03 00 00                                                     
 804850b:       0f 9e c0                setle  %al                              
 804850e:       84 c0                   test   %al,%al                          
 8048510:       75 cb                   jne    80484dd <main+0x19>              
 


-O3就都有了
5 楼 幸存者 2009-12-29  
mikeandmore 写道
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。

我很有兴趣知道前者究竟会优化成什么样以致于比后者快?
4 楼 jinleileiking 2009-12-29  
mikeandmore 写道
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。

要看编译器,我见过的编译器:

KEIL, IAR,都会自动优化。我在项目中做过实验,验证过。。。该死的性能。。。

也许比较老的不会自动优化吧。。ls有什么经验?分享一下。
3 楼 mikeandmore 2009-12-09  
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。
2 楼 smiletuna 2009-12-08  
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。



现在的编译器 能自动优化这种代码了。 毕竟前者可读性更好些。
1 楼 jinleileiking 2009-12-07  
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

相关推荐

    爱情谏言.doc

    爱情谏言.doc

    马云创业语录,创业谏言

    马云创业语录,创业谏言马云创业语录,创业谏言马云创业语录,创业谏言马云创业语录,创业谏言马云创业语录,创业谏言马云创业语录,创业谏言马云创业语录,创业谏言

    编程高手箴言(梁肇新)

    是一本不可多得的编程的灯塔,对我们这些想成为编程高手的人很有指导意义

    【网络工程】技术的悟道之三-给IT技术入门者的几点谏言

    【网络工程】技术的悟道之三--给IT技术入门者的几点谏言,这篇内容主要针对初入IT行业的新人提供了一些宝贵的建议。首先,作者强调技术的核心在于坚持,而非简单的兴趣、高薪或行业热度。他以追求爱情为例,指出兴趣...

    程序员请在编程中别自作聪明

    程序员请在编程中别自作聪明.人人都有很高的欲望在编程中表现自己的聪明。你想卖弄一下,用你高超的技巧写出一段最奇巧的代码。它让你得到少有的成就感。...所以,下面有一些对年轻程序员的谏言:在你的个人项目,

    编程中别卖弄,那是自作聪明

    编程中别卖弄,那是自作聪明!人人都有很高的欲望在编程中表现自己的聪明。你想卖弄一下,用你高超的技巧写出一段最奇巧的代码。它让你得到少有的成就感。...所以,下面有一些对年轻程序员的谏言:在你的个人项目,

    河南省封丘县一中2020学年高一语文上学期12月月考试题.doc

    3. 采诗制度:西周时期的采诗制度是言谏制度的一部分,通过收集民间诗歌,反映了社会下层的声音,对政治产生影响。 4. 献书制度:周代有“史献书”的传统,史官会将前代历史教训作为对君王的谏言,这种“史鉴”制度...

    河南殊丘县_高一语文上学期12月月考试题.doc

    3. **采诗制**:西周时期,存在采诗之制,是言谏制度的一部分,政府会收集民间诗歌,以此了解民情民意,也是对社会下层影响的体现。 4. **献书制度**:除了献诗,周代还有献书的制度,史官和士人通过献书来提供历史...

    《谏太宗十思疏》理解性默写.doc

    知识点3:游乐要有限度 《谏太宗十思疏》“十思”中告诫君王游乐要有限度的一句是:这体现了作者对君王的谏言,希望君王能够控制自己的欲望和情欲,不要沉迷于游乐和享乐中。 知识点4:慎始慎终 《谏太宗十思疏》...

    邹忌讽齐王纳谏 (5).ppt

    3. 君主的开明:齐威王能够听取不同声音,勇于改正错误,是国家兴盛的重要因素。 4. 政治清明的重要性:开放言路,鼓励批评和建议,有利于发现并解决国家治理中的问题。 5. 文化传统的影响:“忠言逆耳利于行”这一...

    乌桓 郭嘉 [【古文阅读】郭嘉谏曹操击乌桓①曹操将击乌] .docx

    小题3的翻译需要准确理解句意并用现代汉语表达出来,注意语境中的“设备”指的是防备,“重任”指的是重用,“轻任”则是指不重用,“为用”是指被任用。小题4是对郭嘉谏言内容的总结,分别对应了远征乌桓的战略优势...

    谏太宗十思疏2016PPT学习教案.pptx

    太宗能够接纳魏征的谏言,体现了开明君主的胸怀,也证明了谏言对于国家治理的重要性。 总的来说,《谏太宗十思疏》是一篇揭示君主治国之道的经典文献,它提倡的居安思危、以民为本的思想至今仍有其现实意义。这篇...

    初中语文 古诗文赏析《齐人谏靖郭君城薛》注释、翻译及赏析(通用).doc

    3. **忠诚与依赖**:门客的谏言体现了对靖郭君的忠诚,同时也指出靖郭君对齐国的依赖。 4. **权力平衡**:在古代封建社会,地方势力与中央的关系需要谨慎处理,过度扩张可能会引发中央的猜忌。 【简析】部分总结了...

    2020届高中语文 4.1.2《谏太宗十思疏》同步备课教案 苏教版必修3.doc

    3. **语言特点**:文章中使用了大量的对偶句和排比句,如“居安思危,戒奢以俭”,增强了论述的力度和文学美感。 4. **历史背景**:这篇文章是在“贞观之治”时期写的,当时唐朝国力强盛,但魏征预见到了潜在危机,...

    初中生优秀写人作文范文:唐太宗的失误.docx

    #### (3)干涉史官记录 - **背景**:古代史官负责记录帝王的言行举止,通常遵循“不虚美、不隐恶”的原则,以确保记录的真实性。历史上大多数帝王不会干预史官的工作。 - **唐太宗的行为**:唐太宗曾要求查看自己...

    高中历史之历史百科诸葛亮为什么不阻止刘备伐吴呢?素材

    3. 刘备的情感因素:刘备伐吴名义上是为关羽报仇,实际上是为了夺回荆州,但他的年龄和时间紧迫性使得此行动充满风险。 4. 诸葛亮的立场与角色:诸葛亮作为丞相,主要职责是执行政策而非谏言,他更注重长远的战略...

    建平中学语文谏太宗十思疏PPT学习教案.pptx

    疏作为一种分条陈述建议的文体,如本文就是魏征对治国理政提出十条思考的谏言。 这篇文章是在唐朝初期社会经济恢复、国力提升的背景下写的,当时唐太宗因一系列成功而逐渐变得骄奢。魏征作为著名的谏官,通过《谏...

    谏太宗十思疏pptPPT课件.pptx

    3. **“十思”内容**:魏征提出的“十思”是十条值得深思的情况,包括固本培元、重视道德仁义、居安思危、戒奢行俭等,旨在敦促太宗保持谦逊和警惕,以维护国家的长久稳定。 4. **唐太宗与魏征的关系**:唐太宗与...

    谏太宗十思疏教案.pptPPT学习教案.pptx

    3. **文体“疏”**:疏是一种古代中国奏议文体,臣子向君王提出意见或建议时所用,通常会分条陈述,便于阅读和理解。 4. **“贞观之治”**:唐太宗在位期间,唐朝进入了一个政治稳定、经济繁荣的时期,被称为“贞观...

Global site tag (gtag.js) - Google Analytics