De overstap naar Python 3 begint!

Capsuleers,

EVE blijft evolueren als onderdeel van het EVE Evolved-initiatief, en het is tijd om de schijnwerpers op de code zelf te richten!

Achter elke gate-jump, marktorder en vlootgevecht in EVE Online gaat een enorme hoeveelheid Python-code schuil. Deze taal heeft New Eden al meer dan twee decennia aangedreven en begint nu aan de overstap naar Python 3. Voor jullie betekent dit betere tools om bugs sneller op te lossen, ruimte voor nieuwe functies en op termijn een snellere EVE.

De definitie van succes voor deze migratie is simpel: het zou volledig onmerkbaar moeten zijn, afgezien van de incidentele momenten waarop iets soepeler verloopt.

Velen van jullie hebben onze eerste stappen op Singularity al getest, en die wijzigingen zijn vandaag geïmplementeerd. Dit is slechts het begin van een lange weg.

Een codebase ouder dan sommigen van jullie

EVE werd gelanceerd in 2003 en is gebouwd op Stackless Python, een versie van Python waarvan de lichtgewicht "tasklets" ervoor zorgen dat één servernode duizenden piloten tegelijkertijd kan beheren. Fenris Creations heeft Stackless niet alleen overgenomen; het is een van de belangrijkste bijdragers aan de taal geworden.

Sommigen van jullie herinneren zich wellicht de upgrade naar Stackless Python 2.5 in 2007, en daarna naar Stackless Python 2.7 in 2010. Dat was de laatste keer dat EVE de Python-versie wijzigde. Python 2.7 bereikte officieel het einde van zijn levensduur in 2020. Terwijl de rest van de softwarewereld verderging en een hele generatie capsuleers is geboren, naar school is gegaan en is begonnen met het vliegen van fregatten, bleef EVE op dezelfde taalversie. De versie was betrouwbaar genoeg dat een grote, potentieel risicovolle migratie zichzelf nooit rechtvaardigde, tot nu.

Zestien jaar op dezelfde versie zegt veel over hoe goed het werkte. De Carbon-engine heeft hier massaal aan bijgedragen, maar ook die is inmiddels verder geëvolueerd!

Waarom Python 3? En waarom nu?

Kort gezegd: het vasthouden aan Python 2 houdt EVE steeds vaker tegen. De overstap naar Python 3 zorgt voor een gezonder spel dat beter wordt ondersteund.

Een van de redenen is prestatie. Recente releases van Python 3 hebben enkele van de grootste versnellingen in de geschiedenis van deze taal opgeleverd. Op termijn opent dit de deur naar een snellere EVE, hoewel het nog te vroeg is om precies te zeggen wat dat zal betekenen.

Een andere reden is het ecosysteem. Moderne bibliotheken, debuggers en profilers zijn allemaal gebouwd voor Python 3. Elk jaar dat we op Python 2 blijven, raken we er meer van kwijt, waardoor we meer zelf moeten onderhouden in plaats van het spel te verbeteren. Betere tools betekenen dat we problemen sneller kunnen vinden en oplossen.

Daarnaast vereenvoudigt Python 3 veel van de kernonderdelen van de taal:

  • Tekstverwerking: Tekst wordt afgehandeld via één consistent string-type, wat lokalisatie betrouwbaarder maakt.
  • Integers: Gehele getallen hebben geen willekeurige groottebeperkingen meer en groeien automatisch wanneer dat nodig is.
  • Class-systeem: Het class-systeem is uniform gemaakt, waardoor verouderd gedrag is verwijderd en objectgeoriënteerde code consistenter is geworden.

Elk personage, elk skill-punt, elk object in elke hangar en elke ISK in elke wallet is geschreven in Python 2-code, en alles daarvan moet onder Python 3 exact zo worden uitgelezen als het was.

De weg vooruit is zwaar; we moeten een enorme hoeveelheid code bijwerken terwijl EVE voor jullie blijft draaien. We weten echter dat het doel bereikbaar is, omdat EVE Frontier onze Carbon-engine al draait op moderne Python 3, en dat werkt.

De migratie van Frontier besloeg twaalf kleine versies van Python in één keer: zestien jaar aan taal-evolutie in één project. Tranquility heeft echter drieëntwintig jaar aan opgehoopte code en, belangrijker nog, drieëntwintig jaar aan echte spelersdata—de geschiedenis van de capsuleers. En het moet 23,75 uur van elke 24 uur blijven ademen.

Voorzichtig... heel voorzichtig...

De EVE-codebase bestaat uit 2,4 miljoen regels Python. Veel daarvan stamt van vóór Python 2.7 en is geschreven volgens standaarden uit het tijdperk van 2.3 en 2.5, die Python 3 helemaal niet kan lezen (parse).

Hoe migreer je 2,4 miljoen regels code? Zeer voorzichtig, en in meerdere fasen.

