为什么程序不以编译格式分发?


32

但是他们给出的指示像

cd downloaded_program
./configure
make install

这将创建所需的ELF,可能还会创建一些.so文件。

为什么不将它们放在zip文件中进行下载(例如Windows应用程序)?有什么理由需要用户编译它们吗?


18
这就是源代码的分发方式。您用ubuntu标记了它-您尝试过这些apt东西吗?
mikeserv

11
Ubuntu:40,000个最常见的程序:$ sudo apt-get install [name]。较为稀有的软件:某些软件必须使用{cmake .. && make,./configure && make,waf,scons等。〜10个构建选项}从源代码构建。
努德·拉尔森

6
您有三个Windows©版本和大约100个“ Linux OS”版本。无法维护和存储超过(40,000)个最常见的程序。
努德·拉尔森

35
这个问题是错误的。大多数软件是以二进制格式分发的,通常以.rpm.deb.tgz软件包形式分发。该资源也分发给那些希望自己进行编译,检查或修改,或打包为一个或多个发行版的用户。没有人.zip在Linux上分发二进制文件,因为.zip文件不支持基本信息,例如用户,组和对其包含的文件的权限。
cas

2
我还不需要编译我想运行的任何Linux程序。可执行文件始终可用...到目前为止。
user2338816

Answers:


34

让我们分析一下因素...

分析

