设为首页收藏本站

八达网

 找回密码
 注册
查看: 741|回复: 17
打印 上一主题 下一主题

本屌丝来装个码农比 求各位fackbook ibm microsoft apple 华为 中兴大牛指教

[复制链接]

452

主题

0

好友

2592

积分

坦克

跳转到指定楼层
1
发表于 2013-7-8 13:01 |只看该作者 |倒序浏览
本帖最后由 rolin 于 2013-7-8 13:08 编辑

一提到ub问题 大多数貌似都具体到c/c++语言
为什么呢 按理说一个序列点上多次修改变量 每种语言都会有这种情况啊
具体到编译器优化,我发现只有m记的vc独树一帜
对于这段代码
int a = 1;
int b = a++ + a++

vc结果是2
gcc结果是3

我另外用了chrome v8测试js代码 结果是3
adobe的actionscript3.0 结果是3
python lua没有自增运算符
c# 结果是3

反汇编发现  
vc是在statement结束后才对变量自增/自减操作
g++是在一个factor结束后马上操作

为什么vc编译器要搞的跟大家不一样?
是因为这些稍微现代的如c#,java都用了同一个前端吗

个人认为vc是牺牲了编译时间来优化程序速度
g++则更便于理解

而对于js这样的无类型脚本语言,没办法把程序解析成仅仅操作char/number类型的字节码,所以vc这样的优化就没办法实现了,如果在eos之后再push ref , push key, ++/-- 这样不是优化,是反过来了

当然这一切都是我的臆想  这方面的资料根本查不到
求指教
1

查看全部评分

57

主题

0

好友

2万

积分

大和

2
发表于 2013-7-8 13:16 |只看该作者
吊丝从不写这样的句子    ++ -- 这样的   一句话里面只用一次

  用着放心   写着舒心
我已经看见   一出悲剧正上演
回复

使用道具 举报

10

主题

0

好友

2万

积分

大和

3
发表于 2013-7-8 13:32 |只看该作者
这种问题完全就是蛋疼
国建身价大于5毛
回复

使用道具 举报

146

主题

0

好友

1万

积分

航母

4
发表于 2013-7-8 13:40 |只看该作者
傻逼才写这种代码
回复

使用道具 举报

780

主题

0

好友

13万

积分

主区版主

Rank: 8Rank: 8Rank: 8Rank: 8

5
发表于 2013-7-8 18:17 |只看该作者
原创内容 水晶 +2
回复

使用道具 举报

4

主题

0

好友

2万

积分

大和

6
发表于 2013-7-8 18:52 |只看该作者
上学时用VC比较多,LZ说的问题也碰到过,区别就是表达式的左解释和右解释,还有VC函数参数的解释顺序和gcc也不同。
当时的感觉微软的很多东西设计的很别扭,故弄玄虚,简单问题复杂化,比如命令名,函数名,接口。
个人感觉是,那些OS,编译方面的基础技术,Unix,Borland已经给出了最合理设计,而微软跳不出这些技术思路,却又想显得不同,只好。。。
回复

使用道具 举报

4

主题

0

好友

1万

积分

航母

7
发表于 2013-7-8 19:52 |只看该作者
这种代码都写得出来
回复

使用道具 举报

1

主题

0

好友

7614

积分

大象

8
发表于 2013-7-8 20:53 |只看该作者
切克闹 发表于 2013-7-8 13:40
傻逼才写这种代码

+1, 的确很2B的代码
有时候错的选择造就了对的结果,有些人一直以为自己是对的,但命运最终都会一次次的告诉她是多么的失败
回复

使用道具 举报

424

主题

5

好友

3078

积分

飞龙

9
发表于 2013-7-8 23:17 |只看该作者
写这种代码会被人爆菊的
回复

使用道具 举报

3

主题

0

好友

8708

积分

大象

10
发表于 2013-7-8 23:51 |只看该作者
1 确定gcc是3?咋试出来vc不一样的?
2 别反汇编也别优化了,先搜索下左值右值和自增究竟咋回事吧。
3  fackbook ibm microsoft apple 华为 中兴 任何一家的编程规范都不会允许这么写,谁敢这么写抽谁。别研究了。

