Näide C-s kirjutatud koodist integreeritud arenduskeskkonnas
**Lähtekood** (kõnekeeles **kood**) on programmeerimiskeeles kirjutatud tekst, mis kirjeldab arvutile antavaid käske. Lähtekood tuleb teisendada masinakeelde ehk transleerida (tõlkida) arvutile arusaadavasse keelde. Seda saab teha kompilaatori või interpretaatori abil.

Kompilaator tõlgib kogu lähtekoodi mõnda vahekeelde või kohe masinakeelde. Kompileeritud koodi saab salvestada uude faili, kust seda saab käivitada ilma lähtekoodita. Interpretaator tõlgib samuti lähtekoodi, kuid teeb seda sammhaaval: tõlgib ühe lause ja täidab selles olevad käsud, siis võtab järgmise lause jne. Interpretaatori puhul on käivitamisel alati vaja ka lähtekoodi.

Programmeerimiskeeli jaotatakse laias laastus kaheks: on kompileeritavad (nt C++, Java) ja interpreteeritavad keeled (nt Python).

Lähtekoodi all mõistetakse mõnel juhul ka märgistuskeeles kirjutatud teksti, näiteks veebilehe HTML-koodi.

Vabalt kättesaadavat ja muudetavat lähtekoodi nimetatakse avatud lähtekoodiks. Lähtekood on kasulik programmeerija, süsteemiadministraatori või kasutaja jaoks, kelle eesmärk on programmi muuta või mõista, kuidas see töötab.

Töökorraldus
------------

Versioonihaldustarkvara TortoiseHg
Enamjaolt jagatakse suuremate programmide kood tarkvara loogilisest ülesehitusest lähtudes eraldi moodulitesse ja/või failidesse. Seda tehakse selleks, et programmi struktuuris oleks lihtsam orienteeruda ja et ei peaks iga muudatuse pärast uuesti tervet programmikoodi kompileerima. Koodifailid saab omakorda paigutada kaustadesse.

Programmi loomiseks vajalikud failid (sh lähtekood) moodustavad tarkvaraprojekti. Projektil võib lisaks olla faile, mis viitavad projekti kuuluvatele failidele ja kirjeldavad nende kompileerimiseks vajalikke samme. Sellised failid on näiteks Makefile ehitussüsteemis Make või .csproj-fail ehitussüsteemis MSBuild.

Ühe projekti raames võib olla kasutusel mitu erinevat programmeerimiskeelt. Koodifaili laiend näitab, mis keelega on tegu, näiteks: .java (Java), .py (Python), .js (JavaScript). Erinevates keeltes kirjutatud komponente saab kompileerida objektkoodiks ning seejärel ühendada linkuri abil ühtseks programmiks. Ka ühe koodifaili raames saab mõnel juhul kasutada erinevaid keeli, näiteks C kood võib jõudluse parandamiseks sisaldada assemblerit.

Veel üks programmide loomise meetod on teha peaprogramm, mis töötleb muus keeles kirjutatud alamprogrammide lähtekoodi. Töödeldav keel võib olla mitme otstarbega või spetsiifiliselt ühe rakenduse jaoks loodud ehk domeenispetsiifiline keel.

### Versioonihaldus

Lähtekoodi hoitakse tavaliselt arvuti kõvakettal. Et lihtsustada koodis tehtud muudatuste haldamist, kasutatakse versioonihaldustarkvara. Versioonihaldus lubab mitmel programmeerijal töötada sama koodiga ja laadida kõvakettal tehtud muudatused üles ühtsesse koodihoidlasse, kust saab teiste muudatusi ka alla laadida. Kui tehtavad muudatused satuvad konflikti mõne muu programmeerija muudatustega, siis pakub versioonihaldus võimalusi konfliktide lahendamiseks.

Loetavus
--------

Lähtekoodi loetavus kirjeldab seda, kui kerge on kirjutatud koodi lugeda ehk kui kerge on koodi eesmärgist, toimimisest, kontrollist ja struktuurist aru saada. Seega on loetavus tähtis eelkõige inimese, mitte kompilaatori jaoks.

