Računalniki znajo izvajati zaporedje ukazov strojnega jezika (angl. machine language). Strojni jezik je sestavljen iz nizov ničel in enk končne dolžine, ki predstavljajo ukaze specifičnega procesorja in njihove operande. Vsak ukaz ima svojo operacijsko kodo (kaj naj naredi), vhodne operande (kakšni so njegovi vhodi), izhodni rezultat (kakšen je rezultat procesiranja ukaza in kam naj se shrani), ter kazalec na ukaz, ki se bo izvedel za njim. Primer takšnega ukaza bi lahko bilo zaporedje ničel in enk 0001 1110 0011. Pri uporabi je potrebno natanko poznati pomen posameznih nizov. Zapis programa je človeku zelo nerazumljiv in je odvisen od računalnika (centralne procesne enote).
Ker razumejo delovanje ukazov strojnega jezika samo inženirji, ki so konstruirali računalnik, je bilo v petdesetih letih prejšnjega stoletja število tistih, ki so pisali programe zelo majhno. Tudi za te inženirje je bilo pisanje programov zelo zahtevno, zato so izumili zbirni jezik (angl. assembly language). Ukazi tega jezika so človeku bolj razumljivi, saj vsak ukaz zbirnega jezika vsebuje nize znakov, ki programerju povedo, kaj dela, od kod dobi vhodne podatke in kam shrani rezultat. Primer ukaza v zbirnem jeziku iz sredine petdesetih let prejšnjega stoletja je ukaz ADD R1, R2, R3, 144, ki sešteje vrednosti iz procesiorjevih registrov R2 in R3, rezultat pa shrani v register R3 ter omogoči izvajanje ukaza, ki je shranjen na pomnilniški lokaciji 144. Zbirnik (angl. assembler) prevede ukaze zbirnega jezika v ukaze strojnega jezika. Iz ukaza (ADD) vidimo, da vsebuje v angleškem jeziku zapisan niz znakov za operacijo (strokovni izraz mnemonik), ki pomeni v sloveščini »seštej«. Programerji, ki so programirali v zbirnem jeziku, so se jezika lažje naučili, saj so si lažje zapomnili mnemonike kot pa binarno zapisane ukaze.
Primer programa v zbirniku, ki poišče največje od treh celih števil je:
LOCO 20 % Nalozi 20 v AC
STOD 30 % Shrani AC na lokacijo 30 -spremenljivka A
LOCO 30 % Nalozi 30 v AC
STOD 31 % Shrani AC na lokacijo 31 - spremenljivka B
LOCO 10 % Nalozi 10 v AC
STOD 32 % Shrani AC na lokacijo 32 - spremenljivka C
LODD 30 % Nalozi spremenljivko A v AC
SUBD 31 % Odstej A-B
JNEG DVECJI % Ce je B vecji, skoci na DVECJI
LODD 30 % Nalozi A v AC
JUMP N1 % Nadaljuj na N1
DVECJI LODD 31 % Nalozi B v AC
N1 STOD 33 % Shrani vecjega od A,B na NAJVECJI
SUBD 32 % Odstej C od NAJVECJI
JPOS KONEC % Ce je NAJVECJI > C, skoci na KONEC
LODD 32 % Nalozi C
STOD 33 % Shrani na NAJVECJI
KONEC LODD 33 % Nalozi Najvecji v AC
Programiranje v zbirnem jeziku je bilo nekoliko lažje, še zmeraj pa je bilo precej zahtevno, saj je moral programer poznati računalniško arhitekturo, za katero je pisal programe. Svoj algoritem je moral zelo podrobno razčleniti, da ga je lahko zapisal v tem jeziku. V petdesetih letih prejšnjega stoletja so se pojavili visoki programski jeziki, katerih ukazi so bili neodvisni od arhitekture računalnika in so bili primerni za reševanje problemov določenega strokovnega področja. Najprej sta se pojavila programska jezika FORTRAN in COBOL, nato pa so se začeli pojavljati še drugi programski jeziki (ALGOL, PASCAL, BASIC, LISP, PROLOG, C....).
FORTRAN (angl. FORmula TRANslation) je namenjen pisanju programov, s katerimi rešujemo matematične probleme. Primer programa, ki izračuna obseg in ploščino kroga v tem jeziku je:
PROGRAM IZRACUNAJ_OBSEG_IN_PLOSCINO
REAL PI,R,PLOSCINA,OBSEG
PI = 3.1415926
R = 2.5
OBSEG = 2 * P * R
PLOSCINA = PI * R**2
PRINT *, "Obseg kroga je: ", OBSEG
PRINT *, "Ploscina kroga je: ", PLOSCINA
END
COBOL (angl. COmmon Business Oriented Language - obči poslovno usmerjen jezik), je namenjen za reševanje poslovnih obdelav (npr. bančne transakcije), pri katerih je potrebno izvesti razmeroma preproste operacije nad veliko količino podatkov. Primer programa v COBOLU, ki nas pozdravi je:
IDENTIFICATION DIVISION.
PROGRAM-ID. ZDRAVO.
PROCEDURE DIVISION.
DISPLAY Pozdravljen!'.
STOP RUN.
Iz prejšnjih primerov vidimo, da so se visoki programski jeziki razvili zato, da so lahko programerji lažje reševali probleme določene domene (v naših dveh primerih sta jezika omogočila lažje reševanje matematičnih in poslovnih problemov). Obstaja pa tudi splošna delitev pogramskih jezikov na imperativne, ki so namenjeni zapisu algoritma (kako naj program reši problem) in deklarativne, ki so namenjeni zapisu problema (kaj želimo, da program naredi, ne pa tudi kako naj to izvede).
Ko so se pojavili visoki programski jeziki so morali razvijalci napisati programe, ki so znali pretvoriti programe napisane v visokih programskih jezikih v programe v strojnem jeziku. Programe za pretvorbo programov, napisanih v visokih programskih jezikih, v strojni jezik delimo na prevajalnike in tolmače.
Prevajalnik (angl. compiler) najprej preveri slovnično pravilnost celotnega programa. Če je program slovnično pravilen, ga pretvori v ukaze strojnega jezika. Tolmač (nekateri mu pravijo tudi interpreter) pa vsak ukaz sproti slovnično preveri in nato ta ukaz pretvori v množico ukazov strojnega jezika. Če potegnemo analogijo s prevajanjem in simultanim prevajanjem iz tujega jezika v naš jezik, lahko rečemo, da prevajalec knjige opravlja podobno nalogo kot prevajalnik na področju programskih jezikov. Tolmač, ki izvaja simultano prevajanje, pa opravlja podobno nalogo kot tolmač v primeru interpretiranja visokega programskega jezika.
Imperativni programski jeziki omogočajo zapis rešitve problema s pomočjo zaporedja ukazov. Delimo jih na proceduralne in objektne. Proceduralni programski jeziki vsebujejo ukaze in podatkovne strukture, ki omogočajo strukturiran zapis algoritma (možno je uporabiti zaporedje ukazov, odločitvene stavke, zanke, funkcije, podprograme, spremenljivke, polja, nize znakov, datoteke, dinamične podatkovne strukture). Problem razdrobimo v logične celote, ki predstavljajo logično ločene dele celotnega programa. Primeri takšnih jezikov so FORTRAN (primer programa je prikazan zgoraj), COBOL (primer programa je prikazan zgoraj), BASIC, PASCAL, ALGOL, C...
V osemdesetih letih prejšnjega stoletja so se pojavili objektni jeziki. Programi, ki so pisani v teh jezikih, imajo vse lastnosti proceduralnih jezikov, dodatno pa uporabljajo še objekte. Objekti so svežnji podatkov in podprogramov. S pomočjo objektov običajno modeliramo elemente iz realnega sveta (npr. bančni račun, naročilnico, študenta, profesorja …). Vsak objekt ima stanje (trenutne vrednosti spremenljivk), identifikator (enolično določeno številko) in obnašanje (množico operacij, ki jih lahko izvajamo nad objektom). Objekti so zgrajeni po predlogah, ki jih imenujemo razredi. V razredu opišemo kakšne podatke (lastnosti) bodo imeli objekti ter katere operacije (metode) lahko izvajamo nad temi objekti. Primeri objektnih jezikov so SMALTALK, C++, Java, C#, Eifel…
| window |
window := Window new.
window label: 'Pozdravljen'.
window open
Zgoraj je podan primer dela programa v SMALTALK-u, ki uporablja objekt tipa window. Najprej tvori novo okno, nato pa v novem oknu izpiše “Pozdravljen” .
V nasprotju z imperativnimi jeziki pa pri deklarativnih jezikih opišemo kaj naj program naredi in ne kako naj to naredi. Deklarativne jezike delimo na funkcionalne in logične. V to skupino bi dodal še označevalne in povpraševalne jezike, ki so mešanica deklarativnega in imperativnega pristopa.
Funkcionalni jeziki omogočajo reševanje problema s pomočjo ovrednotenja funkcij, pri tem pa programi, ki so napisani v teh jezikih nimajo stanja ( spremenljivk).
Primer funkcije za izračun fibonačijevega števila v jeziku LISP je:
(defun fibonacci (N)
"Izracunaj N-to Fibonnačijevo število."
(if (or (zerop N) (= N 1))
1
(+ (fibonacci (- N 1)) (fibonacci (- N 2)))))
Lastnosti funkcionalnih jezikov imajo jeziki LISP, Haskell, ML, APL, XSL, itd.
Logični jeziki temeljijo na predikatni logiki, kjer podatke (bazo znanja) opišemo z dejstvi. Dejstva opišemo z relacijami in njihovimi lastnostmi (npr. oce(Milan, Gregor) – Milan je oče od Gregorja). Bazi znanja lahko zastavljamo vprašanja (npr. oce(X, Gregor)? – Kdo je oče od Gregorja?). Definiramo lahko tudi pravila (npr. prednik(P,N) :- oce(P,X1), oce(X1,N). – P je prednik od N, če je P oce od X1 in če je X1 oče od N).
Logični jeziki so Prolog, OWL, RDF, R++ itd.
Prednik označevalnih jezikov je GML (General Markup Language), ki ga je razvil IBM. Ta jezik je bil osnova za nastanek SGML (Standard General Markup Language), ki se uporablja za delo z besedili. Iz tega jezika so se razvili drugi jeziki kot so HTML, XML itd.
Označevalni jeziki (angl. Markup language) so jeziki, pri katerih so elementi, ki nam povejo kaj naj program naredi, značke (angl. tag). Značke nam lahko povejo kako naj prikažemo vsebino (primer je jezik HTML (angl. Hyper Text Markup Language)), kakšna je struktura podatkov (primer je jezik XML (angl. Extensive Markup Language)), kakšen pomen ima vsebina (primer sta jezika OWL in RDF), kako naj program izvede dele, ki so znotraj značk (primer je jezik BPEL).
Primer vsebine, označene v jeziku HTML je:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<!-- Glava -->
<head>
<title> Naslov dokumenta </title>
<meta http-equiv="Content-Type" content="text/html"; charset="utf-8" />
</head>
<!-- Telo -->
<body>
Telo HTML dokumenta.
</body>
</html>
Primer vsebine, označene z jezikom XML je:
<prireditev>
<naziv>Glasbeni september</naziv>
<termin>18.09.2000 do 29.09.2000</termin>
<lokacija>Območje mesta Maribor</lokacija>
<organizator>SNG Maribor</organizator>
<zvrst>koncert</zvrst>
</prireditev>
Primer vsebine, označene z jezikom RDF je:
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cd="http://recshop.fake/cd#">
<rdf:Description rdf:about="http://recshop.fake/cd/Beatles">
<cd:artist rdf:parseType="Collection">
<rdf:Description rdf:about="http://recshop.fake/cd/Beatles/George"/>
<rdf:Description rdf:about="http://recshop.fake/cd/Beatles/John"/>
<rdf:Description rdf:about="http://recshop.fake/cd/Beatles/Paul"/>
<rdf:Description rdf:about="http://recshop.fake/cd/Beatles/Ringo"/>
</cd:artist>
</rdf:Description>
</rdf:RDF>
Primer vsebine označene z jezikom BPEL je:
<containers>
<container name="input" messageType="…">
<container name="request" messageType="…">
<container name="response" messageType="…">
<container name="output" messageType="…">
</containers>
<sequence>
<receivecontainer="input"/>
<assign>
<copy>
<from container="input"/>
<to container="request"/>
</copy>
</assign>
<invoke operation="service" inputContainer="request" outputContainer="response"/>
<assign>
<copy>
<from container="response"/>
<to container="output"/>
</copy>
</assign>
<replycontainer="output"/>
</sequence>
Namen povpraševalnih jezikov je pridobiti podatke iz različnih podatkovnih virov (označene vsebine, podatkovne baze, baze znanja). V to skupino spadajo jeziki SQL, SPARQL, XQuery, Xpath, OWL-QL in drugi.
Primer deklaracije tabele v relacijski podatkovni bazi s pomočjo jezika SQL je:
CREATE tabel studentje(
Ime varchar(50),
Priimek varchar(50),
[Vpisna stevilka] int(8),
Predmet varchar(50),
Ocena int(8)
Primer povpraševanja pa:
SELECT * FROM studentje WHERE ocena > 7
Primer povpraševanja po XML s pomočjo jezika XQuery je:
<ul>
{
for $x in doc ("test.xml”) knjigarna/knjiga
where $x/cena>20
return if ($x/naslov/@jezik="en")
then <li>{data($x/naslov)} (ang)</li>
else <li>{data($x/naslov)} (slo)</li>
}
</ul>
Primer poizvedbe po imenih glavnih mest posameznih držav v Afriki s pomočjo jezika SPARQL je:
PREFIX abc: <http://example.com/exampleOntology#> .
SELECT ?capital ?country
WHERE {
?x abc:cityname ?capital ;
abc:isCapitalOf ?y.
?y abc:countryname ?country ;
abc:isInContinent abc:Africa.
}
Delitev programskih jezikov je še več. Programske jezke delimo še na dogodkovno prožene, aspektne, domensko specifične, paralelne, podatkovno vodene, skriptne, vizualne itd. Današnji programski jeziki so mešanica deklarativnih in imperativnih jezikov, saj razvijalci prevajalnikov želijo čimbolj olajšati programiranje na določenem področju. Tako danes večina programskih jezikov vsebuje možnosti:
Omenil bi še skriptne jezike, ki so danes ena izmed pomembnih smeri razvoja programskih jezikov. Najprej so se ti jeziki uporabljali za izvajanje zaporedja procesov v operacijskih sistemih (tako imenovani ukazni jeziki (angl. command line language)). Primer takšnega jezika je skriptni jezik Bash, ki se uporablja za sistemsko administracijo in povezovanje programov na računalnikih z operacijskim sistemom LINUX. Za razvoj spletnih aplikacij na strežnikih se zelo pogosto uporablja skriptni jezik PHP. Za razvoj spletnih aplikacij, ki se izvajajo v spletnem brskalniku pa se uporablja skriptni jezik Javascript. Skrptni jeziki so danes mešanica objektnih in deklarativnih jezikov.
Primer funkcije znotraj dokumenta HTML v jeziku Javascript je:
<html>
<head>
<script language="JavaScript">
function nastavi_modro()
{
document.bgColor="blue" ;
}
</script>
</head>
<body onload="nastavi_modro()">
(Vsebina hipertekstne strani)
</body>
</html>
Primer programa v jeziku PHP je:
<?php
$i = 1;
while($i < 5){
echo 'Vrednost je: ' . $i . '<br/>';
$i++;
}
?>
<html>
<head>
<script language="JavaScript">
function nastavi_modro()
{
document.bgColor="blue" ;
}
</script>
</head>
<body onload="nastavi_modro()">
(Vsebina hipertekstne strani)
</body>
</html>
Odgovorite na naslednja vprašanja:
Katera trditev velja zbirnik?
Katera trditev nalboljše opisuje tolmač?
Katera trditev nalboljše opisuje prevajalnik?
Kateri jeziki spadajo med imperativne?
Namig: Odkljukati je potrebno 3 alineje
Kateri jeziki spadajo med deklarativne?
Namig: Odkljukati je potrebno 5 alineje
Imperativni jeziki so namenjeni:
Deklarativni jeziki so namenjeni:
Katere vrste jezikov spadajo med imperativne?
Namig: Odkljukati je potrebno 2 alineji
Katere vrste jezikov spadajo med deklarativne?
Namig: Odkljukati je potrebno 3 alineje