- 浏览: 491499 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hypercube:
markin'
配置D语言编程环境 -
qiezi:
qiezi 写道yangyang_08 写道1 ...
我的编程语言学习经历 -
qiezi:
yangyang_08 写道1、现在如果做并发服务器,楼主选用 ...
我的编程语言学习经历 -
yangyang_08:
1、现在如果做并发服务器,楼主选用什么样的语言架构?2、lua ...
我的编程语言学习经历 -
dearplain:
我也是语言爱好者,不过我一直坚持使用c。
我的编程语言学习经历
这2个语言的比较怪怪的,我最近转换了一些twisted的源文件到D,发现有些东西直接抄过来还是不可行的。
一、参数
比如twisted的callLater:
实际调用大概是这样的:
执行时,它在3秒后调用func(arg1, arg2, arg3=5, arg4=6)。
把这种接口转到D语言,要面临2个问题:
1是参数打包,在D语言中需要用到变参函数,由于前面还传递了一个func参数,所以这个callLater可能被复杂化成一个模板方法。C#在处理这种问题时,把参数打包成object[],以Invoke为例,为了防止其它线程直接调用界面方法,一些操作需要用Invoke来把实际的调用切换到主线程,这和这里的callLater很相似,它把参数打包成object[]然后交给主线程。简单是疯了,我总觉得在静态语言里这种属于旁门左道,为什么不创建一个委托呢?
2是字典参数,这2个东西处理起来都比较烦燥。
所以我干脆把2个都抛弃,改成这样:
调用时只需要:
上面那个委托可以用lazy替代,所以改成这样:
调用:
看起来很简单,不过有误导性,代码不易读,如果D语言强制在调用时也加上lazy关键字可能会好点:
这个在邮件列表中已经有人提过了。
二、多返回值
这个在动态语言中应用比较普遍,D语言中也可以用tuple来解决,但总觉得不是静态语言最优雅的方式,所以还是把返回值写成一个确定的结构或类吧。
三、返回值类型
twisted很多地方返回值类型都不一样,可能返回一个Failure,也可能返回一个0或-1,还可能返回一个字符串,这在动态类型语言中是很普通的做法。不过我还是对这点很有意见,因为我发现它调用起来也很辛苦,调用一个方法,然后要判断一个返回值是否是个Failure,总之自己给自己找了很多麻烦。
D语言强制你只能返回一个类型,所以这是转换过程中比较费时间的,需要折衷考虑,有时需要把多种类型的返回值做成一个类,或者是使用out参数。
四、类的成员
twisted中经常使用getattr来判断一个成员是否定义过,以确定下一步的做法,这种方式没有可能也没有理由在D中继续生存下去。最可恨的是一个成员可能会有不同的类型,又要挨个判断。
所以我想转换源代码或许不是好办法,我又有点相信ACE了。。
-----------------------------------
为啥我写的东西总是虎头蛇尾呢?或许把第1调到第4的位置好点。。
仔细想了一下,或许它这种做法也是有道理的。因为委托可以调用当时执行栈上的所有可见对像,使用时不注意可能引起跨线程调用,把参数打包在一定程度上对这些资源作了限制。如果不把参数打包,就要使用泛型接口,这可能是不友好的,但不是不可以使用的,有时间再看看。
一、参数
比如twisted的callLater:
class IReactorTime(Interface): """Time methods that a Reactor should implement. """ def callLater(self, delay, callable, *args, **kw): """Call a function later. @type delay: C{float} @param delay: the number of seconds to wait. @param callable: the callable object to call later. @param args: the arguments to call it with. @param kw: the keyword arguments to call it with. @returns: An L{IDelayedCall} object that can be used to cancel the scheduled call, by calling its C{cancel()} method. It also may be rescheduled by calling its C{delay()} or C{reset()} methods. """
实际调用大概是这样的:
reactor.callLater(3, func, arg1, arg2, arg3=5, arg4=6)
执行时,它在3秒后调用func(arg1, arg2, arg3=5, arg4=6)。
把这种接口转到D语言,要面临2个问题:
1是参数打包,在D语言中需要用到变参函数,由于前面还传递了一个func参数,所以这个callLater可能被复杂化成一个模板方法。C#在处理这种问题时,把参数打包成object[],以Invoke为例,为了防止其它线程直接调用界面方法,一些操作需要用Invoke来把实际的调用切换到主线程,这和这里的callLater很相似,它把参数打包成object[]然后交给主线程。简单是疯了,我总觉得在静态语言里这种属于旁门左道,为什么不创建一个委托呢?
2是字典参数,这2个东西处理起来都比较烦燥。
所以我干脆把2个都抛弃,改成这样:
interface IReactorTime{ IDelayedCall callLater(float delay, void delegate() callable); }
调用时只需要:
reactor.callLater(3, delegate void(){func(1,2);});
上面那个委托可以用lazy替代,所以改成这样:
interface IReactorTime{ IDelayedCall callLater(float delay, lazy void callable); }
调用:
reactor.callLater(3, func(1,2));
看起来很简单,不过有误导性,代码不易读,如果D语言强制在调用时也加上lazy关键字可能会好点:
reactor.callLater(3, lazy func(1,2));
这个在邮件列表中已经有人提过了。
二、多返回值
这个在动态语言中应用比较普遍,D语言中也可以用tuple来解决,但总觉得不是静态语言最优雅的方式,所以还是把返回值写成一个确定的结构或类吧。
三、返回值类型
twisted很多地方返回值类型都不一样,可能返回一个Failure,也可能返回一个0或-1,还可能返回一个字符串,这在动态类型语言中是很普通的做法。不过我还是对这点很有意见,因为我发现它调用起来也很辛苦,调用一个方法,然后要判断一个返回值是否是个Failure,总之自己给自己找了很多麻烦。
D语言强制你只能返回一个类型,所以这是转换过程中比较费时间的,需要折衷考虑,有时需要把多种类型的返回值做成一个类,或者是使用out参数。
四、类的成员
twisted中经常使用getattr来判断一个成员是否定义过,以确定下一步的做法,这种方式没有可能也没有理由在D中继续生存下去。最可恨的是一个成员可能会有不同的类型,又要挨个判断。
所以我想转换源代码或许不是好办法,我又有点相信ACE了。。
-----------------------------------
为啥我写的东西总是虎头蛇尾呢?或许把第1调到第4的位置好点。。
评论
7 楼
qiezi
2007-01-16
前面在D里面使用栈上构造的函数有些问题,离开当前栈以后再调用可能会失效,这是比较头痛的,不知道是BUG还是Feature?
如果是Feature,我的callLater看来要重新设计了。。。
如果是Feature,我的callLater看来要重新设计了。。。
6 楼
qiezi
2007-01-10
前段时间把twisted源文件转成D代码,发现代码量反而少了许多,当时想可能只是部分代码这样。只到转了很多以后发现,D代码真的会少很多,这样转下去违背了我当初转换源代码的本意了,所以想从头写一个。
经过了2天加起来3小时左右,实现了一个简单的版本,但却改了几次。起先是Reactor/Protocol,简单的架构,但扩展却不容易。然后改成Reactor/Acceptor/Protocol,融合ACE和twisted,不过少了点transport封装,timer已经可以工作了。后来还是觉得Acceptor不如twisted的Factory灵活,又改成Reactor/Factory/Protocol/Transport,还没有改完,基本上已经确定往twisted方向走了。
ACE虽然高效,但对于Protocol没有抽象出来,底层框架也比较简陋,要开发一个简单的程序也要写不少代码。另外ACE使用“通知”来处理一些事件,使用起来也并不是很方便,我曾经为了写一个“断线自动重连”的连接器,花了一整天时间,甚至要去阅读源码。而twisted使用起来则简单很多,我当初并不知道它已经实现了一个自动重连的Factory(也可能当时的确还没实现出来),但仅1个小时就写出一个来。当时的情况,ACE的代码我已经阅读过几次,而twisted的源码我很少去看。这本身虽然和语言有比较大的关系,但我觉得twisted的架构实现得更好一些。
另外这2天也看了一下epoll,我没有惊叹于它的设计精巧或是高效,而是奇怪为什么select没有这样的眼光?它的“创新”之处在于给描述符绑定了一个用户数据,仅仅一个指针,甚至不能说是创新,但却这么有用。另一点创新是由epoll来管理这些描述符,而不是用户,可以避免一些拷贝开销,虽然它内部也有可能做了类似的工作。
经过了2天加起来3小时左右,实现了一个简单的版本,但却改了几次。起先是Reactor/Protocol,简单的架构,但扩展却不容易。然后改成Reactor/Acceptor/Protocol,融合ACE和twisted,不过少了点transport封装,timer已经可以工作了。后来还是觉得Acceptor不如twisted的Factory灵活,又改成Reactor/Factory/Protocol/Transport,还没有改完,基本上已经确定往twisted方向走了。
ACE虽然高效,但对于Protocol没有抽象出来,底层框架也比较简陋,要开发一个简单的程序也要写不少代码。另外ACE使用“通知”来处理一些事件,使用起来也并不是很方便,我曾经为了写一个“断线自动重连”的连接器,花了一整天时间,甚至要去阅读源码。而twisted使用起来则简单很多,我当初并不知道它已经实现了一个自动重连的Factory(也可能当时的确还没实现出来),但仅1个小时就写出一个来。当时的情况,ACE的代码我已经阅读过几次,而twisted的源码我很少去看。这本身虽然和语言有比较大的关系,但我觉得twisted的架构实现得更好一些。
另外这2天也看了一下epoll,我没有惊叹于它的设计精巧或是高效,而是奇怪为什么select没有这样的眼光?它的“创新”之处在于给描述符绑定了一个用户数据,仅仅一个指针,甚至不能说是创新,但却这么有用。另一点创新是由epoll来管理这些描述符,而不是用户,可以避免一些拷贝开销,虽然它内部也有可能做了类似的工作。
5 楼
qiezi
2007-01-10
引用
C#在处理这种问题时,把参数打包成object[],以Invoke为例,为了防止其它线程直接调用界面方法,一些操作需要用Invoke来把实际的调用切换到主线程,这和这里的callLater很相似,它把参数打包成object[]然后交给主线程。简单是疯了,我总觉得在静态语言里这种属于旁门左道,为什么不创建一个委托呢?
仔细想了一下,或许它这种做法也是有道理的。因为委托可以调用当时执行栈上的所有可见对像,使用时不注意可能引起跨线程调用,把参数打包在一定程度上对这些资源作了限制。如果不把参数打包,就要使用泛型接口,这可能是不友好的,但不是不可以使用的,有时间再看看。
4 楼
qiezi
2007-01-10
ACE 网站:
http://www.cs.wustl.edu/~schmidt/ACE.html
除了网络接口外,它对于操作系统相关的API也作了些封装,方便做跨平台的软件。Photoshop里面好像是使用了ACE,当然是大材小用了。金山有一款软件也用了。但都是在客户端,它的长项是服务端。
http://www.cs.wustl.edu/~schmidt/ACE.html
除了网络接口外,它对于操作系统相关的API也作了些封装,方便做跨平台的软件。Photoshop里面好像是使用了ACE,当然是大材小用了。金山有一款软件也用了。但都是在客户端,它的长项是服务端。
3 楼
qiezi
2007-01-10
ACE是一个C++的网络库,支持多种架构,比如reactor, proactor,支持多种接口,比如select, poll, epoll, IOCP等。代码有些老,主要是时间太长了,而且要支持多种平台和编译器。
2 楼
cookoo
2007-01-10
ACE指啥啊?
1 楼
qiezi
2007-01-07
D 1.0里面这个竟然失效了:
上面我标记的这一行,编译错误:
Error: cannot implicitly convert expression ((callable)()) of type void to void delegate()
它当成是执行了。
class Timer{ private void delegate() callable_; public this(long time, lazy void callable){ callable_ = callable; // BREAK LINE } } new Timer(getUTCtime() + 100, writefln("on timer"));
上面我标记的这一行,编译错误:
Error: cannot implicitly convert expression ((callable)()) of type void to void delegate()
它当成是执行了。
发表评论
-
D语言模板和编译期执行
2012-07-29 00:15 0D语言模板继承了C++模板的基本用法,在其上做了相当多扩充,近 ... -
Generator
2008-04-09 13:46 1974几种并发编程模型开销(从大到小): Process > ... -
lambda之路...
2007-11-09 22:57 2838DMD最近的版本号加入了闭包,感觉非常有用,虽然有些背后动作, ... -
像Erlang一样写D程序
2007-09-15 10:23 6696琢磨了好久,一直没时间来做它。在讨论这个问题的时候就已经有这想 ... -
[D语言] qsort的尴尬
2007-05-06 21:31 5039phobos里面在stc.c.stdlib里提供了qsort, ... -
强类型数值计算
2007-04-10 21:45 4669以前曾经讨论过使用typedef来完成强类型的数值计算,最终遇 ... -
简单的单元测试框架
2007-04-10 21:20 3114做了个简单的单元测试框架,只算个毛坯,遇到一些问题。 1、由 ... -
仿STL的vector,写了一组array操作方法。
2007-04-05 23:55 11941文档从MSDN抄过来的,稍稍改了一下。 module ar ... -
编译期执行的效率
2007-03-15 15:58 4180写了一个编译期执行的fibonacci模板: templ ... -
D语言编译期生成和编译期执行技术
2007-02-24 14:35 4092借助D语言新的mixin表达式,可以完成一些代码生成功能,比如 ... -
如何获得一个方法的名字?
2007-01-15 19:24 3455在D语言中,一个方法你可以得到它的指针(函数指针或委托),但不 ... -
D语言的函数编程
2007-01-07 11:17 3816前阵子论坛上有人问我D语言做函数编程怎样,老实说我没怎么想过这 ... -
从简单测试看D数组内存分配策略
2007-01-07 09:43 3196D语言动态数组可以在运行期改变大小,这和C++的vector相 ... -
DMD 0.178发布
2006-12-24 15:32 4559What's New for D 0.178 ... -
GDC 0.20发布
2006-12-17 14:35 2759引用 * Updated to DMD 0.177 * Fix ... -
DMD 0.177发布
2006-12-09 18:47 2240没什么亮点,BUG修复得也不多,BUG数量始终保持在250-2 ... -
DMD 0.176发布
2006-12-03 14:22 3027引用 What's New for D 0.176 Dec ... -
D语言的成员函数模板
2006-12-02 20:29 3039DMD 0.166 特性列表中有一条: * ncorp ... -
D语言 在栈上分配对象 以及 无需GC拖管对象
2006-11-28 13:18 2763一、栈上分配对象 C++可以轻易实现在栈上和堆上分配对象,例 ... -
打算把twisted移植到D语言上
2006-11-26 20:14 4173twisted是一个优秀的python网络开发库,以前用它做过 ...
相关推荐
第Ⅱ部分 Python语言和标准库 第4章 做出决策 49 4.1 比较两个值是否相等 49 4.2 比较两个值是否不相等 51 4.3 比较两个值的大小 51 4.4 对真值和假值取反 53 4.5 观察多个比较运算的结果 54 4.6 循环 57 4.6.1 重复...
基于Python语音,使用Jupyter notebook开发的简单图像识别算法。算法通过将图像进行缩放,并进行灰度处理。然后计算待比较的两个图片之间的汉明距离,通过汉明距离来判断图片之间的相似性,并按照概率给出相似值,...
结果和讨论表多网格循环求解基准D基准Python基准基准比较概括 动机Python是一种众所周知且经常使用的编程语言。 其基于C的程序包NumPy允许对各种问题进行有效的计算。 尽管Python很流行并且经常使用,但是值得一看...
飞机大战小游戏源码,使用的是python语言, 该项目实现了飞机大战游戏的基本功能,玩家可以通过w、a、s、d键控制飞机移动,通过k键发射子弹。同时该项目实现了游戏时的暂停和继续功能以及排行榜功能,记录历史最好...
当前,在传递新值时,Python和Nim本机库之间的速度差异(如果有的话)可以忽略不计。 实验可能会继续。 nim_sub()函数是字符串替换的基本实现,类似于Python为其string.format()接受字典的方式。 安装 pip install...
matlab基于log算子代码 MLC(机器学习控制) 目录 3.1 3.2 3.3 4.1 4.2 抽象的 MLC是一个旨在解决与流体力学领域相关的混沌问题的框架。...最后一个版本正在移植到Python,因此实际的实现是这两种语言的混合体。 支
这个项目适合所有对几种编程语言的性能差异感兴趣的人。 它还可以用于比较多种语言的语法。 作为奖励,还包括一些函数式逻辑编程语言。 目前基准支持: C C++ 目标-C C# D 帕斯卡 Java Scala 路亚 JavaScript 动作...
【2001-2022】企业经济政策不确定性感知数据 ...司i在年份t的年报中MD&A句子数量为S_{it},使用编程语言Python调用 jieba分词模块对每个句子进行分词,并在分词的同时剔除停用词。为尽量降低分词带 来的歧义,我们在
++和Python等编程语言一起使用。 借助CUDA,您可以在科学,医疗保健和深度学习领域中将GPU的并行计算能力用于一系列高性能计算应用程序。 本书涵盖以下激动人心的功能: 了解CUDA中的常规GPU操作和编程模式 揭示GPU...
我们使用自然语言处理(NLP)分析新闻文章中的丰富信息,并量化引用的男女比例的差异。 通过该项目,我们更大的目标是通过有力的证据来提高对女性在公共话语中的刻画的认识,并鼓励新闻机构在其报道中提供更多不同...
1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统...
1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统...
1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统...
1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线...
1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天...
1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统...
目录 前言 1. 一般信息 1.1. 关于本手册 ...1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 ...
MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC...
The VAPI-XP testing tool enables you to create new testing scripts using Microsoft VBScript, Microsoft JavaScript (JScript version), PerlScript, and PythonScript, and integrate these scripts into your...