Leto, ki se je izteklo, je bilo razglašeno za mednarodno leto računalniške kode. Namen »praznika« je bil v tem, da bi ljudi, predvsem šolarje, spodbudili k temu, da bi se lotili programiranja. Če namreč zahodni svet, kamor se radi postavljamo tudi mi, ne bo resneje zagrabil te tematike, ga bodo kaj hitro povozili vzhodnjaki in težišče informacijske industrije, ki je bila do zdaj ves čas nekaj, s čimer se je najbolj hvalil (in z njo tudi največ služil) zahod, se bo preselilo drugam. In to ne tja, kjer bo le cenejša delovna sila, kot je bilo to do zdaj, ampak tja, kjer bo – znanje. Moj mikro vas seveda ne more naučiti programiranja, lahko pa vas popeljemo skozi zgodovino in sedanjost nečesa, čemu pravimo programska koda oziroma programski jeziki.

Višji programski jeziki

Ko so nastali prvi digitalni računalniki, še nihče ni govoril o programskih jezikih. Naprave so sicer izvrševale zaporedne ukaze oziroma inštrukcije, torej to, čemur zdaj pravimo računalniški programi, vendar se zadeva takrat ni imenovala tako. Iz današnjega zornega kota bi rekli, da takrat ni bilo višjih programskih jezikov. Kaj to pomeni? Takratni računalniki so bili programirani s pomočjo ukazov, ki jih je narekovala strojna oprema, zato se je tak jezik imenoval strojni jezik. Ukazi, ki jih je tak jezik poznal, so bili zelo omejeni, zato je bilo programiranje takšne naprave vse prej kot preprosto. Težava je v tem, da je bil tak strojni jezik prirejen izdelavi strojne opreme oziroma zamišljen tako, da bi bila izdelava strojne opreme čim bolj preprosta. To pa je večinoma pomenilo, da so takšni ukazi dokaj okorni in nepriročni za tistega, ki programira. Že čisto preprosta operacija seštevanja je potrebovala kar tri strojne ukaze (naloži A, dodaj B, shrani v C), zato si verjetno lahko predstavljate, kako dolgi in nepregledni so bili programi, da odkrivanja napak niti ne omenjamo. Druga težava je bila, da nabori ukazov med posameznimi računalniki niso bili enaki, kar pomeni, da programov ni bilo mogoče prenašati na druge računalnike, ampak jih je bilo treba napisati na novo, in to z uporabo povsem drugega nabora ukazov.

Zato se je pojavila potreba po nekem novem programskem jeziku (ali jezikih), ki bi te težave odpravil. In tako so nastali tako imenovani višji programski jeziki. Kaj to pomeni? Vrnimo se k omenjenim težavam. Zapisali smo, da se pojavljajo predvsem na dveh področjih – prvo je zapletenost jezika oziroma zelo omejen nabor ukazov, ki zahteva veliko dela tudi za najosnovnejše operacije, drugo področje pa je prenosljivost programov med računalniki (oziroma pozneje procesorji). Ideja višjih programskih jezikov je takšna: najprej si želimo imeti jezik, ki je mnogo preprostejši za uporabo od strojnega, po možnosti čim bližje »človeškemu«. S tem seveda ne mislimo, da bi v računalnik lahko kar v pogovornem jeziku pisali, kaj naj naredi, saj je ta jezik vse preveč nedorečen za nekaj tako neumnega, kot je računalnik. A da je A + B = C, pa res lahko »razume«. Z leti in desetletji so višji programski jeziki precej napredovali in postali dokaj intuitivni za uporabo, s čimer se je zahtevnost programiranja precej zmanjšala.

Pri tem seveda naletimo na težavo, da je računalnik tako bedast, da še vedno razume le tisto strojno kodo, saj elektronska vezja v njem razumejo le to. Zato so razvijalci izdelali posebne programe, imenovane prevajalniki, ki, potem ko je program napisan, tega pretvorijo oziroma prevedejo v program v strojnem jeziku. V primeru omenjenega seštevanja prevajalnik torej prevede A + B = C v »naloži A, dodaj B, shrani v C«. Prevajalniki so torej nekakšni vmesniki med bolj intuitivnim višjim programskim jezikom in čudnim strojnim. A to še ni vse, kot bi rekli pri TV-prodaji. Prevajalniki uspešno naslavljajo tudi drugo težavo – prenosljivost. Če so seveda ustrezno napisani, lahko neki program, izdelan v višjem programskem jeziku, prevedejo tako, da ga razume tudi kak drug računalnik, ki nima enakega nabora ukazov. S tem smo torej ubili dve muhi na en mah. In prav zato so se potem višji programski jeziki izredno razširili.

