Python 3 迁移正式启动!
致克隆飞行员:
作为“EVE 永续”计划的一部分,EVE Online 正在持续演进。而这一次,我们将聚光灯对准了 代码本身!
在 EVE Online 中,每一次星门跃迁、每一笔市场订单、每一场舰队会战,其背后都有庞大的 Python 代码在高速运行。这些代码已经支撑着新伊甸运转了二十多年,如今终于开始向 Python 3 迁移。对于玩家而言,这意味着我们将拥有更好的工具,能够更快修复漏洞,为新功能腾出更 多空间,并让 EVE Online 逐步运行得更加顺畅。
此次迁移的成功标准很简单:除了偶尔感受到某些操作比以往更加流畅之外,你应该完全感觉不 到任何变化。
许多玩家已经在“奇点”服务器上参与了第一阶段的测试,而这些改动现已于今日部署至服务器。但这只是漫长迁移之路的开始。
比部分玩家还年长的代码库
EVE 于 2003 年上线,基于 Stackless Python 构建。Stackless Python 是 Python 的一个版本, 其轻量级“任务片段”机制让单个服务器节点能够同时处理数千名飞行员。Fenris Creations 不 仅采用了 Stackless Python,还成为了该项目最重要的贡献者之一。
或许有些老玩家还记得,我们曾在2007 年将Python 升级至Stackless Python 2.5 ,随后又在 2010 年升级至Stackless Python 2.7。那也是 EVE 上一次升级 Python 版本。Python 2.7 早 在 2020 年就已正式停止支持,软件行业的其他领域早已向前迈进。在此期间,已有整整一代克 隆飞行员出生、上学,然后开始驾驶我们的护卫舰,而 EVE 的底层语言版本却始终未曾改变。它 曾经是如此稳定可靠,以至于我们迟迟不愿意去冒巨大的风险进行这场浩大的迁移,直到今天才 迈出了这一步。
在同一个版本上运行了十六年,足以说明它过去的表现有多么出色。Carbon 引擎也为此提供了 巨大助力。不过,如今它也迈向了新的阶段!
为什么选择 Python 3?为什么是现在?

简而言之:继续使用 Python 2 将日益限制 EVE 的发展,而迁移到 Python 3 将为玩家提供更健 全、更完善的游戏支持。
全、更完善的游戏支持。 其中一个原因是性能。近年来发布的 Python 3 版本带来了该语言史上最显著的一些性能提升。 随着时间推移,这将为打造一个响应更快、运行更顺畅的 EVE 扫清障碍,尽管目前要准确量化这 一提升还为时过早。
另一个原因是生态系统。现代化的库、调试器和性能分析工具均围绕 Python 3 构建。我们在 Python 2 上停留得越久,就会有越来越多的先进工具与我们失之交臂,导致我们不得不投入更 多精力维护老旧工具,而不是专注于改进游戏。更好的工具意味着我们能够更快发现和解决问题。
Python 3 还简化了许多核心语言构建模块。
文本现在统一采用一致的字符串类型处理,让本地化更加可靠。整数不再有任意大小限制,需要 时会自动扩展。就连 Python 的类系统也进行了统一,移除了旧版遗留行为,使面向对象的代码 更加一致。
每一个角色、每一个技能点、每一个机库中的每一件资产,以及每个钱包里的每一枚星币,均由 Python 2 代码编写。而迁移到 Python 3 后,所有这些数据都必须按照原样准确读取。
前路依旧充满挑战,我们必须在 EVE 持续运行的同时更新大量代码,但我们深知目标终将实现, 因为在 EVE Frontier 中,我们的 Carbon 引擎已经成功运行在现代 Python 3 环境中了,而且运 行良好。
Frontier 的迁移项目一次性跨越了 12 个 Python 小版本,在一个项目中完成了十六年的语言演 进。Tranquility 服务器承载着二十三年积累的代码,更重要的是,它还保存着二十三年的真实玩 家数据,记录着无数克隆飞行员走过的历史。而它每天 24 小时中必须有 23.75 小时持续运转。
小心……再小心……
EVE 的代码库包含 240 万行 Python 代码。其中大量代码甚至早于 Python 2.7,其编写标准可 以追溯至 Python 2.3 和 2.5 时代,而 Python 3 根本无法解析这些旧语法。
那么,我们如何迁移 240 万行代码呢?
答案是:非常谨慎地分多个阶段进行。
其中部分阶段会使用 Python 社区开发的工具(例如 Python Futurize),其他阶段则会更多关 注 EVE 独有的架构特性。
每当攻克关键里程碑时,我们都会邀请各位参与“奇点”服务器上的试玩测试,就像你们在 7 月 所做的那样。通过这些测试,我们可以观察更新后的系统在更接近 Tranquility 服务器环境下的 运行表现。
目前我们正处于第一阶段。这一阶段的目标是让代码具备 Python 3 兼容性,同时仍能在 Python 2.7 上运行。
我们使用一个名为 Python-Future 的工具,它基于 Python 自身提供的同一套代码重写机制 (2to3)构建,正是为了帮助完成此类迁移。该工具会应用自动化的“修复器”,每个修复器都 会将一种过时的代码模式改写为 Python 2.7 与 Python 3 均能兼容的现代格式。
而当所有代码都能在两个版本下运行后,真正艰难的工作才刚刚开始:那些代码能够同时在两个 版本下运行,却会产生不同的结果。
量清难题,步步攻克

