Unix设计哲学之可移植性

来源:互联网 发布:网络机顶盒电视直播软件下载 编辑:程序博客网 时间:2024/05/24 20:08

程序更应该注重可移植性


一:问题引导

1. 什么是可移植性?

所谓可移植性,即代码编写一次,简单地做一些修改或者原封不动地就能运行在其他的体系架构机器上而继续发挥余热,充分利用前期工作结果的效用,为软件开发提供了很好的复用模块,提升开发效率。

2. 为什么移植性很重要?

I. 信息革命走过的时间不过半个多世纪,其中发生了翻天覆地的变化,从 intel 公司于1971年推出的intel 4004微处理器开始,到现在的Core i7系列,其中的晶体管的数量从2250个到几十亿的变化,呈现几何倍数增长,其复杂都可见一斑,x86如此,其他体系架构亦是如此,什么MIPS、PowerPC、ARM等等。

II. 硬件的发展早于现代意义上的软件发展。软件最早是以二进制指令序列来体现的,后来发明了助记符形式的编程方法-汇编方法,汇编相对于二进制而言,更友好和更易维护,但它还是和具体的体系架构信息紧密联结。后来到了20世纪70年代初期,C/C++等高级语言相继诞生,屏蔽了具体的硬件信息,使得软件开发人员根本不需要了解体系结构的寄存器和以及寻址方式,这些所有工作都扔给了编译器,极大地降低了软件开发的难度。与此同时也提高了软件在不同体系架构之间的可移植性。

III. 高级语言产生,使得软件发展的速度远超于硬件。软件的超强灵活性使得软件飞速发展,相对于发展较慢的硬件而言,大量编写过的软件可以重新被复用并且添加新的特性发挥余热。软件行业的发展就是在这样的不断迭代中一步一步跑过来的。因此,移植性对于软件开发而言,至关重要,不需要从头造轮子,在现有的基础上添加新的特性从而适应新时代对软件行业提出的新要求和新挑战。

3. 在移植性和效率方面,如何选择?

I. 可移植性概念包含了一层含义:就是在具体硬件信息和软件之间增加了一个层的概念,一般而言它是一些系统软件,比如编译器,它完成软件到二进制的中间的转换过程,以适应不同的体系架构。

II. 俗话说,鱼和熊掌不可兼得, 二进制形式的软件效率无疑是最高的,因为它充分利用硬件的资源和特性,而经过中间层的可移植软件则不具有如此快的速度。
III. 一般而言,在一些简单并且注重效率方面,使用汇编这样高效率的实现方式,而一些复杂通用的部分,可以考虑使用高级语言编写的可移植性程序。比如Linux操作系统,99.9%都是用C语言写的,而只有少部分的启动和初始化代码是用特定架构的汇编完成的。


二:具体阐述

1. 舍弃高效率而取移植性

I. 程序员要面对的一个艰难选择就是:高效率和可移植性。这是一个极其磨人的抉择,因为偏向高效率往往导致代码不可移植,而选择可移植性却又会让软件的性能不那么尽如人意。

II. 高效率的软件不会浪费CPU周期,它充分利用了底层硬件的特性,可往往完全忽视了可移植性的问题,比如利用了图形加速器,高速缓冲存储器以及专门的浮点指令等硬件功能。

III. 虽然高效率的软件非常有吸引力,但是可移植性意味着软件能够运行在不同的机器上,这使得人们考量的天平向可移植性这一端倾斜。一代代处理器如滚雪球般发展,半导体设计世界的动向令人目不暇接,芯片的性能不断呈现螺旋式加速上升,根据摩尔定律,每个18个月硬件的速度翻倍,当然,现实的发展速度快于定于所言。从这个意义上,可移植性更具优势。

IIII . 在转移到一个新平台的时候,充分考虑了可移植性因素的软件大大降低他的平台转移成本,开发人员不需要耗费太多时间在移植工作上,因此他们可以把更多的时间用于开发新功能,由此吸引更多的用户,同时也赋予产品新的商业优势。

2. 最高效的方法往往不可移植

任何时候,但凡一个程序利用了其某些特殊硬件功能的优势,它往往变得高效,但却也变得不那么可移植了。特殊功能有时候会极大提高软件的性能,但他们需要采用于硬件设备相关的代码,但目标硬件被更快的版本取代以后,人们就需要更新代码。

3. 不要花太多时间去优化程序

还是那一点:芯片的性能不断呈现螺旋式加速上升,硬件性能越来越快,在有限的时间用于开发更加有用的功能。

4. 常用的一些可移植的处理方式

I . shell脚本 编写的软件在类Unix系统上几乎通用。比如各大Linux发行版。Ubuntu,RedHat。

II . 采用纯文本文件来存储数据,所谓纯文本就是应该只包括一组由换行符字符或者newline分割的字节流。 文本是通用的可转换格式,几乎说有的目标平台都能处理文本编码的数据,效用文本可以消除很多麻烦,你不需要将自己的数据从一种二进制格式转化到另一种二进制格式。


0 0