Toda zakaj je sploh treba imeti toliko jezikov? Zakaj ne bi razvijali in dodelali le enega? Eden od razlogov je ta, da so bili različni jeziki razviti za različne potrebe. Jezik, razvit za pisanje znanstvenih programov, mora zadostiti drugim potrebam kot jezik za, recimo, poslovne programe. Poleg tega so se s časom spreminjale tudi filozofije programiranja, razvijalci pa so se trudili čim bolj omiliti »računalniško« in poudariti »človeško« razmišljanje, česar obstoječi jeziki v tistem trenutku niso znali ustrezno nasloviti.

Vsega je kriv FORTRAN

John Backus, znanstvenik pri IBM-u, ki je razvil programski jezik FORTRAN (Formula Translate), je v nekem intervjuju dejal, da ga je k razvoju jezika pripeljala izključno lenoba. Pisanje strojne kode se mu je zdelo prenaporno. Prve specifikacije jezika je izdelal leta 1954, tri leta pozneje, torej leta 1957, pa je nastal prvi prevajalnik. Takrat se je ugotovilo, da je prihranek pri količini programske kode celo večji, kot je predvideval Backus. Programi v Fortranu so zahtevali le pet odstotkov količine kode strojnega jezika – za to, kar je bilo mogoče narediti v Fortranu v petih vrsticah, smo jih v strojnem jeziku potrebovali sto. Fortran je torej star 60 let. A ne mislite, da gre pri njem za neko relikvijo preteklosti. Jezik se je razvijal in se, ne boste verjeli, še razvija, saj še letos pričakujemo novo različico. Seveda ta nova različica ni niti malo podobna tisti prvi, saj se je vmes zgodilo preveč novega, a spremljanje zgodovine Fortrana je pravzaprav spremljanje zgodovine informacijske tehnologije. Noben drug izdelek na tem področju ne vztraja tako dolgo.

Pa gremo nazaj v zgodovino. Fortran je bil izdelan z mislijo na znanstveni svet oziroma matematično programiranje. Izraz, kot je na primer X = A ** 2 + 2 * A * B, kjer je * simbol za množenje, ** pa simbol za potenciranje, je pomenil izredno poenostavitev programiranja, saj je bilo mogoče enačbo napisati na skoraj enak način, kot bi jo pisali na papir, medtem ko je bilo v strojnem jeziku za programiranje te enačbe potrebnih več deset vrstic kode. Sestavni del vsakega programa je zmožnost zamenjave vrstnega reda izvajanja operacij glede na rezultat prejšnje operacije. Tak način razmišljanja je bil prisoten že v strojnem jeziku, v Fortranu pa je bil le nekoliko poenostavljen. Izraz IF (X .EQ. 0) GOTO 30 pomeni, da naj se izvajanje programa, če je vrednost X enaka nič, nadaljuje na programski vrstici 30, če ne, pa naj se izvede naslednji ukaz. Tak način oziroma filozofija programiranja je bila globoko vcepljena v način razmišljanja programerjev in je ostala tako kar nekaj desetletij, dokler nismo dobili tako imenovanega objektnega programiranja.

COBOL

Če med seboj primerjamo programske jezike, vidimo, da so si do neke mere podobni. Razen COBOL-a. Kot smo zapisali, so bili prvi programski jeziki napisani za znanstvenike, ki so potrebovali predvsem matematični pristop. Kratica COBOL pa je nastala iz okrajšave za COmmon Business Oriented Language, torej naj bi jezik nastal z mislijo na poslovne uporabnike. Leta 1958 je konferenca Codasyl (Conference on Data System Language) pokazala potrebo po izdelavi in standardizaciji programskega jezika, ki bi bil namenjen poslovni uporabi. Zbrali so poseben odbor in mu določili to nalogo. Že istega leta je nastal programski jezik COBOL, ki je nastal na temeljih, ki jih je postavila admiralka Grace Hopper iz ameriške mornarice, ki hkrati velja za eno od pionirk informatike, saj je sodelovala v ekipi, ki je razvila UNIVAC I, drugi komercialni računalnik, ki so ga izdelali v ZDA.

