免费注册 查看新帖 |

Chinaunix

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

命名难,难于上青天 [复制链接]

论坛徽章:
0
191 [报告]
发表于 2012-02-17 13:55 |只看该作者
回复 190# 三月廿七


    还有,我说你既然c搞得好好的,搞c++干什么?我觉得c一点也不比c++差啊

论坛徽章:
0
192 [报告]
发表于 2012-02-17 13:56 |只看该作者
本帖最后由 三月廿七 于 2012-02-17 13:59 编辑

回复 192# walleeee
c 确实不比 c++ 差,就是一群傻B乱用 c++ 写游戏,
搞的我也要同流合污,

论坛徽章:
0
193 [报告]
发表于 2012-02-17 13:57 |只看该作者
本帖最后由 walleeee 于 2012-02-17 13:58 编辑

回复 193# 三月廿七


    。。。这个确实是,很多游戏引擎和库都是c++搞的,而且各个硬件公司也提供c++ sdk。好吧,这个没办法

论坛徽章:
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
194 [报告]
发表于 2012-02-17 16:02 |只看该作者
OwnWaterloo 发表于 2012-02-17 00:48
这只是lua这样实现。
你再多找几个语言跳过tree,不是text->tree->bytecode/native code的看看?
lisp不 ...


你得承认那些效率其实都没有lua高(当然必须的,肯定不是因为这方面的原因)

Python比lua慢吧,不过它暴露了ast的
ruby更别说了,sb日本人,根本就没有bc,直接执行语法树的- -我无语了。

关于“虚假”么,你就当是一个找到信仰的人嫉妒比自己信仰更好的东西好了。

其实我也纠结lisp啊,我肯定知道lisp好要不然我跟你纠结这么多干嘛= =

虚假我的真正含义是,比如说吧,C++里面的多态,那个行为是一致的,而不同只是不同子类的实现,而“虚函数派发”这种事儿就是固定的一致的。而lisp呢,它看上去是一致的,但是实际上连类似”虚函数派发“这种事情都不是一致的。有的直接执行cons(tiny-scheme),有的翻译bc(racket),有的两者都有(emacs-lisp),所以………………

当然你可以说这是实现问题。但是你难道不觉得这根本就是把事情丢给了实现,才造成各种实现都有的尴尬境地么。

对于运行时不能改变bc,你告诉过我有些lisp是有的。

好吧,反正,这方面并不是重点。我的想法的确是有些问题。

我们讨论重点,延续之前关于“lisp连+都可以覆盖”的问题。

我的核心观点是“lisp把本该不该混在一块的东西(结构、运算符、函数调用)混在了一起”。

那么先讨论“本该”,这显然是我自己的臆想。是不是本该。你的观点是“lisp是第一个,而且如果你先学习lisp,这些就不是本该的”,是吧,这个实在是不好说。但是你得知道在计算机的世界里本来就是有所谓一等和二等公民存在的。有些函数是可以直接变成机器码的,比如+,有些可能得做成一个函数,push/eval/pop神马的。而lisp这种自由化,注定了决定某些函数到底是机器码还是函数这样的操作被放到了运行时:因为编译时你根本就不知道那个+是不是就是真的可以变成机器码的+!

lisp是灵活,但是灵活有点过分了,我的目的只是想限制一下这种灵活的程度。让它和计算机模型匹配一下。当然这种想法本质上是在限制lisp,我的目的只是为了让事情看起来简单,让你看到+就知道,恩,这就是一行单纯的机器码。写C的时候你会有这种感觉的。问题是你写lisp你有“机器实际上在执行啥”的感觉么?如果是lua或者当脚本用,那无所谓,可是你的目的不是吧?如果当作C语言那样的语言用,“心里没有底”这种事情还能忍受么?

C的做法是,所有机器能直接提供的功能,我都固化掉,if语句,while语句,+-*/而且不准重载。那么你就能清晰能明白你写的代码到底是直接就是机器码还是可能会变成一个函数调用——注意函数调用本身也是机器提供的基础功能!我的意思是,C更像是个汇编,它和机器是一对一的,而lisp不是。