Tihtipeale mõjutab koodi ülesehitus eeltoodud aspektide kvaliteeti, kasutusvõimalust ja püsivust.

Lähtekoodi hea loetavus on tähtis eelkõige programmeerijatele, kes peavad enamasti tegelema juba olemas oleva koodiga, nad peavad sellest aru saama ning olema suutelised vajadusel koodi muutma. Vaid väike osa programmeerijatest kirjutab päris uut koodi. Halvasti loetav kood võib põhjustada programmivigu ja koodi duplikaate.

1982. aastal järeldasid James L. Elshoff ja Michael Marcotty oma uurimistöös, et isegi kõige väiksemad muudatused lähtekoodi ülesehituses, nt selle paari rea võrra kärpimine, lühendasid märgatavalt aega, mis programmeerijal kulus koodist aru saamiseks.

Lähtekoodi kirjutades on mõistlik järgida ühtseid stiilireegleid, sest see parandab koodi loetavust.

Kõikide programmeerimiskeelte puhul peaks programmeerija silmas pidama järgmiseid aspekte:

* koodile tuleb lisada selgitavaid, täpsustavaid jne kommentaare;
* koodile peab lisama taandeid, sest need parandavad loetavust;
* koodi erinevad osad on mõistlik vormistada moodulitena;
* muutujate, klasside, funktsioonide vms nimetused võiksid olla kirjeldavad ja kirjapildilt ühtse stiiliga.

Lähtekoodi tüübid
-----------------

Linux on näide tarkvarakogust, mis põhineb avatud lähtekoodil, mida kõik kasutajad võivad muuta
Märgistuskeeled ja programmeerimiskeeled on sarnased selle poolest, et mõlemad kirjeldavad ülesandeid, mida arvuti täitma peab. Näiteks märgistuskeeltes HTML ja CSS kirjutatud veebilehe lähtekood määrab, milline on selle veebilehe sisu ja kujundus.

Legaalselt eksisteerib kaks põhimudelit, mis on tihedalt seotud lähtekoodi omandiõigusega.

**Avatud lähtekoodil** põhinev, üldjuhul tasuta tarkvara võib olla avalikkusele kättesaadav nii avatud lähtekoodi litsendilepingu alusel kui ka ilma selleta.

Avatud lähtekoodi litsendilepingu eesmärk on säilitada mõned elementaarsed õigused autori jaoks. Osad selletaolised avatud koodi litsendilepingul põhinevad kokkulepped limiteerivad muudatuste ja modifitseerimisvõimaluste hulka, mida saab lähtekoodis teha.

Teised avatud lähtekoodi litsendilepingu nõuded märgivad ära vaid seda, et iga inimene, kes koodi muuta soovib, peab viitama algsele autorile.

**Tasuline ja kinnine lähtekood** on teine lähtekoodiga seotud mudel. Privaatse lähtekoodi puhul ei tohi kasutajad dekompileerida käivitatavat faili või rakendust, et näha selle lähtekoodi.

Samuti on neil keelatud seda teiste kasutajatega jagada. Kinnise lähtekoodi põhimõtte on omaks võtnud enamik kommertstarkvara ja riistvara tootjatest, vaatamata sellele, et avatud lähtekoodil põhinevad rakendused ei ole sugugi ebapopulaarsemad ega vähem tulu toovad.

Ajalugu
-------

Matemaatik Ada Lovelace lõi 19. sajandil esimese "arvutiprogrammi" ja lähtekoodi
Kuigi programmeerimiskeele olemasolu võib märgata juba umbes aastast 2500 eKr pärinevas Sumeri abakuses, peetakse lähtekoodi esmaloojaks Ada Lovelace'i – matemaatikut ja ühtlasi esimest programmeerijat.