In kaj je bistvo COBOL-a? Tehnični programi običajno vključujejo veliko matematičnih operacij, v poslovnem svetu pa gre bolj za manipulacijo s podatki. COBOL se zato bolj posveča »premetavanju« podatkov kot pa matematiki nad njimi. Druga pomembna stvar pa so uporabniki. Znanstvene programe uporabljajo znanstveniki, ki jim je marsikaj jasno, poslovne programe pa računovodje, knjigovodje in podobni uporabniki, ki o računalnikih nimajo pojma, morajo pa razumeti, za kaj gre. Računovodji Fortranov izraz B = N * D ne pomeni nič, saj ne ve, za kaj gre, izraz POMNOŽI NETO CENO Z DAVKOM, DA DOBIŠ BRUTO CENO pa mu je jasen. In tako deluje tudi COBOL. Sicer ne v slovenščini, a filozofija je enaka.

Pri celotni stvari je zanimivo to, da tudi COBOL, tako kot FORTRAN, še vedno živi in marsikatera podjetja ga še vedno raje uporabljajo kot na primer C++ ali kak drug sodobnejši jezik.

BASIC

Za BASIC ste verjetno že slišali. Gre za kratico od Beginners' All purpose Symbolic Instruction Code, a tudi če bi zadevo prevedli kot bazično, osnovno ali kaj podobnega, ne bi hudo zgrešili, saj je pri Basicu šlo prav za to – poenostaviti programiranje s tem, da se iz programskega jezika vrže ven kar največ balasta. Jezik sta leta 1964 izdelala Američana Thomas Kurtz in John Kemeny, namenjen pa je bil predvsem v izobraževalne namene. John Kemeny velja za enega od pionirjev uporabe računalnikov v izobraževalnem procesu. Ker je bil jezik precej preprost, programi, napisani v njem, niso bili tako učinkoviti kot recimo Fortranovi ali Algolovi (Algol je bil še eden od dokaj priljubljenih programskih jezikov v tistem času). A to niti ni bilo potrebno, saj je bila ideja narediti jezik, ki se ga bodo lahko naučili tudi nematematiki.

Druga značilnost Basica je v drugačnem delovanju prevajalnika. Ostali prevajalniki so delovali tako, da je bilo treba program napisati, ga nato prevesti in potem zagnati. Prevajanje je bilo torej poseben proces. Pri Basicu pa prevajalnik deluje kar med izvajanjem, torej prevaja vsako vrstico kode sproti. S tem se delovanje sicer nekoliko upočasni, vendar na drugi strani daje programerju takojšen odziv o tem, ali program dela ali ne, saj ga le napišemo in zaženemo.

Basic je bil kakih dvajset let omejen bolj ali manj na izobraževalne ustanove. Svoj pravi pohod pa je doživel s pojavom takšnih in drugačnih namiznih računalnikov iz zgodnjih osemdesetih. Malo starejši se še spomnimo ZX Spectrumov, Commodorjev in podobnih naprav, ki so bile tudi pri nas kar pogoste, a so bile omejene na računalniške zanesenjake. In zanje je bil Basic idealna rešitev, saj za te računalnike ni bilo ravno veliko programov. Tako malo, da je o tem govoril že njihov zagon, saj se nam je po končani inicializaciji pojavila ukazna vrstica, kamor je bilo mogoče neposredno pisati programe.

Težava Basica je bila v tem, da ga je pozneje razvijala cela vrsta posameznikov in podjetij (tudi Bill Gates pred nastankom Microsofta), tako da smo dobili kup jezikov, ki so sicer temeljili na Basicu, bili pa med seboj ravno toliko nezdružljivi, da niso delovali v različnih okoljih. Tudi Basic se, petdeset let po svojem nastanku, še vedno drži. Najbolj znana različica je Visual Basic, razvojni jezik v okolju Windows in jezik, v katerem so pisani makri v MS Office.

APL

Še en zanimiv programski jezik je APL. Kratica je nastala preprosto iz A Programming Language, je pa dokaj čudaški, a izredno zanimiv in tudi pomemben. Čeprav so programi na prvi pogled videti dokaj čudno, celo malo znanstvenofantastično, je bil jezik zamišljen izredno resno. Zadevo pripisujejo kanadskemu znanstveniku Kennethu Iversonu, čeprav je jezik kot tak leta 1966 izdal IBM.

