为什么仍首选C ++来构建沉重的GUI应用程序而不是最新的动态语言?[关闭]


46

我看到大多数包含大量GUI内容的应用程序通常都是使用C ++开发的。大多数游戏/浏览器都是用C ++编写的。

我们不能仅使用最新的动态语言开发更好的GUI应用程序吗?我知道Java并不是一个很好的选择。但是,像python这样的语言本来就建立在C上呢?最新的语言难道不应该比他们的祖先更好吗?为什么相对于最新的语言,为什么我们仍然需要使用古老的C ++?

我也想知道,在C ++中,什么是负责GUI处理的更快速度?另一方面,其他最新语言缺乏什么呢?


22
如果您认为Java是一种“动态”语言,那么您对该词在这种情况下的含义深感困惑。
2011年

15
@Mike Baranczak:这是一个很长的故事。基本上,首先在斯坦福大学有一个研究项目,后来在Sun Research称为Self。自我是Smalltalk系列中的一种编程语言,比Smalltalk更简单,更强大,更具表现力,而且最重要的是,它具有更大的动态性。因为它被设计为一种编程语言(可以使用所有Smalltalk方言开发)来开发整个系统,包括(但不限于)台式机应用程序,服务器,操作系统,设备驱动程序本身,所以它必须非常快。因此,自团队发明了一大堆新的...
约尔格W¯¯米塔格

15
...优化技术,并在虚拟机自1987年就出来了(所以在1992年的第二代甚至更多),它快。它比任何其他Smalltalk VM都要快。自系统附带了大量的示例代码,并且其中的一个例子是Smalltalk的解释写的自我,甚至比任何其他的Smalltalk VM更快。自我比当时的许多C ++实现要快,甚至可以与C竞争。这是。然而,孙决定,他们没有必要为一个面向对象的编程语言或快速VM,所以他们...
约尔格W¯¯米塔格

15
...基本上耗尽了资金,使Self项目饿死了。当Self VM工程师让Sun感到沮丧时,他们很快被一家名为LongView的Smalltalk初创公司(这是他们大多数产品的名称,这是Smalltalk的可选静态类型系统:StrongTalk)广为人知。LongView知道他们永远也不会为Smalltalk出售静态类型,因此他们认为他们宁愿出售地球上最快的Smalltalk,然后以类似Trojan Horse的方式将StrongTalk包含在包装中。他们也意识到,没有一个很酷的...
约尔格W¯¯米塔格

15
...优化自我VM没有人以任何方式特别是自考,但均适用于几乎任何面向对象的语言(甚至只是任何语言)。因此,Self VM工程师必须在称为Animorphic VM的Smalltalk VM上工作。同样,Animorphic VM的运行速度令人目瞪口呆(实际上,即使在15年左右的时间里都没有碰到代码库,它仍然可以与现代高性能Smalltalks,JVM和.NET竞争,特别是如果您选择考虑到,它采用了比少了很多资源,因为它是专为486与20兆...
约尔格W¯¯米塔格

Answers:


58

我是编写C ++ GUI应用程序的人之一(大多数用于Windows)。确切地说,使用Qt。我的理由:

  • 我喜欢C ++。我是自由职业者,通常我可以选择我的工具(幸运的是我!)
  • 在托管环境中,当您需要使用一些非托管代码(C#中冗长的WinAPI声明,有人吗?)时,可能会遇到困难。
  • 更少的依赖项更易于部署
  • 更好地控制一切。
  • RAII(相对于GC)。即使我分配了new,我也很少delete显式地进行任何操作,因为我使用了智能指针或QObject层次结构。
  • 如今,C ++非常令人兴奋,我迫不及待地希望编译器完全支持新标准。
  • 速度(仅在列表的末尾。我知道这对GUI本身并不重要,但是它往往会更快,因为C ++程序不会受到运行时,字节码JIT编译和类似技术增加的开销的影响该程序。)

如您所见,这些大多是个人喜好。我发现使工作愉快是很重要的,C ++向我提供了这一点。


11
除了个人喜好外,+ 1速度绝对是最重要的原因。但是,我喜欢“ C ++如今非常令人兴奋”。为了解决提出问题的人,而不是@TamásSzelei:当然,通过新的思想,范式,技术,产品来快速地进行计算变化,但是最新和最重要的不是美德。C ++已经存在了一段时间,这并不意味着它已经过时,而是与更新的技术相比,它有着悠久的实践记录。原始的Stroustrup文本(发明者的书)内容繁重,但其他人也有很多不错的书-例如,查看oreilly.com。
therobyouknow 2011年

1
@塔纳斯(Tarnas)我认为“总是会更快”有点狭//权威,但不足以保证投票率……
最高

2
作为轶事支持:我参与了多个项目,以使用C ++和JavaScript在Windows上创建尺寸很大的GUI。我还参与了C ++和JavaScript的不同游戏控制台项目。在这两种情况下,JavaScript的速度和内存问题明显更多。
装满了机器人

2
晚了,但是您能详细说明“较少/容易部署的依赖项”吗?
weberc2 2014年

2
我使用C ++已有20多年了。自11、14和17以来,已添加了许多新的重要功能。您几乎可以将C ++用作脚本语言,并且仍然可以获得快速带来的好处。当我处理BIG数据时,几乎必须使用C ++,因为任何其他语言的速度都会慢10-1000。
Kemin Zhou

32

因为速度很重要。

  • 游戏使用C ++进行核心任务,而其中的性能至关重要。他们使用动态语言来编写脚本,而灵活性非常重要。

  • 桌面GUI应用程序:例如,Visual Studio是用.NET而不是本机C ++编写的。对于IDE来说,它似乎工作得很好,因为IDE本身不需要执行很多性能密集型任务。(编译器,链接器和其他工具不一定是用.NET编写的-尽管正如wawa在评论中指出的那样,有些似乎是(例如VB.NET))

  • 浏览器也需要快速。毕竟它们是辅助操作系统。另一方面,您可能会说Firefox的大部分实际上是用javascript写的,因为Mozilla框架似乎严重依赖javascript。

综上所述:我不会说C ++一定是首选,但是如果您有性能瓶颈,则必须更接近金属,然后再遇到C ++(或者C)。有时,用一种语言用C ++进行所有操作会更容易。


1
+1最佳答案:纯粹将速度作为使用C ++的首要原因。甚至Microsoft自己也承认,与c#和Visual Basic相比,C ++是性能最佳的-请在其Visual Studio页面上查看它们。紧随其后的是可移植性-如果您使用Qt之类的跨平台库。最佳答案也是因为它是客观的而不是主观的。
therobyouknow 2011年

2
您的第二点并不完全正确。VB.NET编译器用VB.NET编写,F#编译器用F#编写。C#编译器不是,但是从有关项目Roslyn的发布来看,我认为C#编译器正在用C#重写。
韦斯利·威瑟

5
视觉工作室gui(chrome)(用vs2010编写)是用c#和WPF编写的。解决方案资源管理器,构建系统,代码浏览器和工具箱是使用Winforms用c#/ c ++编写的。编译器是用c ++编写的。
马丁·贝克特

对于大多数桌面应用程序,仅渲染和布局引擎(即“视图”)需要快速。无论如何,Model并不会花费太多时间,并且Controller会花费大部分时间来等待用户做某事(几乎没有用户可以每秒点击10次,而可靠性很高)。
Donal Fellows 2014年

@MartinBa:我要注意,当前的C#和VB(Roslyn)编译器是用C#编写的。
jmoreno

17

您看到用C ++编写的GUI应用程序通常是这样做的,这是出于遗留原因。对于GUI应用程序,Python(带有Qt或Gtk)非常可行,如果您在Windows房屋中工作,则C#也是如此。当新的开始的东西,要么是非常多的首选C ++的,因为缺乏管道的工作有许多工作要做。


5
+1现有代码很重要。在开发新程序时很少完全从​​头开始

7
与Qt一起使用C ++与Qt一起使用Python有何优势?如果我今天要开始一个新项目,我仍然会使用C ++作为GUI。因为:a)这是我所知道的,b)它做得很好。仅仅因为C ++已经存在了一段时间并没有使其“过时”。
TZHX

2
@TZHX:“这就是我所知道的”是一个可行的论点。如果没有提供,则不必再照顾内存管理了,这将极大地提高性能,并且即使在单个项目中,也可能抵消了学习Python的努力。使用Python的另一个原因是跨平台性-对于C ++,您必须小心并采取特殊措施,而python可能就可以工作。
tdammers

4
对于认识C ++的人,我看不到将PyQt代替Qt与C ++一起使用的好处。
本杰明·B

