- 浏览: 497300 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 2006几种并发编程模型开销(从大到小): Process > ... -
lambda之路...
2007-11-09 22:57 2862DMD最近的版本号加入了闭包,感觉非常有用,虽然有些背后动作, ... -
像Erlang一样写D程序
2007-09-15 10:23 6731琢磨了好久,一直没时间来做它。在讨论这个问题的时候就已经有这想 ... -
[D语言] qsort的尴尬
2007-05-06 21:31 5076phobos里面在stc.c.stdlib里提供了qsort, ... -
强类型数值计算
2007-04-10 21:45 4719以前曾经讨论过使用typedef来完成强类型的数值计算,最终遇 ... -
简单的单元测试框架
2007-04-10 21:20 3146做了个简单的单元测试框架,只算个毛坯,遇到一些问题。 1、由 ... -
仿STL的vector,写了一组array操作方法。
2007-04-05 23:55 12023文档从MSDN抄过来的,稍稍改了一下。 module ar ... -
编译期执行的效率
2007-03-15 15:58 4221写了一个编译期执行的fibonacci模板: templ ... -
D语言编译期生成和编译期执行技术
2007-02-24 14:35 4119借助D语言新的mixin表达式,可以完成一些代码生成功能,比如 ... -
如何获得一个方法的名字?
2007-01-15 19:24 3488在D语言中,一个方法你可以得到它的指针(函数指针或委托),但不 ... -
D语言的函数编程
2007-01-07 11:17 3854前阵子论坛上有人问我D语言做函数编程怎样,老实说我没怎么想过这 ... -
从简单测试看D数组内存分配策略
2007-01-07 09:43 3225D语言动态数组可以在运行期改变大小,这和C++的vector相 ... -
DMD 0.178发布
2006-12-24 15:32 4597What's New for D 0.178 ... -
GDC 0.20发布
2006-12-17 14:35 2795引用 * Updated to DMD 0.177 * Fix ... -
DMD 0.177发布
2006-12-09 18:47 2275没什么亮点,BUG修复得也不多,BUG数量始终保持在250-2 ... -
DMD 0.176发布
2006-12-03 14:22 3069引用 What's New for D 0.176 Dec ... -
D语言的成员函数模板
2006-12-02 20:29 3070DMD 0.166 特性列表中有一条: * ncorp ... -
D语言 在栈上分配对象 以及 无需GC拖管对象
2006-11-28 13:18 2806一、栈上分配对象 C++可以轻易实现在栈上和堆上分配对象,例 ... -
打算把twisted移植到D语言上
2006-11-26 20:14 4209twisted是一个优秀的python网络开发库,以前用它做过 ...
相关推荐
综上所述,《NCT青少年Python语言编程教程》是一本非常适合青少年学习Python编程的教材,不仅覆盖了考试所需的所有知识点,而且还注重培养学生的实际编程能力和解决问题的能力。通过这本书的学习,学生不仅能够顺利...
Python 2和Python 3是Python语言的两个主要版本,它们在语法和功能上存在一些差异。Python 3是Python语言的一次重大升级,引入了大量改进,如更友好的打印函数、统一的字符串编码模型以及新的异常处理方式等。而...
这本书以其简洁易懂的风格,深入浅出地介绍了Python语言的基础知识和核心概念,适合对编程感兴趣,尤其是对Python编程感兴趣的读者。 在Python 2和Python 3两个主要版本中,有一些显著的区别。Python 3是Python语言...
标签“python 开发语言 Python库”表明这是与Python编程语言相关的开发资源,特别是作为Python的一个库,可以用于开发项目中。 现在我们来深入探讨一下`rapidjson`库: RapidJSON是一个开源项目,它的目标是提供...
在Python语言特性方面,考题还检验了考生对Python语法规则的认识,比如首行缩进的重要性,这是Python代码结构的基础,选项D错误地表示无需关注缩进。同时,Python的跨平台性、内置对象和函数的使用,以及交互式和...
为了更好地理解 Python 语言,首先需要了解计算机的基本组成部分,包括运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们常说的中央处理器(CPU),它的功能是执行各种运算和控制...
### Python语言特性详解 #### 1. Python的函数参数传递 在Python中,函数参数的传递遵循一种称为“传引用的值”的模型。这意味着当我们将一个变量作为参数传递给函数时,实际上传递的是该变量所指向对象的一个引用...
15.12 游戏开发,虽然Python不是专门的游戏开发语言,但Pygame库允许开发者使用Python编写2D游戏。 15.13 其他第三方库包括数据库接口(如SQLite3、psycopg2)、网络编程(如requests、socket)、测试工具(如...
2. **Python**: 一种高级编程语言,以其简洁的语法和强大的库支持闻名,适用于快速开发和系统集成。 3. **海康威视SDK**: 海康威视提供的软件开发工具包,包含必要的库和API,允许开发者编写程序来控制和管理...
Python是一种高级编程语言,以其简洁明了的语法和强大的功能而受到广泛的欢迎。这份文档是作者自学Python基础知识时的笔记,特别适合初学者了解Python的基本概念、版本差异以及编写代码的一些基本规则。 首先,...
【Python小游戏】是一种利用Python编程语言以及其游戏开发库Pygame构建的小型应用程序。Python以其简洁易懂的语法和丰富的库支持,成为了初学者和专业开发者制作游戏的热门选择。Pygame是Python的一个模块集合,提供...
- **版本差异**:理解Python 2和Python 3之间的区别,目前Python 2已经不再支持,推荐使用Python 3。 - **编码规范**:遵循PEP 8编码规范,编写可读性强且易于维护的代码。 - **避免重复造轮子**:利用Python生态中...
需要注意的是,由于Java和Python是两种不同的语言,性能和内存管理方面可能存在差异,因此在调用Java代码时应考虑效率问题。 在提供的压缩包文件中,`test1`和`mython`可能是两个示例文件。`test1`可能是一个测试...
第Ⅱ部分 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编程基础,并介绍了Python 2.6和Python 3.1两个版本的主要特性和差异。书中内容涵盖了从基本概念到高级编程技巧的广泛主题,为读者提供了一个全面的Python学习资源。 在【标题】和...
Python作为一种易学且功能丰富的编程语言,常用于与数据库交互,进行数据处理和自动化任务。本主题将围绕使用Python编写的PostgreSQL数据库结构比对程序进行深入探讨。 标题中的“Python编写PostgreSQL数据库结构...
在Python编程语言中,PyEcharts是一个强大的可视化库,它提供了丰富的图表类型和高度自定义的选项,使得数据可视化变得更加简单。本主题聚焦于使用PyEcharts绘制三维图,并特别关注如何更改图中的颜色,以增强视觉...
Python库是开发者在进行软件开发时经常会用到的工具,它们提供了一系列预定义的功能和模块,可以帮助程序员快速实现特定任务,提高开发效率。"dam-sync-0.0.3.tar.gz" 是一个针对Python的库,名为“dam-sync”,版本...
- 除法函数(f = a / b):执行浮点除法,注意Python2与Python3在整数除法上有差异,需要确保在Python3环境下运行或使用`//`进行整数除法。 3. 程序开发注意事项: 编写程序时,应确保每个字符的准确性,避免语法...