如果要妥协,那么lisp就必须想办法实现这种一对一的关系——是机器的,就明确表明,不是,也得明确表明。说白了,这就是我所谓的一致性(我们说的完全是两个方面)。

一方面,lisp灵活,但是这种灵活超出了大多数使用的需要:我想没有哪个人会蛋疼到去换+的实现吧?然后lisp允许你这么做,如同脚本语言允许你写True=False,这种灵活性就是不必要的,我想从lisp里面剔除这种灵活性。

其次,lisp里面所有的东西都是form,但是form和form是不同的,有些form一行机器码就能搞定,但有些得做成函数,lisp的语义决定了你没法区分这两种,于是干脆全部做成函数——这也是我说的“lisp的逻辑抽象就一个,CALL”的原因。

那么我想要的东西是:
- lisp式的灵活,但有限制,限制的原因是为了和机器一一对应,“做事心里有底”
- 在这个基础上,尽可能的灵活,要带编译器就带吧,在这种灵活程度下编译器是会很小的(像lua,语法几乎和字节码一一对应)
- 在上述两点的基础上,概念尽量简单,只引入一种作用域神马的。意思就是,这才是一致性应该关注的点。

也就是说,一致性不是第一位的,第一位是要“你知道你在做啥,你能很容易知道你在做啥”,第二位是“如果你知道你能做啥,那么我不限制你想做啥做啥”,第三位才是一致性“如果你想做两件事实上是一样的事情,那么我提供的方式让你实际上就是在用一种形式做事”。

第三位就存在一个度的问题。第一位第二位都是对这个度进行限制(直观性,灵活性),但除了这两点其实还有另外一个限制:如何抽离实际上你做的事中不一样的部分?比如说,你要编译期计算,既然也是计算那就用运行期那一套东西呗,但是你也要有办法明确标注“这些就是编译期计算的,别拖到运行期去”,这样在一致性中,允许不一致的“外壳”出现,是有必要的。

反正用lisp觉得心虚:小的实现觉得效率低,效率高的实现体积大。而且lisp追求自给自足,却没有自给自足的能力(毕竟是个类脚本的东西——要成为不类脚本的就得限制,上面提到了),所以很纠结。

lua的优势是定位明确:我tmd就是脚本,别对我期望太高,我把身为脚本做到的事情做好,把用C能做到的事情让它足够简单。剩下的事情别找我!





论坛徽章:
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
195 [报告]
发表于 2012-02-17 16:11 |只看该作者
回复 186# OwnWaterloo


    我建议你别投奔lua,lua在不支持宏的前提下还是不如lisp的(支持宏了就是lisp方言了是不- -),而且说实话,lua就是一干活儿方便的东西。没lisp那么多的“特性”。特简单,源代码就1W9,看完了你就觉得超神了,根本没法跟人炫耀

论坛徽章:
0
196 [报告]
发表于 2012-02-17 18:01 |只看该作者
OwnWaterloo 发表于 2012-02-16 20:08
回复 160# 幻の上帝

喂,既然来了,也帮忙看看std:: list:: size的问题嘛……

