免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: SQ_Linux
打印 上一主题 下一主题

嵌入式死循环为什么基本都是用while(1){} [复制链接]

论坛徽章:
0
31 [报告]
发表于 2012-06-04 11:18 |只看该作者
本帖最后由 wwwsq 于 2012-06-04 11:18 编辑
cobras 发表于 2012-06-04 11:15
我说的效果是指编译结果的执行效果。包括执行效率和正确性。



for (;; )和while(1) 都是正确的,而且执行效率应该是一样的。

有些文章建议写前者。那是因为有些sb编译器,会对后面的while(1)报一个warning。

不过我的建议是不要用那种sb编译器,而不是为了sb编译器而把自己变成sb。


论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
32 [报告]
发表于 2012-06-04 11:26 |只看该作者
回复 26# wwwsq


    语义其实就是,后者是前者的一个特殊形式,特殊到他有个特殊的解释,这个解释就是语义,它是被明确提出了的,意味着编译器明确知道你的意图。

当然就现代编译器来说,你写while (1)还不知道你的意图的肯定是sb编译器。

不过事实上也的确存在你写很奇葩的代码而编译器并不知道你的意图的……

论坛徽章:
0
33 [报告]
发表于 2012-06-04 11:50 |只看该作者
本帖最后由 sonicling 于 2012-06-04 11:51 编辑

我正在写编译器,看我是如何处理的吧:

@234: // iteration-statement => while '(' condition ')' statement
tree block(iterate(%1, %2, null), %0)

@239: // iteration-statement => for '(' for-init-statement ';' ')' statement
tree block(list(%1, iterate(literal("1", "int" ) , %2, null)) , %0)


这是对应语法的语法树脚本,用“树节点名(子节点列表...)”的形式表示。其中block、list和iterate的使用方法是:
block(语句列表,scope名)
list(任意元素列表...)
iterate(前置条件,循环体语句,后置条件)

null是空节点,list(null, node)、list(list(node))... 等效于 node,所以list(null) 等效于 null。

while(1) { 。。。} 的语法树是 block(iterate(literal("1", "int" ) , 。。。, null), "while" )
for( ; ; ){。。。}的语法树是 block(list(null, iterate(literal("1", "int" ) , 。。。, null)), "for" )

从等效性上来看,他们有区别吗?这都还没到优化节点。

(去掉可恶的笑脸,编辑一下)

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
34 [报告]
发表于 2012-06-04 12:50 |只看该作者
回复 34# sonicling


    这基本上就是我说的意思了……

PS:回复的主要目的是好奇:写编译器怎么不用LLVM呀?利器呀

论坛徽章:
0
35 [报告]
发表于 2012-06-04 12:55 |只看该作者
我只是写了个半自动前端,把C编译为控制流图。LLVM和GCC都是全手写的前端。我这算是一点点小尝试。

论坛徽章:
0
36 [报告]
发表于 2012-06-04 19:50 |只看该作者
CSAPP上说GCC会吧所有的循环都翻译成do while循环。

论坛徽章:
0
37 [报告]
发表于 2012-06-05 00:24 |只看该作者
在此非常感谢大家跟帖,也感谢大家给出的理解,

论坛徽章:
0
38 [报告]
发表于 2012-06-05 17:23 |只看该作者
可以少打几个字符
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP