游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7857|回复: 30

拆instemast的面向对象语言的语义的楼

[复制链接]

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-9-28 20:06:00 | 显示全部楼层 |阅读模式
这个楼(http://bbs.gameres.com/showthread.asp?threadid=116888&page=1)太高了,拆过来来说说:

首先,编程就是编程,语义上接近自然语言只是为提高可读性,和OO没有必然联系

其次,具体到设计问题,是world->Move(player, pos)还是player->MoveTo(pos),取决于你的或者是项目的design philosophy。粗略的分,有两大类:应用程序类和library类。对应用程序类,主要考虑的是程序的易实现度,更侧重实现,往往会选择前者,因为移动player时涉及世界的诸多数据结构的更新,自然在world里做更方便。对library类,因为目的是给外部使用,所以更在意提供简单易用的编程接口,所以通常选择后者。但这和OO仍然没有关系,即使纯C也有这样的选择,是MovePlayer(world, player, pos),还是Move(player, pos, world),还是将world作为全局变量只使用Move(player, pos)。

再者,语义问题经常只是函数起名的问题,OO只不过是让人有机会把MovePlayer(player, pos)的宾语放到主语的位置变成player->MoveTo(pos),而类结构设计本身是不需要考虑语义的,因为不管类结构如何,只要调整一下函数名总能让语义自然一些,如:player1->GiveItemTo(player2, item),player2->GetItemFrom(player1, item),itemSystem->TransferItem(player1, player2, item)。

最后,要表达语义也不是必须很??碌募咏榇剩?玫?PI参数不易超过4个也是为了能从语义上推断参数含义。
比如说:给他两个金币,give him two gold coins,Give(player, ITEM_GOLD, 2),……这个函数把2放后面没人理解不了吧?而且多数人都会很自然地把这个数量参数放后面,为什么?因为我们关注的不止是语义,还有重要性的顺序。所以我说,不需要考虑黏着语屈折语,其实编程语言和汉语一样是孤立语。 [em20]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-9-29 10:12:00 | 显示全部楼层

Re:拆instemast的面向对象语言的语义的楼

Give(player, ITEM_GOLD, 2)
不能写成:
Give(player, 2, ITEM_GOLD)
因此,这样的语言,不是孤立语,也不是黏着语,而是屈折语(通过词的顺序表达意思).

xml, html, ini, vb的命名参数,则具有黏着语的特性。

而C/C++中的这种语法:
unsigned int
int unsigned
才能说:具有孤立语特性。但这毕竟是少数简单情况。

孤立语是无论如何不能作为计算机语言的。孤立语可以作为人类语言,是因为可以从单词上判断意思:

晚饭吃什么?  晚饭:代体宾语
你吃什么? 你:主语

如果计算机语言也是这样,那就糟了:

aaa eat;
bbb eat;

分别表示什么意思?

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-9-29 15:04:00 | 显示全部楼层

Re:拆instemast的面向对象语言的语义的楼

黏着语的必然性:

中文:孤立语,论外了。

英语:屈折语,用顺序表示词义,但这只限于简单的SVO:

I drink water.

一旦句子成分复杂:

I go there here car

请问,只通过词的顺序,怎么确定这些词的语法功能???

所以出现了“介词”
i go there from here by car
看看,这就是黏着语的特性!

但是,英语烦人的是,既然我使用了 介词 ,就没有必要固守词序!比如:
i go by car there from here
这句话的意思一点儿也不含糊!


对于比较复杂的句子,使用介词等虚词表示意思,是必然的!
而既然使用了虚词,就没有必要限制词的顺序!
==> 黏着语的必然性和优越性

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
 楼主| 发表于 2008-9-29 16:23:00 | 显示全部楼层

Re:拆instemast的面向对象语言的语义的楼

同志,你说的这些和OO没有任何关系,和编程语言也没有关系,是你非想用日语的语法来写程序,你认为日语优越不算错,但你认为别的语言不好就是错了。

我说编程语言类似于孤立语是定义的时候顺序可变,你非得要使用的时候可变,非得用??碌酿ぷ庞锉泶锓绞健S斜匾?穑咳毡舅祷笆被共皇谴蠖喟粗鞅鑫降乃承颍?话凑?K承蛩档牟哦嗌佟S殖对读恕?

编程语言不是自然语言,程序设计是设计Contract,函数定义是Contract,没有介词、助词,就像数学表达式一样,你可以认为它是个语言,但它不是自然语言,他是数学语言,它需要的是简洁精确。

退一步说,即使你要接近自然语言编程,只要你在用英文写代码,你就得用英文的语法,除非你用的是日文编程语言,那才能合理地使用黏着语语法。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-10-2 08:42:00 | 显示全部楼层

Re:拆instemast的面向对象语言的语义的楼

if aaa then bbb 这里的 if 和 then 就是黏着成分,否则我们不知道 aaa , bbb 的意思。

dim Player as Player 这里的 dim 和 as 就是黏着成分,否则我们不知道 两个 Player 的意思。

比如c++中:

struct Player;
Player Player; // 错误
struct Player Player; // 正确

你试验过没有?

英语中怎么没有黏着语语法成分?
i go there from here by car
这里的 from , by 就是黏着成分,否则:
i go there here car --> 怎么看出来意思? --> 必须要黏着成分

因为通过单词的顺序所表达的东西有限,所以助词,介词等黏着语语法成分成为必然!

还有,黏着语的解析是非常简单的,黏着语的语法定义也是非常简单的,黏着语的学习也很简单,使用也灵活
----> 有助于我们快速制作一个自己的“小语言”以解决某些具体问题。
(为了做一个小语言而去采用复杂的英语式语法,开销是非常非常大的)

4

主题

220

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2008-10-6 11:29:00 | 显示全部楼层

Re: 拆instemast的面向对象语言的语义的楼

呵呵,instemast不赞成你的意见真多,我感兴趣的是你读了什么书,致使你如此走火入魔,关于哲学的我也读了不少,也没见我这样啊

4

主题

220

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2008-10-6 11:41:00 | 显示全部楼层

Re:拆instemast的面向对象语言的语义的楼

喜欢日语语法的都用日语,喜欢汉语的都用汉语.哦,需要合作沟通的时候,那又怎么半了. OO的语法形式走到今天,已经普遍被大多数OO程序员所接受,这就是约定俗成,我前面就说过,除非你不用OO.

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-10-8 16:13:00 | 显示全部楼层

Re:拆instemast的面向对象语言的语义的楼

我当然用 OO !!
而且,我包括2方面: 1) 对象,东西  2) 类,模块,实例

