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

向后兼容性与老化

    博客分类:
  • rant
阅读更多
只想记个链接而已,标题党了(苦笑

Bruce Eckel发了篇帖子,Will Open-Sourcing Java Remove Competetive Corporate-Think?。其中的观点并不新了,他自己最近的几篇帖子里其实都有类似的内容。不过今天读到的这篇让我想随便记几句。

跟Bruce一样,Sun让我感到很困惑的一点就是"no one has been able to figure out Sun's business plan"。技术层面上Sun一直不缺人才,但在奇怪的商业策略的引领下这些技术总让人觉得没能发挥出它们最大的潜力。有一个挺有趣的观点(也不新了):Sun是想学习Microsoft的商业策略,并标榜自己为anti-Microsoft。某种程度上来说这有点道理。至少Bruce提到的这点我觉得很符合我接触到的状况:"Rather than fixing the problem, respond with rhetoric (another lesson learned from Microsoft)"。

Enough rants on Sun. I don't really care about what happens to Sun anyway. 我是联想到最近关注的C# 4.0的一些设计,也是严重受限于向后兼容性。

假如把一门语言或者一个库的API比做一件衣服,把这个语言或者库所要解决的问题领域比做一个人,那么一开始这个人还是个小婴孩,总不能把衣服做得太大。慢慢的这个小孩长大了,在一定范围内衣服可以修补、扩张来满足新的需要,但这样的修补会让衣服变得越来越重。超出这个范围后,如果不把衣服拆解回到零件的状态再重新组装的话,衣服就很难再继续改进来满足需要了。
一个问题领域也总是有从简单到复杂的发展过程的。一开始如果把语言或者API设计得太复杂,那会:1、提高学习曲线,使它难以学习;2、难以适应后续的变更。那么假如一开始设计得很简单,后面要继续满足新需求多半需要添加新的元素;对语言来说这意味着新的语法结构,对API来说这意味着新的类、新的方法或函数。为了保持向后兼容性,添加新元素的同时就无法去掉旧的过时的元素,使语言或API变得越来越重,甚至影响到新设计的可能性——也就是所谓的老化。持续下去的话,最终人们将不得不使用新的语言或者库来解决新出现的问题,让原来的语言处理它老化之前就能处理的问题(注意:这并不是说原来的语言就“死”了。只是在它的问题领域已经“成熟”了而已)。

程序员真的需要向后兼容性么?当然,如果能保持向后兼容性同时又能提供新的服务,如果这两者不矛盾的话,自然是好的。没人会心甘情愿的只为了升级运行时环境而修改一大堆代码。但程序员本来就应该习惯“为了解决问题”而写程序。如果因为向后兼容性绑住了手脚而无法解决问题,那这个向后兼容性的代价也太大了。很多时候,真正的进化都意味着要放弃绝对的向后兼容性,像是Python和Ruby的发展过程中许多东西都为了适应新的需要而在改变着。

C# 4.0里有可选参数(optional parameter)的语法结构。这种语法结构在C++里已经存在多年,即便在.NET平台上也有VB.NET一直支持,看似微不足道的。但就是因为保持向后兼容性,它不得不做了个尴尬的设计:如果将虚方法与可选参数一起使用,会带来十分不直观的行为。例子的话请参考这里:Optional parameters - Conclusion: Treat like "unsafe"。下面把例子的代码引用过来:
public class Derived : Base {
    public override string Test(int test = 2) {
        return "Derived " + test.ToString();
    }
}
 
public class Base : IBase {
    public virtual string Test(int test = 1) {
        return "Base " + test.ToString();
    }
}
 
interface IBase {
    string Test(int test = 3);
}
 
sealed class Program {
    static void Main(string[] args) {
        Base b = new Base();
        Console.WriteLine(b.Test());

        IBase bi = b;
        Console.WriteLine(bi.Test());

        Derived d = new Derived();
        Console.WriteLine(d.Test());

        Base d2 = d;
        Console.WriteLine(d2.Test());

        IBase d2i = d2;
        Console.WriteLine(d2i.Test());
    }
}

而输出是:
引用
Base 1
Base 3
Derived 2
Derived 1
Derived 3

也就是说同一个虚方法从不同的基类调用时很可能会出现行为的差异。这与一般对虚方法的认识有相当的出入,很不直观。虽说C++也是这样,但C#也没必要全盘照搬C++的行为嘛。
VB.NET在这方面的处理就不一样——它将可选参数的默认值考虑为signature的一部分,如果派生类在覆盖基类的虚方法时对同一个可选参数提供了不同的默认值,编译器会报错。这样就阻止了发生上述问题的可能性。
那为什么C# 4.0不学VB.NET呢?C# 4.0小组的成员告诉我是因为向后兼容性。因为当前在C#里用户可以使用OptionalAttribute和DefaultParameterValueAttribute来修饰方法的参数,而C# 4.0也是使用这两个属性来修饰可选参数的。如果在C# 4.0里用户写出这样的方法:
void Foo([DefaultParameterValue(10), Optional]int x, int y = 10)

则x的默认值不会被编译器检查(因为老的C#编译器是不检查的),而y的默认值会被编译器检查。既然无法保证C# 4.0里所有的可选参数都能够被检查,那就只好整体都不检查,从而带来上述的问题了。
据说开发小组内部为这个问题争论过很多次,但最终还是决定采用这样的设计;全是让向后兼容性害的……

诶。C#和.NET Framework显然都在老化。Anders也说每次给C#添加新特性都意味着带来了老化,所以要非常小心。即便他和他的设计组很小心也还是带来了不可忽视的老化。而Microsoft一直有过不久就发布新平台来代替旧平台的传统,不知道.NET Framework能撑多久呢?

也有明明老化得很严重却还一直撑着的例子。例如说Win32 API。那里面许多设计都带着早期Windows的影子,有些API早该去掉了,却还一直存在。
又例如x86指令集。这算不上API,应该算是ABI(Application Binary Interface)的一部分吧。为了保持向后兼容性,新的x86兼容芯片还是得支持8086的一些过时依旧的运行模式。但也正是因为一直向后兼容,x86平台一直保持着强大的生命力。这个例子又说明了什么呢?

======================================================================

另外也想记点关于编程语言与API的关系。许多人认为核心语言应该非常小,非常简洁但足够强大,保持设计的稳定,让上面的库去承担语言发展的变化部分。对研究编程语言的人来说这自然是最好不过的,像LISP那样以不变应万变就是最好的例证。(不是说LISP的语言没变化,只是最核心的部分一直都没怎么变)。
对应用程序员来说,这种思路其实没多少意义。当你需要解决问题的时候,你会发现手边的工具都有所谓的“表面区域”;编程语言和上面的API都是表面区域的一部分。从某种意义上说,所有的库都可以看成是以某种编程语言为元语言的DSL(特定领域语言)。无论是编程语言发生了变化还是库发生了变化,对应用程序员而言都意味着表面区域变了,意味着自己写的程序可能需要修改。
十年前如果有人问是学习Java语言难还是学习它上面的库难,答案或许是两者都差不多;但到现在各种框架层出不穷,学习Java语言本身显然比不上学习框架的难度。而那些框架的API发生的变化都直接牵动着程序员的筋。不是框架不好,而是问题领域本身变复杂了。
语言和库都会遇到向后兼容性和老化。即便把许多常用的语法结构用库来实现,也改变不了它们的变化会影响到表面区域的问题。
4
0
分享到:
评论
4 楼 KKFC 2009-01-07  
更新的时候给一部分人相当的机会,市场就是这样造就而成的。
3 楼 CloudiDust 2008-12-14  
说到这个,还是蛮佩服ruby和python的勇气的说~

不过版本间的不兼容性多少都是个问题~

其实……最悲惨的一个例子是C99啊,只要一考虑到跨平台的问题,那就基本只能C89了……可怜的标准……

.Net Framework么……话说在WPF还没有替代WinForms,全面托管的Windows系统层还没有出现的时候(我觉得这几乎不可能),微软应该不敢大动干戈才对。

想想到现在因为WinXP的意外长寿,我们都不能假定每个用户都安装了足够新的.Net呢,所以基于.Net写(给一般用户使用的)桌面小应用的不多啊,虽然我觉得这个东西比用C++合适。(用SliverLight来缓解这种状况么? =口=)
2 楼 RednaxelaFX 2008-12-13  
yywill 写道

老化是一件大好事,代表了成熟。C和C++不是很老很老的语言么?而现在开发工资 C > C++ > JAVA > C#

你如果想提高自己的工资要么就去学一门老化的语言,要么就去等待自己学的语言老化吧。

这话是不错。就像古董会因为年代久远,数量稀少而升值一般。
最后这句话我很喜欢 ^_^

最近业界对“成熟”的看法也有不少讨论就是了。有人说成熟意味着难以接受新的发展,Bruce Eckel显然是这一派的;有人说成熟是好事,意味着稳定,并以C/C++为证,yywill兄的观点似乎是这一系的。

这两种观点并没有本质上的矛盾。Bruce也一直强调说他并不反对使用Java来解决它原本就擅长的东西。例如说这段:
Bruce Eckel 写道
Java itself will continue to be a core workhorse, just as C++ has been. But like C++, I think people will reduce the use of the more difficult and newer features and keep their code simple, mostly because they will only be doing small portions of applications using those languages and will do whatever they can in the more powerful enabling languages.


这两种观点会影响到的主要还是设计“表面区域”的人而已。对应用程序员来说没啥,反正问题领域本身的变化就足够驱动写新代码的需要了,无论表面区域变不变。
1 楼 yywill 2008-12-13  
老化是一件大好事,代表了成熟。
C和C++不是很老很老的语言么?
而现在开发工资 C > C++ > JAVA >C#

你如果想提高自己的工资要么就去学一门老化的语言,要么就去等待自己学的语言老化吧。

相关推荐

    电子设备结构设计原理-575P-13.4M(高清带书签).pdf

    第Ⅲ篇电磁兼容性结构设计 17电磁兼容性概述 18电磁场基础 19屏蔽 20接地与搭接 21线缆敷设 22滤波 23电磁兼容性测试 参考文献 第Ⅳ篇防腐蚀设计 24概述 25金属电化学腐蚀基本原理 26各种环境中的腐蚀 27金属材料的...

    disk-burnin-and-testing:Shell脚本,用于老化和测试新驱动器或重新使用的驱动器

    Shell脚本,用于驱动器的老化和测试 目的 disk-burnin.sh是我编写的POSIX兼容外壳程序脚本,用于简化磁盘刻录过程。 它仅适用于不包含数据的磁盘,例如新磁盘或正在测试或重新使用的磁盘。 我受到FreeNAS论坛上主题...

    服务器虚拟化技术方案高校.doc

    软件兼容性冲突 不少网络中心存在一个服务器在没有做虚拟化的情况下搭建多个应用的情况。由于业 务性质的差异性,大量的教学业务系统,不同厂商开发,不同版本,很难统一部署与管理,软 件正常使用,系统稳定性得不到有效...

    c64-rf-modulator-replacement:C64 CompositeS-Video RF调制器更换

    c64-rf-调制器更换 C64复合/ S视频RF调制器更换 ... 这样就可以与各种不同的电路板修订版,VIC芯片,老化的组件和显示器实现最佳的兼容性。 可调级别意味着该板还可与带有或不带有串联电阻的s视频电

    开关电源测试综述

     良好的开关电源必须符合所有功能规格、保护特性、安全规范(如UL、CSA、VDE、DEMKO、SEMKO,长城等等之耐压、抗燃、漏电流、接地等安全规格)、电磁兼容能力(如FCC、CE等之传导与幅射干扰)、可靠性(如老化寿命...

    MW8209_6208E量产工具_1.1.2.5(最新版)

    2:优化了版本兼容性问题。 3:优化了CDROM二次量产的问题。 MW8209量产工具_1.1.1.2_20090704 1.优化了量产速度 MW8209量产工具_1.1.1.2_20090615 1:优化了升级功能(过全面扫描) 2:增加了手动选择扫描模式...

    MW8209_6208E量产工具_1.1.2.5

    2:优化了版本兼容性问题。 3:优化了CDROM二次量产的问题。 MW8209量产工具_1.1.1.2_20090704 1.优化了量产速度 MW8209量产工具_1.1.1.2_20090615 1:优化了升级功能(过全面扫描) 2:增加了手动选择扫描模式...

    省级气象虚拟化建设方案设计.doc

    (5)兼容性较差,有部分应用的操作系统是windows系统老版本,缺乏备份手 段,如果服务器突然崩溃,因驱动及系统兼容性较差等原因,系统及部分应用无法迁移 到新的硬件上。 (6)系统可用性差,很多数据传输的应用...

    工业电子中的基于人机界面及伺服控制器的卷烟系统

    MK9-5/PA8-5 型卷接机组是我国引进较早数量较多的烟草设备之一,为英国莫林斯(MOLINS)公司70年代产品。... 选用富士UG220H-LC4,5.7寸STN单色八级灰度,可以与26个厂家的PLC直接通讯(正是由于其兼容性强才决定选用此

    基于人机界面及伺服控制器的卷烟系统

    MK9-5/PA8-5 型卷接机组是我国引进较早数量较多的烟草设备之一,为英国莫林斯(MOLINS)公司70年代产品... 选用富士UG220H-LC4,5.7寸STN单色八级灰度,可以与26个厂家的PLC直接通讯(正是由于其兼容性强才决定选用此产品

    Drive-Scripts:硬盘脚本的集合

    操作系统兼容性 硬件相容性 贡献 支持 版本控制 作者 版权 执照 致谢 警示语 :warning: :warning: :warning: :warning: 执行“烧入/擦除”脚本将破坏数据! :warning: :warning: :warning: :warning:...

    开关电源必须符合所有功能规格、保护特性、安全规范(如UL、CSA、VDE、DEMKO、SEMKO,

    开关电源必须符合所有功能规格、保护特性、安全规范(如UL、CSA、VDE、DEMKO、SEMKO,长城等等之耐压、抗燃、漏电流、接地等安全规格)、电磁兼容能力(如FCC、CE等之传导与幅射干扰)、可靠性(如老化寿命测试)、...

    SQLServer2008查询性能优化 2/2

    7.7.1 统计的向后兼容性 186 7.7.2 自动创建统计 186 7.7.3 自动更新统计 187 7.7.4 自动异步更新统计 189 7.7.5 收集统计的采样数量 189 7.8 小结 190 第8章 碎片分析 191 8.1 碎片的成因 191 8.1.1 ...

    SQLServer2008查询性能优化 1/2

    7.7.1 统计的向后兼容性 186 7.7.2 自动创建统计 186 7.7.3 自动更新统计 187 7.7.4 自动异步更新统计 189 7.7.5 收集统计的采样数量 189 7.8 小结 190 第8章 碎片分析 191 8.1 碎片的成因 191 8.1.1 ...

    老服务器有RAID如何用U盘安装好Windows Server2003系统。

    很多时候老旧的服务器很多接口都老化,导致自带的光驱无法使用,自带的软驱也无法使用,但是现在我们都2022年了也没有几个人还有USB软驱这种古董,当然也可以用U盘模拟成A盘,但是兼容性不一定很好,而今天楼主也是...

    单片机设计流程.doc

    " " 完成电原理图设计后,根据技术方案的需要设计PCB图,这一步需要考" "虑机械结构、装配过程、外壳尺寸细节、所有要用到的元器件的精确三维 " "尺寸、不同制版厂的加工精度、散热、电磁兼容性等等,为最终完成这...

    DHCP客户端测试软件(dhcp for xcap)

    说明: 1, 暂未实现重传机制, 所以若抓包无...兼容性处理, 即option为IAAddress时按照IAAddress解析, 当option为status code时按照Status code解析 V1.0.16 1, 解决DHCPv6的client_id的duid处理, 支持任意格式的duid.

    研发程序文件.doc

    5.6.3涉及安全、電磁兼容的設計、電氣結構及關鍵元器件發生變更時,須及時向認 證機構提出申請,批准後方可實行變更。 5.6.4當產品安全性的關鍵元器件及影響EMC的關鍵元器件發生變更時,依據"產品變 更控制流程圖...

    高压变电站无线自动测温控制系统的设计

    (3)首次分析了无线测温系统在高压变电站中的电磁兼容性。 一方面研究高压设备对无线测温装置进行无线通讯的影响,进而研究提高无线测温装置的抗干扰能力的方法,如滤波或安装屏蔽装置;另一方面研究无线测温装置的...

Global site tag (gtag.js) - Google Analytics