`
qiezi
  • 浏览: 497784 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

D语言和python的差异

    博客分类:
  • D
阅读更多
这2个语言的比较怪怪的,我最近转换了一些twisted的源文件到D,发现有些东西直接抄过来还是不可行的。

一、参数

比如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看来要重新设计了。。。
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来管理这些描述符,而不是用户,可以避免一些拷贝开销,虽然它内部也有可能做了类似的工作。
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,当然是大材小用了。金山有一款软件也用了。但都是在客户端,它的长项是服务端。
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里面这个竟然失效了:
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()

它当成是执行了。

相关推荐

    NCT青少年Python语言编程教程-V0.02B.pdf

    综上所述,《NCT青少年Python语言编程教程》是一本非常适合青少年学习Python编程的教材,不仅覆盖了考试所需的所有知识点,而且还注重培养学生的实际编程能力和解决问题的能力。通过这本书的学习,学生不仅能够顺利...

    Python 2参考手册和Python3参考手册(chm)

    Python 2和Python 3是Python语言的两个主要版本,它们在语法和功能上存在一些差异。Python 3是Python语言的一次重大升级,引入了大量改进,如更友好的打印函数、统一的字符串编码模型以及新的异常处理方式等。而...

    A Byte of Python3和2两版中英文版本

    这本书以其简洁易懂的风格,深入浅出地介绍了Python语言的基础知识和核心概念,适合对编程感兴趣,尤其是对Python编程感兴趣的读者。 在Python 2和Python 3两个主要版本中,有一些显著的区别。Python 3是Python语言...

    Python库 | python_rapidjson-0.9.3-cp38-cp38-win_amd64.whl

    标签“python 开发语言 Python库”表明这是与Python编程语言相关的开发资源,特别是作为Python的一个库,可以用于开发项目中。 现在我们来深入探讨一下`rapidjson`库: RapidJSON是一个开源项目,它的目标是提供...

    2022年6月青少年软件编程(Python)等级考试一级答案版.docx

    在Python语言特性方面,考题还检验了考生对Python语法规则的认识,比如首行缩进的重要性,这是Python代码结构的基础,选项D错误地表示无需关注缩进。同时,Python的跨平台性、内置对象和函数的使用,以及交互式和...

    从零开始学Python:Python语言中的变量.docx

    为了更好地理解 Python 语言,首先需要了解计算机的基本组成部分,包括运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们常说的中央处理器(CPU),它的功能是执行各种运算和控制...

    Python Interview

    ### Python语言特性详解 #### 1. Python的函数参数传递 在Python中,函数参数的传递遵循一种称为“传引用的值”的模型。这意味着当我们将一个变量作为参数传递给函数时,实际上传递的是该变量所指向对象的一个引用...

    python-15 Python程序员的开发生态

    15.12 游戏开发,虽然Python不是专门的游戏开发语言,但Pygame库允许开发者使用Python编写2D游戏。 15.13 其他第三方库包括数据库接口(如SQLite3、psycopg2)、网络编程(如requests、socket)、测试工具(如...

    linux下使用python调用海康威视SDK包

    2. **Python**: 一种高级编程语言,以其简洁的语法和强大的库支持闻名,适用于快速开发和系统集成。 3. **海康威视SDK**: 海康威视提供的软件开发工具包,包含必要的库和API,允许开发者编写程序来控制和管理...

    python自学笔记.docx

    Python是一种高级编程语言,以其简洁明了的语法和强大的功能而受到广泛的欢迎。这份文档是作者自学Python基础知识时的笔记,特别适合初学者了解Python的基本概念、版本差异以及编写代码的一些基本规则。 首先,...

    Python小游戏(我自己写的)

    【Python小游戏】是一种利用Python编程语言以及其游戏开发库Pygame构建的小型应用程序。Python以其简洁易懂的语法和丰富的库支持,成为了初学者和专业开发者制作游戏的热门选择。Pygame是Python的一个模块集合,提供...

    Python语言教程&案例&相关项目资源

    - **版本差异**:理解Python 2和Python 3之间的区别,目前Python 2已经不再支持,推荐使用Python 3。 - **编码规范**:遵循PEP 8编码规范,编写可读性强且易于维护的代码。 - **避免重复造轮子**:利用Python生态中...

    python 利用 jpype 调用java代码

    需要注意的是,由于Java和Python是两种不同的语言,性能和内存管理方面可能存在差异,因此在调用Java代码时应考虑效率问题。 在提供的压缩包文件中,`test1`和`mython`可能是两个示例文件。`test1`可能是一个测试...

    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 重复...

    Beginning Python:Using Python 2.6 and Python 3.1.pdf

    这本书旨在帮助读者快速掌握Python编程基础,并介绍了Python 2.6和Python 3.1两个版本的主要特性和差异。书中内容涵盖了从基本概念到高级编程技巧的广泛主题,为读者提供了一个全面的Python学习资源。 在【标题】和...

    Python编写PostgreSQL数据库结构比对程序源代码

    Python作为一种易学且功能丰富的编程语言,常用于与数据库交互,进行数据处理和自动化任务。本主题将围绕使用Python编写的PostgreSQL数据库结构比对程序进行深入探讨。 标题中的“Python编写PostgreSQL数据库结构...

    python绘制三维图—更改颜色.rar

    在Python编程语言中,PyEcharts是一个强大的可视化库,它提供了丰富的图表类型和高度自定义的选项,使得数据可视化变得更加简单。本主题聚焦于使用PyEcharts绘制三维图,并特别关注如何更改图中的颜色,以增强视觉...

    Python库 | dam-sync-0.0.3.tar.gz

    Python库是开发者在进行软件开发时经常会用到的工具,它们提供了一系列预定义的功能和模块,可以帮助程序员快速实现特定任务,提高开发效率。"dam-sync-0.0.3.tar.gz" 是一个针对Python的库,名为“dam-sync”,版本...

    《Python语言程序设计》项目报告书 (2).docx

    - 除法函数(f = a / b):执行浮点除法,注意Python2与Python3在整数除法上有差异,需要确保在Python3环境下运行或使用`//`进行整数除法。 3. 程序开发注意事项: 编写程序时,应确保每个字符的准确性,避免语法...

Global site tag (gtag.js) - Google Analytics