注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天地不仁,以万物为Googol!

天行有常,不以物喜,不以己悲……

 
 
 

日志

 
 

c/c++之于物理/数学,及其它——一些发烧时的想法  

2006-04-07 14:44:23|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
托发烧的福,难得有个整块的时间,在电脑面前思考些没用的东西,记录一下。
 
网上闲逛,又看到了有人为c/c++而争吵。类似的争吵还有:unix(linux)/windows,c(c++)/java(c#),java/.net,ppc/palm,windows/mac……总之,电脑界从来都不缺月经话题。正好,趁着浑身发热,我也来趟趟混水。
 
c最大的特点,也是其出现的原因,便是面向硬件。c中的每个语意都直接脱胎于汇编/机器语言,c可以直接操纵机器的所有资源(寄存器啦,开关位啦)。最明显的,就是c并未对int的长度做规定,而是默认其与运行的硬件寄存器位数相同。而long/short都只规定其位数要不少于int/不多于int。这样的好处就是,c中一个int变量,可以和寄存器中的每一位(bit)做一一对应,进而与芯片的针脚做一一对应关系(假设是普通电子芯片,每个针脚只能有0/1态。三台门不算!生物芯片的更不算!)。这样,c中的int变量完全可以直观的控制芯片的输出。而java/c#等新生派则在想:用户又不关心机器到底是多少位的,甚至程序员对此也不是很清楚,那何必给int一个“模糊”的定义呢?干脆就统一成4bytes吧,反正数值计算上差不多够用了。
 
c++脱胎于c,自然也就具有了这种“硬件映射”的能力。但是,c++出生的目的在于能够更加“抽象的”组织程序。这个抽象,是指程序将直接对应于人脑的思想,而不是硬件的实现。比如说,stl中的list类,直接对应于链表结构(学过数据结构的都知道我在说啥……),也具有链表的插入/删除/转置等行为。但stl的实现呢?是用的指针链表?数组链表?内存分配的形式是malloc还是pool?没有规定,甚至,list允许在定义实例时对这些内容进行选择(通过模板……唉,你要实在不知道我说啥就算了……)。如果有合适的实现,编程将是如此简单:用application类建立一个新的应用程序,其中使用了一个自定义的windows类,应用程序启动时show自定义的windows类的(假设show是windows类的一个行为)的一个实例到显示器上……
 
ok,到此为止,一切都还是比较直观的,然后…………模板降临了!
 
c++最早引入模板,只是为了程序员能少写点代码而已。(可见程序员有多懒……)。还是以之前的list类为例。list里存储的是什么东西呢?int?char?指针?windows类?哦~~~~莫非要一一实现int_list、char_list、ptr_list、windows_list?但这些类,除了存储类型不一样,其处理流程都是一样一样一样的啊。于是,大牛们就想到了一个抽象的方法:将存储类型与存储结构分离!变成这个样子:list<some_type>。这样,list只用实现一份,在使用时,如果想存char,就用list<char>,如果想存int,就用list<int>,…………恩~~其实我更想,list<ppmm>^^(更详细的模板演化过程,可以去看《c++的设计与演化》)
 
以上,就是模板在iso c++ 98中的定义与使用情况。但是,牛中自有更牛人,偶然出奇迹。由于c++“偶然的”将模板实现为编译期展开(就是说,编译的时候,list<int>会生成一份int_list,而list<char>会生成一份char_list。这种生成是由编译器自动完成的,程序员不用操心。哦,对了,还有ppmm_list),于是,有人发现,模板可以用作静态接口,在编译时将两端完全不搭嘎的程序链接在一起(至于链接在一起的后果,如果不是经过设计就偶然能用的,那…………估计上帝会知道……)。于是,一时间,编译期多态,编译期断言,程序造程序,模板元编程等等“新思维”词语层出不穷。
 
甚至,模板的这个特性开始与传统的c++相结合,出现了函数的函数(泛函?),谓词函数(离散这门计算机基础数学,终于在语言中有了直接对应),lambda函数(lisp的看家本领都被c++学来了)……工程的空间开始呼啦呼啦的滋生纯数学的概念。类与模板结合,开始对人脑中最为抽象的数学,进行抽象。至此,c++真正脱离了c的那种硬件描述理念,开始在抽象的世界里不断“抽象下去”。
 
由此,不得不想到数学和物理的关系。物理是一门绝对具体的学科,所研究的都是“实实在在”的东西(你看不到的东西,不一定不实在X-D)。而数学则是抽象为王。从真实的空间抽象出空间的概念(比如:线性空间,希尔波特空间,不知道是什么东西了吧),从运动抽象出微积分(所以难怪经典物理学家牛顿,会发明微积分),从对物体位置的描述抽象出维度的概念(比如说,一个2.5维的直线,你能想象么?),从物体的形状抽象出几何(欧几里德,黎曼,然后是更不可理解的纤维丛,弦……)。结果就是:物理与数学越走越远,研究方法也相差很大。(关于两者研究方法的差别,有个笑话,说一个物理学家证明歌德巴赫猜想的方法是:我试验了从3~100的所有整数,都可以做歌德巴赫猜想的那种拆分,因此歌德巴赫猜想是正确的。其实,牛顿经典力学数百年来不被怀疑,不就是因为没有爱因斯坦来指出反例么?当然,这是笑话,别拿这个较真)而现代数学,早已抽象到了完全不知如何与实际用途对应的地步(比如,你知道矩阵的特征值的含义么?)。c++也开始向这方面进军。一群大牛开始搭建一个又一个的抽象概念,一次又一次的提高c++的学习门槛。(这年头,学c++而不知道stl的,简直都不好意思见人!)。呃……数学的学习门槛也很高的,要不然大家考研就不会头疼数一了……
 
恩……主要的写完了,再扯点别的。
 
魏尔施特拉斯逼近定理号称任何一段有限区间的连续函数,都可以用幂有限的多项式一致逼近。这是系统线性化的基础。一致逼近中的一致是指什么意思啊?(你看,数学抽象的,不直观的特点吧?顺便b4封杀wiki的行为!!)
 
快速排序要想行之有效,关键在于中间值的选取技巧。中间值选的不好,快排会退化为冒泡。人具有扫一眼就能知道中间数大概是多少,计算机能不能呢?如果能,快排就方便了。
 
ipod是个本能层次和行为层次的优秀作品,unix是反思层次的优秀作品。windows上的程序设计则是行为层次上的优秀作品,结果windows成功了。(于是程序员的门槛更低了,于是我的日子难过了,555555)
 
学好c++很难,用好c++更难,想知道在哪用c++最难。一是c++总有实现好的,运转高效的类库,二来在c和java/c#等语言的夹击下,c++使用面越来越窄。
 
恩……真是个难得的下午,发烧的大脑胡乱思考的感觉真爽!
  评论这张
 
阅读(204)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017