只不过不用 obj->method(aaa,bbb); 这样的语法写了。

为什么?----举个真实的例子:

windows XP 的桌面,有“对齐到网格”功能,于是, 排  列  图  标, 成了某人的习惯!
桌面乱了,总会花十几分钟,重新排列图标;
按装新软件了,又要重新分类,排列所有图标。。。
有一天此人对我说“我要改掉!”
----他建立了一个“图标”文件夹,所有图标全部扔进这里头。从此,他不再浪费时间去排列图标了。

我也要改,就是不再浪费时间去“排列图标”,真的很无聊,有那个时间和心情,不如搞策划
----考虑有什么类型的怪物,而不是class


用英语语法的代价是严重的:

1 语法解析器 ---- 简直要我的命
2 语法定义 ---- 定义一个小小的语法,也要花上一整天,然后还要反复调试
3 学习花费 ---- 简单的语法还好,如果像 F# .net 那样的语法,是在头疼

用汉语语法的代价:

必须分析每个单词的详细意思,才能推断出句子结构 ---- 目前没有人能写出来(精确的)

P.S.
我打算支持“助词前置”,比如:

sb I  vb go  to there  from here  by car.
sb I  vb go  from here  by car  to there.
sb I  vb go  by car  from here  to there.
... ... ... ...

这些句子,都是正确的.如你所见,语法定义和解析非常简单, 菜 鸟 都 会 !

4

主题

220

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2008-10-8 16:24:00 | 显示全部楼层

Re: 拆instemast的面向对象语言的语义的楼

那你呼吁所有的OO程序员都用你这个

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
 楼主| 发表于 2008-10-8 20:09:00 | 显示全部楼层

Re:拆instemast的面向对象语言的语义的楼

instemast,你执着的黏着语语法就是最大的错误,你认为它简单,可它对多数人来说是更复杂了,不信你调查一下多少人愿意用你的语法。

给你个句子让你翻译成黏着语法解析试试:
Let the one with more HP of current player's pets attack a nearby mob with least HP or the mob who attacks the player if the pet is not already attacking a mob who attacked the player.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 02:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表