• C# vs. C++/C : 从技术管理角度的分析(附: .Net 在桌面领域的潜敌分析)


        产品是由一系列属性组成,如,价格,性能,可移动性等。对于程序开发语言来说,就是性能、开发速度、可维护性等。对于产品的某个属性,并不是这个属性越高越好,只要足够高就行了。绝大多数人绝大多数场合,对产品的要求不是要求它“最好”,只是要求它“足够好”。当足够好之后,人们就会去关注其它的属性。

        举例子,就拿人来说,吃东西,不是吃的越多越好,当人吃饱了,就会想别的花花肠子,所谓保暖思淫逸。拿电脑来说,当一个电脑性能足够用之后,我们可能就会要求它可携带、便携,当可携带之后,我们的关注点可能就是待机时间或其它要求了。

        因此,本文的立足假设就是:市场上对一个产品的某项属性要求有一个满意线,超出这个满意线,就可以被市场接受,此时,不同产品之间竞争的主战场就会切换,从一个属性变化到另一个属性。

    image

        而市场是多样化的,每个市场对属性的要求不同。我简单的画一张图(上图),这个图上横坐标是时间,纵坐标是程序的性能。为了简化讨论,在这里只谈性能,至于其它的,用类似分析方法可以分析。一般来说,随着时间发展,程序的性能是逐步提高的,我们就假设C#的性能低于C++,是对方的0.X倍。这里假设有4个市场A、B、C、D,4个市场对程序性能的需求不同,A要求最高,B其次,C再其次,D最没要求。市场对性能的期望也是上升的,常见的情况就是上面的模式:市场对性能的需求是逐步上升的,产品的性能也是逐步上升的,但后者上升的比前者快。

        上图中有3个时间点。在时间点1,C#还没出生,C/C++的性能可以满足D市场的需求,哈哈,这时候,D市场里的技术人员纷纷选择C/C++开发,这时A、B、C市场上的开发人员没办法,只能一句一句汇编的写。在时间点2,C/C++可以满足A、B、C、D四个市场的需求了。C#也发展到可以满足C、D这两个市场的需求了。此时,C、D两个市场上的技术人员,在选择技术时,就不再关心C#的性能问题,他们的关注重心是性能之外的事情,而C#在快速开发、可维护性上要优于C/C++。此时,选择C#就是正确的选择。而A、B两市场上的开发人员则绝不会考虑C#,因为性能不过关。时间继续发展,到了时间点3,B市场的一些先行者突然发现,C#可以满足他们的性能要求了——于是,C#又蚕食掉了C/C++的市场C。

        当然,世界中的事情比这复杂的多,这幅图只是简化之后的阐释。上面这些文字,最核心的2个意思是:

        (1)我们对大多事物的要求只是足够好,不是最好,当一个方面足够好了,人们的关注点会迅速切换到其它方面去;

        (2)由于市场之间的交叉性很差,致命的竞争对手往往潜伏在别的领域,而不是目前正在正面竞争的技术。

        对于第(2)点,再画一张图来解释:

    image

        这张图上只有两个市场A、B,这两个市场相隔甚远。有甲、乙、丙三种技术,在时间点1,只有甲、乙两种技术能满足A市场的需求。于是甲和乙两种技术缠斗不休,打呀打呀打呀,打到时间点2。这时丙技术虽有发展,但还是不能满足A市场的需求,A市场上没有丙技术的影子。甲和乙眼里只有对方,仍然互相踩啊打呀骂啊。到了时间点3了。甲和乙依然还在打啊打啊,这是A市场发现,丙技术能满足他们需求了,此外发现,丙技术还具备甲、乙技术所不拥有的其它优点。然后丙技术很快在A市场上传播开了,甲技术和乙技术傻眼了…… 市场的急剧变换就是这样发生的。想想摩托罗拉是怎么衰落的?

        换到C/C++/C#可以推断,C#会对C/C++的现有市场逐步蚕食,从D到C到B到A……

        但是——

        (1)考虑到现有的在C/C++上的投资,并不一定会完全的转移到新技术上去

        (2)其它市场,如嵌入式这一块如今发展凶猛,在这一快速发展的领域,C往往是最先满足需求的技术(如性能,内存占用,编译器的复杂程度等),C++是其次,C#是最后。因此表现就是,C#蚕食C/C++的老市场,C/C++不断的进军新市场。如果C/C++扩张速度大于被蚕食速度,那么在语言的份额上,C/C++依然是逐渐扩大的。

        具体我们在技术的选用上,就要看这个技术是否在某方面已经足够用了,然后多方面考虑进行决策,而不是这个技术是不是最NB的。

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

        本文最想说的不是上面这些,而是下面的——

        螳螂捕蝉,黄雀在后。C#在蚕食C/C++,但有一个潜在的对手,可能威胁到.Net在桌面开发的未来地位。而目前,绝大多数人对这个潜在的敌人还不甚了解。本文重点就是介绍这个潜在的对手。

        这个潜在的对手就是Flash。Flash的主流市场是网络广告,然后是视频网站,这个市场和桌面开发完全是不沾边嘛!但是——请听我一一道来:

        (1)Flash是一个虚拟机平台,跨平台的,还可以在很多手机上应用。我们以前可能觉得.Net是平台,Java是平台,但Flash也是一个平台,这三个平台之间没有啥本质的区别。Flash理论上也可以支持多语言,事实上,相关项目已经启动了。Flash/AIR可以运行在桌面。

        (2)Flash的主流语言as3很强大了,已非昔日阿蒙,除了语法略有不同外,它几乎是和C#最相似的语言。有属性,有事件,有function,有接口,有异常,有比较强悍的静态类型系统,也有动态类,有反射,有Remote(as3的Remote非常好用的!),当然,缺乏的也不少,最主要的是缺泛型。as3性能也很不错,我简单的测试结果是Flash程序大约相当于sl程序性能的80%,而不用unsafe,sl性能和wpf是相当的。重构啊,单元测试全部都支持的。

        (3)在UI上,和Flash/Flex对应的是WPF+Silverlight,不是Silverlight。目前Flex已经是4.0了。至于Html5,现在还在打酱油,本文除了这句话外,再也不会提及它。

        (4)在IDE上,Flash Builder已经很好用了。此外还有古老的Flash和新生的Flash Catalyst。Flash现在是有3个不同定位的官方IDE,可满足于不同的需求。

        下面,就以一个简单的Hello World来演示一下Flash开发和.Net开发的相似性。

    image

        上图是Flash Builder。由于是在Eclipse基础上开发的,有过Eclipse使用经验的可以快速上手。同时,它的开发模式和VS下WPF开发是非常类似的。而WPF在VS2010之前还无法拖控件,Flash Builder(Flex Builder)很早就可以拖动了。同时,Flex也提供了很多现有控件的。上面,我拖了2个控件,一个Label,一个Button。然后在Size and Position中,我设置了这个button的定位约束在右下方。

    image

        上图是官方的控件。常用的都有了。

    image

        上图是属性面板,里面列了button的属性和事件。带“闪电”图标的是事件。双击即可自动产生方法。比如,双击click,可产生:

    protected function button1_clickHandler(event:MouseEvent):void
    {
    }

        点击时让label显示helloworld,可在方法体中添加:

    this.txt.text="Hello world.";

        到现在为止,只写了这一行代码。然后运行,可以得到:

    image

        下面是完整的代码:

    <?xml version="1.0" encoding="utf-8"?>
    <s:WindowedApplication xmlns:fx="
    http://ns.adobe.com/mxml/2009"
                           xmlns:s="library://ns.adobe.com/flex/spark"
                           xmlns:mx="library://ns.adobe.com/flex/mx" width="375" height="242">

        <fx:Script>
            <![CDATA[
                protected function button1_clickHandler(event:MouseEvent):void
                {
                    this.txt.text="Hello world.";
                }
            ]]>
        </fx:Script>

        <fx:Declarations>
            <!-- Place non-visual elements (e.g., services, value objects) here -->
        </fx:Declarations>
        <s:Button label="Click Me" click="button1_clickHandler(event)" right="10" bottom="10"/>
        <s:Label x="42" y="48" id="txt"/>
    </s:WindowedApplication>

        Flash的数据绑定非常简洁。改写成数据绑定版本:

    <?xml version="1.0" encoding="utf-8"?>
    <s:WindowedApplication xmlns:fx="
    http://ns.adobe.com/mxml/2009"
                           xmlns:s="library://ns.adobe.com/flex/spark"
                           xmlns:mx="library://ns.adobe.com/flex/mx" width="375" height="242">

        <fx:Script>
            <![CDATA[
                [Bindable]
               
    private var message : String;
                protected function button1_clickHandler(event:MouseEvent):void
                {
                   this.message = "hello world";
                }
            ]]>
        </fx:Script>

        <fx:Declarations>
            <!-- Place non-visual elements (e.g., services, value objects) here -->
        </fx:Declarations>
        <s:Button label="Click Me" click="button1_clickHandler(event)" right="10" bottom="10"/>
        <s:Label x="42" y="48" text="{this.message}"/>
    </s:WindowedApplication>

        这些年来,Flash在悄悄的布置阵地,现在这个阵地已经成型了。由于关注于UI,这个虚拟机很小,语言也很实用很轻量级。部署在桌面的话也只是10M上下,而类似的WPF程序的部署大小是30M-40M。同时,还是跨平台的。并且,浏览器应用和本地应用之间的差异很小。开发速度也很快,比.net的开发慢不了多少。http://www.taaz.com/makeover.html 这是一个非常NB的Flash Web程序,我只用了5周时间就已经实现了它除了自定义模特之外的主要功能!

        目前Flash还有一些非常大的缺陷,如虚拟机的成熟度仍然不够,还有桌面程序目前还不支持本地调用。前者依靠时间来完善,后者也需要等等。如果这些实现了,将是C#在桌面上的极大的威胁!但目前,.Net还很不在意Flash的存在,大家头脑中想起Flash依然还是漫天的网络广告。

     

  • 相关阅读:
    前端面试的一道数组元素值去重问题
    数组元素前移,第一个元素放置数组末位
    Linux 查询oracle错误日志&警告日志
    CentOS 6.4 源码安装MySQL 5.6
    Oracle 表空间不足引起的问题及解决方法
    Oracle 强制中止正在执行的SQL语句
    request for member 'GetByteArrayElements'
    jni入门 eclipsecygwin+ndk
    ffmpeg结构体(二)
    ffmpeg结构体(三)
  • 原文地址:https://www.cnblogs.com/xiaotie/p/1763699.html
Copyright © 2020-2023  润新知