无标题.jpg (15.6 KB, 下载次数: 2)

gcc

gcc

无标题2.jpg (17.01 KB, 下载次数: 2)

vc

vc

J
回复

使用道具 举报

头像被屏蔽

0

主题

0

好友

375

积分

禁止发言

11
发表于 2013-7-9 09:57 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

452

主题

0

好友

2592

积分

坦克

12
发表于 2013-7-9 12:57 |只看该作者
GGiloveU 发表于 2013-7-8 23:51
1 确定gcc是3?咋试出来vc不一样的?
2 别反汇编也别优化了,先搜索下左值右值和自增究竟咋回事吧。
3  f ...

还左值右值
谁给你勇气大放厥词的?
本文讨论的编译器实现,不是软件工程 你看懂了吗?
既然a++ + a++这样的代码只是ub警告能通过编译
那就有价值  你自己实现编译器就必须解析这种语法
懂?
2861316437
2836235853
回复

使用道具 举报

120

主题

19

好友

1万

积分

航母

13
发表于 2013-7-9 14:37 |只看该作者
c++只定义了规范标准,但是很多细节根据不同厂家不同编译器实现是不一样的。
这种问题真不值得花时间研究,除非是线上产品问题。
回复

使用道具 举报

23

主题

0

好友

4万

积分

大和

14
发表于 2013-7-9 14:42 |只看该作者
本帖最后由 Neutrino 于 2013-7-9 14:57 编辑

我写个编译器,这种情况一律解释成a="coder is da sha bi"
回复

使用道具 举报

190

主题

5

好友

4万

积分

管理员

小姐别发贴,是我

Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

战队
[B.D]=
种族
Protoss

2013年夜饭

15
发表于 2013-7-9 14:54 |只看该作者
这种问题有研究的必要性吗 ?
向还在为STL奋斗的玩家致敬!
回复

使用道具 举报

452

主题

0

好友

2592

积分

坦克

16
发表于 2013-7-9 15:02 |只看该作者
给各位大神跪了。。。
我要讨论的是编译实现啊
不是这种代码傻逼不傻逼啊
既然市面上的编译器能通过
那我也需要解析这样的语法
怎么都给看成了洪水猛兽

难道python lua就是因为这个原因取消了inc, dec运算符.....
2861316437
2836235853
回复

使用道具 举报

452

主题

0

好友

2592

积分

坦克

17
发表于 2013-7-9 15:12 |只看该作者
如下我现在的实现跟大多数语言一样
  1. var x [stack:0]
  2. var y [stack:1]
  3. ;var x = {};
  4. 0  New_Obj
  5. 1  Pop eax
  6. 2  Mov x [stack:0], eax
  7. ;x.name = 3;
  8. 3  Push x [stack:0]
  9. 4  Push "name"
  10. 5  Push 3
  11. 6  Set_Field
  12. ;var y = x.name++ + x.name++;
  13. 7  Push x [stack:0]
  14. 8  Push "name"
  15. 9  Get_Field
  16. 10 Push 1
  17. 11 Add_Field 1
  18. 12 Push x [stack:0]
  19. 13 Push "name"
  20. 14 Get_Field
  21. 15 Push 1
  22. 16 Add_Field 1
  23. 17 Pop ebx
  24. 18 Pop eax
  25. 19 Add eax, ebx
  26. 20 Push eax
  27. 21 Pop eax
  28. 22 Mov y [stack:1], eax
  29. 23 Ret 0
复制代码
但是我觉得c编译器的遇到EOS之后再 add/sub 1的处理方式更好
才有了这么个帖子
2861316437
2836235853
回复

使用道具 举报

23

主题

0

好友

4万

积分

大和

18
发表于 2013-7-9 15:27 |只看该作者
如果是写编译器,就应该给个warning,告诉他是UB,然后随便给个随机值就行了。
让他程序崩溃几次,就老实了,以后也不会这么写
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

手机版|Archiver|八达网    

GMT+8, 2025-11-28 19:44

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部