分享

关于编程语言

 联合参谋学院 2013-02-16

今天碰巧讨论起来编程语言。好像最近很流行的一个话题,包括lisp和haskell的再一次又一次悄然流行。
 

PS:这些是我很一些同学一次讨论的总结,可能有我没有说清楚的地方,也有可能是我没有理解对的地方,如果有哪里写的不对,欢迎大家指正。 


我的风格:

首先我不会haskell和lisp,请大家联想一下一个不用emacs的人。

选择策略:

我所长久使用的,或者说是擅长的是汇编,包括几种结构的汇编。当然后来出于敏捷的考虑我会用C,如果充满了网络应用,正则表达,文件操作这种功能性比较强而且要频繁的和操作系统打交道而不是cpu的时候,我会用python,如果是以网络操作为主的话那么用perl。

风格源自汇编:

但是我无论用哪种编程语言你可以看到一种非常统一风格就是来自于汇编的风格,非常强的指令逻辑顺序风格。最简单的一个例子就是goto的使用,因为这个和汇编中的jmp系列命令是一致的。我不会用非常C的风格,比如宏定义,switch 以及while,甚至我的C中嵌入汇编都是很经常的事情。我写c程序唯一看起来像C的地方,就是指针和for,满篇的指针运算因为这个和汇编中的地址操作是一致的。我会用指针来完成switch while 等操作,我所使用的C无非是[for + 指针 + goto + if +中断]没了。还有一个特别明显的特征就是我特别爱用中断,这个是国内学生不太愿意用的东西,其实特别好用。因为汇编和系统之间交互的时候就是用中断实现的。总结一句话,我的风格是用硬件开发工具写算法。够奇葩吧。

思维模式:

我能理解的是中断,地址,以及指令过程。比如信号和信号槽我就理解成为一种软中断实现,类似的还有时刻表cron,这个是时钟中断的一种派生,指针是地址的一种实现,重载是函数指针的一种实现。我所不能理解的就是迭代,这个常常使得别人对我产生误解,认为我擅长计算机工程而不是计算机科学,其实不然,我是按照计算数学的思路在写程序,而不是按照集合论的想法在写程序,仅此而已。

缺陷:

我写的程序其实针对性非常强,即使C以移植性著称,但是这个是一个狭义的移植性概念。

 

在我看来

编程语言的不同,是编程模型的不同,如果想掌握一门编程语言,首先要弄清楚编程模型是什么。

比如:

*汇编的编程模型是cpu,

写汇编的时候经常要拿着datasheet,然后查阅时序图,时序图就是基本的工具,用这些工具构建你想要实现的功能。需要和外部交互的时候还需要知道io map是怎么样的,如果有bios这样管理io的子系统的时候那么你只要弄清楚bios给你提供的服务就可以了。汇编和操作系统之间交互是通过中断来实现的,也就是仿真一种硬件行为,这个行文叫做软中断,然后操作系统会守护这些中断信号然后作出反映。

*C的编程模型是内存,

在用C写成的时候大部分的时间是和内存打交道,不需要(但是有权利)管理cpu内部的寄存以及其他的一些具体部件,那些都有一个.h文件统一管理和抽象。然后你只要关心内存就可以了。和外部通信的时候也是将那些功能映射到内存地址了。C和操作系统之间的桥梁只有标准IO就是stdin stdout 和stderr,由于一切文件化的抽象,能用的指令也只有read 和write。当然你还要用ioctl先设置一个合适的工作状态。当你写的本身就是内核的时候,那些变量都可以直接调用的,比如全局时间。

*python的编程模型是应用,

其实我不太会用python,我只是说说我是这么用的,python可能是各种功能实现的一种抽象,如果有那么一个应用无论是什么语言编写,无论是如何执行,那么他一定可以有(或是已经有)python接口了,你调用这种接口,然后建立一个实体,这个实体就是一个应用的抽象。比如我可以创建一个webkit的实体,然后这个实体就可以有url这个变量,填好后,就可以用open()这个函数,然后从context里面就能得到浏览结果了。python和操作系统之间的交互很灵活,可以通过os 这个抽象,或是exec等等。当然管道也是一个利器,可以通过popen取出程序执行过程中的标准io里面的内容。

*perl还不是很会,其实我一直拿perl当python的网络加+正则表达加强版,等以后我有时间了,再学习一下,再加上这一段。

 

那么,我写程序的风格贴近硬件,但是其实不怎么本质。需要大量的计算数学,而不是数学。还有另外一类更本质的编程,更数学的编程语言,是基于计算机理论的,也就是图灵理论。这些编程语言是面向计算过程的包括:递归,λ演算和图灵机,这三个是等价的,所使用的是逻辑数学+集合论,所讨论的问题是可计算问题。这些程序的移植性非常强,即使没有操作系统。他们不需要操作系统,编译器或者解释器完成的任务就是将各种不同的图灵机物理实现转化成基本操作符,这里已经不要求物理实现是计算机了,物理实现有可能是各种形态的。他们描述的是计算的本质。

 

*LISP 、Haskell 编程模型是命题

那么,所编写的程序其实就是证明过程,纯函数编程语言,基本操作就是λ演算,每一个计算原子就是一个λ算式,没有语句。基本编程结构是递归。LISP抽象了7种基本操作符也就是7条公理。递归的用这些基本公理,证明命题是可以计算的。指导思想是逻辑数学和集合论。没有side effect,也就是说不能修改函数以外的变量,也不能修改代入的变量,纯迭代,只有返回值,由于严格的迭代要求所以可以在代码运行的过程中,进行修改代码和系统交互使用的是actions这个atom,由于要保持计算的过程的单纯性,尽量将IO降到最低限度。C python都有嵌入λ算子功能是为了实现异步回调算法。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多