1842. aastal avaldati teadusajakirjas *Bibliothèque universelle de Genève* Charles Babbage'i analüütilise masina loengu põhjal kirjutatud prantsuskeelne artikkel. Ada Lovelace tõlkis selle artikli Babbage'i sõbra, Charles Wheatstone'i palvel inglise keelde ning lisas juurde hulganisti kommentaare, muuhulgas ka kirjelduse, kuidas selle masina abil saaks leida Bernoulli arve. Neid juhiseid hakati hiljem pidama ajaloo esimeseks programmiks. Ada Lovelace'i kommentaarid avaldati 1843. a Richard Taylori raamatusarjas "Scientific Memoirs" initsiaalide AAL all.

Programmeerimiskeelte arengus on oluline osa John von Neumannil, kes töötas 1945. aastal Institute for Advanced Study jaoks. Von Neumann töötas välja kaks olulist mõistet, mis mõjutavad programmeerimiskeeli tänapäevani. Esimene on tuntud "salvestatava programmi" (*stored program*) mõistena. Selle tehnika teoreetilises kirjelduses osutati, et arvuti riistvara peaks olema lihtne ja selle tööd peaks korraldama mälu, kuhu salvestatakse nii programmikäsud kui ka andmed. Mälu pidi saama kustutada ning seega pidi programmikäske saama muuta ka sel ajal, mil programm töötab. Seni eeldas programmi muutmine, et eelmine programm on oma töö lõpetanud. Töötava arvuti programmikäskude muutmiseks pakkus von Neumann välja muutujaid kasutava programmeerimiskeele (*variable-address program language*).

John von Neumanni loodud teine mõiste on "tingimisi kontrolli üleandmine" (*conditional control transfer*), mis pani aluse alamprogrammide loomisele ja väikeste koodiplokkide kasutusele, kust arvuti loeb informatsiooni korrektselt, kuid eelkõige suvalises järjekorras, läbimata kronoloogilist koodi lugemist.

Tingimisi kontrolli üleandmise idee teine osa märkis, et arvuti kood põhineb loogilistel avaldustel nagu IF (väljend), THEN ja FOR.

1970ndail ja 1980. aastate alguses töötati välja uus programmeerimismeetod, mis sai nimeks objektorienteeritud programmeerimine, lühendatult OOP. Objektorienteeritud programmeerimine kasutab "objekte" – lihtsaid või keerulisi andmestruktuure, mis koosnevad andmeväljadest ning meetoditest, nagu näiteks pärimine.

Taani matemaatikule ja arvutiteadlasele Bjarne Stroustrup'ile meeldis objektorienteeritud programmeerimise idee. Ta hakkas täiendama C programmeerimiskeelt lisadega ja lõi seeläbi "klassidega C" ("C with Classes"). 1983. aastal võeti kasutusele nimetus C++ ning 1985. a avaldati selle programmeerimiskeele esimene versioon.

Objektorienteeritud programmeerimine
Viimaste aastakümnete jooksul on lisandunud hulganisti uusi programmeerimiskeeli, mis kasutusse võetuna moodustavad kõik lähtekoodi. Näiteid teistest lähtekoodi tüüpidest: Javascript, Python, HTML (mis ei ole programmeerimiskeel, aga kvalifitseerub sellegipoolest lähtekoodina), Perl jt.

Vaata ka
--------

* Masinkood
* Programmeerimiskeel
* Kompilaator
* Tarkvaralitsents

Viited
------

1. ↑  Tennisberg, Targo; Gabrel, Katrin. *Võistlusprogrammeerimine: I osa*. Tartu Ülikool, 2017.
2. ↑  James L. Elshoff; Michael Marcotty. *Improving computer program readability to aid modification*, Communications of the ACM, v.25 n.8, p.512-521, Aug 1982.
3. ↑  Hanson, Gregory and Susan Barwick. *What Are the Different Types of Source Code?* WiseGeek. Conjecture, 06 Dec. 2013.
4. 1 2  Isaacson, Walter. *The innovators: how a group of hackers, geniuses, and geeks created the digital revolution*. New York, Simon & Schuster Paperbacks, 2014.

Välislingid
-----------

* Pingviini viki artikkel lähtekoodist