# Shkenca > Informatikë dhe Internet > Arti i programimit >  Tutorial per programim

## qoska

*Hyrje*

Sa me shume perdoruesit avancojne ne njohurite me kompjuterat aq me shume ata njihen me nderfaqe me te komplikuara per te kontrolluar ose komanduar keto makina komplekse. Nderfaqa me e "veshtire" nga te gjitha konsiderohet ajo e "programimit", per vete faktin se eshte nderfaqja me e gjere ne komandimin e kompjuterit.

Ne fillim kjo nderfaqe ishte jashtezakonisht e veshtire pasi duhej te nderveproje drejtperdrejt me makinen, jo plotesisht e sakte pasi ne realitet kishte nje shtrese abstragimi mjaft te lehte qe ekziston dhe sot e kesaj dite qe quhet "assembler". Duke pare kompleksitetin dhe kohen e madhe te implementimit te programeve dhe nderfaqeve te tjera shkencetaret filluan modelimin e abstragimeve me te thjeshta dhe me produktive, kerkime qe cuan ne krijim e nderfaqeve si gjuha C, qe quhen ndryshe gjuhe programimi. Menyra se si keto nderfaqe vepronin ishte thjesht perkthimi i instruksioneve te kesaj nderfaqeje ne nivelin e meposhtem pra nga C -> assembler nepermjet nje perpiluesi.

Ne ditet e sotme duke perfituar dhe nga perparimi i teknologjise qe ka sjelle nje shpejtesi perpunimi dhe ekzekutimi te te dhenave mjaft te madhe abstragimet kane arritur nivele me te medha. Sot jane perhapur shume nderfaqet ose gjuhet ndervepruese(scripting languages). Keto nderfaqe ne te kundert te araardheseve te tyre nuk duhet te kalojne nepermjet nje perpiluesi per te prodhuar kodin e makines ne baze te arkitektures dhe me pas te ekzekutohen por mjafton te shkruhen instruksionet e duhura dhe rezultati mund te merret ne cast. Kjo behet e mundur per shkak te ketyre niveleve te medha abstragimi qe ne te vertete perfitojne nga  disa makina virtuale, ambiente ekzekutimi me cilesi specifike. Nderfaqe ose gjuhe te tilla jane C++/CIL, C#, Java, Perl, Python, Ruby, etj.

Le ti sqarojme disi me mire keto teknika pasi, sipas mendimit tim, eshte mire te njihen pjeset perberese qe te kesh mundesi ti perdoresh ato ne menyre efikase dhe pa surpriza. 
Teknika e prezantuar me siper, gjuhe ndervepruese, nuk eshte gje tjeter vetem i njejti parim si ai i makines me procesorin dhe gjuhen e tij specifike, nderfaqen e tij assembler, te virtualizuar. Pra, emulojme, krijojme nje makine teresisht ne kod me nderfaqen e saj specifike e cila ne njeren ane ndervepron me procesorin fizik, me ane te nderfaqes reale te tij assemblerit, dhe ne anen tjeter na abstragon nje nderfaqe te re mbi te cilen ndertohen abstragime te reja si gjuhet e lart permendura. 
Normalisht lind pyetja po pse nevojitet kjo nderfaqe ne dukje e pavlere? 
Pergjigja eshte e thjeshte pasi na lejon perdorimin e disa teknikave ne makinen virtuale sic jane "garbage collectors"(mbledhesit e mbeturinave), JIC - "just in time compilers"(perpiluesit e jekoheshem). Nese keto teknika do te ndertoheshin ne makine direkte pra ne menyre fizike, normalisht do te ishin dhe me te shpejta se nje makine virtuale, por do te ngrinin koston e procesorit mjaft[1], si rrjedhoje te tere makines. Sigurisht nder te tjera me e rendesishmja eshte se keto makina virtuale na garantojne dhe levizshmerine e kodit te shkruar ne kete gjuhe ne arkitektura te ndryshme.
Menyra se si arrihet kjo levizshmeri ka te beje me gjendjen e ndermjetme te kodit te shkruar ne gjuhen ndervepruese qe quhet "byte-code". Ky kod i ndermjetem s'eshte gje tjeter vetem nje kod i abstraguar nga makina virtuale qe po ta paralelizonim si shembull mund te quhej edhe assembleri i makines virtuale. Ky "byte-code" na krijon mundesine e ekzekutimit te intsruksioneve ne kohe reale, sigurisht te shkruara ne nje gjuhe ndervepruese qe e fsheh nga perdoruesi kete ndermjetesim, duke "eliminuar" procesin e perpilimit ne nderfaqet e mepareshme pasi kjo pune i lihet makines virtuale qe mund ta beje kete pune ne kohe reale pasi e njeh shume mire arkitekturen ne te cilen ajo po ekzekutohet.

Tani per t'ju kthyer qellimit tone, cdo nderfaqe programimi ka te ashtequajturen kurbe te mesimit(learning curve). Nderfaqet e bazuara ne makina virtuale nder cilesite e tyre kane dhe zvogelimin e kesaj kurbe, kohes se mesimit te tyre. Por duke mos perfshire ne kete vleresim kurben e koncepteve te reja qe sjellin ato me vete, koncepte qe u shpjeguan me siper.
Psh per gjuhen JAVA e cila ruan disa mbetje nga paraardhesit duhet te krijohen skedare me instruksionet perkatese, te behet kompilimi ne "byte-kod" dhe me pas te ekzekutohet skedari duke perdorur makinen virtuale. 
Shenim: _Sic shihet JAVA nuk e ka transparent procesin e perpilimit ne "Byte-code" si pjese perberese te nderfaqes. Ky vendim eshte marre nga krijuesit e JAVA-s per ti lehtesuar punen krijuesve te ambienteve programuese si Visual Studio, NetBeans, etj._
Le te paraqesim shembullin klasik ne gjuhet respektive:
1- krijome skedarin test.java me instruksionet si me poshte:


```
class Test {
public static void main(String[] args) {
    System.out.println("Hello World");
 }
}
```

2- Perpilojme skedarin ne "byte-code"
javac test.java 
qe na jep skedarin e perpiluar me emrin test.java

3- ekzekutojme programin me makinen virtuale
java test.java
(Ne te gjitha me siper komandat java dhe javac sistemi duhet te dije se ku ti gjeje ose mund te perdorni thirrje absolute si psh ne windows "c:\vendi ku ndodhet instalimi i java\java[c]" )

Ne gjuhen Python, qe eshte me e re ne moshe, ku eshte transparente pjesa e kompilimit ne "byte-code" ndaj perdoruesit mjafton te perdoret nderfaqa direkte e saj, "shell-i i saj", dhe te shkruhen intruksionet qe ekzekutohen menjehere si:
Shenim: _ ne windos IDLE gjendet ne Start->Programs->Python2x->Python(command line) ju hap ambientin e programimit te Python. kini kujdes te ruani struktruen e kodit pasi gjuha Python kerkon "indentation" te kodit_ 


```
print "Hello World"
#ose me nje koncept me OO(orientuar sipas objekteve):
class Test:
        def __init__(self, message):
              print message

Test("Hello World")
```

Nga te gjitha te shpjeguara me siper perdoruesi ka veshtiresine e perdorimit  te mjeteve per te ndervepruar me makinen virtuale. Panvaresisht se keto nderfaqe  kane me te thjeshte dhe mesazhet e gabimit prape shihet nje veshtiresi e kuptimit te tyre. Shpjegimi qe jepet zakonisht ka te beje me perceptimin qe i behet nderfaqes se programimit. Shume njerez kujtojne se mjafton te njohesh nje gjuhe programimi per te programuar por e verteta eshte se duhet te njohesh konecptet si OO(object 
oriented), strukturat e te dhenave, etj qe te kesh rezultat dhe te mesosh mjaft kollaj te programosh ne cfaredolloj ambienti. 

Kjo nuk eshte evidente sidomos ne fillimet e programimit sic shihet dhe me siper nuk duhet ndonje gjeni per te mesuar ate me siper. Per te vazhduar me tej ama ....!       

[1]_Sa per kuriozitet, makina te tilla jane ndertuar, nder me te dalluarat jane te ashtequajturat Makinat AI(AI machines) ose Makinat Inteligjente, te cilat kane ne procesor nje perpilues te gjuheve si LISP e PROLOG. Normalisht kosto e tyre eishte me shume se 3 here nga ato normalet._


*Vazhdim 1..*

Per fillestaret ambiente te avancuara programimi si Visual Studio, Eclipse, etj jane te pakeshillueshme. Pasi duhet ta beni njehere ne menyre manuale nje veprim, qe ta kuptoni se cfare po ndodh, dhe pastaj te kerkoni mjete per t'ju lehtesuar punen sic jane ambientet e lartpermendura.
Si rrjedhoje, ambienti me i mire per fillestaret eshte CLI(command line interface) qe ne sistemin windows mund te aksesohet duke shkuar ne Start->run -> dhe duke shtypur "cmd"[1], ose "command" ne versione te vjetra te Windows, pastaj "Enter". 
Per editor mjafton Notepad.exe.
Per tiu ardhur ne ndihme *ketu* mund 
te gjeni te gjithe proceduren se si shembulli i prezantuar gjate *Hyrjes* ne JAVA mund kryhet ne Windows. Normalisht do t'ju duhet te keni ne kompjuterin tuaj JAVA. Minimalisht JRE dhe me e rekomanduar Java-SDK te cilat mund ti shkarkoni nga http://java.sun.com.
Gjithashtu per shembullin ne PYTHON shkoni ne http://www.python.org dhe shkarkoni paketen per sistemin tuaj.

[1]_ se si mund te perdoret dhe pershtatet sipas deshires ambienti i prezantuar nga CLI ne Windows referohuni tutorialeve qe mund te gjehen ne makina kerkimi si google.com_

*do te vazhdoje me vone......
P.S. Kjo nenkuton edhe distance me dite ndermjet Vazhdimeve*

----------


## qoska

Me duket e natyrshme qe si cdo leksion te perfshi ne fillim te tij nje permbajtje te temave ne vazhdim edhe per vete faktin qe personat te zgjedhin vete se cilen pjese te lexojne ose ne ja vlen ta lexojne ne teresi apo jo.
Megjithes po e shkruaj kete leksion ne kohen time te lire, qe ju siguroj nuk eshte shume keto muaj  :i ngrysur: ,  shpresoj qe pjeset e tij te jene sa me te pavarura nga njera tjetra dhe te plotesojne qellimin e tyre.

Tani meqe une jam nje perkrahes i filozofise se sistemeve UNIX qe mbeshtetet ne thjeshtesi dhe perkrah modelin nga lart – poshte. Cka do te thote qe ju mesoni pjeset e brendshme te sistemit dhe me vone ato te jashtme. Per ta qartesuar disi me shume, do te thote qe ne fillim mesojme si eshte ndertuar makina dhe pastaj mesojme ti japim asaj.
Ky model duket shume i gjate, i veshtire dhe jo per te gjithe, por ne fund te ketij leksioni do te vereni produktivitet me te madh perfshire ne te thjeshtesine per te zgjeruar njohurite tuaja ne vazhdim.

Gjuhet programuese qe do te perdoren jane: C, C++. JAVA, PYTHON. 
_Shenim: Per vete faktin se seicila nga keto gjuhe kerkon ambientin e saj po ju jap dhe adresat ku mund te gjeni mjetet e nevojshme.
Per C/C++ do te perdoret paketa e perpiluesve falas(open-source) qe mund te gjenden ne  http://gcc.gnu.org 
Per JAVA  http://java,sun.com
Per PYTHON  http://www.python.org
_
Normalisht qe po cuditeni me faktin e perdorimit te kaq shume gjuheve kur ju jeni te interesuar vetem ne nje. Gjithe kjo ka te beje me perceptimin ose me mire mendimin qe kam une se duhet te mesoni konceptet  dhe me pas teknikat. Gjuhe te ndryshme, te perdorura njekohesisht, mundesojne fokusimin ne thelbin e vertete psh ne kuptimin e strukturave te te dhenave dhe jo fokusimin ne sintaksa te gjuheve te ndryshme. Cka do te synoj eshte prezantimi i shembujve ne seicilen gjuhe, nese eshte e mundur, qe te keni mundesi te beni krahasimin dhe mbase te kuptoni me mire thelbin dhe me kohen te kuptoni ngjashmerite dhe vecorite e seiciles gjuhe.

Permbajtja:
_Shenim: Jo e plote pasi mund te ndryshoje disi radha. Per vete faktin se nuk po shkruhet si nje i tere por ne vazhdimesi._

