owned this note
owned this note
Published
Linked with GitHub
Uvod
====
Računar je mašina koja obrađuje podatke upotrebom fizičkih fenomena poput električnih, mehaničkih ili hidrauličkih veličina za modeliranje i rješavanje problema. Prvi računari bile su mehaničke mašine koje su se uptrebljavale kao pomoć pri računanju i mjerenju za potrebe astronomije i navigacije.
Engleski inžinjer mašinstva Charles Babbage se smatra tvorcem modernog računara. Početkom 19. stoljeća je osmislio prvi programabilni mehanički računar **opšte namjene** pod nazivom Analitički motor. Uređaj bi uzimao probušene kartice gdje je pristutvo ili odsustvo rupica na kartici predstavljalo uputstvo za rad mašine. Mašina je trebala posjedovati printer, ploter krivih i zvonce, koji bi se koristili za predstavljanje rezultata njenog rada. Analitički motor je trebala pokretati osovina na pogon parnog motora. Osovine, ali u vertikalnom položaju, bi se koristile i za pohranu brojeva gdje bi na svakoj od njih bilo postavljeno 40 točkova koji su se mogli nalaziti u 10 različitih pozicija (cifre od 0 do 9), te je zamišljeno da mašina može čuvati 1000 dekadnih brojeva od po 40 cifri (oko 16,6 kB). Uređaj prilikom svog rada, a na osnovu uputstava sa probušenih kartica mogao bi vršiti sve četiri osnovne računske operacije, ali i poređenje brojeva i računanje korijena. Osnovna razlika u odnosu na prethodne računare jeste što je ovo bila prva **Turing-potpuna mašina**, te nije imala konkretnu namjenu (npr. računanje pozicija u astronomiji ili rješavanje trigonometrijskih problema) već su se pomoću kartica mogle davati instrukcije za rješavnje različitih problema.
:::info
Pojam Turing potpunosti izučava se u oblasti teorijskih kompjuterkih nauka pod nazivom teorija izračunljivoti, a njegovo razmatranje izlazi izvan opsega ovog poglavlja. Ipak, svi današnji programski jezici su Turing potpuni što zanči da, u teoriji, bilo koji program napisan u nekom od savremenih programskih jezika bi se mogao izvšiti i na Analitičkom motoru. Naravno, bilo bi potrebno mnogo više vertikalnih osovina za proširenje memorije, a vrijeme izvršavanja današnjih programa bi trajalo milenijima jer se brzina izvršavanja jedne operacije na Analitičkom motoru mjeri u sekundama, a današnji računuari izvršavaju više milijardi operacija u jednoj sekundi. Kako bi se stekao osjećaj ove razlike, potrebno je imati u vidu da milijijarda sekundi iznosi 31,7 godina.
:::
Charles Babbage je preminuo prije nego je uspjeo napraviti fizičku verziju ove mašine. Na osnovu dizajna mašine, Ada Lovelace, engleska matematičkarka, je u naučnom radu napisala način (algoritam) za računanje Bernoullijevih brojeva na uređaju, što se smatra prvim objavljenim računarskim algoritmom i prvim kompletnim računarskim programom. Stoga, Ada Lovelace se smatra prvom programerkom računara.
Za razliku od Babbage-ovog računara koji je zamišljen da se pokreće parnim motorm i da brojeve (podatke) modelira mehaničkim točkovima, moderni računari za obje ove potrebe koriste električnu energiju. Konkretnije, današnji računari koriste minijaturne komponente - tranzistore - koji upotrebljavaju nivo voltaže za rad sa vrijednostima. Prepoznaju se dva nivoa voltaže: niski (0 V) i visoki (5 V).
:::info
Nije nužno da računar koristi električnu energiju za predstavljane podataka. Potojali su i postoje (danas najčešće u muzejima) računari koji su koristili i druge medije. Na primjer, računar MONIAC je koristio vodu i dinamiku fluida kako bi modelirao ekonomiju Velike Britanije. U 1950-tim godinama digitalni računari koje pokreće struja postaju ekonomičniji i tačniji, te samim time i standard u industiji. I danas se na nekim univerzitetima vrše istraživanja o analognim računarima, njihovom razvoju i primjeni.
:::
:::info
Iako spor Analitički motor je brojeve predstavljao koristeći deset pozicija što je odgovaralo ciframa od 0 do 9. Odabir upotrebe samo dva nivoa voltaže može se činiti kao nazadovanje, jer omogućava predstavljanje 5 puta manje podataka. Zaista, izvodivo je napraviti digitalne računare koji rade sa decimalnim brojevima (npr. IBM 650) ili koji detektuju više nivoa voltaže.
U praksi mnogo je lakše, jeftinije i efikasnije praviti tranzistore koji rade sa samo dva nivoa voltaže, pa čak iako ih je potrebno više. Postojanjem samo dva stanja:
* smanjuje se dvosmislenost;
* povećava se dozvoljeni nivo šuma u signalu (npr. ukoliko je na elementu očitano 4.75 V, može se pretpostaviti da se radi o visokoj voltaži, dok ukoliko u istom rasponu od 0 V do 5 V želimo predstaviti deset različitih vrijednosti, ne može se sa sigurnošću utvrditi da li se radi o 9. nivou voltaže ili o 10. nivou);
* olakšava se mogućnost kopiranja podataka.
Veličina tranzistora se kontinuirano smanjuje. Njihova trenutna veličina se mjeri u nanometrima i počinju se primicati veličini atoma. Za očekivati je da će kada se dostignu ovi limiti doći i do upotrebe alternativa digitalnim računarima.
:::
## Šta je 5 volti, odnosno šta su vrste podataka?
Razlika između 0 V i 5 V je temeljna za rad računara. Ova dva nivoa, sama po sebi, nemaju nikakvo inherentno značenje, odnosno, samo je važno da ih se može razlikovati. Dva nivoa se mogu predstaviti na različite načine, npr. slovima N (niski) i V (visoki) ili slovima L (low) i H (high), ili slovima F (false) i T (true). Interesantno predstavljanja ovih voltaža je pomoću brojeva 0 i 1. Time se ulazi u sferu brojeva i stvari počinju da budu zanimljive.
Prilikom zapisivanja *dekadnih brojeva* kada se potroši svih deset cifri, sa lijeve strane se dopisuje broj 1, a desne cifre ponovo kreću od nule. Kada se i one potroše, sa lijeve strane se piše broj 2 i proces se ponavlja. A šta kada se potroše sve lijeve cifre? Odgovor je naravno: trocifreni brojevi!
Dvijema voltažama mogu se dodijeliti simboli 0 i 1, koji omogućavaju brojanje do ... 1! Kao i kod dekadnih brojeva, kada se potroše sve, tj. obje cifre, sa lijeve strane dodaje se broj jedan a desne cifre ponovo kreću od nule. U ovakvom sistemu, vrijednost 10 predstavlja dekadni broj 2. Vrijednost 11 je dekadni broj 3, a prelaskom na trocifrene brojeve dobija se 100 što predstavlja dekadni broj 4. Sistem predstavljanja brojeva koristeći dva simbola naziva se **binarni brojni sistem**.
### Kada 100 nije stotinu, već 4
Rad sa binarnim brojevima je osnov funkcionisanja računara, dok sa druge strane ljudi su navikli koristiti dekadne brojeve. Konverzija između ova dva sistema je česta operacija, a shodno tome i neophodna vještina za programere.
:::info
Prelazak na rad sa binarnim brojevima može biti zahtjevan pošto su ljudi navikli baratati sa dekadnim brojevima koje koriste od prvog razreda osnove škole. Treba imati u vidu da je to posljedica činjenice da ljudi imaju deset prstiju na rukama, a ne neki zakon univerzuma.
:::
Konverzije iz binarnog u dekadni sistem je jednostavnija. U dekadnom sistemu pozicije cifri predstavljaju jedinice, desetice, stotice, odnosno koliko se u broju nalazi jedinica, desetica i stotica. Tako se u broju 742 nalazi sedam stotica, četiri desetice i dvije jedinice. Iako čitanje brojeva ljudi rade intuitivno u pozadini izvršavaju narednu kalkulaciju: $7 * 10^2 + 4 * 10^1 + 2 * 10^0$. Sa desna na lijevo pozicija svake cifre odgovara broju deset stepenovanog sa pozicijom te cifre, a sama cifra predstavlja količinu te vrijednosti (cifra $7$ na trećoj poziciji sa desna označava da broj sadrži $7$ puta vrijednost $10^2$). U informatici, a i matematici, brojanje često počinjemo od $0$, a ne $1$, pa se krajnja desna cifra nalazi na poziciji $0$.
Binarni brojevi slijede istu metodologiju predstavljana vrijednosti. S obzirom da jedna cifra u binarnom sistemu može predstavljati dvije vrijednosti, pozicije određuju stepenovanje broja $2$, a ne $10$. Ostatak kalkulacije je isti kao i u dekadnom sistemu. Stoga, binrani broj $1001$ predstavlja $1 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0$ odnosno dekadnu vrijednost $9$.
:::info
Kada se govori i radi sa oba sistema dekadnim i binarnim lako može doći do zabune. Kako bi se zabuna izbjegla upotrebljavaju se oznake brojnog sistema. U programskom jeziku Python prilikom pisanja binarnog broja dodaje se prefiks `0b`, dok za dekadne brojeve nije potrebna upotreba oznake. Zato `100` označava broj stotinu, a `0b100` predstavlja binarni broj koji ima dekadnu vrijednost $4$.
:::
Razmotrimo primjer gdje želimo zapisati količinu nekih objekata u dekadnom sistemu. Počinjemo s nizom objekata, gdje na poziciju jedinica možemo zapisati vrijednosti od 0 do 9. Ako imamo više od 9 objekata, moramo koristiti dodatne pozicije poput desetica, stotica, i tako dalje.
Na primjer, ako imamo više od 9 objekata, jedan objekat stavljamo na poziciju desetica, koja predstavlja skup od 10 objekata, a preostali broj manji od 10 ostaje na poziciji jedinica. Ovo znači da za broj između 10 i 19, cifra 1 predstavlja jednu grupu od 10 objekata, dok preostali broj objekata zapisujemo na poziciju jedinica.
Matematički, ovaj proces se može opisati kao dijeljenje s 10:
- Ostatak dijeljenja sa 10 daje nam broj objekata na poziciji jedinica.
- Cjelobrojno dijeljenje sa 10 daje broj desetica, koji predstavlja koliko grupa od po 10 objekata imamo.
Ako imamo veći broj objekata, recimo više od 100, isti postupak se ponavlja. Pozicija stotica sada predstavlja skupove od 100 objekata, dok desetice i jedinice prikazuju preostale manje grupe.
Analizom opisanog procesa može se zaključiti da na poziciju jedinica stavljamo cifru koja predstavlja ostatak dijeljenja sa 10, jer tom operacijom dobijamo broj 4. Cjelobrojnim djeljenjem sa 10 dobit ćemo broj preostalih desetica. Na primjer, broj $154$ se sastoji od 1 stotice, 5 desetica i 4 jedinice.
$154 \bmod 10 = 4$
$\lfloor 154 \div 10 \rfloor = 15$
$15 \bmod 10 = 5$
$\lfloor 15 \div 10\rfloor = 1$
Analogan algoritam se koristi za zapisivanje binarne vrijednosti s tim što se za dijeljenje i ostatak dijeljenja koristi baza 2.
Posljednja cifra u binarnom zapisu dobit će se ostatkom djeljenja sa brojem dva (npr. $154 \bmod 2 = 0$). Kako bi se dobila naredna cifra (broj dvica) vrijednost se cjelobrojno dijeli sa 2 $\lfloor154 \div 2 \rfloor = 77$. Proces se nastavlja:
```mermaid
graph TD
A[154] --> B[154 / 2 = 77, ostatak 0]
B --> C[77 / 2 = 38, ostatak 1]
C --> D[38 / 2 = 19, ostatak 0]
D --> E[19 / 2 = 9, ostatak 1]
E --> F[9 / 2 = 4, ostatak 1]
F --> G[4 / 2 = 2, ostatak 0]
G --> H[2 / 2 = 1, ostatak 0]
H --> I[1 / 2 = 0, ostatak 1]
I --> J[Binarni rezultat: 10011010]
```
<!---
* $77 \bmod 2 = 1$, te je posljednji dio binarnog broja $10$
* $\lfloor 77 \div 2 \rfloor = 38$
* $38 \bmod 2 = 0$, te je posljednji dio binarnog broja $010$
* $\lfloor 38 \div 2 \rfloor = 19$
* $19 \bmod 2 = 1$, te je posljednji dio binarnog broja $1010$
* $\lfloor 19 \div 2 \rfloor = 9$
* $9 \bmod 2 = 1$, te je posljednji dio binarnog broja $11010$
* $\lfloor 9 \div 2 \rfloor = 4$
* $4 \bmod 2 = 0$, te je posljednji dio binarnog broja $011010$
* $\lfloor 4 \div 2 \rfloor = 2$
* $2 \bmod 2 = 0$, te je posljednji dio binarnog broja $0011010$
* $\lfloor 2 \div 2 \rfloor = 1$
* $1 \bmod 2 = 1$, te je posljednji dio binarnog broja $10011010$
* $\lfloor 1 \div 2 \rfloor = 0$
-->
Kada se kao rezutlat dijeljenja sa brojem $2$ dobije nula, znači da su prebrojane sve dvojke, četvorke, osmice, itd. Stoga, prethodna binarna vrijednost je ujedno i binarni zapis dekatnog broja. Dekadni broj $154$ se binarno zapisuje kao $10011010$.
Ukratko algoritam za konverziju dekadnog zapisa u binarni slijedi naredne korake:
* Ostatak dijeljenja sa dekadnog broja se zapisuje na početak binarnog broja. Ako je ostatak $1$, na početak se zapisuje jedinica, a ako je ostatak $0$, u zapisuje se nula.
* Zatim se vrši cjelobrojno dijeljenje sa $2$. Ukoliko rezultat nije $0$ ponovo se izvršava prvi korak sa dobivenom vrijednošću. Ukoliko rezultat jeste $0$ proces je konverzije je okončan.
### Kada 100 nije stotinu, već 00000100
Kao što je već navedeno, računar koristi dvije različite voltaže - nisku i visoku - koje se obično predstavljaju kao 0 i 1. Ove dvije različite voltaže predstavljaju osnovni način na koji računari pohranjuju i obrađuju podatke, a svaka od tih vrijednosti naziva se **bit** (skraćenica od engleskog "binary digit"). Bit je najmanja jedinica informacije koju računar može obraditi, pri čemu vrijednost bita može biti ili 0 (niska voltaža) ili 1 (visoka voltaža). Ove dvije vrijednosti, iako same po sebi jednostavne, predstavljaju osnovu za sve operacije koje računar može izvršiti. Sve informacije koje računar obrađuje - tekst, slike, zvuk, i drugi podaci - na kraju su prikazane nizovima nula i jedinica, odnosno nizovima bitova.
Zbog toga što jedan bit može predstavljati samo dvije vrijednosti, on nije dovoljan za pohranu ili reprezentaciju složenijih podataka. Složeniji podaci, poput brojeva većeg raspona, zahtijevaju veći broj kombinacija, a to se postiže grupisanjem bitova u veće jedinice. Najčešća jedinica koja grupiše bitove naziva se **bajt**. Bajt je sekvenca od tačno 8 bitova, što znači da svaki bajt može predstavljati ukupno 256 različitih vrijednosti ($2^8$). Kombinacijom 8 bitova dobija se mnogo veći broj mogućih stanja, omogućavajući računarima da predstavljaju i obrađuju složenije podatke efikasnije nego korištenjem individualnih bitova.
Pojam bajta i njegova veličina, kao sekvenca od 8 bitova, nisu uvijek bili standard. Naime, istorijski razvoj računara pokazuje raznovrsnu upotrebu različitih veličina "bajtova". Prvi digitalni računari sredinom 20. stoljeća nisu imali univerzalno definisanu veličinu za ovu jedinicu podataka. Na primjer, neki od ranih mašina, poput računara IBM 7030 Stretch, koristili su varijabilne veličine bajtova, od 1 do 6 bitova, u zavisnosti od vrste podatka koji su pohranjivali.
Odluka o standardizaciji bajta od 8 bitova dogodila se postepeno, prvenstveno iz praktičnih razloga. Kako su računari postajali složeniji i kako su se podaci počeli razmjenjivati, bilo je neophodno definisati pouzdanu i standardizovanu veličinu najmanje jedinice podataka. Osam bitova pokazalo se kao optimalno rješenje iz nekoliko razloga:
1. **Efikasnost kodiranja podataka**: Bajt od 8 bitova omogućava reprezentaciju 256 različitih vrijednosti
2. **Implementacija u hardveru**: S obzirom na tadašnja tehnička ograničenja rad sa nizovima od 8 bitova bio je optimalan kompromis između performansi i složenosti hardverske implementacije. Osam bitova lako je podijeliti na manje dijelove (npr. polovinu od 4 bita), što je olakšavalo razvoj i proizvodnju standardizovanih memorijskih modula.
3. **Kompatibilnost i interoperabilnost**: Različite veličine bajtova koje su koristile rane računarske arhitekture izazivale su probleme kod prenošenja podataka i kompatibilnosti programa. Uvođenje standardnog bajta od 8 bitova pojednostavilo je razvoj softvera, omogućavajući prenosive kodove između različitih mašina i razvoj univerzalnih komunikacijskih protokola.
Stoga, možemo reći da je odabir veličine bajta rezultat evolutivnog razvoja računarskih tehnologija, s ciljem olakšavanja standardizacije i interoperabilnosti između računarskih sistema. Danas je 8-bitni bajt univerzalni standard za gotovo sve računarske arhitekture, te sve više apstraktnih jedinica podataka kao što su kilobajt (KB), megabajt (MB), i gigabajt (GB) temelje se na ovoj jedinici.
Iako bajt može sadržavati vrijednosti od 0 do 255, često ćemo vidjeti da se i manje vrijednosti zapisuju koristeći cijeli bajt. Na primjer, binarna vrijednost 100 može se zapisati kao 00000100, gdje su vodeće nule dodane kako bi se popunilo svih 8 bitova. Ova praksa omogućava dosljednost u radu s podacima, olakšava njihovu obradu i usklađena je sa arhitekturom računara koja očekuje podatke u jedinicama cijelih bajtova.
### Kada 100 nije stotinu, već 256
Dekadni i binarni sistemi su dva različita načina zapisivanja brojeva, koristeći baze 10 i 2. Ipak, bilo koja vrijednost može se zapisati korištenjem drugih baza, zavisno od potrebe i konteksta. U digitalnom svijetu, pored binarnog sistema (baza 2), pokazala se vrlo korisnom i baza 16, poznata kao heksadecimalni brojni sistem.
Heksadecimalni sistem koristi šesnaest različitih simbola za predstavljanje brojeva: cifre od 0 do 9 i slova od A do F, gdje A predstavlja vrijednost 10, B vrijednost 11, i tako dalje, sve do F, koje predstavlja 15. Ova proširena baza omogućava kraće zapise za vrijednosti koje bi u binarnom sistemu bile mnogo duže.
Jedan od glavnih razloga za upotrebu heksadecimalnog sistema u računarstvu jeste njegova povezanost s binarnim sistemom. Dok binarni brojevi mogu brzo postati dugački i nečitljivi, heksadecimalni zapis omogućava kompaktnije predstavljanje istih informacija. Svaka heksadecimalna cifra predstavlja tačno četiri bita, što znači da se svaki binarni broj lako može prevesti u heksadecimalni, i obrnuto.
Na primjer, binarni broj 11011011 može se podijeliti u dvije grupe po četiri bita: 1101 i 1011. Prva grupa, 1101, odgovara heksadecimalnoj cifri D, dok druga grupa, 1011, odgovara cifri B. Dakle, binarni broj 11011011 se u heksadecimalnom sistemu zapisuje kao `0xDB`.
:::info
Kao što je već objašnjeno, prefiks `0b` koristi se za označavanje binarnih brojeva, gdje svaka cifra može biti samo 0 ili 1. Slično tome, prefiks 0x koristi se za označavanje heksadecimalnih brojeva, koji koriste bazu 16 i obuhvataju cifre od 0 do 9, te slova od A do F, koja predstavljaju vrijednosti od 10 do 15.
Oznake `0x` i `0b` pomažu programima da razlikuju različite brojne sisteme. Na primjer, broj `100` bez prefiksa bi bio protumačen kao dekadni broj. Međutim, broj `0b100` interpretira se kao binarni broj, što daje dekadnu vrijednost 4, dok se `0x100` interpretira kao heksadecimalni broj, što u dekadnom sistemu odgovara vrijednosti 256.
:::
Heksadecimalni sistem je posebno koristan kada radimo s memorijom, registrom procesora ili drugim područjima gdje su podaci često predstavljeni u binarnom formatu. Budući da je svaka heksadecimalna cifra ekvivalentna grupi od četiri bita, memorijske adrese ili druge binarne vrijednosti se mogu efikasnije prikazivati i pratiti. Na primjer, adresa poput `1101101010110001` u binarnom sistemu može se lako prikazati u skraćenom heksadecimalnom obliku kao `0xDAB1`, što znatno pojednostavljuje čitanje i obradu podataka.
### Kada 100 nije stotinu, već d
Računari ne razumiju tekst onako kako ga ljudi doživljavaju. Kao što je već spomenuto, oni rade isključivo s digitalnim signalima – nizovima nula i jedinica. Sami ti signali nemaju nikakvo značenje, već su samo različiti nivoi napona koje računar koristi za rad. Da bi računar mogao te signale koristiti za nešto smisleno, poput prikazivanja teksta, potrebno je da svaki niz tih bitova bude preveden u prepoznatljiv simbol. Upravo zbog toga su razvijeni kodni sistemi, poput ASCII tabele, koji omogućavaju računaru da ove nizove brojeva poveže sa specifičnim karakterima, kao što su slova, brojevi i interpunkcijski znakovi.
ASCII (American Standard Code for Information Interchange), osmišljen 1960-ih godina od strane Boba Bemer-a iz IBM-a, postao je ključan odgovor na tu potrebu. Računari su tada koristili različite, nekompatibilne sisteme kodiranja, što je činilo komunikaciju između različitih uređaja i proizvođača gotovo nemogućom. ASCII je uveo standardizovan način predstavljanja tekstualnih simbola u obliku binarnih brojeva, čime je omogućena interoperabilnost između računara.
Motivacija za kreiranje ASCII-a bila je omogućiti univerzalno kodiranje teksta koje bi svaki računar mogao razumjeti. ASCII tabela sadrži 128 znakova, uključujući slova engleskog alfabeta, brojeve, interpunkcijske znakove, kao i kontrolne znakove koji upravljaju načinom prikaza teksta. Na primjer, binarni broj `1100100` (dekadni broj `100`) u ASCII tabeli odgovara simbolu ``'d'``, dok broj 65 predstavlja simobl `'A'`. Ovaj jednostavan sistem korištenja brojeva za prikazivanje znakova omogućio je računarima da razmjenjuju tekstualne informacije, a ne samo brojeve.
| Decimal | Binary | Hex | Symbol | Decimal | Binary | Hex | Symbol |
|----------:|---------:|:------|:---------|----------:|---------:|:------|:---------|
| 0 | 0000000 | 00 | NUL | 64 | 1000000 | 40 | @ |
| 1 | 0000001 | 01 | SOH | 65 | 1000001 | 41 | A |
| 2 | 0000010 | 02 | STX | 66 | 1000010 | 42 | B |
| 3 | 0000011 | 03 | ETX | 67 | 1000011 | 43 | C |
| 4 | 0000100 | 04 | EOT | 68 | 1000100 | 44 | D |
| 5 | 0000101 | 05 | ENQ | 69 | 1000101 | 45 | E |
| 6 | 0000110 | 06 | ACK | 70 | 1000110 | 46 | F |
| 7 | 0000111 | 07 | BEL | 71 | 1000111 | 47 | G |
| 8 | 0001000 | 08 | BS | 72 | 1001000 | 48 | H |
| 9 | 0001001 | 09 | HT | 73 | 1001001 | 49 | I |
| 10 | 0001010 | 0A | LF | 74 | 1001010 | 4A | J |
| 11 | 0001011 | 0B | VT | 75 | 1001011 | 4B | K |
| 12 | 0001100 | 0C | FF | 76 | 1001100 | 4C | L |
| 13 | 0001101 | 0D | CR | 77 | 1001101 | 4D | M |
| 14 | 0001110 | 0E | SO | 78 | 1001110 | 4E | N |
| 15 | 0001111 | 0F | SI | 79 | 1001111 | 4F | O |
| 16 | 0010000 | 10 | DLE | 80 | 1010000 | 50 | P |
| 17 | 0010001 | 11 | DC1 | 81 | 1010001 | 51 | Q |
| 18 | 0010010 | 12 | DC2 | 82 | 1010010 | 52 | R |
| 19 | 0010011 | 13 | DC3 | 83 | 1010011 | 53 | S |
| 20 | 0010100 | 14 | DC4 | 84 | 1010100 | 54 | T |
| 21 | 0010101 | 15 | NAK | 85 | 1010101 | 55 | U |
| 22 | 0010110 | 16 | SYN | 86 | 1010110 | 56 | V |
| 23 | 0010111 | 17 | ETB | 87 | 1010111 | 57 | W |
| 24 | 0011000 | 18 | CAN | 88 | 1011000 | 58 | X |
| 25 | 0011001 | 19 | EM | 89 | 1011001 | 59 | Y |
| 26 | 0011010 | 1A | SUB | 90 | 1011010 | 5A | Z |
| 27 | 0011011 | 1B | ESC | 91 | 1011011 | 5B | [ |
| 28 | 0011100 | 1C | FS | 92 | 1011100 | 5C | \ |
| 29 | 0011101 | 1D | GS | 93 | 1011101 | 5D | ] |
| 30 | 0011110 | 1E | RS | 94 | 1011110 | 5E | ^ |
| 31 | 0011111 | 1F | US | 95 | 1011111 | 5F | _ |
| 32 | 0100000 | 20 | (space) | 96 | 1100000 | 60 | ` |
| 33 | 0100001 | 21 | ! | 97 | 1100001 | 61 | a |
| 34 | 0100010 | 22 | " | 98 | 1100010 | 62 | b |
| 35 | 0100011 | 23 | # | 99 | 1100011 | 63 | c |
| 36 | 0100100 | 24 | $ | 100 | 1100100 | 64 | d |
| 37 | 0100101 | 25 | % | 101 | 1100101 | 65 | e |
| 38 | 0100110 | 26 | & | 102 | 1100110 | 66 | f |
| 39 | 0100111 | 27 | ' | 103 | 1100111 | 67 | g |
| 40 | 0101000 | 28 | ( | 104 | 1101000 | 68 | h |
| 41 | 0101001 | 29 | ) | 105 | 1101001 | 69 | i |
| 42 | 0101010 | 2A | * | 106 | 1101010 | 6A | j |
| 43 | 0101011 | 2B | + | 107 | 1101011 | 6B | k |
| 44 | 0101100 | 2C | , | 108 | 1101100 | 6C | l |
| 45 | 0101101 | 2D | - | 109 | 1101101 | 6D | m |
| 46 | 0101110 | 2E | . | 110 | 1101110 | 6E | n |
| 47 | 0101111 | 2F | / | 111 | 1101111 | 6F | o |
| 48 | 0110000 | 30 | 0 | 112 | 1110000 | 70 | p |
| 49 | 0110001 | 31 | 1 | 113 | 1110001 | 71 | q |
| 50 | 0110010 | 32 | 2 | 114 | 1110010 | 72 | r |
| 51 | 0110011 | 33 | 3 | 115 | 1110011 | 73 | s |
| 52 | 0110100 | 34 | 4 | 116 | 1110100 | 74 | t |
| 53 | 0110101 | 35 | 5 | 117 | 1110101 | 75 | u |
| 54 | 0110110 | 36 | 6 | 118 | 1110110 | 76 | v |
| 55 | 0110111 | 37 | 7 | 119 | 1110111 | 77 | w |
| 56 | 0111000 | 38 | 8 | 120 | 1111000 | 78 | x |
| 57 | 0111001 | 39 | 9 | 121 | 1111001 | 79 | y |
| 58 | 0111010 | 3A | : | 122 | 1111010 | 7A | z |
| 59 | 0111011 | 3B | ; | 123 | 1111011 | 7B | { |
| 60 | 0111100 | 3C | < | 124 | 1111100 | 7C | | |
| 61 | 0111101 | 3D | = | 125 | 1111101 | 7D | } |
| 62 | 0111110 | 3E | > | 126 | 1111110 | 7E | ~ |
| 63 | 0111111 | 3F | ? | 127 | 1111111 | 7F | ␡ |
ASCII je brzo postao standard jer je riješio ključni problem – omogućio je različitim računarima da koriste isti kodni jezik za tekst. Ovaj standardizovani pristup ubrzo su prihvatili proizvođači hardvera i softvera, pa je ASCII postao temelj digitalne komunikacije. On je bio esencijalan u razvoju ranih sistema za e-mail, tekstualne datoteke (eng. fajlove) i prikazivanje tekstualnih informacija na ekranima.
Ipak, ASCII ima svoje limitacije. Sadrži samo 128 znakova, što je dovoljno za osnovni engleski alfabet, brojeve i simbole, ali ne i za druge jezike ili specijalne simbole. Pojavila se potreba za kodnim sistemima koji mogu obuhvatiti mnogo širi spektar znakova, uključujući simbole za različite jezike i posebne tehničke simbole. Tako je nastao Unicode, kodni sistem koji može predstavljati stotine hiljada znakova, omogučavajući pisanje na praktično svim jezicima svijeta. I dok Unicode danas dominira, ASCII i dalje zadržava svoje mjesto u osnovnim funkcijama sistema, zbog svoje jednostavnosti i kompatibilnosti sa ranijim tehnologijama.
### Kada 100 nije stotinu, već siva
U digitalnom prikazu slika, broj 100 više nije samo broj, već on postaje ključna komponenta koja definiše izgled piksela. U sivim (eng. grayscale) slikama, svaka vrijednost piksela određuje nijansu sive boje, a te vrijednosti se kreću od 0 (potpuno crna) do 255 (potpuno bijela). Vrijednost 100 u tom spektru predstavlja tamniju sivu nijansu, bližu crnoj nego bijeloj, dok se vrijednosti poput 200 kreću prema svjetlijim tonovima.
:::info
**Piksel** je osnovna jedinica digitalne slike, tj. najmanji element slike koji može prikazati određenu boju ili nijansu. Naziv dolazi od skraćenja riječi "picture element", i svaki piksel predstavlja jednu tačku na ekranu. Pikseli su kvadratnog oblika i poredani su u redove i kolone, formirajući mrežu ili matricu koja čini sliku. Važno je napomenuti je da cijeli piksel uvijek ima samo jednu boju ili nijansu i ne može biti podijeljen tako da njegovi dijelovi prikazuju različite boje. U kombinaciji s milionima drugih piksela, svaka tačka doprinosi stvaranju kompletne slike koju vidimo na monitoru, telefonu ili televizoru. Sami pikseli su tako sitni da ih naše oko ne može razlikovati pojedinačno, pa se njihovim stapanjem stvara iluzija neprekidne slike.
:::
Ovaj raspon od 0 do 255 nije slučajan. Povezan je s veličinom bajta. Bajt, kao što je ranije objašnjeno, sastoji se od 8 bitova, što omogućava predstavljanje 256 različitih vrijednosti. Svaki piksel u sivoj slici može se opisati jednim bajtom, a vrijednost tog bajta određuje koliko će taj piksel biti svijetao ili taman. Dakle, broj 100 postaje značajan u kreiranju vizualne slike, prikazujući tačno određenu tamniju sivu nijansu.
Ali, dok sive slike koriste samo jedan bajt po pikselu da bi prikazale nijanse sive, stvaranje RGB slika zahtijeva složeniji pristup. RGB je akronim za tri osnovne boje koje se koriste u digitalnim slikama: Red (crvena), Green (zelena) i Blue (plava). Umjesto da se svaki piksel predstavi jednom vrijednošću, kao kod sivih slika, u RGB slikama svaki piksel se sastoji od tri vrijednosti – po jedna za svaku od ovih boja. Svaka od tih vrijednosti također se kreće u rasponu od 0 do 255, pa se time postiže kombinacija koja omogućava prikazivanje širokog spektra boja.
Na primjer, ako su sve tri komponente crvene, zelene i plave postavljene na 0 (`R=0, G=0, B=0`), dobijamo potpuno crnu boju. S druge strane, ako su sve tri komponente na 255 (`R=255, G=255, B=255`), dobijamo čistu bijelu boju. Međutim, kada se različite vrijednosti boja kombinuju, stvaraju se nijanse boja. Recimo, kombinacija `R=255, G=0, B=0` daje čistu crvenu, dok kombinacija `R=255, G=165, B=0` rezultira narandžastom bojom, jer crvena dominira, a zelena doprinosi stvaranju tople nijanse, dok plava ostaje isključena.
Dakle, svaka RGB slika koristi tri bajta po pikselu – jedan za crvenu, jedan za zelenu i jedan za plavu komponentu. Ove tri vrijednosti omogućavaju računaru da generiše više miliona različitih boja kombinacijom različitih intenziteta svjetlosti za svaku boju. Tako jedna slika može sadržavati detaljno prikazane nijanse, od svijetlih, svijetloplavih tonova do tamnih, bogatih nijansi crvene ili zelene.
:::info
Baš kao što se digitalna slika sastoji od piksela koji prikazuju statičnu scenu, video se sastoji od niza takvih slika, poznatih kao okviri (frames), koje se brzo smjenjuju kako bi se stvorio dojam pokreta. Kada se okviri prikazuju jedan za drugim određenom brzinom, najčešće 24, 30 ili 60 okvira po sekundi, ljudsko oko ih percipira kao neprekidan, tečan tok. Brzina kojom se ovi okviri smjenjuju, poznata kao fps (frames per second), direktno utiče na glatkoću kretanja u videu. Što je veća brzina, pokreti izgledaju prirodnije i fluidnije. Digitalizacija videa, međutim, zahtijeva obradu velike količine podataka, zbog čega se koristi kompresija kako bi se smanjila veličina video fajlova, zadržavajući što je moguće više detalja i kvaliteta.
:::
Povezanost između bajta i boja u digitalnom svijetu stoga je ključna za razumijevanje kako računari interpretiraju slike. Dok kod sivih slika jedan bajt definiše nijansu sive, kod RGB slika tri bajta zajedno kreiraju spektar boja koje se vide na ekranima. Bez obzira na to radi li se o čistoj bijeloj, svijetloj plavoj, ili tamno sivoj poput one koju stvara vrijednost 100, upravo ove kombinacije i upotreba bajtova omogućavaju računarima da stvaraju slike koje svakodnevno gledamo.
### Kada 100 nije stotinu, već šapat
Baš kao što digitalne slike prikazuju vizuelne informacije nizovima brojeva koji određuju nijanse i boje svakog piksela, tako se i zvuk može predstaviti nizom brojeva. Zvuk je, kao i video, u svojoj prirodnoj formi analogni signal koji varira kontinuirano u vremenu, pa ga je potrebno pretvoriti u digitalni oblik kako bi ga računar mogao obraditi. Ovaj proces digitalizacije zvuka sastoji se od dva ključna koraka: uzorkovanja (eng. sampling) i kvantizacije (eng. quantisation).
Uzorkovanje označava mjerenje vrijednosti zvučnog signala u pravilnim vremenskim intervalima. Ove mjere, ili uzorci, uzimaju se u fiksnom intervalu, čime se određuje broj uzoraka po sekundi, poznat kao uzorkovna frekvencija. Uzorkovna frekvencija od 44.1 kHz, koja se koristi u audio CD-ovima, znači da se zvučni signal mjeri 44.100 puta u jednoj sekundi. Što je uzorkovna frekvencija viša, to je zvuk preciznije digitalizovan jer je više detalja sačuvano. Međutim, viša frekvencija zahtijeva i veći broj podataka, odnosno više memorije.
Kvantizacija je proces dodeljivanja numeričkih vrijednosti svakom uzorku. Pošto računar može predstavljati samo diskretne vrijednosti, a ne kontinualni spektar, svaki uzorak mora se zaokružiti na najbližu dozvoljenu vrijednost. To znači da će kontinuirani signal biti aproksimiran diskretnim nivoima. Što je više kvantizacionih nivoa dostupno, zvuk će biti kvalitetniji, jer se svaki uzorak preciznije prikazuje. Dubina bita (npr. 16-bitna ili 24-bitna kvantizacija) određuje broj mogućih nivoa kvantizacije; 16-bitna dubina nudi 65.536 različitih nivoa, dok 24-bitna omogućava čak 16 miliona nivoa.
Na primjer, broj 100 u kontekstu kvantizacije može predstavljati određeni nivo glasnoće zvuka u trenutku uzorkovanja. Zamislimo da imamo 8-bitnu kvantizaciju, koja može prikazati vrijednosti od 0 do 255. U ovom slučaju, broj 100 bi predstavljao relativno tih zvuk, možda nešto poput tihog razgovora ili šapata u mirnom okruženju. Međutim, u 16-bitnom sistemu, gdje opseg ide od 0 do 65,535, broj 100 bio bi skoro nečujan zvuk jer predstavlja vrlo nizak nivo amplitude.

U praksi, kada se sluša digitalni zvuk, računar ili uređaj čita ovaj niz brojeva – uzoraka – i reprodukuje ih tako da rekonstruiše zvučni talas što je preciznije moguće. Proces uzorkovanja i kvantizacije omogućava da se čak i najfiniji detalji zvuka sačuvaju u digitalnom obliku, omogućavajući visok kvalitet zvuka koji je danas dostupan u muzici, filmovima i komunikaciji.
## Šta računar radi?
Računari su postali osnovni alati modernog života, koristeći protok električne struje da bi nam prikazali gotovo sve što možemo zamisliti – slike, zvukove, video zapise, tekst, brojeve i složene podatke. Danas koristimo računare i mobilne uređaje kroz različite aplikacije za širok spektar zadataka: komunikaciju, analizu podataka, obradu fotografija i virtuelnu stvarnost. Ova raznovrsnost funkcija pruža intuitivan osjećaj da su računari višenamjenski uređaji, sposobni za širok spektar zadataka i aplikacija.
U stvarnosti, bez obzira na kompleksnost zadatka, svi **računari rade samo dvije stvari**:
* **izvršavaju proračune (računaju)**;
* **pohranjuju rezultate tih proračuna**.
Sve što računar „zna“ i „radi“ – od prikazivanja slike na ekranu do obrade velikih baza podataka – svodi se na ove dvije osnovne funkcije. Svaki prikaz, svaki zvuk, svaki tekstualni unos ili vizuelna slika rezultat su računanja i pohrane.
Ova jednostavna binarna priroda omogućava računarima da rade izuzetno efikasno, omogućavajući im da kroz niz proračuna i pohrane upravljaju svim složenim zadacima i funkcijama koje koristimo svakodnevno.
:::info
U ovom tekstu, pojam računar koristi se u generalnom smislu i odnosi se na sve vrste digitalnih uređaja koji obrađuju podatke i izvršavaju proračune. To uključuje ne samo klasične desktop računare, već i laptope, tablete, pametne telefone, pa čak i male, specijalizovane uređaje poput mini računara i integrisanih sistema. Takođe, obuhvata i složene servere koji pokreću podatkovne centre i obavljaju kompleksne zadatke za mreže korisnika. Bez obzira na njihovu veličinu, oblik ili specifičnu svrhu, svi ovi uređaji funkcionišu prema istim osnovnim principima, računajući i pohranjujući informacije kako bi obavljali zadatke koje svakodnevno koristimo.
:::
Ove dvije funkcije, računanje i pohranjivanje, na prvi pogled mogu djelovati jednostavno ili čak neimpresivno. Na kraju krajeva, čovjek obavlja iste te dvije stvari. Ljudi su sposobni za izvođenje proračuna, bilo da se radi o osnovnim računskim operacijama ili složenim matematičkim zadacima. Također, rezultate tih proračuna može zabilježiti na papiru ili ih zapamtiti.
Međutim, razlika između računara i čovjeka u pogledu brzine obrade i kapaciteta pohrane podataka je drastična. Dok bi čovjeku trebali sati, pa čak i dani, za obavljanje složenih izračuna, moderni računari vrše milijarde operacija u jednoj sekundi. Na primjer, savremeni računar može ostvariti brzinu od nekoliko milijardi ciklusa po sekundi, pri čemu svaki ciklus predstavlja priliku za izvršavanje više računskih operacija. Na ovaj način, računar može obaviti u djeliću sekunde ono što bi ljudskom umu trebalo čitav život.
Što se tiče pohrane, razlika je jednako nevjerovatna. Prosječan čovjek može zapisati nekoliko stranica informacija za sat vremena, dok moderni računar može pohraniti stotine miliona stranica teksta. Na primjer, skromni moderni PC može čuvati milione knjiga u digitalnom formatu, dok bi za fizičko skladištenje ove količine informacija bile potrebne ogromne prostorije ili biblioteke. Osim toga, računar može odmah pristupiti svim ovim informacijama i koristiti ih u obradi, dok bi za čovjeka bilo nemoguće zapamtiti, a kamoli analizirati, toliku količinu podataka u tako kratkom vremenu.
Upravo zbog ove ekstremne razlike u brzini i kapacitetu, računar je sposoban izvršavati zadatke nezamislivog obima i složenosti.
:::info
Koliko god bili moćni, računari imaju svoja ograničenja u onome što mogu izračunati. Postoje problemi koje ni najbrži računari ne mogu riješiti u razumnom vremenu zbog njihove složenosti, dok su neki zadaci čak i teorijski nemogući za potpuno rješenje. Oblasti kao što su teorija izračunljivosti, kompleksnost algoritama i optimizacija koda od ključne su važnosti u računarstvu jer definišu granice računarskih mogućnosti. Ovi koncepti, međutim, nisu razmatrani u ovom tekstu, ali predstavljaju osnovu za razumijevanje limita računarskih sistema.
Na primjer, pogađanje lozinke na prvi pogled može djelovati kao jednostavan zadatak, ali u stvarnosti predstavlja izazov zbog ogromnog broja mogućih kombinacija koje je potrebno isprobati. Ako lozinka sadrži 12 znakova i može biti sastavljena od velikih i malih slova, brojeva i posebnih simbola, broj mogućih kombinacija prelazi $10^22$. Čak i kada bi napredan računar mogao isprobati milijardu kombinacija u sekundi, bilo bi potrebno više od 300.000 godina za isprobavanje svih mogućnosti.
:::
### Komponente računara
Da bi računar mogao obavljati svoje osnovne zadatke, ključnu ulogu imaju dvije temeljne komponente: **procesor** i **memorija**. Procesor je središnji element odgovoran za izvršavanje svih proračuna i slijeđenje uputstava, čineći ga pokretačkom snagom računanja u računaru. Memorija, s druge strane, omogućava pohranu podataka i rezultata koje procesor koristi u daljnjoj obradi, osiguravajući da su informacije brzo dostupne kad god su potrebne. Upravo ove dvije komponente direktno odgovaraju osnovnim funkcijama računara: računanju i pohrani.
Pored ovih osnovnih elemenata, svaki računar sadrži i dodatne komponente koje omogućavaju interakciju s okolinom i stabilan rad sistema. Među njima su ulazno-izlazni uređaji poput tastature, monitora i mrežnih adaptera, specijalizovani čipovi poput grafičkog procesora za bržu obradu vizualnih podataka, te jedinice za napajanje i međusobno povezivanje dijelova, uključujući matičnu ploču. Ove komponente čine cjelovit sistem, prisutan u svim vrstama računara – od minijaturnih ugrađenih sistema (embedded systems) kao što su pametni satovi i medicinski uređaji, do masivnih super računara.
#### Procesor
Procesor (ili centralna procesorska jedinica, skraćeno CPU) je centralna komponenta svakog računara koja obavlja osnovne operacije neophodne za izvršavanje programa. Iako procesori omogućavaju izvršavanje složenih softverskih zadataka, skup osnovnih operacija koje procesor može izvršiti zapravo je prilično ograničen. Te operacije mogu se podijeliti u nekoliko osnovnih kategorija:
* aritmetičke operacije (sabiranje, oduzimanje, množenje, dijeljenje),
* logičke operacije (upoređivanje i logički izrazi poput *i*, *ili*),
* upravljanje podacima (premještanje podataka između memorije i registara unutar procesora),
* kontrolne operacije (naredbe koje određuju tok programa).
Kombinacijom ovih osnovnih operacija, procesor može obavljati složene zadatke i izvršavati aplikacije.
Brzina procesora mjeri se u hercima (Hz) i označava broj operativnih ciklusa koje procesor može izvršiti u jednoj sekundi. Današnji procesori rade u milijardama ciklusa po sekundi (gigahercima, GHz), što znači da mogu obaviti nekoliko milijardi osnovnih operacija u sekundi. Brža frekvencija omogućava procesoru da obradi veći broj uputstava u kraćem vremenskom roku, što direktno utiče na performanse sistema.
Pored brzine, razlike između procesora mogu se posmatrati kroz njihove arhitekture. Različite procesorske arhitekture koriste različite skupove uputstava, što znači da podržavaju različite operacije i načine na koje se te operacije izvršavaju. Na primjer, arhitekture poput ARM procesora, koji se često koriste u mobilnim uređajima, optimizovane su za efikasnu potrošnju energije, što ih čini pogodnim za uređaje s baterijskim napajanjem. S druge strane, arhitekture kao što su x64 procesori, koji se često koriste u desktop računarima, dizajnirane su za visoke performanse i brzinu, ali pri tome troše više energije. Izbor arhitekture ima direktan uticaj na razvoj softvera, jer softver mora biti optimizovan ili čak specifično razvijen za određeni skup uputstava koje procesor podržava.
Savremeni procesori često posjeduju više jezgri, što znači da unutar jednog procesora postoji više zasebnih jedinica koje mogu izvršavati operacije istovremeno. Višejezgreni dizajn omogućava paralelno izvršavanje zadataka, čime se poboljšava efikasnost u radu sa višestrukim aplikacijama ili u obradi podataka koji se mogu razdvojiti u manje, nezavisne segmente. Kako bi softver mogao maksimalno iskoristiti prednosti višejezgrenih procesora, programeri često moraju pažljivo dizajnirati svoje aplikacije kako bi omogućili da se različiti dijelovi zadatka obrade paralelno. Ova paralelna obrada pruža značajnu prednost u aplikacijama kao što su video obrada, grafički prikaz i složene naučne simulacije, gdje se različiti dijelovi zadatka mogu obrađivati istovremeno, čime se ubrzava cjelokupni proces.
Kombinacija brzine, arhitekture i broja jezgri omogućava procesorima da budu prilagodljivi različitim vrstama uređaja i zadacima, od mobilnih telefona i tableta do radnih stanica i super računara.
#### Memorija
Memorija je ključna komponenta računara koja omogućava pohranu podataka i uputstava neophodnih za rad sistema. Bez memorije, procesor ne bi imao gdje privremeno ili trajno pohranjivati rezultate svojih proračuna, niti bi mogao brzo pristupati podacima potrebnim za izvršavanje programa. Memorija omogućava procesoru brz pristup informacijama, čime se osigurava kontinuirani tok obrade podataka i stabilan rad sistema.
U računarima postoji nekoliko vrsta memorije, svaka s određenom brzinom, kapacitetom i cijenom. RAM (Random Access Memory), ili radna memorija, koristi se za privremeno čuvanje podataka koji su aktivni tokom trenutnog rada računara. RAM je brz, ali nestalan, što znači da se svi podaci u njemu brišu kada se računar isključi. Upravo zbog svoje brzine, RAM omogućava procesoru brz pristup aktivnim podacima, čime se ubrzava izvršavanje programa i zadataka u toku. Radna memorija obično se kreće od nekoliko gigabajta (GB) u mobilnim uređajima i standardnim računarima do nekoliko terabajta (TB) u serverima i naprednim radnim stanicama.
Trajne memorijske jedinice, kao što su tvrdi diskovi (HDD) i SSD (Solid State Drive) uređaji, služe za dugotrajno čuvanje podataka. Za razliku od RAM-a, trajna memorija zadržava podatke čak i kada se računar isključi. Međutim, trajna memorija je sporija od RAM-a, zbog čega se podaci potrebni za izvršavanje programa gotovo uvijek prebacuju iz trajne memorije u radnu memoriju kako bi procesor mogao brzo pristupati tim podacima. Ova razlika između trajne i radne memorije znači da programeri moraju optimizovati način na koji aplikacije koriste radnu memoriju, jer ona direktno utiče na performanse programa u realnom vremenu.
Različite vrste memorije postoje kako bi se postigao balans između brzine i cijene pohrane. Brža memorija, poput RAM-a, skuplja je, ali omogućava brzi pristup podacima. Nasuprot tome, trajna memorija, kao što su HDD i SSD uređaji, nudi veći kapacitet po nižoj cijeni, ali pri manjoj brzini pristupa. Cache memorija, koja se nalazi u samom procesoru, najskuplja je po jedinici kapaciteta, ali omogućava izuzetno brz pristup često korištenim podacima, smanjujući potrebu za pristupom sporijoj radnoj memoriji.
Hijerarhija memorije, koja uključuje cache, RAM i trajne memorijske jedinice, omogućava računarima da balansiraju brzinu i kapacitet pohrane, optimizujući performanse u skladu sa zadacima. Na primjer, mobilni uređaji koriste memoriju koja štedi energiju, dok serveri i radne stanice s velikim kapacitetima RAM-a i trajne memorije mogu istovremeno obavljati niz složenih zadataka. Kombinacija različitih vrsta memorije omogućava računarima da zadrže efikasnost u pohrani, obradi i pristupu velikim količinama podataka.
#### Ostale komponente
Računar nije sastavljen samo od procesora i memorije. Postoje i druge komponente koje omogućavaju interakciju sa okolinom i olakšavaju izvršavanje različitih zadataka. Ulazni i izlazni uređaji su ključni za omogućavanje komunikacije između korisnika i računara.
Ulazni uređaji prenose podatke iz okoline u računar. Na primjer, kamera pretvara vizuelne informacije u niz piksela koji se digitalno obrađuju, dok mikrofon konvertuje zvučne talase u digitalne signale koje računar može pohraniti i analizirati. Tastatura omogućava unos tekstualnih podataka, pri čemu svako pritisnuto slovo pretvara u kodirani digitalni znak, dok miš omogućava navigaciju unosom koordinata i pokreta, izraženih kao par brojeva koji označavaju poziciju na ekranu. Takođe, USB portovi omogućavaju direktan prijenos podataka između računara i vanjskih uređaja, kao što su memorijske jedinice ili telefoni, što čini USB univerzalnim ulazno-izlaznim interfejsom za različite vrste informacija. Mrežna kartica može se takođe smatrati ulazno-izlaznim uređajem, jer omogućava prijenos podataka između računara i mreže, omogućavajući pristup internetu i razmjenu podataka sa drugim uređajima.
Izlazni uređaji, s druge strane, omogućavaju prikaz i reprodukciju podataka koje računar obrađuje. Ekran predstavlja izlazne podatke u vidu piksela, stvarajući slike, tekst i video, dok zvučnici konvertuju digitalne podatke u analogne zvučne talase koji se mogu čuti. Ovi izlazni uređaji su ključni za doživljaj računarstva, jer omogućavaju korisnicima da vide i čuju rezultate obrade podataka.
Pored ulaznih i izlaznih uređaja, računar sadrži i druge važne komponente. Matična ploča predstavlja glavnu vezu između svih komponenti računara. Ona povezuje procesor, memoriju, ulazno-izlazne uređaje i druge elemente, integrišući njihov rad u jedinstven sistem. Napajanje (eng. power supply unit - PSU) je odgovorno za isporuku električne energije komponentama, čineći rad sistema stabilnim i efikasnim. Hladnjaci i ventilatori osiguravaju odvođenje toplote koju generišu procesor i druge komponente tokom rada, sprječavajući pregrijavanje koje bi moglo oštetiti uređaj.
Osim osnovnih komponenti, u računarima su često prisutne i specijalizovane komponente poput grafičkog procesora (eng. graphics processing unit - GPU), koji je optimizovan za paralelnu obradu grafičkih podataka i koristi se u aplikacijama kao što su grafički dizajn, video igre i mašinsko učenje. Još jedna specijalizovana komponenta može biti zvučna kartica, koja omogućava obradu audio podataka i poboljšava kvalitet zvuka u odnosu na integrisana rješenja. Neke napredne radne stanice i serveri koriste akceleratore za vještačku inteligenciju.
Sve ove komponente zajedno omogućavaju računarima da izvršavaju složene zadatke, omogućavajući efikasnu obradu, pohranu, komunikaciju i prikaz informacija u digitalnom obliku.
:::info
Tranzistori, sićušni elektronski prekidači, temelj su moderne računarske tehnologije. Milioni, pa čak i milijarde tranzistora ugrađeni su u mikročipove, koji čine osnovu procesora i memorijskih jedinica. Proizvodnja ovih čipova izuzetno je kompleksan proces koji zahtijeva visok nivo preciznosti i sofisticiranu opremu za litografiju na nanoskalama. Svaki napredak u dodatnom smanjenju dimenzija omogućava brže i efikasnije čipove, ali povećava i tehničke izazove i troškove proizvodnje.
Tokom decenija, tranzistori su postajali sve manji, približavajući se već veličini atoma. Danas se dimenzije tranzistora kreću u rasponu od nekoliko nanometara (nm), a kako se smanjuju, postaje sve teže kontrolisati elektronske tokove zbog kvantnih efekata koji se pojavljuju na tako malim skalama. Ova ograničenja izazivaju sve veće tehničke prepreke za dalju miniaturizaciju.
Kako se približava granica fizičke veličine tranzistora, istražuju se alternativni pravci razvoja. Kvantno računarstvo predstavlja jedan od mogućih puteva, koristeći kvantne bitove (kubite) koji mogu istovremeno biti u više stanja, čime bi značajno povećali brzinu obrade za određene tipove problema. Molekularna elektronika i optoelektronika također su oblasti istraživanja, s ciljem stvaranja tranzistora baziranih na molekulima ili svjetlosnim talasima umjesto na elektronima. Ovi pravci razvoja imaju potencijal da prevaziđu ograničenja konvencionalne tehnologije i otvore nove mogućnosti za računarstvo budućnosti.
Zbog strateške važnosti ove tehnologije, zemlje širom svijeta, uključujući SAD, Kinu i zemlje Evropske unije, ulažu značajne resurse u istraživanje i razvoj poluprovodničke industrije. Globalna potražnja za čipovima pokreće trku za tehnološkom nadmoći, jer su napredni čipovi od ključne važnosti za nacionalnu sigurnost, ekonomiju i industriju visokih tehnologija. Kontrola nad proizvodnjom čipova postaje ključan faktor u geopolitici, jer ona daje stratešku prednost u mnogim područjima, od računarske industrije do vojnih tehnologija.
:::
## Programiranjem do potpune kontrole računara
Iako su računari neizostavan dio svakodnevnog života, korisnici rijetko imaju pristup informacijama o tome kako ovi uređaji zapravo funkcionišu. Korisnicima su obično prikazane samo aktivnosti i radnje koje su potrebne za rješavanje određenih zadataka, poput slanja e-pošte, kreiranja dokumenata ili pregledanja multimedijalnih sadržaja, dok su tehnički detalji, kao što su načini na koji procesor obrađuje uputstva ili kako memorija pohranjuje podatke, vješto sakriveni. Na taj način se računari prilagođavaju korisničkom iskustvu koje je fokusirano na efikasnost, praktičnost i intuitivnost.
Uprkos toj pojednostavljenoj slici, svaka aplikacija ostvaruje duboku interakciju sa samim hardverom računara. Upravo su stručnjaci, poput softverskih inžinjera i programera, oni koji kreiraju aplikacije oslanjajući se na znanje o tome kako hardverske komponente funkcionišu i kako se ponašaju prilikom obrade podataka. Kroz svoje vještine, oni mogu koristiti računar u njegovom punom kapacitetu, osmišljavajući efikasne mehanizme za kontrolu nad procesima, pohranom i obradom podataka.
U nastavku je opisan put kojim programeri dolaze do upravljanja hardverskim resursima, počevši od načina na koji procesor izvršava uputstva, preko uloge operativnog sistema kao posrednika, pa sve do različitih nivoa jezika koji omogućavaju interakciju sa računarom. Razumijevanje ovog procesa otkriva kako se računar transformiše iz osnovnog uređaja za obradu podataka u svestran alat pod potpunom kontrolom stručnjaka.
### Procesor u akciji
Procesor, centralna komponenta svakog računara, prima uputstva koja su programeri prethodno napisali i prilagodili kroz složen proces prevođenja, kako bi ih procesor mogao razumjeti i izvršavati. Ta uputstva procesoru dolaze kao nizovi binarnih kodova tj. sekvence jedinica (1) i nula (0) jer njegovi osnovni elektronski sklopovi funkcionišu kroz prisustvo i odsustvo napona, što odgovara vrijednostima 1 i 0. Procesor može raditi isključivo s binarnim vrijednostima, jer su one direktna refleksija visokog i niskog napona struje koja teče kroz njegov elektronski sklop.
Sam procesor ne raspoznaje tekst, slike, niti druge vrste podataka. [^vrste] Sve što procesor vidi i s čim može raditi su nizovi jedinica i nula, koje interpretira kao uputstva za različite operacije. Svako uputstvo daje procesoru osnovne informacije o tome koji se podaci obrađuju, gdje se oni nalaze i koju vrstu operacije treba primijeniti, bilo da se radi o matematičkom proračunu, logičkom poređenju ili manipulaciji podacima.
[^vrste]: Iako može djelovati kontradiktorno s obzirom na prethodni opis različitih vrsta podataka, procesor sve informacije tretira kao binarne nizove bez značenja. Tek kada ti podaci prolaze kroz softver i stižu na izlazne uređaje (ili se unose putem ulaznih uređaja), njihov sadržaj dobija svoj kontekst i formu, bilo kao tekst, slike ili zvuk.
Uputstva koja procesor izvršava su obično podijeljena u nekoliko dijelova. Jedan tipičan format uputstva na arhitekturi poput x86 može izgledati sadržavati:
* **Opcode**: Binarni kod koji određuje koja će operacija biti izvršena, kao što je sabiranje, pomjeranje ili poređenje.
* **Operande**: Dio uputstva koji može nositi informacije o podacima koji se obrađuju ili lokacijama gdje se ti podaci nalaze, bilo u registrima, bilo u glavnoj memoriji.
Na primjer, instrukcija za sabiranje mogla bi izgledati ovako:
```
00000001 11000000 00000101
```
Ova instrukcija sadži tri dijela:
* **00000001** predstavlja opcode koji procesoru govori da treba izvršiti operaciju sabiranja (ADD).
* **11000000** je kod koji označava da će se operacija izvršiti nad registrom EAX.
* **00000101** je binarna reprezentacija broja 5, koji se koristi kao operand u ovoj operaciji.
Procesor interpretira ove binarne sekvence kao uputstva za manipulaciju naponom kroz elektronske sklopove, omogućavajući mu da izvrši zadanu operaciju. U ovom slučaju, procesor koristi logičke sklopove kako bi "sabrao" vrijednosti unutar EAX registra i broj 5. Rezultat se pohranjuje ponovo u registar EAX, spreman za daljnju obradu ili pohranu.
:::info
**Registri** su mali dijelovi memorije unutar procesora koji privremeno pohranjuju podatke i uputstva tokom obrade. Svaki registar može brzo pristupiti podacima, što omogućava procesoru da efikasno izvršava operacije bez potrebe za povratkom na glavnu memoriju. Registri obično čuvaju jedan podatak u svakom trenutku, jer svaki registar ima fiksnu veličinu (npr. 32 ili 64 bita u modernim procesorima). Koriste se za pohranu pojedinačnih vrijednosti, kao što su operandi ili rezultati aritmetičkih operacija, i brzo se mijenjaju kako se instrukcije izvršavaju.
:::
### Programi su osnova računarskih zadataka
Na najosnovnijem nivou, program je niz instrukcija koji se izvršava na procesoru računara, usmjeravajući ga kako da obrađuje podatke i upravlja sistemskim resursima. Svaka instrukcija sadrži precizne informacije o tome koji korak procesor treba da preduzme, kao i koje podatke ili dijelove memorije treba koristiti. Kada se ove instrukcije izvršavaju u tačno definisanom redoslijedu, procesor postepeno gradi složenije operacije – od osnovnih aritmetičkih proračuna do složenih funkcionalnosti koje omogućavaju rad grafičkih aplikacija ili obradu zvuka. Stoga, program predstavlja niz pažljivo usklađenih uputstava koja procesor prati korak po korak kako bi ostvario željeni rezultat.
Programi dolaze u različitim oblicima i služe mnogim svrhama, ali svi su, u suštini, nizovi binarnih instrukcija koje procesor interpretira i izvršava. Postoje tri glavne kategorije programa koje računari koriste za obavljanje različitih funkcija:
* **Sistemski programi**: Ovo su programi koji omogućavaju osnovno funkcionisanje računara i upravljanje njegovim resursima. Primjer takvog programa je operativni sistem, koji organizuje izvršavanje drugih programa, upravlja procesorskim vremenom i memorijom te omogućava komunikaciju između hardvera i softvera.
* **Aplikacije ili korisnički programi**: Aplikacije su programi dizajnirani za obavljanje specifičnih zadataka za korisnika. Tu spadaju kancelarijski alati, softver za uređivanje slika, video igare, programi za komunikaciju, web preglednici i drugi softveri koji se koriste u svakodnevnim zadacima ili profesionalnim okruženjima. Svaka aplikacija pruža određenu funkcionalnost koja omogućava korisniku da koristi računar u skladu sa svojim potrebama.
* **Servisi i pozadinski programi**: Ovi programi rade u pozadini, često nevidljivi korisniku, obavljajući važne sistemske zadatke ili podržavajući rad drugih aplikacija. U ovu grupu spadaju antivirusni softver, programi za upravljanje mrežom i razni servisi za sinhronizaciju podataka. Pozadinski programi često funkcionišu kao podrška drugim aplikacijama ili sistemskim procesima, održavajući stabilan i siguran rad računara.
Bez obzira na vrstu programa, svi se na nivou procesora svode na binarne instrukcije koje se izvršavaju u nizu. Programi mogu biti kratki, s jednostavnim uputstvima, ili veoma složeni, sa hiljadama ili milionima uputstava koja procesor obrađuje redom. Upravo kombinacijom tih uputstava, računar može obavljati različite zadatke, pretvarajući ga u svestran alat koji je temelj savremene digitalne tehnologije.
:::info
**Operativni sistem** je ključan posrednik između aplikacija i hardverskih komponenti računara. Iako softverski inženjeri pišu aplikacije koje komuniciraju sa hardverom, te aplikacije se zapravo izvršavaju pod kontrolom operativnog sistema, koji preuzima mnoge zadatke i upravlja detaljima o kojima programer ne mora voditi računa.
Na primjer, kada aplikacija treba da pohrani podatke na disk, operativni sistem preuzima zadatak, određujući gdje će podaci biti smješteni i kako će se njima kasnije pristupati. Programer jednostavno koristi standardne komande za čuvanje podataka, dok operativni sistem rješava složenosti pristupa fizičkom disku, upravljanja datotekama i sprječavanja konflikata između aplikacija koje možda pokušavaju istovremeno pristupiti disku.
Slično tome, operativni sistem upravlja memorijom, dodjeljujući aplikacijama potrebnu količinu radne memorije i osiguravajući da različite aplikacije ne ometaju jedna drugu. Programeri tako ne moraju brinuti o detaljima fizičkog rasporeda podataka u memoriji – operativni sistem obezbjeđuje sigurno okruženje u kojem aplikacije mogu koristiti memorijske resurse bez međusobnog konflikta.
Na ovaj način, operativni sistem omogućava da aplikacije rade stabilno i efikasno, preuzimajući na sebe zadatke poput upravljanja memorijom, pristupa disku i drugim kritičnim resursima, čime olakšava posao softverskim inženjerima.
Ipak, aplikacija napisana za jedan operativni sistem neće nužno raditi na drugom, jer operativni sistemi koriste različite metode i standarde za pristup hardveru i upravljanje resursima. Na primjer, aplikacija dizajnirana za Windows možda neće biti kompatibilna s macOS-om ili Linuxom bez dodatne prilagodbe ili prevođenja koda. Zbog tih razlika, operativni sistem igra važnu ulogu ne samo u kontroli resursa već i u određivanju na kojoj će platformi aplikacija funkcionisati.
:::
### Programski jezici su most između ideje i mašine
U prethodnim dijelovima, istaknuto je da različite arhitekture procesora koriste različite skupove uputstava. Instrukcije koje su prilagođene za jedan tip procesora ne funkcionišu nužno na drugom, tj. svaki procesor ima svoj specifičan set instrukcija koje razumije i s kojima može raditi. Ovaj skup instrukcija naziva se **programski jezik** i čini osnovnu formu komunikacije između softvera i hardvera. Kao što se ljudi u različitim dijelovima svijeta sporazumijevaju koristeći različite jezike, tako i različiti procesori "razgovaraju" koristeći različite jezike.
#### Mašinski jezici
Za svakog ko želi programirati direktno na nivou procesora, neophodno je poznavati tačno definisane instrukcije specifične za njegovu arhitekturu. Na primjer, instrukcija za sabiranje na procesoru s x86 arhitekturom ima različit binarni kod u poređenju s procesorom ARM arhitekture, iako oba procesora obavljaju istu osnovnu operaciju. Tako, u suštini, svaka arhitektura ima svoj vlastiti „jezik“ koji definiše kako će izvršavati pojedinačne instrukcije.
Ovi jezici su veoma bliski osnovnim elektronskim operacijama koje procesor može izvršavati, te ih nazivamo **mašinskim jezicima**. Mašinski jezici su formati binarnih kodova koje procesor direktno interpretira i izvršava, čineći ih najnižim nivoom u hijerarhiji programskih jezika. S obzirom na to da je mašinski jezik specifičan za svaki tip procesora, programi napisani u jednom mašinskom jeziku nisu prenosivi na drugu arhitekturu bez prilagođavanja.
Upravo zbog ove specifičnosti, mašinski jezici predstavljaju osnovni *most* između softvera i hardvera, omogućavajući procesoru da izvršava naredbe koje će obraditi podatke i izvršiti funkcionalnosti definisane od strane programera. Međutim, budući da su ovi jezici kompleksni i često vrlo teški za razumijevanje ljudima, razvijeni su dodatni slojevi programskih jezika koji pružaju apstrakcije iznad ovog osnovnog nivoa i omogućavaju programerima da pišu kod razumljiviji ljudima, a koji se zatim prevodi u mašinski jezik razumljiv procesoru.
#### Asembleri
Iako je mašinski jezik osnovna forma komunikacije između softvera i procesora, pisanje kompleksnih programa direktno u njemu veoma je zahtjevno. Teško je održavati takav kod, razumjeti ga i izmijeniti kad je potrebno. Programeri bi za svaki korak morali precizno znati adrese memorije, binarne kodove operacija i druge detalje koji su daleko ispod nivoa na kojem ljudi intuitivno razmišljaju.
Kako bi olakšali rad s računarima, inžinjeri su prvo razvili skup symbola i mnemotehničkih skraćenica za mašinski jezik poznat pod nazivom asembler (eng. Assembly language). Asembler omogućava programeru da piše uputstva koristeći jednostavne simbole koji direktno odgovaraju mašinskim instrukcijama. Na primjer, umjesto da se sabiranje zapisuje u obliku `00000001 11000000 00000101`, u asemblerskom jeziku bi se moglo napisati `ADD EAX, 5`. Ipak, i asembleri su i dalje vrlo nisko-nivo: oni su samo jedan korak iznad mašinskog jezika i još uvijek veoma zavisni o arhitekturi konkretnog procesora. Ako se promijeni arhitektura, program napisan u asembleru vrlo vjerovatno neće raditi bez izmjena.
#### Jezici srednjeg nivoa
Nakon asemblera pojavili su se jezici srednjeg nivoa, od kojih je C možda najpoznatiji. Ovi jezici i dalje relativno blisko upravljaju memorijom i sistemskim resursima, ali su fleksibilniji i univerzalniji od asemblera. Programi napisani u C-u se mogu kompajlirati za različite arhitekture i operativne sisteme, uz minimalne ili nikakve izmjene koda, zahvaljujući standardizaciji jezika i postojanju različitih kompajlera.
Jezici srednjeg nivoa pružaju bolju apstrakciju od asemblera, dopuštajući programerima da rade s konceptima poput funkcija, strukturiranih tipova podataka i kontrolnih struktura, a da pri tome i dalje imaju direktan pristup detaljima računara kada im je to potrebno.
#### Jezici viskog nivoa
S vremenom, razvijeni su jezici visokog nivoa (poput Pythona, Jave, C#-a ili Ruby-ja) koji programere oslobađaju većine detalja noskog nivoa. Umjesto da razmišljaju o registarskim adresama i ručnoj kontroli memorije, programeri u ovim jezicima fokusiraju se na logiku problema. Ovi jezici uvode bogate standardne biblioteke, automatsko upravljanje memorijom (npr. "garbage collection") i čitljive sintakse, što značajno ubrzava razvoj softvera i smanjuje mogućnost grešaka.
:::info
##### Uloga kompajlera i interpretera
Jezici visokog nivoa nisu direktno razumljivi procesoru. Za njihovo izvršavanje neophodan je alat koji će izvorni kod prevesti u mašinske instrukcije ili ih interpretirati u trenutku rada. Za prevođenje se koriste kompajleri, programi koji čitav izvorni kod analiziraju, optimizuju i prebacuju u oblik razumljiv procesoru ili u međukod koji druga komponenta naknadno izvršava. Time se omogućava pokretanje programa brzinom bliskom onoj kod direktno napisanog mašinskog koda, ali bez potrebe da se program piše na niskom nivou. Kompajliran kod se obično pokreće samostalno, bez dodatnih alatki.
Također, mogu se koristiti interpreteri koji čitaju i izvršavaju naredbe koda liniju po liniju za vrijeme rada aplikacije. Izvršavanje ovakvog koda može trajati duže, ali se time omogućava jednostavnije interaktivno testiranje, brže kreiranje prototipa i lakše ispravljanje grešaka.
Neki sistemi kombinuju oba pristupa: izvorni kod se prevodi u međukod, a potom se taj međukod naknadno interpretira. Na taj način dobija se kompromis između performansi, prenosivosti i fleksibilnosti.
:::
#### Veliki jezički modeli kao programski jezici
Najsavremeniji trendovi u razvoju softvera ukazuju da se apstrakcija ne mora zaustaviti na visokim nivoima jezika koje danas koristimo. S pojavom velikih jezičkih modela (eng. Large Language Models - LLM) otvara se vizija budućnosti u kojoj će sam čin programiranja postati još pristupačniji i intuitivniji.
LLM modeli, istrenirani na ogromnim količinama tekstualnih podataka, mogu na osnovu uputa koje programeri formulišu na prirodnom jeziku generisati programski kod. Umjesto pisanja detaljnih algoritama u Pythonu, C-u ili nekom drugom jeziku, programeri sada mogu opisati problem na bosanskom jeziku, a LLM će predložiti, pa čak i automatski kreirati, djelimično ili potpuno rješenje u obliku koda. Ovo se može shvatiti kao pomak ka "jezicima najvišeg nivoa", gdje jezik više ne mora biti stroga sintaksa i semantika ljudski definisanog programskog jezika, već može biti gotovo običan ljudski govor.
Naravno, ovi sistemi još uvijek nisu savršeni. Oni nemaju istinsko razumijevanje u smislu ljudske svijesti, te povremeno mogu generisati netačan ili suboptimalan kod. Ipak, trend je takav da razvojem sve naprednijih modela i integracijom s alatima za statičku analizu, testiranje i optimizaciju, LLM-ovi se postavljaju kao još jedan sloj apstrakcije iznad jezika visokog nivoa.
U budućnosti, programeri bi mogli postati više *arhitekte rješenja* i *koordinatori resursa* nego autori detaljnog koda. Njihova uloga bit će u stvaranju visokokvalitenih opisnih specifikacija koje će potom, uz pomoć LLM-a, biti prevedene u efikasan programski kod. Ovaj scenario ukazuje na to da se granica između čovjeka i mašine dodatno pomjera: umjesto fokusiranja na precizno pisanje koda i poznavanje mnoštva detalja, možda će programieri samo opisivati šta žele da softver uradi, a modeli i alati će sami pronaći i generisati najbolje rješenje.
## Programiranjem do potpune kontrole računara
U suštini, za kreiranje i izvršavanje programa nisu potrebni naročito složeni ili specijalizovani alati. Na najosnovnijem nivou, dovoljan je uređivač teksta i program (kompajler ili interpreter) koji može prevesti ili izvršiti napisani kod. Uređivač teksta pruža mogućnost da se zapiše izvorni kod, dok kompajler ili interpreter transformiše taj kod u nešto što procesor može razumjeti ili izvršava instrukcije direktno. Ova dva elementa čine minimalan skup neophodan za realizaciju bilo kakve ideje u programskom jeziku.
Ipak, pored osnovnog pristupa, savremeni razvoj softvera uglavnom koristi dodatne alate i funkcionalnosti koji ubrzavaju pisanje i održavanje koda. Najčešće se koriste integrisana razvojna okruženja,(eng. Integrated Development Environment - IDE). IDE predstavlja programski paket koji kombinuje uređivač koda sa alatima za kompajliranje ili interpretiranje, sistemima za automatsko dovršavanje komandi, alatkama za detekciju i isticanje sintaksnih ili logičkih grešaka, integrisanim alatom za praćenje izvršavanja programa, te pregledom dokumentacije i biblioteka. Na taj način, IDE postiže veću efikasnost i smanjuje mogućnost ljudskih pogrešaka, posebno kod većih ili složenijih projekata. Dok se bez problema mogu koristiti i sasvim osnovni alati, IDE znatno pojednostavljuje svakodnevne programerske zadatke.
Pored klasičnog lokalnog razvoja, postoje i alati koji funkcionišu u okviru servisa u oblaku (eng. cloud services). U tom slučaju, izvorni kod se može pisati i pokretati direktno u internet pregledniku, bez potrebe da se programi ili biblioteke instaliraju na lokalni računar. Ovo zahtijeva stabilnu internet vezu, ali otvara mogućnosti za kolaborativni rad, gdje više osoba može istovremeno pristupiti i uređivati izvorni kod putem mreže. Takav način rada olakšava saradnju, upravljanje verzijama, pa čak i testiranje na različitim platformama, bez potrebe za kompleksnim lokalnim konfiguracijama.
U konačnici, izbor alata i okruženja zavisi od potreba, sklonosti, iskustva i konteksta u kojem se razvija softver. Ipak, sve se svodi na istu suštinu: napisati i izvršiti programski kod. Bilo da se koristi najobičniji uređivač teksta i lokalni kompajler ili napredno IDE rješenje u oblaku, cilj ostaje isti – pretvaranje ideje u funkcionalan računarski program.
## Python programski jezik.
Python je programski jezik koji je razvio Guido van Rossum početkom 1990-ih godina. Nastao je kao odgovor na tadašnju situaciju gdje su programeri imali potrebu za jezikom koji će biti jednostavan za učenje i čitanje, ali istovremeno dovoljno moćan za ozbiljne projekte. Za razliku od jezika niskog nivoa, Python je od samog početka nastojao ponuditi veću apstrakciju. U odnosu na tadašnje popularne jezike visokog nivoa želio je donijeti intuitivniju sintaksu i filozofiju pisanja koda koja podstiče jasnoću i uređenost. Sam naziv *Python* inspirisan je grupom komičara *Monty Python*, a ne zmijom, što ukazuje na opušten i kreativan duh u kojem je jezik začet.
### Filozofija dizajna
Za Python se kaže da *dolazi sa baterijama* (eng. batteries included). Ova metafora ukazuje da je njegova standardna biblioteka izuzetno bogata i nudi mnoge gotove funkcionalnosti, poput rada s fajlovima, mrežnim protokolima, formatima podataka i matematičkim i statističkim operacijama. To znači da se za mnoge uobičajene zadatke ne moraju tražiti dodatni alati, već je dovoljno koristiti ono što dolazi s osnovnom instalacijom Pythona.
Filozofija Pythona oslanja se na principe jednostavnosti i čitljivosti. Dok su neki jezici veoma fleksibilni i dopuštaju više načina za rješavanje istog problema, Python teži ka tome da postoji barem jedan jasan, *najbolji* način. Rješenja napisana u Pythonu obično djeluju prirodno, a kod je lako pratiti i razumjeti, čak i kada ga čita osoba koja nije učestvovala u njegovom kreiranju. Izbjegava se nepotrebna složenost i raznolikost sintakse, pa je samim time lakše zadržati preglednost i kvalitet koda.
### Principi razvoja
Python se kontinuirano razvija. Programski jezik ima dobro definisan proces za predlaganje i usvajanje novih funkcionalnosti, poznat kao Python Enhancement Proposals (PEP). Programeri i stručnjaci iz cijelog svijeta diskutuju o novim idejama, predlažu unapređenja i zajedno rade na njihovoj implementaciji. Ovo znači da Python nije statičan—on se mijenja, prilagođava i poboljšava s vremenom.
Pratiti novosti u Python svijetu pomaže pri usvajanju novih mogućnosti i razumijevanju smjera u kojem se jezik kreće. Prelazi s jedne verzije na drugu obično donose poboljšanja performansi, nove korisne funkcionalnosti, a ponekad i uklanjanje zastarjelih funkcionalnosti.
### Upotreba Python-a
Popularnost Pythona raste već godinama, a danas se koristi u najrazličitijim domenama. Jedno od područja gdje je Python stekao izuzetnu važnost jeste nauka o podacima (eng. Data Science), uključujući statističku analizu, mašinsko učenje, duboko učenje i obradu prirodnog jezika. Razlog za to leži u širokoj dostupnosti biblioteka i alata koji olakšavaju rad sa složenim algoritmima i velikim količinama podataka. Python je tako postao standardni jezik u istraživačkim laboratorijama, tehnološkim kompanijama i timovima koji se bave analitikom.
Pored nauke o podacima, Python je prisutan i u web programiranju. Uz pomoć okvira za izradu internet stranica, poput *Django*-a ili *Flask*-a, moguće je brzo i efikasno kreirati aplikacije, kako jednostavne, tako i veoma složene. Mnoge velike internet kompanije koriste Python za razvoj, automatizaciju procesa i integraciju sa drugim sistemima.
Python takođe ima važnu ulogu u pisanju skripti i automatizaciji. Kada je potrebno brzo obaviti neki posao, obraditi fajlove, preuzeti informacije s mreže ili integrisati različite sisteme, Python se često javlja kao prvi izbor. Jednostavan pristup i čitljiv kod olakšavaju kreiranje kratkih skripti za svakodnevne zadatke, bez potrebe za dugim procesom učenja.
Industrija zabave, video-igara i vizuelnih efekata u filmovima takođe je prepoznala prednosti Pythona. Mnogi alati za grafički dizajn, animaciju i 3D modeliranje podržavaju Python skripte koje pomažu u automatizaciji procesa i prilagođavanju radnog okruženja specifičnim potrebama kreativnih timova.
### Zašto je Python dobar za početnike
Mnogi početnici u programiranju biraju Python kao svoj prvi jezik. Razlozi za to su jednostavnost i lakoća čitanja koda. Za razliku od nekih drugih jezika, Python izbjegava suvišne simbole i složena pravila. Umjesto toga, oslanja se na uvlačenja linija za označavanje blokova koda, a ključne riječi i struktura programa su intuitivni. Ovo znači da su i najosnovnije naredbe, kao što su ispisivanje poruke na ekran ili čitanje podatka, odmah razumljive, čak i osobama bez ikakvog programerskog iskustva.
Početnicima pomaže i to što Python ima vrlo aktivnu zajednicu korisnika i obilje edukativnih materijala dostupnih online. Postoje brojni tutorijali, priručnici, forum diskusije i predavanja, što značajno olakšava prve korake i rješavanje neizbježnih početnih problema. Mnogi obrazovni programi, fakulteti i kursevi iz oblasti informatike odavno su uključili Python u svoju nastavu, upravo zbog njegove pristupačnosti.
Također, Python podržava interaktivno pokretanje komandi, pa je dovoljno pokrenuti interpreter i unositi naredbe kako bi se odmah vidjeli rezultati. Na taj način se, na samom početku, može eksperimentisati i dobiti osjećaj za to šta programiranje zapravo jest. Odmah su vidljive posljedice napisanog koda, što smanjuje nejasnoće i pomaže pri intuitivnom učenju.
### Instalacija i pokretanje Pythona
Ukoliko se želi raditi sa Python programskim jezikom, najprije je neophodno osigurati da računar ima instaliran Python interpreter. Bez obzira na to da li je u pitanju Windows, macOS ili Linux, većina modernih operativnih sistema ili već dolazi s određenom verzijom Pythona ili omogućava jednostavnu instalaciju. Ipak, vrijedi pogledati koja se verzija koristi, jer je Python tokom svog razvoja prolazio kroz nekoliko većih promjena. Danas je standard Python 3, i preporučuje se uvijek koristiti najnoviju stabilnu verziju iz ove grane.
Python je moguće instalirati na različitim platformama
* **Windows**:
Na zvaničnoj stranici python.org dostupni su instalacioni paketi za različite verzije Windows operativnog sistema. Proces instalacije je sličan drugim Windows programima: neophodno je preuzeti `.exe` datoteku, pokrenuti je, te u programu za instalaciju (eng. installation wizard) odabrati mjesto gdje će se Python smjestiti. U toku instalacije može se označiti opcija za dodavanje Pythona u `PATH` varijablu, što pojednostavljuje kasnije pokretanje s komandne linije. Nakon završene instalacije, Python se može pokrenuti iz komandne linije (naredbom `python` ili `py`) ili putem instaliranog *IDLE* okruženja koje se automatski doda u start meni.
* **macOS**:
Moderni macOS često već ima Python instaliran, ali to mogu biti starije verzije. Najbolje je preuzeti najnoviju verziju s stranice python.org i instalirati je. Alternativno, alat kao što je *Homebrew* može instalirati ili ažurirati Python putem jednostavne komande (npr. `brew install python3`). Nakon instalacije, Python je spreman za korištenje u terminalu (naredba `python3`).
* **Linux**:
Većina Linux distribucija dolazi s Python 3 programskim jezikom. Ako pak nije dostupan moguće ga je instalirati koristeći standardni sistem za upravljanje paketima. Na primjer, Python 3 se na *Ubuntu* operativnom sistemu instalira naredbom `sudo apt-get install python3`, dok na *Fedora* operativnom sistemu naredbom `sudo dnf install python3`. Python će potom biti dostupan u terminalu i spreman za pokretanje.
## Sažetak
U uvodnim razmatranjima istaknuta je suština računara kao mašina koje obrađuju podatke koristeći binarne vrijednosti i logičke operacije. Opisan je historijski razvoj, od mehaničkih sprava Charlesa Babbagea do modernih digitalnih sistema, te su uvedeni ključni pojmovi poput Turing-potpunosti, bitova, bajtova i različitih načina na koje se podatci predstavljaju (brojevi, tekst, slike, zvuk). Naglašeno je da, bez obzira na složenost i raznolikost zadataka, računar u osnovi radi samo dvije stvari: izvršava proračune i pohranjuje rezultate. Postavljen je teoretski okvir za razumijevanje kako računari primaju, obrađuju i pohranjuju informacije.
Dalje je ukazano na ulogu programskih jezika kao mosta između ideje i mašine. Od mašinskih instrukcija i asemblera, preko jezika visokog nivoa, do potencijalnih budućih paradigmi baziranih na velikim jezičkim modelima (LLM), prikazan je kontinuirani trend rasta apstrakcije i pristupačnosti. Naglašena je važnost kompajlera i interpretera, kao i razlika između minimalnog skupa razvojnih alata i naprednih razvojnih okruženja (IDE), uključujući cloud rješenja.
Konačno, obrađeni su motivi koji čine Python idealnim kandidatom za daljnje proučavanje. Istaknuta je njegova jednostavna i čitljiva sintaksa, bogata standardna biblioteka, široka primjena i podrška zajednice, kao i činjenica da je pogodan za početnike. Sve to priprema osnovu za naredna poglavlja, u kojima će se teorijski koncepti prevesti u praktičan rad sa jezikom koji je danas jedan od najpopularnijih i najrasprostranjenijih u svijetu programiranja.