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依然还是漫天的网络广告。

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2010/06/23/1763699.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)

相关文章
|
6月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
1472 2
|
9月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
1304 3
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
257 2
|
数据采集 存储 C#
C# 爬虫技术:京东视频内容抓取的实战案例分析
C# 爬虫技术:京东视频内容抓取的实战案例分析
|
SQL Java 测试技术
C#字符串拼接的6种方式及其性能分析对比
在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询、构建日志信息、格式化用户显示内容等。然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异。今天咱们一起来看看在C#中字符串拼接的常见6种方式及其使用BenchmarkDotNet进行性能分析对比。
433 6
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
261 11
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
266 10
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
357 5
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
613 5