这里的should和shall确实有区别。
(下面一堆表格格式无力……= =左边是Verbal form右边是Equivalent expressions for use in exceptional cases,左边的内容我加粗吧……)
ISO/IEC Directives, Part 3
Rules for the structure and drafting of International Standards
Annex E
(normative)
Verbal forms for the expression of provisions
NOTE Only singular forms are shown.
The verbal forms shown in Table E.1 shall be used to indicate requirements strictly to be followed in order
to conform to the standard and from which no deviation is permitted.
Table E.1 — Requirement
Verbal form Equivalent expressions for use in exceptional cases
(see 6.6.1.3)
shall
is to
is required to
it is required that
has to
only … is permitted
it is necessary
shall not
is not allowed [permitted] [acceptable] [permissible]
is required to be not
is required that … be not
is not to be
Do not use “must” as an alternative for “shall”. (This will avoid any confusion between the requirements of a standard and external statutory obligations.)
Do not use “may not” instead of “shall not” to express a prohibition. To express a direct instruction, for example referring to steps to be taken in a test method, use the imperative mood in English.
EXAMPLE “Switch on the recorder.”
The verbal forms shown in Table E.2 shall be used to indicate that among several possibilities one is recommended as particularly suitable, without mentioning or excluding others, or that a certain course of action is preferred but not necessarily required, or that (in the negative form) a certain possibility or course of action is deprecated but not prohibited.
Table E.2 — Recommendation
Verbal form Equivalent expressions for use in exceptional cases
(see 6.6.1.3)
should
it is recommended that
ought to
should not
it is not recommended that
ought not to
In French, do not use “devrait” in this context.
The verbal forms shown in Table E.3 are used to indicate a course of action permissible within the limits of
the standard.
Table E.3 — Permission
Verbal form Equivalent expressions for use in exceptional cases
(see 6.6.1.3)
may
is permitted
is allowed
is permissible
need not
it is not required that
no … is required
Do not use “possible” or “impossible” in this context.
Do not use “can” instead of “may” in this context.
NOTE 1 “May” signifies permission expressed by the standard, whereas “can” refers to
the ability of a user of the standard or to a possibility open to him.
NOTE 2 The French verb “pouvoir” can indicate both permission and possibility. For
clarity, the use of other expressions is advisable if otherwise there is a risk of
misunderstanding.
The verbal forms shown in Table E.4 are used for statements of possibility and capability, whether
material, physical or causal.
Table E.4 — Possibility and capability
Verbal form Equivalent expressions for use in exceptional cases
(see 6.6.1.3)
can
be able to
there is a possibility of
it is possible to
cannot
be unable to
there is no possibility of
it is not possible to
NOTE See note 1 to Table E.3.

论坛徽章:
0
197 [报告]
发表于 2012-02-17 18:08 |只看该作者
回复 176# OwnWaterloo

立场啥的……好吧,我是类C语言黑……包括C++。
只是,C++年代以后的语言能黑的地方实在太显眼了,比起C++来实在没战斗力啊……我是支持C++战翻Java之流几条街的。(现实不可能是另一回事。)
赞扬lisp。
我说的词法上的解决当然最好能不损害像lisp的notation具有的能力了……不过想不太出来= =

论坛徽章:
0
198 [报告]
发表于 2012-02-17 18:14 |只看该作者
回复 195# starwing83


   
lua的优势是定位明确:我tmd就是脚本,别对我期望太高,我把身为脚本做到的事情做好,把用C能做到的事情让它足够简单。剩下的事情别找我!


这是一个kiss。

论坛徽章:
0
199 [报告]
发表于 2012-02-17 18:19 |只看该作者
回复 191# walleeee
大概都是说overloading resolution吧。
……说实话,平时用起来感觉不复杂,但考虑各种转换和name lookup以后你可能就不会这么想了。ISO C++ 13.3读起来各种郁闷……
而你说的关于name mangling什么的是实现上的问题了,如果要考虑杯具的ABI兼容性,也是挺纠结的。

论坛徽章:
0
200 [报告]
发表于 2012-02-17 18:31 |只看该作者
starwing83 发表于 2012-02-17 16:02
你得承认那些效率其实都没有lua高(当然必须的,肯定不是因为这方面的原因)

Python比lua慢吧,不过 ...

几个问题。
这里的限制一定和灵活矛盾吗?
只说语言不说实现,能提供检查+不被重写的功能么?一定会导致“注定了决定某些函数到底是机器码还是函数这样的操作被放到了运行时”吗?(“运行时”说白了也不是相对而言的嘛。)这里的责任应该落实到语言还是语言的实现?
“如果当作C语言那样的语言用”——这个应该是语言设计的目的吗?
话说自然语言是怎么摆平这个的……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP