为什么有些程序是用C ++编写的,而其他程序则不是?

时间:2009-02-16 07:55:56

标签: php c++ cross-platform

这是我一直想知道的事情。

将instpad ++用于instace。维基百科告诉我它是用C ++编写的,它只是Windows版本。

现在拿PHP。维基百科告诉我这也是用C ++编写的,但也可以在其他操作系统上运行。

但我看到更多的语言,然后只是C ++ for PHP ...这是怎么做到的?他们是否在C ++中创建了一些新代码,看看它是否有效,然后弄清楚如何在Perl中执行它,或者会发生什么?

8 个答案:

答案 0 :(得分:11)

这取决于您是否使用特定于平台的库。 Notepad ++是一个桌面应用程序,它需要一个GUI工具包。虽然有像Qt和wxWidgets这样的跨平台C ++库,但Notepad ++可能正在使用微软的特定技术。因此,它不能移植到其他平台。

另一方面,PHP是一种WEB脚本技术,因此不需要GUI库。与Notepad ++相比,在许多平台上运行PHP的兴趣要大得多。这是开发人员使C ++代码跨平台的一种激励。

避免使用特定于平台的库不是C ++跨平台应用程序所需的唯一内容。它通常意味着编码最小公分母并为每个支持的平台保留不同的代码分支。虽然C ++是一种跨平台语言,但每个系统都有自己的复杂性。事实上,如果要使用不同的编译器,代码在同一平台上也可能不同。尝试下载开源应用程序的C ++源代码,例如PHP。您会注意到所有平台的大部分代码都是相同的,但也会有不同的位。有时会使用预处理程序指令,其他地方则涉及完全不同的源文件。

因此,创建一个真正的跨平台C ++应用程序是一项艰巨的工作,通常是在有强烈动机的情况下创建的,并且很多人都参与其中。像Notepad ++这样的单人应用程序实际上不能跨平台。

答案 1 :(得分:4)

通常,在单一平台上运行的程序可以使用操作系统中的一些功能(例如,系统调用来处理窗口,按钮,服务)。显然,代码严格依赖于系统,不能在其他环境中工作。对于跨平台软件,您可以遵循几种方法,其中一些方法是:

  • 您可以独立于操作系统和脚下的东西进行编程(因此您不使用操作系统设施,框架等)。
  • 您使用以这种方式编程的库和工具进行编程,因此可以在多个操作系统下工作(例如,您使用跨平台的Qt或wxWindows来管理窗口和接口)。
  • 您构建了几个版本的代码,以处理它将运行的各种体系结构的特殊性。这样你就可以获得更高性能和“更好”的软件,因为代码针对自己的架构进行了优化,但是很难维护。

我认为大多数语言都是以第一种方式工作,但有时他们可以使用操作系统调用来获得一些性能(在这种情况下,您将拥有例如PHP for Windows,PHP for MacOS,...)。

答案 2 :(得分:3)

与Java和C#,C ++等现代语言不同,该语言仅提供基本功能。它没有处理用户界面,线程,网络交互,加密甚至读取XML的标准方法。相反,对这种功能的支持由操作系统决定。 Windows提供了一个名为Win32的广泛API集,为Windows编写的应用程序可以利用它们。在Linux和其他操作系统之上构建了类似的API。每当作者利用特定操作系统的库时,他们就会使其程序无法在其他操作系统上运行。

通过抽象出与操作系统交互的项目,可以编写一个可以跨操作系统工作的C ++程序,但这并不简单,也不常用。

答案 3 :(得分:1)

C ++是一种固有的跨平台语言;只是有很多用C ++编写的库使用特定于特定平台的特性,因此这些程序仅限于该平台。避免使用那些特定于平台的功能,并且你已经拥有了一个C ++程序,可以在大多数平台上编译而不会有太多麻烦。

答案 4 :(得分:1)

Notepad ++仅适用于Windows,因为Notepad ++是Windows Notepad的替代品,这是非常糟糕的。任何自尊操作系统上的任何人都不会使用名称中包含“记事本”的编辑器;>。

Notepad ++的核心是Scintilla text editor component,它是跨平台的(Linux,OS X和Windows),可用于跨平台和特定于平台的applications。核心视图逻辑是共享的,具有用于与窗口系统和图形上下文连接的抽象类。应用程序采用跨平台组件并将其绑定到特定于操作系统的窗口和图形上下文。我最喜欢的Linux和Windows编辑器是SciTE,这是一个围绕编辑器使用Lua脚本编写的非常快速的包装器;还有Komodo将Scintilla编辑器组件包装在Mozilla XUL容器中 - 另一个跨平台C ++堆栈。

跨平台制作应用程序需要一些成本;如果在这些平台上有潜在用户,那么投资是值得的。

答案 5 :(得分:0)

  

现在拿PHP。维基百科告诉我这一点   也是用C ++编写的,但是运行起来   在其他操作系统上也是如此。

PHP是用C语言编写的,只是为了让它在更多平台上可用。甚至有规则只能制作C风格的评论,而不是C ++ //.

请参阅PHP coding standards

答案 6 :(得分:0)

除了特定于平台的库和API之外,C和C ++也不是真正的跨语言(出于好的理由)。他们故意留下许多未指定的细节,例如类型长度,字节序,结构中的变量对齐以及是否初始化新​​分配的内存。

这允许您编写(特定于平台的)代码,其速度与CPU可能的速度一样快,但这也意味着如果您希望代码可移植,则需要额外的工作和测试 - 许多人定位Windows / x86平台可能会跳过。

答案 7 :(得分:0)

其他人评论了GUI以及仅存在于主要平台子集上的其他库的使用。

另一个因素是开发人员。许多开发人员(或软件公司)只拥有专业知识,访问权限,客户需求或需要使用单一平台,因此他们不会花费额外的精力来使他们的软件跨平台。例如,如果一家公司在每个人的桌面上都有Windows PC和开发人员工具,那么没有内部开发或测试的Linux或Mac机器,也没有那些在其他平台上是专家的开发人员,也没有大型客户需要不同的平台,他们很难证明不仅仅是使用仅限Windows的软件包。如果他们以后改变主意,当他们拥有专业知识,设备或其他要求时,他们可能会发现修复一个已经被允许变得非常依赖于平台的大型代码库已经太晚了。

平台独立需要付出实际努力,每一步都是如此。如果从第一天开始计划,使用跨平台库(例如,Qt,boost,OpenGL等,小心避免MFC,DirectX等),并定期在所有平台上构建和测试,它可能只有10个制作一个优秀的跨平台应用程序需要多花20%的精力。但是如果你从一个已经开发了很长时间的单平台应用程序开始,那么跨平台创建它可以花费尽可能多的努力从而从头开始编写,如果新平台有相对较多的话,这可能特别难以证明您所在行业的市场份额很小,或者您的开发人员不喜欢这样做。