半点优化网 http://www.bdxc.net/
当前位置首页 > 网站技术问题> 正文

用C#、C++、Java能编写出Adobe等级的行业软件吗?

2022-05-28 10:28:38 暂无评论 193 网站技术问题 C#   C++   行业软件

Adobe这种软件工具的核心是算法,你列的三种语言都可以很好地实现。

我90年代初做过断口图像处理的基金项目,有很多类似Adobe的功能,那时还没有上述CSharp、Java语言,也没有Adobe,用C语言写的软件,何况现在这些面向对象的语言。

C语言写,相当于手工打造。擦掉一根线都要按位进行各个点的异或处理,不象C#之类语言,删除一个对象即可。对图像进行降噪、去毛刺、二值化、特征提取都要编写相关算法。比如边缘增强、平滑处理要用到插值算法,模式匹配用到圆邻域方法……现在很多算法都有函数库,通过接口调用就行了,简单了很多,用C#、C++、Java处理起来绰绰有余。

用C++当然可以写出adobe的软件,因为它们本身就是用C/C++写的。这里我没有区分C和C++,可以不严格地认为后者就是前者的超集。

现在重点讨论的是C#和Java到底能不能写出类似adobe这样的软件。

二八原则我们都听过,我们多数人可能只用到了adobe的20%的功能,但是它却可以满足80%的需求。如果问我们能否用C#和Java去实现这20%最基本的功能,那自然是没有问题的。现在网上就有用C#写的图像处理软件,对标photoshop。

但是一个优秀软件、专业软件,它们的竞争力恰好是那普通人很少用的功能。就像一辆汽车一样,基本功能很多厂家都能做(有的国产车可以卖到5万以下),绝对能满足多数人80%甚至99%的代步功能。而贵车就强在一些不常用或不必须的功能,安全问题就是其中之一。我们可能一辈子都经历不了一次车祸,但是遇到了,贵车就更能保命。

我们先以adobe的photoshop为例。基本的图像处理,对于C#和Java来说那都不是事,无非就是加载图片、缩放、颜色、像素、保存等等这些东西。但是,很多人可能没有意识到,C#和Java是运行在虚拟机上的,它们的核心代码用的就是C/C++。当我们写一个Jpg加载程序时,你以为你写的是纯粹的C#和Java,而实际上后端的关键实现是用的C语言。

为了证实这一点,我特地去网上下载了一份JDK的源码,清清楚楚地看到了在某一个native目录下,放着用C语言写的JPG处理程序。

除了Jpg,还有zip压缩、音频、视频处理也是用的C语言。

网上几乎很难找到有用纯C#和Java写的JPG处理程序。光是JPG的图片格式,都可以写一本书。不是那么容易的。就算写出来了,其性能也远远不如C/C++。

你可能会说两点:一、虚拟机自带的JPG足够用了,那本身就是标准库,是语言的一部分。第二、用纯C#和Java去实现JPG等算法,似乎性能不会低,无所谓。

第一、JVM和.Net framework自带的JPG能满足大部分需求,但是一旦涉及优化和修改,就傻眼了。而PS专业处理图像,必定需要反复优化。举个不一定对的例子,或许虚拟机只能处理某种最最主流的Jpg标准,遇到非主流就无能为力了。

第二、在底层算法方面,C#和Java是无法与C/C++比速度的。这得益于后者对内存的精确掌控。这个具体原因讨论起来可以单独开一个帖子了,就不再展开。只说结论,现在主流的各类语言,在涉及复杂算法,特别是运算密集型时都用的C和C++(也有用fortran、go、rust的)。JPG、压缩、加密、MP3、MP4、机器学习,等等。说到机器学习,有人说脚本语言python不是大行其道吗?其实python的大部分优秀算法底层都是C/C++,比如大名鼎鼎的tensorflow。

至于说现在硬件性能很高了,性能低一点无所谓,这就又回到之前的问题了,就是什么叫专业软件。一辆5万的汽车和50万的汽车,性能差别也是几乎可以忽略不计。起步块?动力足?跑高速能飙到180?这就是二八原理了,人们往往反而喜欢这些不太重要的细节。我哪怕起步比你快0.1秒,我也自豪!你先别管我敢不敢跑不跑180码……专业软件也是如此,就是快,你别管我快几秒能干啥。要的就是体验……

上面说的还主要是JPG举例。如果遇到音频、视频这类专业adobe软件,C#和Java将更显得无力。尤其是视频。JPEG,比MPEG-4,完全不在一个难度系数等级,对性能要求也高很多很多。不信?你看看网上能不能找到相关的MP4源代码,C语言除外。

其实C#和Java也是可以写出类似adobe的专业软件,只不过不是纯粹的,是要和C/C++结合使用。前者负责写上层框架,特别是图形界面,后者负责其中一部分复杂的算法实现。

猜你喜欢