Portimine

**Portimine** (inglise keeles *porting*) on tarkvaraehituse protsess, mille eesmärk on kohandada tarkvara nii, et see saavutaks teatavas programmis kasutatavas arvutuskeskonnas erineva tulemuse sellest, milleks selle programmi arvutuskeskkond algselt mõeldud oli (kaasaskantavus). Seda terminit kasutatakse ka siis, kui riistvara või tarkvara muudetakse vastavalt keskkonnale, et seda oleks võimalik seal kasutada. Tarkvara on kaasaskantav siis, kui selle portimise kulud uuele platvormile on oluliselt madalamad kui nullist kirjutamise kulud. Mida väiksemad on tarkvara kohandamise kulud võrreldes selle rakendamise maksumusega, seda porditavamaks (kaasaskantavamaks) peetakse tarkvara.

## Nimetus
Mõiste "port" on tuletatud ladina keelest *portāre*, mis tähendab "vedama". Kui koodi ei ole võimalik ühildada konkreetse operatsioonisüsteemi või arhitektuuriga, siis tuleb kood "vedada" uude süsteemi. Seda terminit ei rakendata üldiselt protsessidele, kus tarkvara kohandatakse selleks, et viimane kasutaks vähem mälu protsessoril või operatsioonisüsteemil. Samuti ei kasutata seda ka lähtekoodi ümberkirjutamisel mõnda teisse programmeerimiskeelde. Enamik tarkvaraarendajaid väidab, et nende kirjutatud tarkvara on kaasaskantav ehk tarkvara uude keskkonda kohandamiseks on vaja vähe vaeva näha. Tegelik pingutuste suurus sõltub mitmetest teguritest, alustades sellest, kui palju erinevad algne ja uus keskkond üksteisest, lõpetades tarkvaraarendaja eelneva kogemusega.

## Ajalugu
Tänapäeval kasutatav CPU-de ja operatsioonisüsteemide arv on tunduvalt väiksem kui minevikus. Domineerivaks on x86 arhitektuur, mis tähendab, et enamus töölaua tarkvara ei pea kunagi portima erinevale CPU-le. Samal turul on ka operatsioonisüsteemide valik koondunud kolmeks suureks osaks: Microsoft Windows, macOS ja Linux. Turg, kus kaasaskantavus tekitab veel olulisi probleeme, on mobiiliturg. Laialdaseks alternatiiviks on seal tekkinud ARM.

Aina rohkem leidub tööriistu, mille abil saab hõlbustada kohandamist, nagu näiteks GNU Compiler Collection, mis võimaldab järjepidevaid programmeerimiskeeli erinevatel platvormidel. Teiseks tööriistaks on Autotools, mis automaatselt tuvastab keskkondade erinevusi ja kohandab tarkvara sellele vastaks.  

## Teisaldatavad kompilaatorid
Otseselt masinkoodi tõlkimise asemel tõlgivad tänapäevased kompilaatorid masinsõltuvaks vahekoodiks, et parandada kompilaatori teisaldatavust ja minimeerida kavandamisega seotud jõupingutusi. Vahekeel määratleb virtuaalmasina, mis suudab täita kõiki käske, mis on kirjutatud vahekeeles. Vahekeele koodi juhised tõlgitakse koodi generaatori poolt samaväärseteks masinkoodi jadadeks, et saaks luua käivitatava koodi. On võimalik vahele jätta masinkoodi genereerimine, kui implementeerida koodi tõlk või JIT virtuaalmasinale. Koodi tõlk on enda olemuselt lihtsamini ülesehitanud ning seetõttu lihtsamini kaasaskantav kui koodi generaator, sest ta ei suuda koodi optimeerida enda piiratud vaate tõttu (näeb ainult ühte käsku korraga, vaja läheb jada, et koodi optimaalselt optimeerida). Mõningaid koodi tõlke on väga lihtne portida, sest nad teevad minimaalseid oletusi nende aluseks oleva riistvara käskude komplekti kohta. Tulemusena on virtuaalne masin veelgi lihtsam kui sihtprotsessor.

Kui soovitakse kirjutada kompilaatori allikad täielikult programmeerimiskeeles, mille kompilaator on mõeldud tõlkima, siis kasutatakse järgmist lähenemisviisi, mida kutsutakse kompilaatori alglaadimiseks: 

* Kõigepealt porditakse endale tõlk. Viimane tuleks kodeerida monteerimiskoodis, kasutades sihikuna juba olemasolevat monteerijat.
* Seejärel kohandatakse kood generaatori allikas uue masinaga.
* Kohandatud allikas käivitatakse, kasutades tõlki koos koodi generaatori allikaga kui sisend. See genereerib masinkoodi koodi generaatori jaoks.

## Videomängude teisaldamine

Portimise terminit kasutatakse ka videomängude valdkonnas. Näiteks on kindel mäng mõeldud jooksma teatud platvormil. Kui seda mängu teisendada nii, et seda saab kasutada ka teisel platvormil, kutsutakse seda videomängude portimiseks. Aastaid tagasi mõeldi videomängude “portimise” all mängude ümbertegemist, aga tänapäeval on mängud arendatud tarkvaraga (C++) nii, et platvormide vahelist portimist praktiliselt tegema ei pea. Algselt kannatasid paljud porditud mängud kvaliteedi probleemide küüsis, sest arvutid erinesid tohutult. “Konsooli port” on mäng, mis on originaalis mõeldud mängukonsoolile (Xbox 360), kuid hiljem kohandatud nii, et seda oleks võimalik mängida ka personaalarvuti peal. See termin on arvutimängurite kommuunides laialdaselt levinud. Konsoolilt portimise protsessi tagasiside on sageli olnud negatiivne, sest personaalarvutid suudavad riistvara arenedes mänge jooksutada palju kõrgemate seadistuste peal, aga vahel on kohandatud mängud kehvasti või laisalt optimeeritud.

## Vaata ka
* Software portability
* Console emulator
* Source port
* Write once, compile anywhere
* Cross-platform
* Program transformation
* Meaning of ''unported''

## Viited