python的虚函数,Python求虚根
未来编程语言的发展方向
在C语言入门了之后,我体会到了编程的乐趣,那是人生最快乐的一件事情。当用创造世界的工具(编程语言和IDE),设计出虚拟世界的运行规则(程序),然后虚拟的世界就按照自己设计的法则运转时(程序将严格按照程序员的意愿去运行),那种乐趣是常人难以想象的!
在冠县等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都网站设计 网站设计制作按需规划网站,公司网站建设,企业网站建设,成都品牌网站建设,全网整合营销推广,外贸营销网站建设,冠县网站建设费用合理。
程序员、用户、程序: 程序就是一个系统,类似于《信号与系统》中的系统,用户的输入类似于激励源,用户需要的就是系统的输出。这个系统的设计就是程序员的事情了,这个系统是否合理、平衡也是程序员的事情。还有一个原则,同样的输入只能得到的输出,不可能也不应该让程序帮助用户完成所有的功能。比如:搜索一个文件等,用户一定要告诉程序到底想要搜索什么样的东西,而不应该全部交由程序去分析用户的意图,那样的结果只会是徒劳。
一想到C#、VS、Windows就怒,在用户、程序 、 程序员、编程语言、集成开发环境、操作系统之间,每个角色的职责和功能和权利,全部被Microsoft给颠覆了。
用户的需求是获得最安全的产品、最可靠的产品(无内存泄漏、内存写越界等问题)、运行速度高的产品(也就是程序)。但MS不这样做,MS觉得自己有必要绑定在一起销售的东西,就全部强加给用户,不管用户需不需要。比如Windows里的那么多后台服务、那么多的系统自带程序,用户想不要都不行,即使想删除也不行,因为删除起来不那么方便。可怜的用户,花了那么钱买一个商品,但最后即使是自己不想要的东西、可能给自己带来祸害的东西(比如没有必要的后台程序和服务),也没办法拒绝。"顾客就是上帝", 在IT行业,变成了"Microsoft就是上帝"。
同样,编程语言本来就是一个工具,为程序员更快速地设计规则(程序的运行规则)服务的。编程语言和IDE本来是给程序员服务的,程序员希望编程语言和IDE应该提供什么方便快捷的功能,那就是语言和IDE的发展趋势。题外话:但程序员自己应该完成的职责,不应该由编程语言去完成。比如,整个程序有没有内存泄漏问题,整个程序的效率高低问题,程序设计合不合理,这些应该由程序员去完成,而语言和IDE只应该提供一些辅助的分析工具和预防措施,而不能替代程序员的职责。
自然世界遵循的是对称的原则,程序也是如此,编程语言语言也是如此。有constructor,就有destructor;有malloc,就有free;有new就应该有delete;函数的设计也是如此,有QueryPlugin,就有ReleasePlugin;if else 分支里面的内容应该完全对称;
break,continue,return破坏了程序的顺序执行,破坏了函数的前后对称,所以很大一部分内存泄漏问题都是发生在这些地方。程序设计美观、对称,不太可能发生内存泄漏问题。
但Java把delete关键字去掉之后,世界全部变味了。对称破坏掉了,在Java里,当代码写的不是很好时,某块内存同样可能成为死内存。即使这块内存没人用,但Java的垃圾回收机制根本无法收集。谁申请的资源,谁负责释放。担心内存泄漏、因为内存管理太复杂,所以把内存操作全部去掉,交由语言和IDE和内存回收工具去做,有点像中国古代的因噎废食。程序员的水平不够,应该靠培训、靠学习来解决,而不应该靠语言和工具来解决。
C#不往给程序员提供方便的自然规则描述语言入手,而把Java的破坏对称的招数直接照搬过来,看来也不见得很高明。
编程语言的本质就是描述自然,描述自然界运行的规律。面向对象语言的成功,就是因为她能更自然、直观、方便、快捷地描述自然界以及规律。比如,一个物体或生命本身的属性就是一个对象的数据,一个物体或生命的动作,就可以看成是一个对象的成员函数。自然界的生命体有生、有死,对应编程语言中的构造和析构函数。 如果仅仅是一个很简单的属性,对应语言中的基本数据类型;一个物体很多的数据类型,对应struct;如果此物体仅仅只有数据特性,那么struct完全足够(struct对应设计模式中的Compsite设计模式)。我们可以复制它。如果还有相关的操作,那么就是一个类,类应该是一个比struct更高级的东西。 虚函数(也就是多态)的特性,表示自然界是可以进化的。由后来者(派生类)取代前人(祖先类)。正因为有了多态的特性,程序才可以更好的描述自然世界,更完美、更自然地模拟自然规则。程序里各个模块、各个类的功能对应自然界的各个物体和生命的功能和职责。互相之间和谐地工作,就组成一个平衡的世界。
所有的面向对象语言都可以用C语言改写。用C语言和汇编语言的年代,就像刀耕火种的年代,一人种1分地(程序的性能当然好啦),但耕种的速度慢。用面向对象语言的本质就是,用更符合事物本质的语言来描述事物,会牺牲一点点性能,但提高了耕种的速度(用面向对象的方式去设计整个系统,之后的扩充和移植都很方便,效率也会高一些。所以大型软件肯定不适合用C语言),结构上也清晰很多,维护和扩充肯定也方便的多。
在一切都变是MS说了算的年代,没有人关注编程语言发展的方向。语言只是给程序员使用的工具,但程序员自己根本不知道这是自己的基本权利,因为他们从来没有过这个权利,因为就连Stanley Lippman都没有这个权利。所有的程序员都在等着MS给大家设计好的语言,而这门语言是不是大家需要的已经没有人去关心了。所有的程序员都相信伟大的Microsoft可以带领他们往着美好的方向走去。前面是天堂,是地狱,没有人知道,所有人只知道,那是微软设计的蓝图.........
C++ int i[233];我直接这样写代表了什么意思?
C++ int i[233];直接这样写代表了,定义了一个整形的数组,共有233个整形元素,数组的名字叫做i。
为什么越来越多的科学家使用Python,Ruby而非Fortran
需要强调的一点是, 语言只是工具, 在特定应用场景下满足特定需要的工具,
脱离应用场景来谈不但没有意义而且还会扣友善度。以下经验(吐槽)都是针对大规模科学计算的, 个人电脑写一个下午的代码,然后跑十分钟的代码趁早去用
Python/R/Matlab/Ruby, 上手容易, 功能强大, 网上资源丰富, 绝对是您无悔的选择。
大家的难用都是从
fortran77那里感受来的,看过80年代的Fortran77代码,混乱程度简直爆表。再看2000年左右的Fortran95代码,马马虎虎,
算是中规中矩的结构化语言。最近看过2010年左右的Fortran2003 code(Fortran的lua接口)
。抽象类,构造函数满天飞,我擦好多feature都不知道。
所以你们批判的不是Fortran, 而是任性的,非结构化的coding
style。这不过恰巧搞科学的这票人都不太鸟coding standard和coding style,
所以Fortran写出来的代码大都比较乱, 这是使用者自身需要学习一个, 跟语言本身关系不大吧。见过师弟师妹们写的C代码,
比Fortran版本的还魔幻。
而C和C++里面也有goto, 也有extern可以不做函数参数参数检查,倒是没见你们怎么喷。Fortran里面也有interface来声明函数原型, 倒也没见你们怎么用。
比
如elemental, pure, 函数重载, forall, where,
Fortran95新加的功能一大部分是为并行度设计的,其语法也非常偏向高维的大数组操作, 自动并行化(openmp
workshare)用起来简直比C++爽不知道多少倍。在OpenMP+MPI的场合加上千核量级的并行度,还是有优势的。还有一种东西叫CAF,
CoArray Fortran, 专门针对大并行度的超级计算机添加了很多新语法,估计知道的人不多。
更不要说Fortran2003/2008支持面向对象。当然在虚函数方面好像比C++缺了一个功能, 其他都是完整复刻的。
python-keybinder 怎么用
实现一个binder通信实例,需要经过以下步骤: (一)获得ServiceManager的对象引用 (二)向ServiceManager注册新的Service (三)在Client中通过ServiceManager获得Service对象引用 (三)在Client中发送请求,由Service返回结果。 下面看具体的代码如何实现。 三.一 libmyservice代码实现 (一)新建目录frameworks/base/myservice/libservice,进入该目录 view plain $ cd frameworks/base $ mkdir myservice $ cd myservice $ mkdir libmyservice $ cd libmyservice (二)编写libmyservice/myservic.h文件 view plain #include threads.h #include RefBase.h #include IInterface.h #include BpBinder.h #include Parcel.h namespace android { class MyService : public BBinder { mutable Mutex mLock; int三二_t mNextConnId; public: static int instantiate(); MyService(); virtual ~MyService(); virtual status_t onTransact(uint三二_t, const Parcel, Parcel*, uint三二_t); }; }; //namespace (二)编写libservice/myservice.cpp文件 view plain #include "myservice.h" #include IServiceManager.h #include IPCThreadState.h namespace android { static struct sigaction oldact; static pthread_key_t sigbuskey; int MyService::instantiate() { LOGE("MyService instantiate"); // defaultServiceManager ()获得ServiceManager的对象引用,addService()可向ServiceManager注册新的服务 int r = defaultServiceManager()-addService(String一陆("android.myservice"), new MyService()); LOGE("MyService r = %d/n", r); return r; } MyService::MyService() { LOGV("MyService created"); mNextConnId = 一; pthread_key_create(sigbuskey, NULL); } MyService::~MyService() { pthread_key_delete(sigbuskey); LOGV("MyService destroyed"); } // 每个系统服务都继承自BBinder类,都应重写BBinder的onTransact虚函数。当用户发送请求到达Service时,系统框架会调用Service的onTransact函数,该函数分析接收到的数据包,调用相应的接口函数处理请求 status_t MyService::onTransact(uint三二_t code, const Parcel data, Parcel* reply, uint三二_t flags) { switch(code) { case 0: { pid_t pid = data.readInt三二(); int num = data.readInt三二(); num = num + 一00; reply-writeInt三二(num); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } } }; //namespace (三)编写libservice/Android.mk文件 view plain # File: Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := myservice.cpp LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) LOCAL_SHARED_LIBRARIES := libutils libbinder LOCAL_MODULE_TAGS := optional LOCAL_PRELINK_MODULE := false LOCAL_MODULE := libmyservice include $(BUILD_SHARED_LIBRARY) (四)编译libmyservice.so动态库 在android源码主目录下 view plain $ source build/envsetup.sh including device/htc/passion/vendorsetup.sh including device/samsung/crespo四g/vendorsetup.sh including device/samsung/crespo/vendorsetup.sh $ mmm frameworks/base/myservice/libmyservice/ 编译成功后生成文件:out/target/product/generic/system/lib/libmyservice.s
python中怎么把datetime类型转换成timestamp
在进行新纪元时间(1970-01-01 00:00:00)以来的秒到实际时间之间转换的时候 MySQL 根据参数 time_zone 的设置有两种选择:
time_zone 设置为 SYSTEM 的话:使用 sys_time_zone 获取的 OS 会话时区,同时使用 OS API 进行转换。对应转换函数 Time_zone_system::gmt_sec_to_TIME
time_zone 设置为实际的时区的话:比如 ‘+08:00’,那么使用使用 MySQL 自己的方法进行转换。对应转换函数 Time_zone_offset::gmt_sec_to_TIME
实际上 Time_zone_system 和 Time_zone_offset 均继承于 Time_zone 类,并且实现了 Time_zone 类的虚函数进行了重写,因此上层调用都是 Time_zone::gmt_sec_to_TIME。
想学一门语言,主要用于科学计算,c++还是python更合适?
个人觉得是先学c,再python,最后c++
首先c语法简单,但是因为接近底层,所以你会对编程的好多本质有所了解,比如内存的本质,程序运行的本质,指针强准的本质,关键是这些都不难,多用一用就能理解。但是c也只适合入门了,因为他开发效率偏低,解决问题时,花费时间长,也就是开发效率低(当然执行效率高)。
因为c的运行效率高,经常会被用作开发操作系统,而且操作系统也不需要c++那样花哨的语言特性。当然,一般人不会接触到操作系统的开发……
python就是一个瑞士军刀,好像什么都能做。但是你要拧螺丝的话,是瑞士军刀的好还是独立螺丝刀好?肯定是独立螺丝刀好用!但是有了瑞士军刀,拧螺丝这个事又不是很急,何必非买独立螺丝刀呢?而且瑞士军刀用起来可能有些不方便,但是肯定比出门买个独立螺丝刀要方便啊!这就是python的最大优势,他有非常齐全的库,官方的也好第三方也好,经过十几年的积累,这是一个庞大的集群。因为python语法简单,甚至接近伪代码,所以python对我来说是解决问题一用的,达成目的即可,其他的?shut up!
c++是最不适合作为编程入门的,因为他的规则太复杂了,对于新人来说,当学习时这些东西扑面而来很容易把人吓蒙的!什么是显式构造、什么是拷贝构造、析构函数为什么要virtual、虚函数是什么、虚基类是为了什么存在的、运算符重载的规则是什么、指针和引用的区别、模板有那些黑魔法、标准库究竟会干些什么…… 不得不说它的很多特性,让编程变为像魔法一般的存在,当使用者念咒语施放魔法时会产生非常强的成就感。但当你对咒语一知半解时,一旦犯错你需要翻经阅典花费大量的时候来搞明白。
所以我建议先从C开始,了解基础语法之后尝试更深入地了解本质,这对你接下来学python有好处。然后学学python,并用python尝试去做一些事情,你会发现python的强大。最后学C++,虽然上面说了C++的语言魔法太复杂,但在当前市场下,C++程序员的需求量还是很大的,因为C++得益于他比C更快的开发效率以及python等脚本语言所无法比你的运行效率,使其成为市场的一个刚需。
当前文章:python的虚函数,Python求虚根
本文来源:http://hbruida.cn/article/hscpeg.html