前几天,我为一个朋友的魔兽世界插件调整了一个脚本。他对您可以编辑插件感到惊讶——它们是“开源的”。(《魔兽世界》插件是用 Lua 脚本语言编写的)我发现自己想说“当然可以——所有脚本都是‘开源’的。”
真的吗?当然,有些脚本可以编译成字节码,但不是几乎所有的脚本都被解释了吗?也就是说,根据定义,解释脚本的设备不需要“源”吗?
这取决于您如何解释“开源”。
当然,你有源代码,但通常这并不是开源的意思。通常开源是指许可。拥有“开源”意味着您可以出于任何目的自由修改源代码,包括在许多情况下重新分发它。
仅仅拥有源代码并不能使其在一般软件意义上成为开源。如果脚本是受版权保护的,那么它在技术上是“封闭的”,除非明确给出了开源许可证。您可以修改它,但如果您在未经作者许可的情况下重新分发它,您将违反他们默示(或明确注册)的版权。
开源是关于许可的。脚本可以拥有作者(或版权所有者,例如雇主)想要的任何许可。所以答案是“不”。
在这种情况下,脚本通常以与它们编写时相同的形式分发 - 没有编译格式。所以你可以看到源。这并不意味着它们是开源的。
“开源”与能够查看源代码不是一回事;开源许可是关于从该源代码派生作品的合法权利。
如果您在未经他人明确同意的情况下盗用他人的作品,对其进行修改和重新分发,那么您就侵犯了他们的版权,并且触犯了法律。
“开源”不仅意味着您拥有源代码,它还用于描述您在修改或不修改代码的情况下重新分发代码的合法权利。
基于版权和许可,许多脚本不是开源的。
正如许多人所指出的,仅仅因为您可以访问源代码并不能赋予您随心所欲地使用它的权利。
你问
不是几乎所有的脚本都被解释了吗?也就是说,根据定义,解释脚本的设备不需要“源”吗?
不会。即使在解释器中,源代码在被解释之前也会经过多次转换。最终被解释的形式通常是基于堆栈或基于寄存器的虚拟机的指令序列;此类指令通常称为“字节码”。也可以相对有效地解释内部树。主要为教学目的而设计的口译员可能会使用效率更低的方案。
一些实现允许您采用内部形式并将其写入磁盘,从中可以重新读取和解释。感知到的优势通常是
程序加载和运行速度更快,因为初始处理阶段在编写内部表单之前执行一次,然后一遍又一遍地重用。
内部形式保护源代码不被窥探。
主要缺点是典型的内部形式通常不如源代码可移植,这可能是因为字节顺序或字长的不同。
在 Lua 的特殊情况下,luac
编译器会将字节码写入磁盘。它很少使用,因为字节码不可移植,而且编译器已经非常快了。在魔兽世界的特殊情况下,他们实际上是在鼓励人们使用 Lua 来修改界面和定制体验;他们希望每个人都共享代码,因此保持开源。WoW 拥有超过 1000 万订阅者,并且至少有 5000 人贡献了代码。所以这是贡献了一些代码的用户群的 0.5%,这让我对编程作为一种职业的未来感到高兴。
要为解释器分发程序,您必须发送源代码(尽管不一定是可理解的源代码)。这并不自动意味着这些术语通常使用的方式是开放或免费的。
我似乎记得在游戏条款和条件中阅读了一些要求插件作为开源许可的内容,但我现在似乎找不到它,所以我可能一直在想象它。在所有实际情况下,它们都是。
您可以编译 Lua 和其他脚本语言并以各种方式隐藏它们。与其他语言相比,默认情况下打开源代码更常见,而不是更必要。