究竟该如何知道自己距离 Python 3 还有多远?
答案是测量。我们将近 2 万个 Python 文件分别放入真实的 Python 2.7 和 Python 3 编译器中进 行编译,因为编译器才是检验代码能否被正确解析的终极标准。
第一次扫描的结果令人惊喜:95.9%的文件已经能够在两个版本下成功编译。在 240 万行代码中, 因语法不兼容而被 Python 3 拒之门外的“阻碍行”仅有约 3300 行。
原本看似高耸的大山,其实是一座完全可以精确衡量的小山丘:
约 1500 条旧式 print 语句;
约 800 个类似 123L 的“长”整数字面量;
约 600 条在 EVE 诞生之前就已弃用的异常子句语法;
50 处<>用法——这是一种表示“不等于”的写法,就连许多仍在使用 Python 的开发者 都没见过如此古老的写法。
未来的挑战

解析代码只是其中较为容易的一步。
同一次扫描还发现,大约有 2 万行代码虽然能够在两个版本下正常编译,但在 Python 3 中的行 为却有所不同。最经典的例子就是除法:在 Python 2 中,1 / 2 的结果是 0;而在 Python 3 中, 则是 0.5。
而在 EVE 中,这些数字可能代表伤害、星币或坐标,因此其中每一行都需要由人工判断,而无法 通过机械化方式进行修复。这项工作属于第二阶段,这也正是我们必须先完成第一阶段的原因: 先清除那些可以自动处理的“机械障碍”,让人工精力集中在真正需要人类判断的地方。
这对玩家意味着什么?
短期来看,什么都不会改变。第一阶段的所有改动都应该是无感的。从长期来看,这是我们能为 EVE 未来奠定的最重要基础之一:更快的解释器将为舰队战和市场中心提供更强大的支持;现代化工具能帮助我们更快发现并修复问题,而经过优化的代码库也能让新开发人员更高效地开展工 作,尽快向玩家推出新功能。这是为 EVE Online 未来二十年的发展铺设的基础设施。
感谢各位帮助我们验证这一点
“让玩家毫无察觉”就是我们的目标,而你们正是帮助我们实现这一目标的人。
7 月底,大家在“奇点”服务器上测试了第一批改动。感谢每一位参与测试的玩家。
现在,我们正在将这些改动部署至 Tranquility 服务器。接下来请各位继续像往常一样游玩,如 果发现任何异常,请向我们提交问题报告以反映情况。
此外,我们也正在为代理人任务后端迁移至 Python 3 做准备,不过大家应该不会察觉到任何变 化。
这仅仅是万里长征的第一步。清除那些“机械障碍”是相对容易的部分。真正需要逐行审阅与重 构的代码依然在前方等待着我们,而那里也将是我们最需要大家协助的战场。
敬请关注我们的官方频道,了解未来测试的相关消息。如果你一直想告诉军团成员,你帮助 EVE 迁移到了 Python 3,现在就是你的机会!
无论你身处哪个 Python 版本,我们都祝你一路顺风!