-	*Hyrje ne konceptet e programimit.* (bazat e tij duke perfshire pak histori, pershkrim te gjuheve bazuar ne modelin procedurial si C dhe pastaj modeleve OO(orientuar ne objekte) dhe gjuheve perkatese. Gjithsesi duhet theksuar fakti qe ne ditet e sotme nuk ka gjuhe qe nuk mbeshet koncepte OO, pervec ASSEMBLERIT besoj :P, madje dhe ne C mund te shkruani sipas koncepteve OO. Per te bere kete te fundit sigurisht qe duhet nje njohje e thelle e gjuhes C gje qe nuk eshte synimi I ketij libri.
-	*Hyrje ne Gjuhet programuese.* Pershkrimi i tipareve te gjuheve te programimit, cilesive te seiciles si dhe hyrje ne sintaksat e seiciles.
-	*Pershkrim I mjeteve per seicilen gjuhe.* 
-	*Fillimi I programimit te vertete.* Per t’ju bere me te afert me seicilen nga gjuhet do paraqes teknika per leximin e informacionit nga perdoruesi dhe shfaqen e tij pas nje perpunimi te thjeshte. Vini re, te gjitha shembujt do te lexojne informacionin ne ambiente CLI(command line interface) pasi zgjerimi I ketij diskutimi ne ambiente GUI(graphical user interface) do te ishte i tepruar dhe teper konfuz per fillestaret.
-	*Pershkrimi I tipeve te te dhenave.* Fillimisht me tipet qe modelohen direkte ne baze te arkitektures, ku do te perfshihet dhe pak diskutim mbi arkitekturat e ndryshme te kompjuterave(ordinatore, faktikisht eshte fjala e percaktuar ne fjaloret shqip) dhe fokusohet ne gjuhet C dhe C++ dhe disi PYTHON. Pastaj tipet e abstraguara si ne JAVA ku cdo gje eshte objekt I mirefillte.
-	*Pershkrimi I strukturave te te dhenave.* Do te mundohem te qendroj sa me strikt me fjalorin, te pakten deri ku ekziston, te perdorur ne FSHN(fakultetin e shkencave dhe te natyres) per momentin. Strukturat qe do te prezantojme jane Listat(me derivatet e tyre si vektoret dinamike, Rradhet(queue), Pemet(konceptet e pemeve dhe pemet binare), ndoshta do te permendim dhe disa te tjera si Bashkesite, Grafet(jane modele matematikore per zgjidhjen e problemeve komplekse). Ne fillim do te prezantohen sipas modeleve proceduriale.
-	*Koncepti OO.* Do te prezantohet bashke me cilesite qe sjell ky model si trashegimia(inheritance), etj duke u prezantuar direkte me shembuj konkrete ne gjuhet perkatese.
-	*Vazhdimesia*Do te pershkruajme koncepte te tjera si programimi ne rrjet, GUI , nderfaqe me Baza te Dhenash(databases). E them ne numrin shumes pasi do te keni njohurite baze per te vazhduar seicili nga ju te kontribuoni ne kete leksion.




*Hyrje ne konceptet e programimit.*

Kompjuterat sot jane nje pjese integrale e cdo ambienti tone duke filluar nga ato te punes deri tek ato te shtepise. Sigurisht te mudesuara nga avancimi I teknologjise.

Sigurisht qe e gjithe kjo rruge ka fillimin e vet qe ne lashtesi pasi puna kryesore e kompjuterave eshte te bejne llogaritje per te na lehtesuar punen.
Kujt I detyrohemi per keto komoditete?
Sic thame puna qe kompjuterat bejne me mire eshte llogaritja dhe kjo eshte pikerisht per cka ato u krijuan ne fillimet e tyre, per te ndihmuar ne llogaritjen e shprehjeve matematikore komplekse.

Modeli ne te cilen bazohen kompjuterat e sotem eshte ai I Neumann, nje matematicieni qe per disa eshte dhe me I madh se Anjshtajni. Me shume infomacion mbi kete ceshtje mund te gjeni  KETU. Realisht ai krijoi modelin matematikor I cili per kohen nuk mund te realizohej deri ne fund nga teknologjia e asaj kohe te pakten  pa shpenzime te jashtezakonshme. Gjithsesi nje prototip u krijua dhe u vu ne pune.

Menyra si komandoheshin keto makina ishte totalisht ne kod makine. Me kod makine dua te them me te vertete ne bite. Duke formuar instuksionet sipas manualeve perkatese. Por me kalimin e kohes vete keta programues kerkuan nje menyre per te thjeshtesuar punen e tyre pasi koha qe konsumohej ne krijimin e ketyre programeve ishte jashtezakonisht e madhe dhe rezultonte ne shume gabime. Keshtu qe u krijua nje shtrese e cila ekziston sot e kesaj dite qe quhet assembler. Kjo shtrese ofronte nje metode abstragimi ndaj pasijeve fizike duke eliminuar nga programuesi barren e njohjes se intruksioneve(op-codeve) qe komandonin makinen per te cilat assembleri ishte pergjegjes per kete. Ai, perpiluesi(compiler) i assemblerit, duhet te njihte mire platformen(ky perpilues eshte i nderthurur me makinen ne ditet e sotme). Ne te vertete ai vetem krijonte nje menyre me te thjeshte per shkrimin e ketyre intruksioneve qe do te ishte konsistente ndermjet arkitekturave ose versione te ndryshme te te njejtes pasije fizike.
Meqe ky abstragim permiresoi cilesine dhe shkurtoi kohen e shkrimit te ketyre programeve natyralisht qe u tentua me tej. Produkti ishin gjuhe te nivelit me te lart te cilat qendronin mbi shtresen assembler te cilat abstragonin totalisht ose fshihnin nga programuesi detajet e pasisjeve fizike perberese te kompjuterit. Kjo detyre i lihej gati totalisht perpiluesit. Gjithashtu, keto gjuhe krijonin me shume fleksibilietet pasi prezantonin koncepte si struktura te dhenash qe modeloheshin me afer koncepteve te botes reale. Si psh numrat e plote(int) njiheshin me po kete emer, karakteret(char) njiheshin po me kete emer, mundesi per ti grupuar ne menyre logjike keto objekte dhe per ti manipuluar ato po sipas ketij grupimi, si dhe nga me te rendesishmet mundesine e riperdorimit te kodit te krijuar ne platforma ose programe te tjere. Gje qe lehtesonte mjaft punen dhe ishte nje ide revolucionare per kohen. 

Mbas disa kohesh ky model filloi te paraqese problemet e veta, probleme qe nuk ekzistonin ne kohen kur keto gjuhe u modeluan. Si rezultat  kerkimet per eliminimin e ketyre problemeve cuan ne nje shtrese tjeter ndertuar mbi konceptet e modeleve proceduriale(disa nuk mund te jene dakort me kete percaktim) qe njihet me emrin OO(orientuar sipas objekteve).

Modeli i ri sic thame me siper adresonte problemet e shfaqura ne gjuhet proceduriale sic eshte  perplasja e emrave(namespace pollution) per grupimet llogjike te instruksioneve ose instruksioneve. P.sh. dy funksione te shkruar ne menyre indipendente do te kishin te njejtin emer. Per te qene me te sakte ne terma teknike i njejti emer do te thote e njejta gjurme(signature). Ky koncpet do te shpjegohet me vone ne kapitullin perkates. 
Abstraksioni i ri bazohej totalisht ne boten reale. Psh po te verejme boten qe na rrethon cdo object qe mund te identifikojme me ane te shqisave tona ka cilesite e tij specifike dhe funksionin e tij specifik. Po te verejme me me kujdes do te kuptojme qe seicili nga keta objekte ka nje paraardhes, prej te cilit trashegohen disa veti dhe kjo ide u modelua ne sistemet kompjuterike. Sigurisht me ane te rregullave perkatese duke synuar fleksibilitet, riperdorim mbase duke humbur pak ne modularitet.

* rivazhdon .....*

----------


## qoska

Le te njohim pak me shume seicilin nga konceptet e prezantuar me siper.

Ne fillim sic thame ishte programimi dirket ne gjuhen e makines(bitet). Nje program i shkruar do te ngjante mjaft me kete:

CD03e3a20fa0aaaa99a889896655465
_Shenim: Shemublli eshte paraqitur ne HEX dhe eshte nje trillim por aktualisht mund te edhe te kryejendonje veprim qofte te rrezikshem si fshirjen e te dhenave . Nese jeni kureshtar hapni nje redaktues(tekst editor) ne windows dhe ruani nje skedar me permbajtjen e me siperme ne prapashtesen .COM dhe ekzekutojeni._

Pastaj u krijua shtresa e assemblerit, por edhe kjo shtrese nuk eshte nje nga synimet e ketij leksioni po paraqes vetem nje preshkrim te shkurter te ketij ambienti programimi.

Ne gjuhen Assembler programi eshte nje seri, ne plote kutpimin e fjales, intsuksionesh qe perkthehen ne instruksione ose gjuhe kompjuteri. Pra, forma finale pas perpilimit te ketij kodi eshte ajo e prezantuar me siper. E vetmja menyre per te modifikuar rrjedhen e programit eshte midis kercimeve te mirefillta sipas adresave psh:

Nese kemi nje matrice dydimensionale ku ne kolonen e pare ndodhen adresat ose radha e ekzekutimit te instruksionit dhe ne kolonen e dyte kemi intruskionet e vetmja menyre per te ndryshuar rrjedhen e intruskioneve eshte krijimi i kercimeve sipas numrave te paracaktuar te adresave, ne kete rast numrat ne kolonen e pare. 


```
| 0, 1            |
| 1, 234        |
| 2, 123123  |
| 3, 89          |
| 4, 43	        |
| 5, 90          |
```

_Modifikimi i rrjedhes se programit:_


```
Fillim:
       | 0, 1            |
       | 1, 234        |
Mes:
       | 2, 123123  |
       Nese jo e vertete shko ne fund
       | 3, 89          |
       Nese e vertete shko ne fillim
       | 4, 43	        |
Fund:
       | 5, 90          |
```

Per ata qe duan te shohin paksa kod assembler shembulli me poshte eshte nje Hello World ne Assembler qe mund te ekzekutohet ne ambiente te tipit UNIX dhe mund te perpilohet me NASM(mund ta gjeni ne faqen sourceforge.net):


```
BITS 32 ;per ambiente 32 bit qe jane normale sot

Jmp start

Shfaq:
     Xor eax, eax ;bejme eax = 0
     Pop edx ; kjo merr adresen ku ndodhen karakteret(eshte nje menyre e       perdorur                                     shume nga taktikat bufferoverflow )
     Push  0x1 ;stdout
     Push edx ; karkateret
     Push 0xC ;gjatesia e karaktereve
     Mov eax, 0x4 ;write() syscall 
     Push eax ;Kjo duhet ne *BSD
     Int 0x80 ;ne ditet e sotme perdoret shume SYSENTER
Start: 
	Call shfaq
        Db Hello World ;karakteret qe do te shfaqen ne ekran
```

Sic duket jo nje metode shume frytdhenese. Nje programues qe modifikon kodin e shkruar nga dikush tjeter duhet ta studioje ata ne menyre rrenjesore qe te jete i sigurte se modifikimi ne nje pjese te programit sdo te shkaktoje probleme ne pjese te tjera.
Gjithashtu, kjo gjuhe ne projekte te medha mund te krijoje nje rremuje te madhe pasi kemi vetem nje fushe dhe te gjithe variblat duhet te kene emra te ndryshem. 

Gjithe sqarimin e gjuhes assembler e bera qe ta kuptoni pse ishin kaq te nevojshme gjuhe te nivleit me te larte dhe kjo do te qartesohet akoma me shume kur te mesoni te perdorni keto gjuhe.


*Koncepti procedurial:*

Sic ju kam treguar me pare dhe e konkretizova disi me siper, praktikat e deri atehershme ne programim ishin te kufizuara tek njerez me eksperience dhe conin ne kosto mjaft te medha per krijimin e programeve. Keshtu u desh te krijohej nje praktike e re me koncepte te reja ne kete fushe. Mbas kerkimeve u arrit ne konceptin e njohur sot si metoda proceduriale me gjuhe te nivelit te larte.
Nje nga perdorimet e para te kesaj praktike jane te lidhura me fillimet e sistemit te shfrytezimit(OS, mos u cudisni ky eshte emir i perdorur ne shkollat e informatikes) UNIX. Ky system ishte nga projektet e para te medha ku perdoreshin keto koncepte si dhe per te cilin u krijua nje nga gjuhet me te perdorura deri me sot C.
Ky kocept mundohet te permiresoje praktikat e meparshme me koncepte te reja ku nder me thelbesoret jane:
Fusha te shumta emrash, 
Grupim te variablave ne menyre llogjike,
Grupim te instruksioneve ne menyre llogjike
Dhe me e rendesishmja nga te gjihta shprehja e ketyre instruksioneve ne nje menyre me te  kuptueshme nga njerezit.

*Cdo te thote fusha te shumta emrash?!*

Sic pame gjate gjuhes assembler ne cdo cast te ekzekutimit te programit ne mund te kercenim ne cfaredolloj pjese te programit dhe te modifikonim cfaredolloj variable dhe kjo nenkuptonte nje hapesire te vetme veprimi.
Ne koceptin e ri te krijuar  u pa e arsyeshme qe kjo liri te kufizohej(jo nga pikepamja e sigurise) duke krijuar ndarjen e instruksioneve dhe ndryshoreve ne menyre llogjike qe lehtesonin mirembajtjen dhe leximin e ketij kodi. Per me teper ky kod tani nuk do te shkruhej ne nje menyre shume te afert me makinen por duke ju afruar sa me shume shprehjeve llogjike te njerezve psh:
Zakonisht ne jemi mesuar te shprehim nje veprim matematikor vleredhenie  te nje rezultati nga nje funkion ne formen y = f(x). Ky shenim u gjykua te mbartej dhe ne kete prezantim per shkak te lehtesimit te leximit te tij ndryshe nga forma e tij ne assembler qe eshte:
Push x
Call f(x)
Pop y. 

Duke vazhduar me kete llogjike u mendua meqe funskioni f(x) mund te kete cfaredolloj veprimesh brenda te tij te konsiderohet si nje fushe e vecante qe te dallohet ne menyre te qarte si nje grumbull intruksionesh. Pra cdo ndryshore ose veprim qe behet brenda kesaj fushe te kete kuptim vetem ne kete fushe dhe e gjithcka do te arrihej me thirrjen f(x) qe mund te konsiderohet emir i grupimit dhe vlerat brenda kllapave informacioni qe i nevojitej kesaj fushe per te llogaritur nje rezultat.
_Shenim: Per ata qe jane te njohur me Algjebren Lineare mund te bejne nje lidhje te drejtperdrejt midis fushave te percaktuara aty me fushat ne metoden proceduriale. Psh ne Algjeber fusha me elemente perberes 1, 2 qe permban veprimet +, - shprehet si x = { 1, 2 | +, -} XXX: verfikio kete menyre te shprehuri.
_

Per me teper llogjika e fushave mund ti atribuohet disa ndryshoreve qe sherbejne per te paraqitur vlera per nje objekt te caktuar.
_Shenim: mos ngaterroni objektin e permendur ketu me ate ne konceptin OO._

Psh nese nje fushe me instruksionet perkatese llogarit me shume se dy vlera njekohesisht, kthen me shume se nje nga to mbas llogaritjes, ato mund ti grupohjme nen nje fushe te vetme dhe ti kthejme si nje te tere. Kur nevojitet te merret vlera perkatese e nje ndryshore menyra e adresimit behet duke vene emrin e fushes me pas veprimi qe tregon se deshirojme te shqyrtojme nje vlere brenda fushes dhe pastaj emrin e ndryshores perkatese, ose vleren e elementit perberes. Sigurisht qe fillimi i ketyre instuksioneve behet me kompromis. 
Per tja u bere me konkrete le te shprehim kete koncept me ane te nje gjuhe qe quhet pseudo-kod. Ne kete pseudo-kod fillimi eshte fusha me etiketen Fillo.


```
HAPESIRE
Strukture pike
	Fillo
		NumerPlote x
		NumerPlote y
	Fund

Fushe Fillo(Pike z, Pike w)
Fillim
		z = Mblidh(z, w)
		Shfaq(z)
	Fund

Fushe Mblidh(Pike z, Pike w)
	Fillim
		temp.x = z.x + w.x
		temp.y = z.y + w.y
		Kthe temp
	Fund

Fushe Shfaq(Pike z)
	Fillim
		Sfhaqneekran z
	Fund
FUND_HAPESIRE
```

_
Shenim:
Percaktimi I gjuhes pseudo-kod qe perdoret ne kete leksion.
Grupimi llogjik i disa instruksioneve dhe ndryshoreve behet me ane te etiketes fushe dhe te  gjitha keto fusha gjenden Brenda nje hapesire te vetme. Nese ketij grupimi do ti japim informacion ne hyrje atehere do ta bejme kete duke perdorur te njejten simbolike si ne matematike duke perfshire informacionet e ndryshme midis kllapave rrethore dhe te ndara midis tyre me presje ,.
Kontektsi i kesaj fushe, hapesira llogjike, percaktohet me ane te fjaleve Fillim dhe Fund. Ku Fillim shenon fillimin e grupimit te instruksioneve dhe ndryshoreve dhe Fund mbylljen e ketij grupimi.
Per te gurpuar disa ndryshore perdorim fjalen Strukture. Edhe ketu fusha percaktohet nga fjalet Fillim dhe Fund.
_

Ky eshte pak a shume dhe koncepti procedurial. Sic mund ta dalloni qarte eshte mjaft me i qarte se ai ne gjuhen Assembler dhe per me teper me i lexueshem pasi per te ndryshuar nje pjese te programit mjafton te perqendrohesh brenda nje fushe dhe ske pse te studiosh te tere programin.

*Koncepti OO:*

Koncepti OO eshte avancimi i radhes ne fushen e informatikes. Ai eshte nje permiresim i disa cilesive te konceptit procedurial gjithmone ne drejtim te garantimit te nje cilesie mirembajtje dhe sigurie me te larte te programeve te modeluara sipas ketij koncepti.

Baza e tij eshte marre direkte nga modeli i jetes sone se perditshme. 
Keshtu eshte dhe me I thjeshte per tu kuptuar. Ne boten tone te perditshme ne rrethohemi nga sende dhe gjallesa. Ku sendet kane cilesi dhe gjallesat pervec cilesive mund te kryjne dhe veprime dhe pikerisht ne baze te ketyre cilesive dhe veprimeve na ndihmojne ti  dallojme ato site vecanta nga njera tjetra. Gjithashtu ne boten tone te perditshme shume objekte kane cilesi te njejta dhe dallojne vetem ne disa prej tyre, qe do te thote qe ka shume mundesi te kene nje prejardhje te njejte.
Meqe dhe programet qe krijoheshin duhet te modelonin keto sjellje dhe veprime u mendua qe ky do te ishte modeli me frytdhenes dhe me I thjeshte per tu konceptuar shprehur ne kod nga te gjithe. Gjithe kjo doli e vertete dhe ky model eshte nga me te perdorurit ne krijimin dhe modelimin e programeve sot. 
Me siper ne konceptin procedurial shpjeguam konceptin e fushave dhe hapesirave, por aty ekzistoni n shume fusha dhe nje hapesire e vetme. Ky concept u cua me tej si nje rrjedhoje logjike e konceptit procedurial duke krijuar disa hapsira te ndryshme ku seicila prej tyre te kishte fusha e veta. Pra krijimi I shume hapesirave na jep mundesine te krijojme ndarje llogjike ne kodin tone qe te ngjasoje me inspirimin e ketij modeli te ri, botes sone te perditshme. 

Per te bere me konkret sqarimin e mesiperm le te vazhdojme shembujt tona ne pseudo-kod. Sigurisht me pare le te mendohemi se cfare na duhet te shtojme ne sintaksen e pare per te mundur te paraqesim dhe kete concept me te. Po te mendohemi asgje e re nuk na nevojitet ne sintakse. Pasi modeli i ri vetem bent e mundur izolimin e metejshem te kodit duke evituar edhe perplasjet ne emra por duke na dhene dhe nje shkalle te dyte izolimi qe karakterizon objektet e botes reale.

Psh nese duam te modelojme nje gjarper dhe nje lepur ne pseudo-kod kjo do te shprehej:


```
HAPESIRE gjarper
	NumerPlote gjatesi_gjarper
	Funskion Zvarritu(NumerPlote distance)
		Fillo
			Leviz(distance)
		Fund
FUND_HAPESIRE gjarper

HAPESIRE lepur
	NumerPlote peshanekg
	Funskion Vrapo(NumerPlote distance)
		Fillo
			Leviz_shpejt(distance)
		Fund
FUND_HAPESIRE lepur

HAPESIRE dite_normale
	
	Gjarper.zvarritu(10m)
	Lepur.vrapo(100m)

FUND_HAPESIRE dite_normale
```

Normalisht do te mendoni more per kaq te jene lodhur ato kokat qe e kane shpikur kete model  te lakuar gjithandej?!
Sigurisht qe jo per arsyen e vetme qe bota nuk eshte kaq e thjeshte dhe per me teper qe duhej ofruar dicka me suhme programuesce  :buzeqeshje: .

Por kjo do te vazhdoje ne postimin e ardhshem  :i ngrysur: .

----------


## sot_ka_peshk

qoska,

ne radhe te pare pergezime qe i je perkushtuar kesaj teme, per publikun tone. Meqe eshte dicka e re ne Shqiperi dhe duhet me shume vemendje le te themi per te rinjte tane qe humbin shume koh neper rrjet pa asnje perfitim. Ndersa ideja jote dhe tutori qe je duke mbajtur eshte shume interesant.
Une lexova vetem fillim dhe thjesht vura re nje gabim dhe vendosa ta postoj, padashur te paragjykoj punen tende te mire qe ke nisur.
Problemi eshte si me poshte




> *Hyrje*
> 
> .....
> 1- krijome skedarin test.java me instruksionet si me poshte:
> 
> 
> ```
> class Test {
> public static void main(String[] args) {
> ...


Nuk eshte se eshte ndonje problem shume i madh, per te mos thene fare i vogel.
Po tek pika e trete ekzekutimi i programit te kompiluar behet me komanden "_java test"_ 
Shpresoj te mos me keqkuptosh qe te korigjova, po te njejtin gabim kam bere dikur njeher ne Info 1, ku ishte nje pyetje me alternative, dhe aty humba disa pike te rendesishme.
Gjithsesi mendoj se e ke filluar shume mire, qe i jep fillestareve nje ide si te punojn ne fillim ne terminal, dhe me vone mund te perdorin edhe Eclipse si nje mjet mjaft te rendesishem per nje gjuh OOP sic eshte Java.
Te pershendes dhe te uroj pune te mbare!

----------


## qoska

Kush eshte i interesuar te ndihmoje ne kete tutorial apo leksion mund te me dergoje ne adresen time te e-mailit, mund ta lexoni tek profili im, pjesen per te cilin gjithkush nga ju tenton te shkruaje. 
Ju lutem nese merrni kete inisiative lexoni permbajtjen, ne fillim, ne te cilin ky tutorial mbeshtetet.
Sigurisht qe emri i autorit do te publikohet bashke me shkrimin pra mos harroni ta perfshini ate bashke me shkrimin.

P.S. Po e bej kete postim pasi une deri nga mesi i korrikut nuk do te kem kohen per dicka te tille per shkak te angazhimeve te tjera dhe per te mos e lene pas dore thashe po kerkoj ndihmen e te interesuarve  :shkelje syri: .

----------