Sommige van deze fasen maken gebruik van tools die zijn ontwikkeld door de Python-gemeenschap (bijv. Python Futurize), terwijl andere fasen zich meer richten op de unieke kenmerken van EVE. Wanneer we belangrijke mijlpalen bereiken, vragen we jullie hulp via playtests op Singularity, zoals in juli is gebeurd. Hier kunnen we observeren hoe delen van het bijgewerkte systeem zich gedragen onder omstandigheden die dichter bij de Tranquility-server liggen.

De eerste fase, waarin we ons nu bevinden, maakt de code "Python 3-ready" terwijl deze nog draait op Python 2.7. We gebruiken hiervoor een tool genaamd Python-Future, gebouwd op dezelfde code-herschrijfmechanismen (2to3) die Python zelf heeft geleverd om dit soort migraties te ondersteunen. Deze tool past geautomatiseerde "fixers" toe die elk een verouderd patroon herschrijven naar een moderne vorm die zowel door Python 2.7 als Python 3 wordt geaccepteerd.

Zodra alle code onder beide versies werkt, begint het echt zware werk: de code die op beide versies draait, maar zich verschillend gedraagt.

De berg meten (en toezien hoe deze krimpt)

Hoe weet je eigenlijk hoe ver je verwijderd bent van Python 3? We meten het. Elk van onze ongeveer 20.000 Python-bestanden wordt gecompileerd onder een echte Python 2.7-interpreter en een echte Python 3-interpreter, omdat de compiler de absolute waarheid is over of code correct wordt gelezen.

De eerste scan was een aangename verrassing: 95,9% van de bestanden compileerde al onder beide versies. De blokkerende regels—de regels die syntax gebruiken die door Python 3 wordt geweigerd—bedroegen ongeveer 3.300 van de 2,4 miljoen.

De berg bleek een grote, maar zeer meetbare heuvel te zijn:

  • ~ 1.500 print-statements in oude stijl;
  • ~ 800 "long" getal-literalen zoals 123L;
  • ~ 600 exception-clausules in een syntax die al was afgeschaft voordat EVE bestond;
  • 50 keer het gebruik van <>, een manier om "niet gelijk aan" te schrijven die zo oud is dat veel actieve Python-ontwikkelaars het nooit hebben gezien.

De uitdagingen die nog komen

Het parsen (lezen) van de code is het makkelijke gedeelte. Dezelfde scan telde ongeveer 20.000 regels code die prima compileren onder beide versies, maar in Python 3 anders reageren.

Een klassiek voorbeeld is deling: in Python 2 is 1 / 2 gelijk aan 0, terwijl dit in Python 3 0.5 is. In EVE, waar deze getallen schade, ISK of coördinaten kunnen zijn, vereist elke regel een menselijke beslissing in plaats van een mechanische fix. Dit werk maakt deel uit van Fase 2. Daarom komt Fase 1 eerst: het opruimen van het mechanische puin, zodat menselijke aandacht alleen nodig is waar mensen echt nodig zijn.

Wat dit voor jou betekent

Op de korte termijn: niets, en dat is precies de bedoeling. De wijzigingen in Fase 1 moeten onzichtbaar zijn.

Op de lange termijn is dit een van de meest waardevolle fundamenten die we kunnen leggen voor de toekomst van EVE: een snellere interpreter voor vlootgevechten en markthubs, moderne tooling die ons helpt bugs sneller te vinden en op te lossen, en een codebase waar nieuwe ontwikkelaars productiever aan kunnen werken, wat betekent dat nieuwe functies jullie sneller bereiken. Het is de infrastructuur voor de komende twintig jaar van EVE Online.

Bedankt voor de hulp bij het bewijzen ervan

Het doel is dat jullie helemaal niets merken, en jullie helpen ons dat doel te bereiken. Aan het eind van juli hebben jullie de eerste set wijzigingen op Singularity getest. Bedankt aan iedereen die heeft deelgenomen.

We implementeren deze wijzigingen nu op Tranquility. Hier rekenen we op jullie: blijf doen wat je altijd doet, en als er iets niet goed voelt, laat het ons dan weten door een bugrapport in te dienen. Daarnaast bereiden we de backend van de agent-missies voor op Python 3, maar daar zouden jullie niets van moeten merken.

Dit is slechts de eerste stap van velen. Het opruimen van het mechanische puin was het makkelijke deel. Het echte werk—de code die regel voor regel gelezen moet worden—ligt nog voor ons, en dat is waar we jullie het meest nodig zullen hebben.

Houd onze kanalen in de gaten voor toekomstige tests. Als je ooit aan je corpmates hebt willen vertellen dat je hebt geholpen EVE naar Python 3 te verplaatsen, dan is dit je kans!

Fly safe, op welke versie van Python je je ook bevindt.