平台的依赖性:在开发人员创建和维护应用程序的几种特定于体系结构的变体的环境中,会出现一些问题:

  • 不同的变体需要不同的源代码-不同的基于UNIX的操作系统可能使用不同的功能来实现相同的任务(例如strchr(3)vs. index(3))。同样,可能有必要针对不同的变体包含不同的头文件(例如,string.h与strings.h)。

  • 不同的变体需要不同的构建过程-不同平台的构建过程有所不同。差异可能涉及诸如编译器位置,编译器选项和库之类的细节。

  • 必须将用于不同变体的构建隔离开来-由于只有一个源代码树,因此必须注意确保一种体系结构的对象模块和可执行文件不会与其他体系结构的混淆。例如,链接编辑器不得尝试使用为SunOS-4构建的对象模块创建IRIX-5可执行文件。

  • 每个操作系统都有其自己的链接管理方案,并且必须根据需要准备ELF(可执行和链接格式)文件。

  • 编译器将生成一个由一系列指令组成的构建,并且不同的体系结构意味着不同的指令集(指令集体系结构比较)。因此,每种架构的编译器输出都是不同的(例如:x86,x86-64,ARM,ARM64,IBM Power ISA,PowerPC,摩托罗拉6800,MOS T 6502

安全性

  • 如果下载二进制文件,则不能确定它是否按照其说明的方式工作,但是您可以尝试审核源代码并在系统中使用自编译的二进制文件。尽管如此,用户Techmag在其评论中还是指出了一个很好的观点,对代码进行审核需要知识渊博的合格编码人员来评估代码,而不是安全的保证。

市场:在这一部分中,有很多因素,但是我将尝试恢复它:

  • 并非每家公司都打算将所有平台都推向市场,这取决于市场和平台的知名度以及他们想出售的产品。

  • 自由软件本着使软件尽可能广泛可用的精神,但这并不意味着该软件是为每个平台设计的,它取决于支持它的社区。

结论

并非每种软件都针对每个平台设计的。为所有架构和平台提供二进制文件意味着要对其进行编译,测试并为所有平台进行维护。这项工作有时成本太高,如果用户在自己的平台上进行编译,则可以避免。而且,用户将知道他正在执行什么。


1
我认为通过更明确地说明处理器模型差异以及10年前每个Unix变体基本上都有自己的差异,可以改善此答案。Linux并不是今天的普遍影响。
2015年

@Sobrique:或者甚至提到处理器模型本身的差异-十年前,过去我们拥有的类型不止今天两种,Linux几乎都在它们上面运行(我本人在PowerPC上运行Linux)。今天它与x86,AMD64(也称为x86-64)和ARM仍然部分相关。如今,MIPS在可以制造自己的芯片的人们中仍然很受欢迎,因为它现在完全没有专利。
slebetman 2015年

抱歉耽搁了!谢谢你们俩!我添加了一些有关cpu体系结构的参考,还添加了一个指向比较列表的链接。我不希望答案这么大。但是是的,这非常重要!
Facundo Victor

1
该安全注释表示读取器/安装程序知道如何阅读和理解代码。鉴于shellshock漏洞可以幸免了几十年而没有被发现,因此我谨此建议,这是一种错误的信念。它确实允许知识渊博的胜任的编码人员对代码进行评估,但是它并没有像宣传的那样真正地阻止安全。它实际上可能产生相反的效果。如今,由州和有组织犯罪资助的黑客有可能为开放源代码图书馆/项目的所有庄园贡献代码,以期为下一次轰炸开辟新的大门……
Techmag 2015年

你是对的!我修改了答案以反映这一点。我试图不失去对答案主要目标的关注。谢谢Techmag!
法肯多·维克多

10

* nix和其他多种平台和软件环境都可以在其上运行该软件,从而允许您构建应用程序(或与应用程序一起使用的库)是唯一可行的支持这些组件的许多组合就像一个“好的”软件一样。当然,诸如GPL之类的许可证要求源代码可用 -因此,即使该软件无法正常运行,通常也可以为用户提供服务(尽管理解错误和解决方法可能很棘手)或某些第三方潜入并进行更正,即使创建者不会/不再/不再存在这样做也是如此。

将软件作为源代码分发还可以进行独立验证,以验证该软件是否执行了其声明的工作,并且没有做任何令人讨厌的事情,尽管这样做降低了人们对创建者的信任程度,但实际上可以增强它!


8

首先,您的问题基于有缺陷的前提。程序分布在编制格式!

像大多数其他Linux发行版一样,并且在大多数Unix变体上更普遍地,在Ubuntu上安装软件的通常方法是安装软件包。在Ubuntu上,您打开软件中心或其他软件包管理器,然后浏览可用的软件。选择要安装的软件包时,二进制文件(如果软件包包含程序)将下载并安装在计算机上。

默认情况下,程序包管理器为您提供由分发维护者制作的程序包。您还可以找到第三方软件包来源。Ubuntu提供PPA作为第三方提供软件包的标准化方法。

从作者那里以编译形式下载软件是不得已的选择。仅当软件不流行而无法打包时,或者如果您绝对需要尚未打包的最新版本时,才需要这样做。大多数人根本不需要这样做。

如果未打包软件以进行分发,则通常以源代码形式而不是二进制形式分发软件。导致这种情况在Linux世界中经常发生而在Windows世界中很少发生的两个主要原因。原因之一是Linux上开源程序的比例更高。显然,如果程序的源代码不可用,则唯一的分发形式是二进制。另一个原因是Linux世界更加多样化。每组不兼容的库版本都需要不同的二进制文件,这通常意味着每种发行版的每个版本都有不同的二进制文件。Windows通过让每个程序包作者分发他们与程序一起使用的库来“解决”这一问题(结果:您的计算机存储了每个库的许多副本,每个使用它的程序都存储了一个副本;如果某个库中的错误已修复,每个使用它的程序都必须发布更新),并且仅每三年左右发布一次新版本的操作系统。Unix具有更多的多样性和更及时的错误修复习惯,并且通过为不同的发行版构建不同的二进制文件来解决库发行问题。


5

Linux不仅可以在一个特定的CPU平台上运行。如果您分发ELF文件(或任何其他类型的原始可执行文件),则某些版本的Linux可能无法运行该软件。本着使软件尽可能广泛可用的精神,首选使用源代码。例如,Linux在Sparc,Intel,AMD,ARM和其他类型的处理器上运行。

例如,如果ELF文件专门针对Intel处理器,则其他类型的硬件将无法运行该软件。ELF是独立于平台的,但其托管的代码需要符合平台的机器代码。您会注意到有多少发行版具有相似的程序包(例如,当_386和_586程序包支持不同的处理器时,它们)–您必须安装正确的ELF文件才能进行正确的操作。

同样,如果我决定构建一个使用不同中断,链接器等的自定义Linux版本,那么我仍然需要源代码来编译代码。即使源代码没有特定于平台的构建指令,每个平台也有所不同,并且可能无法从其他系统运行ELF。


这就是为什么您可能像在“ 64位” Windows OS上运行许多其他程序一样运行32位firefox的原因,而64位linux通常运行64位应用程序。
mchid 2015年

5

分发作为源的最初原因当然是平台的多样性。出于这个原因以及出于新的,部分出于政治目的的原因,Linux社区继续使用该方法。

与Windows不同的是,Linux历来从未在长时间内保持任何ABI(应用程序二进制接口)稳定-认为在可执行格式,库API和对新硬件平台的支持等方面进行创新的可能性更多重要。

商业操作系统通过严格控制创新来实现长期的应用程序兼容性。总是需要在旧的功能上添加新的功能/软件界面,这需要维护两件事,并且发布后更改任何内容的代价都被认为很高。或者,您可以与计划为应用程序淘汰的事实以及任何为您的OS编写软件的人一起接受这一事实(这并不是在暗示MS,而是其他OS厂商)。

对于仅以二进制形式(在给定的Linux发行版之外)分发的软件,如果要获得长期稳定的平台,Linux社区的某些成员甚至认为这是不可取的。作为两个平台的用户,我并不是说这是好是坏。就是这样。


4

在许多情况下(至少在* nix世界中),源代码是软件的最可移植版本。拥有源可保证共享软件将在可能支持它的每个平台上运行(在许多情况下,这仅意味着POSIX兼容)。发行二进制文件仅保证与这些二进制文件针对的平台(软件和硬件)兼容。

考虑到在Windows上,二进制文件是共享软件最方便,最可移植的形式。由于编译源代码不是常规Windows软件分发模型的一部分,因此Microsoft多年来竭尽全力确保二进制文件可在其操作系统的多个版本中工作:http : //www.joelonsoftware.com/articles/APIWar.html


5
Windows也取决于基础架构。启用ARM的Windows应用程序无法在常规笔记本电脑/台式机上运行,​​依此类推。这就是Linux具有更好的硬件支持的主要原因-因为编写的代码可以在具有健全Linux实现的任何平台上进行编译,而Windows则取决于存在的已知硬件类型。
phyrfox

如果您构建Windows / x86,则将覆盖95%的二进制兼容性。很好 尽管Linux / x86变得越来越普遍,但我们来自一个世界,在这个世界中,您拥有各种各样的大人物,他们拥有自己的特殊处理器体系结构和Unix变体-与二进制不兼容。
Sobrique

@Sobrique您从哪里获得了95%的数字?上次查看时,每1 x86有4个ARM CPU。几年前,每个人都开始使用带有ARM处理器的智能手机。因此,如果我们假设没有其他处理器占20%。
ctrl-alt-delor 2015年

3

大多数Linux软件是免费软件。通过使用一些编译指令而不是二进制文件来分发源代码,您就有机会在编译之前查看甚至编辑源代码。这样,您可以非常确定该程序实际执行的操作,并且它不会有害。


0

我个人不喜欢仅获取程序可执行文件的主要原因是因为我想先检查一下源代码的实际作用(主要是因为我只是喜欢看别人的代码),但我知道其他几个人他们还会检查源代码中是否存在恶意代码。


0

许多答案表明,在大多数情况下,软件分布在编制格式。我同意这个假设。不过,我看到了一种情况,即按源分发软件比以编译格式分发更好。

我不确定这是真的,但我可以想象,在Internet的开始阶段,由于网络带宽不好,有时按来源分发软件可能比以编译格式分发软件更快。由于代码源只是纯文本,因此它通常比编译格式的软件小。因此,如果用户能够编译带有代码源的软件,则似乎是共享它的更好方法。


0

除了有许多可以在许多不同平台上运行的Unix系统这一事实之外,只需考虑Windows软件从此发行模式中所面临的问题,尽管他们实际上只需要担心Windows的一个版本和一个平台(PC )。

即使只需要担心PC,还是有两种体系结构:32位和64位。如果您注意到,绝大多数Windows软件只会忽略64位,而只会提供32位软件,如果您使用的是64位系统,那么您将获得次优的软件。然后是图书馆。如果您尚未安装适当的库,则一个软件供应商不希望您在尝试运行其程序时遇到奇怪的错误,因此他们只是将库包含在其程序中(即使您已经拥有该库,下载也会更大) )。第二个程序执行相同的操作,但是库的版本不同。在最佳情况下,程序B包含一个向后兼容的库的较新版本,因此,如果您安装程序B在之后程序A可以正常工作,但是以相反的顺序安装它们会使您使用旧版本的库,因此程序B会中断。但是,库供应商常常会进行向后兼容的更改,并且不会更改库的名称,因此,无论以哪种顺序安装两个程序,第一个程序都会中断。这称为“ dll地狱”。

可悲的是,为避免这种情况,大多数Windows软件都将所有库都放在自己的程序目录中而不是共享目录中,因此每个程序都具有自己的私有库,并且永远不会相互共享,这会破坏整个系统。首先是dll的问题,最终您会花费更多的内存和磁盘空间,并浪费时间下载所有重复的库。

这就是为什么开放源代码软件以源代码形式发布,并且OS供应商提供了软件包管理器,用于解决依赖性问题并仅下载您实际需要的预编译二进制文件,而无需在各处复制库。这也解决了以下事实:许多不同的Unix系统运行在许多不同的平台上。

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.