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)

相关文章
|
16天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
1月前
|
安全 数据安全/隐私保护 开发者
三款.NET 代码混淆工具比较分析:ConfuserEx、Obfuscar 和 Ipa Guard
三款.NET 代码混淆工具比较分析:ConfuserEx、Obfuscar 和 Ipa Guard
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
65 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
1月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
58 1
|
1月前
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
91 0
|
30天前
|
算法 安全 大数据
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(二)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
48 0
|
9天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
29天前
|
算法 Java C++
【C/C++ 内存知识扩展】内存不足的可能性分析
【C/C++ 内存知识扩展】内存不足的可能性分析
12 0
|
29天前
|
存储 监控 Linux
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
48 0
|
29天前
|
存储 算法 C语言
【C/C++ 链表结构】探索链表迭代器:C++实现的深入分析与优化策略
【C/C++ 链表结构】探索链表迭代器:C++实现的深入分析与优化策略
36 0