Ideja APL-a je povsem drugačna od vseh takratnih programerskih praks in jezikov. APL namreč ni deloval tako, da bi program najprej napisali, ga nato prevedli in zagnali, pač pa bi uporabnik sedel za terminalom, vpisoval ukaze, ti pa bi se izvedli takoj. Če bi vpisali recimo 5!, bi takoj dobili rezultat 120, kar je 5 x 4 x 3 x 2 x 1. Vse skupaj spominja na nič drugega kot na – kalkulator. A ni čisto tako. Ni namreč nujno, da se ukazi izvršijo tako po vpisu. Izdelati je mogoče tudi zaporedja ukazov, torej program. A bistvo APL-a je v tem, da je z razmeroma malo kode omogočal reševanje dokaj zapletenih izračunov.

Naslednji dvovrstični izraz, zapisan v APL, recimo določa, da naj računalnik izračuna in izpiše vsa praštevila med 1 in 2000:

N←2000
(~N∈N∘.×N)/N←1

Bi znali sprogramirati na kak krajši način? Prav zaradi takšne filozofije naj bi bil APL glavni navdih za elektronske preglednice in tudi programe, kot so Mathematica, Maple in podobni.

Največja takratna težava APL-a je bila v izpisu posebnih znakov, ki jih je jezik poln. Dandanes to ni težava, saj imamo tako Unicode kot tudi posebne dodatke za pisanje vseh mogočih simbolov, v šestdesetih letih pa je bila to težava. Rešil jo je IBM s svojim terminalom z »žogastim« pisalnim strojem (črke so bile v nasprotju s klasičnim pisalnim strojem postavljene na vrteči se žogici, od tod tudi izraz golfball typewriter), saj takrat še ni bilo računalniških zaslonov, kot jih poznamo, ampak se je koda tiskala na papir. Pisalni stroj s črkami, razporejenimi na žogo, je bil praktičen zato, ker je bilo žogo preprosto zamenjati in s tem zamenjati pisavo, v primeru APL-a pa seveda v nabor ustreznih znakov.

Tudi APL je še vedno prisoten, mogoče je celo kupiti posebne tipkovnice, ki vsebujejo znake oziroma simbole, ki jih jezik uporablja, obstaja celo rešitev za sistem Android, kmalu pa naj bi bila na voljo tudi različica za Windows.

C in izvedenke

Fortran je za nadzor poteka programa uvedel stavke IF in GOTO in s tem omogočil usmerjanje dogajanja glede na rezultate nekega drugega dogodka. Za Fortranom je na sceno prišel tudi jezik, imenovan Algol, ki je zadevo razširil in ustvaril osnove za vse sodobne programske jezike, kot so C, C++, C# in še kateri. Algol je namreč omogočil organizacijo programov v bloke, ki so bili programerjem bolj intuitivni. Namesto da bi se koda v primeru zadovoljenega pogoja nadaljevala na nekem drugem delu programa, kot smo to zapisali v primeru stavka IF-GOTO pri Fortranu, je Algol omogočal, da se neko zaporedje ukazov, torej blok, izvršuje, dokler ni izpolnjen neki pogoj. In to je bila na neki način osnova objektnega programiranja, kot ga poznamo zdaj.

Kot veliko drugih programskih jezikov je tudi jezik C začel nastajati v šestdesetih letih, a je luč sveta ugledal šele leta 1973 s strani Dennisa Ritchieja iz AT&T Bell Labs, ki je bil med drugim tudi eden od razvijalcev pri nastanku Unixa, ki je utrl pot sistemom, kot sta Linux in Android. Bistvo novih idej je bilo v ponovni uporabi kode. Za kaj gre? Večina programiranja temelji na konceptu programa in podprogramov. Podprogrami so delčki kode oziroma krajši deli programa, ki so namenjeni izvajanju določene funkcije, ta podprogram pa je mogoče priklicati s preprostim ukazom iz glavnega programa. Vzemimo preprost primer: v programu se pojavi potreba po večkratnem izračunu povprečne vrednosti nekih števil. Zamuden proces bi deloval tako, da bi vsakič, ko potrebujemo povprečje, števila seštevali in jih nato delili, pameten način pa, da bi naredili podprogram za izračunavanje povprečja, nato pa ga takrat, ko ga potrebujemo, preprosto poklicali. S tem se izognemo ponavljanju, kar pomeni, da je količina kode manjša, pa še preglednost programa je večja. In to je nekako poenostavljena razlaga objektnega programiranja, ki je danes na voljo skoraj povsod, če govorimo o programskem jeziku C, pa sta to predvsem C++ in C#.