13
C ++也可能会起作用。使用Python,您必须担心用户安装了哪个版本的python,或担心将其捆绑在一起。除非您犯了愚蠢的错误,否则“照顾内存”确实没有太多工作要做。我认为很多人将“内存管理”作为使用C ++的一大障碍,却并未真正知道它带来的变化。
TZHX

16

因为无论.NET之类的人群显示多少性能测试,无论它们在基准测试中的排名有多接近,最终C ++应用程序都会脱颖而出。冷启动时速度更快,更灵活,并且有更多改进方法。

我在项目开始阶段就听到了无数种证明,.NET是必经之路,但是一旦选择它,它们最终就成了沉重的麻烦。

而且,当今的C ++非常安全且易于使用,尤其是对于Qt或WTL之类的框架。


2
+1:“而且,如今的C ++非常安全且易于使用,尤其是在Qt之类的框架下……”我完全同意:我认为,最大的优势不是(仅)C ++本身,而是(1 ),将其编译为本地代码,(2)具有合理的功能集(OOP,模板),(3)具有非常好的框架(如Qt)。这弥补了该语言相当庞大且难以学习的事实:一旦掌握了该语言的一个不错的子集和一些优秀的库,您就可以真正提高生产力。
乔治

10

大多数游戏引擎都是用C ++编写的。同样,许多浏览器引擎都是用C ++编码的。但是浏览器GUI经常使用一些轻量级脚本(JavaScript,Python)进行编码。除了Source Engine以外,大多数游戏引擎还使用脚本语言(例如Lua或Python)。[供参考:Lua脚本游戏列表 ]

还可以使用流行的C ++ GUI库,例如Qt。在当前版本(4.7)中,它将QML用于GUI。QML基本上是带有Qt绑定的JavaScript。

因此,确实没有C ++ 动态语言混合在一起。


[需要引用]。我知道很多游戏都使用脚本语言来让用户扩展它们,但是据我所知,并没有很多游戏使用脚本语言来实现其发行二进制功能。
ProdigySim 2011年

1
@ProdigySim:我知道有几个这样做。在我头顶上,出现了魔兽世界(Lua + XML),顽皮狗的《神秘海域》系列(Lisp),虚幻系列(UnrealScript),基于Torque和Unity引擎的游戏,《地牢围攻》,《无冬之夜》等。数据驱动的游戏正在成为一种规范,脚本宿主从上到下接管了大多数(如果不是全部)UI功能和游戏状态。
greyfade

@ProdigySim:即使普通用户不知道它,也并不意味着他们在内部不使用脚本引擎。基本上,游戏开发人员有两种选择-为模型创建自己的脚本语言或使用通用语言之一。Lua特别适用于游戏,因为它通常适用于实时系统。
vartec

源引擎使用Squirrel脚本语言。
cubuspl42

6

第一个原因将是:(旧)习惯

第二个原因:虚拟机,需要安装的解释器等可靠性较低。

而且仍然有一些优秀的IDE可以用C ++开发代码。


1
仍然是出色的IDE”。我认为Visual Studio和Eclipse是最先进的,并且已经存在了很长时间。
JBR威尔金森

@JBRWilkinson:我没有说其他语言也没有。
2011年

6

原因是您对所有发生的事情都有更多的控制权。如果要使用C#编写Photoshop,则对于某些任务,您将遇到严重的性能问题。在具有更多控制权的较低级语言中,您可以采用快捷方式,针对更复杂的内容进行优化。当然,这假定您在非托管代码中使用C ++,而不是.NET中的C ++。

请参阅此处以获取快速示例。


2
Adobe Lightroom是Lua编写的,它基本上是Photoshop的子集。
约尔格W¯¯米塔格

4
@Jörg:其余都是C ++。实际上,这可能是可用的最佳组合,对于基础来说,是C ++,对于其余部分,是Lua(尽管在底层方面,我仍然更喜欢C而不是C ++)。
哈维尔

2
@Javier:是的,Lightroom基本上是来自Photoshop的图像处理算法(可能主要用MMX / SSE程序集编写)和SQLite3(出于可移植性用史前ANSI C编写)与Lua粘合在一起。Adobe还完全在Lua中开发了自己的Lua IDE。有谁知道他们使用什么图形工具包?AFAIR Photoshop几乎早于所有现代工具箱,因此它可能是本土生产的?
约尔格W¯¯米塔格

