Lähdekoodi

Lähdekoodilla tarkoitetaan ohjelmoinnissa tietokoneohjelman tekstimuotoista ohjelmointikielistä kuvausta.
Lähdekoodina ohjelma on ohjelmoijien kirjoittamassa ja ylläpitämässä muodossa.
Lähdekoodia säilytetään yleensä versionhallintajärjestelmässä, jolloin kaikista muutoksista jää lokimerkintä ja eri versioihin on myöhemmin mahdollista palata muun muassa osana virheenjäljitystä ja laadunvarmistusta.
Jos lähdekoodi on kaikkien nähtävissä ja vapaasti jatkohyödynnettävissä, puhutaan avoimesta lähdekoodista tai vapaasta ohjelmistosta. Koska tietokoneen suoritin suorittaa vain konekieltä, ohjelman ajaminen vaatii lähdekoodin kääntämisen tai tulkkaamisen.
Määritelmiä.
Richard Stallmanin määritelmä, joka muotoiltiin 1989 GPL-lisenssissä, ehdotti lähdekoodia millaiseksi muodoksi tahansa, jossa ohjelmistoa muokataan:
Jotkut klassiset lähteet määrittelevät lähdekoodin ohjelmointikielten tekstimuotona, esimerkiksi:
Määritelmä vastaa tosiasiaa, kun ohjelmien kääntäminen ilmestyi ensimmäisen kerran, silloiset ohjelmistotuotannon työkalut olivat tekstipohjaisia ohjelmointikieliä. Näin ollen lähdekoodi tarkoitti tekstikoodia, kun taas konekoodi oli kohdekoodi. Kuitenkin kun ohjelmointiputket alkoivat sisällyttää enemmän väliasteen muotoja, osa kielistä, kuten JavaScript, voitiin kääntää joko lähde- tai kohdekoodiksi. Siitä seurasi, että tekstikoodi ei enää vastannut lähdekoodin synonyymiä. 
Näin ollen Stallmanin määritelmä ottaa huomioon JavaScriptin ja HTML:n lähde-kohde-epäselvyyden sekä mahdolliset tulevaisuuden ohjelmistotuotannon muodot, kuten visuaaliset ohjelmointikielet tai koneoppimisessa käytetyt tietokannat.
Toiset, laajemmat tulkinnat puolestaan katsovat lähdekoodin sisältävän konekoodin yhdessä kaikkien korkean tason kielten kanssa, jotka sitä tuottavat. Tämä määritelmä kumoaa alkuperäisen kone-teksti-erottelun pitämällä ohjelman kääntämisen jokaista vaihetta lähdekoodina.
Tämä lähestymistapa mahdollistaa joustavamman tavan järjestelmän analysointiin eikä vaadi suunnittelijaa julkaisemaan helppoa ymmärtämisen ja muokkaamisen muotoa. Sitä voidaan soveltaa myös tilanteisiin, joissa suunnittelijaa ei tarvita, kuten DNA:n tapauksessa. Kuitenkin tämä analyysin muoto ei ota huomioon kalliimpaa koneiden välistä koodianalyysiä verrattuna ihmisen ja koneen koodianalyysiin.
Kääntäminen.
Useimmilla ohjelmointikielillä työskennellessä ohjelman lähdekoodi on käännettävä kääntäjäksi kutsutulla tietokoneohjelmalla ensin suoritettavaan muotoon ennen kuin se voidaan ajaa. Ennen varsinaista suorituskelpoista ohjelmaa lähdekoodi käännetään objektimuotoiseksi ohjelmaksi. Tähän objektimuotoiseen ohjelmaan linkitetään valmiit kirjastomoduulit, ja tuloksena syntyy suorituskelpoinen ohjelma.
Tulkkaaminen.
Lähdekoodia voidaan suorittaa myös "tulkkausperiaatteella". Tulkkauksessa lähdekoodia luetaan ja suoritetaan yksi lauseke kerrallaan. Tämä tapa on huomattavasti hitaampi suorituksessa, mutta etuna on aikaavievän käännöksen poisjäänti. Tulkkaavaa suoritusta voidaan käyttää ohjelman kehitystyössä ja protoilussa, jossa tärkeintä on valmiin toimivan prototyypin nopea kokeilutestaus kehityksen lomassa.
Esimerkkejä.
C-kieli.
Tyyppiesimerkki C-kielisestä ohjelmasta:
 #include &lt;stdio.h&gt;
 int main(void)
 puts("Huomenta maailma!");
Java.
Alla esimerkki lyhyestä Java-kielisestä lähdekoodista:
 public class HeiMaailma {
 public static void main(String[] args) {
 System.out.println("Hei Maailma!"); 
PHP.
PHP-lähdekoodin tarkasteleminen ei onnistu kuin muokatessa tiedostoa, koska PHP on kieli, joka suoritetaan palvelimen puolella, joten lähdekoodia ei missään vaiheessa lähetetä käyttäjälle. PHP tulostuu lähdekoodiin HTML-kielenä.
Esimerkki PHP-kielisestä lähdekoodista:
&lt;?php
echo ('Moikka Wikipedia!'); 
Lähdekoodin muokkaus.
Lähdekoodia muokataan yksinkertaisella "editoriksi" kutsutulla tekstitoimittimella. Editorin tärkeimpiä ominaisuuksia on, että se ei lisää tekstin sekaan tavallisen tekstinkäsittelyohjelman ohjauskoodeja (joita kääntäjä ei osaa käsitellä).
Ohjelmakoodia kirjoitetaan myös ohjelmointiympäristöissä. Niissä on monia ohjelmointia helpottavia ja nopeuttavia automatisoituja rutiineja. Tällaisia ovat esimerkiksi virheiden paikallistaminen, kirjastomoduulien ennakoiva kirjoitus, debuggaus, versionhallinta ja suoritusnopeuden profilointi.