Nišno in naravno

Do zdaj našteti jeziki so nekako univerzalni. Res je, da so nekateri recimo bolj namenjeni znanstveni srenji, drugi pa poslovni, a med njimi ni nepremostljivih razlik oziroma je vse od naštetih mogoče uporabiti (prisiliti) v bolj ali manj vse namene. Obstajajo pa tudi jeziki, ki so namenjeni zelo specifičnim nalogam oziroma za pisanje precej specifičnih programov. Eden takšnih je recimo Lisp, ki je bil zasnovan za delo v zvezi z umetno inteligenco, poudarek pri njem pa je predvsem na povezavah med objekti.

Zelo zanimivi so tudi jeziki, ki na prvi pogled spominjajo na omenjene splošne, so pa namenjeni uporabi na dokaj nišnih področjih. Takšna sta na primer Python in Lua. Slednji, na primer, je na prvi pogled videti zelo podoben C++ ali kateremu sorodnemu, vendar je njegova uporaba v praksi omejena skoraj izključno na industrijo iger. To pa zato, ker je Lua zelo učinkovita pri ustvarjanju kode, ki je kratka in nima velikih pomnilniških zahtev. To pa je izrednega pomena predvsem v zadnjem času, ko se igre skorajda selijo iz namiznih računalnikov v prenosne naprave, kot so pametni telefoni in tablice. Nekateri sicer trdijo, da kratka in učinkovita koda ni toliko odraz jezika, ampak bolj prevajalnika, kar je mogoče celo res, a dejstvo je, da je Lua dosegla tako imenovano »kritično maso« programerjev, da lahko rečemo, da ni muha enodnevnica, ampak jezik, ki se bo obdržal. Poznate Angry Birds? Lua!

Tudi Python je na prvi pogled podoben C++ ali Javi. A ko ga malo bolje spoznate, vidite, da je precej drugačen. Predvsem je precej preprostejši za uporabo, celo tako, da velja za enega najpreprostejših, saj zahteva precej manj kode kot konkurenca. Razlog za to je predvsem v tem, da v Pythonu ni treba definirati spremenljivk – ni treba določati, ali gre pri neki spremenljivki za celo ali realno število, saj jezik to prepozna kar sam. To je sicer dobro, kar zadeva ergonomijo uporabe, je pa zato izvajanje nekoliko počasnejše, v nekaterih primerih pa lahko pride tudi do napak.

Razlog za Pythonovo skokovito naraščanje priljubljenosti je v tem, da je izredno dobro sprejet v odprtokodnih krogih. Ko na nekem projektu dela večja skupina neodvisnih programerjev, je zelo pomembno, da je koda kratka, saj jo je tako lažje pisati, predvsem pa razhroščevati, kot pravimo iskanju in popravljanju napak, zaradi preprostosti pa je Python tudi dober magnet za privabljanje novih programerjev.

Marsikateri od naštetih jezikov je nastal v petdesetih in šestdesetih letih preteklega stoletja, kar je za informacijsko dobo večnost, a koncepti teh jezikov so ostali dokaj podobni. In kot je videti, bo tako ostalo še nekaj časa, čeprav se znanstveniki že dolgo trudijo, da bi kaj spremenili. In kakšna je ta sprememba? Drugačna skoraj ne more biti kot ta, da postane programski jezik čim bolj podoben človeškemu. Nekaj takšnih poskusov je že bilo. Recimo Smalltalk, ki je nastal že leta 1980 in je bil korak naprej, vendar so ta trenutek stvari še vedno bolj ali manj v fazi tako imenovanega »brainstorminga«. Znanstveniki napovedujejo, da bodo v naslednjih letih sicer nastale nekatere rešitve, ki bodo konvencionalne programske jezike potisnile nekoliko v smeri naravnih jezikov. Zadnje čase se veliko govori o jezikih oziroma rešitvah, kot je LabView, kjer gre sicer za okolje, namenjeno avtomatizaciji procesov, kjer se obnašanje sistema določa s pomočjo definiranja parametrov funkcijskih blokov. Tak pristop sicer ni primer naravnega jezika, gre pa za to, da je neko nalogo mogoče izvesti tudi brez klasičnega programiranja.

Programiranje v naravnem jeziku je torej še daleč, tako da se, če želite programirati, kar mirno naučite katerega od »klasikov«, saj vaše znanje še ne bo tako hitro za v koš.

Moj mikro Januar Februar 2015 | Miha Gradišnik