4
没有冒犯,但是,如果您认为ANSI C是史前的,则说明您在阅读错误的代码示例
哈维尔,

6

C ++是静态类型的。通过使编译器使您的抽象适合给定平台上的可用系统进程,可以预先优化代码执行。到目前为止,动态语言需要附加的软件层(即解释器),这会减慢对系统资源的访问。


4

给出的大多数原因是技术原因或“高于要求” ...以下是业务原因或“低于要求”:

分发已编译代码与分发源代码。在c / c ++中开发时,您将分发二进制文件。如果您正在使用一种现代语言进行开发,则可以分发源代码。很难将混淆器的想法卖给必须向股东/投资者做出回应的管理人员,这样就不必打扰。

愚蠢的用户:至少在管理人员的头脑中。他们仍然认为他们的用户几乎无法双击“ setup.exe”。如果您将口译的安装作为安装的一部分,他们会左右摇头。

旧的开发人员:大多数有经验的人已经存在了很长时间,并且没有保持最新状态。他们使用C ++编程,而不使用更新的语言编程,因为他们不了解更新的语言。


我认为发布.NET应用程序时您正在发布源代码。看一下Visual Studio的大部分界面都是使用WPF表单设计的。您的某些观点当然是正确的,当今的大多数管理人员都是昨天的开发人员,而今天的框架中的坏消息由于当今计算机的变化而不太可能成立。
拉姆猎犬,

许多有很多经验的人通过不断更新自己来积累经验。他们往往不会仅仅因为他们很热而学习热门的新语言(例如1980年代初期的Pascal),而是仅在他们有用或有有趣的想法(例如Haskell)时才学习。
David Thornley

4

我会将问题的范围从GUI扩展到预期具有竞争力的软件。C ++不涉及目标平台的税,因为它涉及处理能力,已安装的运行时,框架等。因此,与以托管/解释语言编写的类似解决方案相比,C ++可以在更有限的客户硬件上运行。在成功的商业软件的情况下,开发成本(对于C ++而言可能更高)由销售数量摊销。

另外,C ++通常提供对系统api(如GUI)的直接访问,这提供了最佳机会来优化利用率并使其与同类解决方案区分开。


3

我认为这很大程度上与GUI工具包的API有关。它们都具有C / C ++ API,但并非都具有(例如)Python绑定。有时,工具包本身是考虑到C ++编写的,因此即使它们确实支持其他语言,也不会完全支持它们(例如,它们将不支持Python tuple作为参数)。


哦,他们没有完全支持他们,因为他们不想这样做,或者没有时间实施。不是因为那不可能。
cubuspl42

2

您以浏览器和游戏为例。这两个都是非常重要的性能应用程序,因此使用低级语言来提高速度是很有意义的。

许多其他应用程序的性能限制较小,并且可以轻松地用其他语言编写。特别是C#似乎使用了很多。(还有Obj-C,但我认为它并不能算是高级。尽管比C ++更好。)

但是,肯定缺少最新编程语言的框架。例如,确实没有适用于Python的本地GUI库。当然,您可以使用PyQt或PyGtk,它们可以很好地工作,但是最后,那只是再次与C代码接口。同样,C#(也可以说是Obj-C)似乎是个例外,也许MacRuby或IronPython可以改变游戏规则。


0

对于要取代C ++或Java的语言,它除了要发挥自己的优势外,还必须做这些语言中非常想念的事情。同样,这些语言也投入了大量资金。这意味着在许多平台上都有一个标准的C ++库,浏览器,游戏和此类程序可以轻松使用。因此必然会有一些惯性。与其他软件不同,语言倾向于缓慢发展。

如果您看一看,Anaconda(RedHat的安装程序)已经存在了大约10年了,从一开始就是用Python编写的。Anaconda刚推出时,Python并不流行。

Google的Go(golang.org)发展非常迅速。编译器尚未启动。为了使其流行起来,它的库必须稳定,应该引导编译器,并且,更多的人必须使用它。我听说Google以外的一个生产程序是用Go编写的,据报道在它已经使用了一年多的时间里还没有出现停机。


1
其实,有一个商业围棋编译器为Windows这是写在围棋,所以对围棋自举编译器。(不过,它仍处于封闭测试中。)
JörgW Mittag

哦,那我没联系。感谢您的告诉:)
vpit3833 2011年

2
它称为erGo,由一家名为Newquist Solutions的公司生产。
约尔格W¯¯米塔格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.