# Shkenca > Informatikë dhe Internet > Arti i programimit >  C/C++: Përpiluesi (Compiler)

## drita

Kisha disa pyetje, ne lidhje me kompilatoret e nje gjuhe programimi.
Se pari ne cfare gjuhe programimi behen ato?
A jane thjesht nje software si software t e tjera apo shume me te komplikuara?
P.sh kompilatroti i C, ne cfare gjuhe eshte bere?
Kam degjuar edhe se Assembler perdor nje si tip "komplilatori", po kjo ne cfare gjuhe eshte bere?
Ajo qe me ka lodhur shume, eshte pyetja se si eshte ndertuar software i pare, apo me sakte sistemi i pare dhe me i thjeshte operativ (MS DOS), sepse ne e dime se nje software nuk mund te behet pa nje editor texti, ndersa vete editori nuk mund te krijohet pa nje gjuhe programimi, atehere kush ka lindur i pari dhe si?
E di qe ngjan si puna e asaj kush e ka bere e para veza pulen apo pula vezen, por qe veretete qe eshte e cuditshme apo jo?
NEse je i afte per te krijuar nje kompilator, atehere kjo do te thote se mundesh te krijosh edhe nje gjuhe programimi?
Se fundi dikush m'u lut qe meqe merrem me keto gjerat e informatikes ta ndihmoja per te krijuar nje "kompilator" qe ben 4 veprimet matematikore.
Kaq ishte detyra qe u kishte dhene professori mavri i informatikes, ketu ne Tirane.
As u ka shpjeguar fare se cfare jane kompilatoret, si ndertohen, por direkt u ka dhene detyren dhe e theu koken per turizem.
Cti besh papergjegjshmeri totale?!
Me shprese se dikush do te tentoje te me ktheje pergjigje ju uroj gjithe te mirat!

----------


## benseven11

kompilusi i pare ka qene A-0 eshte bere me assembler
Per C-ne ka qene Latice
Dosi i pare origjinal QDOS( ne fillim eshte quajtur quick and dirty operation sistem;
me vone Dos u  riquajt disk operating system)
kompjuteri i pare TSR-80 me chip Intel 8088
IBM krijoi arkitekturen e pjeseve hardware te kompjuterit te pare
dhe ne koperim me Intelin krijoi kompletin e chipsave elektronike
qe dha mundesi per krijimin e dosit te pare
Nga Dosi krijuan Assemblerin ... fillimi i dosit e ka bazen
ne chipsat elektronike te fabrikuar gati per tu manipuluar me ane te tastjeres

----------


## Force-Intruder

LoL Drita,

kjo duket tamam si puna e vezes dhe e pules apo... kompilatori vete programohet, por qe te programohet do nje gjuhe programimi. Paradoks duket... por po te shikosh aty ne nje vend tek pergjigja e Benseven ke nje ndihme ne arsyetimin tend ku flitet per chips at. Gjithmone duhet mbajtur parasysh se edhe ne hardware ka "inteligjence" (pra njefare llogjike filestare, psh dioda lejon kalimin e rrymes vetem ne nje drejtim). Eshte shfrytezuar kjo llogjike dhe nje gjuhe bazike per te programuar kompiluesin(et) e pare dhe keshtu ka vazhduar terkuza.

----------


## edspace

Je futur në të thella moj Drita por mqns po marr një klasë për arkitekturën e kompjuterit, si dhe për gjuhët e programimit, do mundohem të të kthej një përgjigje sa më të qartë.

Në rradhë të parë ta fillojmë me ndërtimin e kompjuterit. Shpesh ke dëgjuar se kompjuteri është vetëm zero dhe njësha por zerot dhe njëshat janë vetëm për njerëzit që kanë sy dhe dinë të dallojnë një vijë të drejtë (njëshin) nga një vijë e mbyllur (zeron). Kompjuteri nuk njeh numra por njeh sinjale elektrike. Zerot dhe njëshat (e njerëzve) për kompjuterin përkthehen në tensionin që kalon përmejt aparaturave.

0 = nuk ka tension ose ka tension të ulët
1 = ka tension të lartë

Për të mos thënë "tension i ulët", "tension i lartë", do përdorim numrat 0 dhe 1. 

Tani që kuptojmë tensionet, do vazhdojmë tek zemra/truri i kompjuterit që është procesori. Procesori është ndërtuar në një mënyrë të tillë që një sinjal, shkakton një sinjal tjetër, shkakton një sinjal tjetër, e kështu me rradhë. Duke bashkuar miliona sinjale së bashku mund të krijojmë llogjikën elementare të kompjuterit dhe në të njëjtën kohë mund të ruajmë edhe informacion në sistemin binar. 

Ndryshe nga sistemi dhjetor që përdorin njerëzit, shifrat e kompjuterin mund të jenë vetëm 0 ose 1. Prandaj për të komunikuar me procesorin duhet të përkthejmë të gjithë numrat në 0 dhe 1 dhe të përdorim sistemin binar (dyshifror). 

1 shifër quhet 1 Bit = 0
8 shifra sëbashku quhen 1 Bajt (anglisht=byte) = 00000000

Shifra e parë djathtas tregon 2 në fuqi 0, e dyta 2^1, 2^2, 2^3..... 2^k
(decimale) - > (binare) 
0 = 00000000
1 = 00000001 sepse 2^0 = 1
2 = 00000010 sepse 2^1 = 2
4 = 00000100 sepse (2^2) = 4
8 = 00001000 sepse (2^3) = 8
16 -------- || -----------------
32 -------- || -----------------
64 -------- || -----------------
128 = 10000000 sepse (2^7) = 128

127 = 01111111 sepse (2^6) + (2^5) + (2^4) + (2^3) + (2^2) + (2^1)(2^0) =   64 + 32 + 16 + 8 + 4 + 2 + 1 = 127

3 = 00000011 sepse (2^0) + (2^1) = 1 + 2 = 3

Nqs mund të prezantojmë numrat në këtë mënyrë, atëherë mund të bëjmë edhe mbledhje, zbritje, shumëzim, pjestim. 

Për ti rënë shkurt, procesori është i ndarë në disa pjesë. Një regjistër ka komandën që duhet të kryhet, një pjesë tjetër kryen aritmetikë elementare (+ - * /), një rregjistër përdoret për të ruajtur vlerat e plot e plot të tjera shumë të komplikuara që vetëm inxhinierët e elektronikës mund ti kuptojnë në brëndësi. 
Mos harro se edhe pse po flasim me zero dhe njësha, gjithçka kthehet në sinjale elektronike. 

Procesori ka gjuhën e tij me 0 dhe 1 dhe të vetmet komanda që pranon janë po ashtu me 0 dhe 1. 

Një komandë e procesorit mund të duket kështu. 
00010110  00100011  00011101 10100110

Kombinimi i ndryshëm i zerove dhe njëshave e bën procesorin të dallojë midis mbledhjes, zbritjes, shumëzimit, pjestimit, hedhjen në memorje, marrjen nga memorja, etj. 

Çdo komandë është 32 bit ose 4 bajt. 
00010110  00100011  00011101 10100110

Këto 32 bite janë ndarë në grupe. Grupi i parë i thotë procesorit çfarë funksioni të kryej, grupi i dytë i thotë ku të ruaj rezultatin, grupi i tretë dhe i katërt mund ti japin dy numra. 

a = adresa e memorjes ku eshte hedhur 4
b = adresa e memorjes ku eshte hedhur 5
c = adresa e memorjes ku do rruajme rezultatin 9



```
00010110  00100011  00011101 10100110
shto/add          c                a               b
00010000  00100011  00011101 10100110
zbrit/sub          c                a               b
00111000  00100011  00011101 10100110
shumëzo          c                a               b
10001000  00100011  00011101 10100110
pjesto              c                a               b
10110001  00100011  00011101 10100110
lexo                 a                b 
shkruaj            a                b
...
....
```

Vër re si ndryshon grupi i parë i shifrave për çdo komandë. Kjo e lejon procesorin të dallojë midis mbledhjes, zbritjes dhe plot komandave të tjera. Në të vërtetë gjërat janë më të komplikuara por unë po i thjeshtoj shumë sa për të të dhënë një ide. Numrat i kam dhënë sa për shëmbull dhe nuk janë të saktë. Pse? Sepse procesorët modern kanë me qindra komanda të tilla dhe është e pamundur për njerëzit të mbajnë mënd gjithë kombinimet e ndryshme të zerove dhe njëshave. 

Grupi i komandave me zero dhe njësha quhet gjuhe makine (machine language). 
00010110  00100011  00011101 10100110
00010000  00100011  00011101 10100110
00111000  00100011  00011101 10100110
10001000  00100011  00011101 10100110
10110001  00100011  00011101 10100110

Për të lehtësuar punën për njerëzit, komandat e gjuhës së makinës përkthehen në asembli (assembly) që ka afërsisht të njëjtat funksione me gjuhën e makinës por shkruhet me shkronja dhe simbole të gjuhëve njerëzore. Komandat në asembli janë shkurtime të fjalëve të anglishtes. 


```
ld     	_sfoo,g0
ld      	_sfoo+4,g4
cmpible 	g4,g0,L4
mov   	g4,g0
ld   	_sfoo,g5
ld   	 8(g5),g4
ldis   	8(g4),g0
ld 	12(g4),g4
addo 	g5,g0,g0
callx	(g4)
```


Shkronjat dhe numrat siç të thashë në fillim janë për njerëzit. Kompjuteri dhe pjesët elektronike pranon vetëm sinjale me tension të ndryshëm. Prandaj domosdo që komandat e para që i janë dhënë procesorit nuk kanë qënë në asembli por dikush i ka regjistruar sinjalet në një ROM. ROM-i është memorje e pandryshueshme. Pra është ndërtuar në mënyrë të tillë që gjithnjë përmban të njëjtat komanda. ROM përmban sinjalet e nevojshme për të aktivizuar sistemin e marrjes dhe dhënies që quhet BIOS (basic input output system), shqiptohet bajos. Kur ti ndez kompjuteri, procesori fillon të kryej komandat e BIOS që është regjistruar në ROM. BIOS kontrollon pjesët e tjera të kompjuterit si hard disku, cd-rom, memorjen etj dhe pastaj lexon hard diskun për sektorin boot (boot sector). Aty gjenden komanda për sistemin operativ (dos, windows, unix, linux, mac) që hidhen në memorje dhe prej memorjes, kryen me rradhë nga procesori. 

Në përshkrimin më lart nuk zura në gojë zero dhe njësha sepse ato nuk ekzistojnë. Gjuhët simbolike janë vetëm për njerëzit. Edhe hard disku nuk ka zero dhe njësha por ka sinjale që simbolizojnë 0 ose 1. Para se të ndërtohej hard disku, kompjuterat përdornin kartela me vrimë dhe vrima simbolizonte 1. 

Njerëzit nuk duan të mendojnë për sinjale, prandaj i kthejmë sinjalet në numra. Duke bashkuar 0 dhe 1 formojmë, gjuhën e makinës. Gjuhën e makinës e përkthejmë në asembli, fortran, pascal, cobol, basic, c, c++ e plot gjuhë të tjera. Kjo është renditja kronologjike por për njerëzit është më e rëndësishme drejtimi i kundërt, përkthimi nga gjuhët moderne në gjuhën e makinës. 
Asembli kalon tek assembler dhe përkthehet në gjuhën e makinës. 
Të gjitha gjuhët kanë përpilusin (compiler) e tyre. 

Si u krijua përpiluesi i parë? 
Përpiluesi i parë ka qënë një seri komandash që dikush i ka kthyer në sinjale dhe i ka hedhur në hard disk nëpërmjet tastierës. Këto zero dhe njësha lexohen nga procesori dhe krijojnë disa zero dhe njësha të tjerë. Këto të fundit i japin komanda procesorit të dërgojë sinjale te monitori dhe monitori ndryshon ngjyrat e pikave (pixels). Formacionet e pikave në mënyra të ndryshme formojnë simbolet e gjuhëve që përdorin njerëzit. Kur ti shtyp një buton në tastierë, procesori merr një seri komandash që ruajnë shkronjën tënde në memorje dhe pastaj e vizatojnë në ekran. Grupimi i shkronjave formon gjuhën dhe gjuhët ndërtojnë mbi njëra tjetra. 

Nuk ka rëndësi gjuha por rezultati i zerove dhe njëshave që shkruhen në hard disk, disketa, CD dhe sende të tjera që ruajnë informacionin. Në fillim ruheshin me kartela me vrima por tani përdoren teknologji të tjera si fushat elektromagnetike, rezet lazer, etj. 

Pasi i krijua një seri zerosh dhe njëshash për asembli, nuk ishte nevoja që të shkruhej përsëri me zero dhe njësha. 
0101010 -> asembli
asembli -> perpilues per gjuhe tjeter
gjuha tjeter -> gjuhë akoma më të mirë
gjuha më e mirë -> fortran
fortran -> gjuhë tjetër
gjuha tjetë -> C
C -> C që tregon dhe gabimet e kodit
C -> C që tregon gabimet dhe është më e shpejtë
C -> C++, më të lehtë se C
C -> Java, më të lehtë se C
C -> Lisp, PHP, PERL
...
...

Çfarë bën përpiluesi?
Përpiluesi analizon simbolet që ke hedhur ti në memorje dhe i kthen komandat në gjuhën e makinës (01101010). Përpiluesit e mirë të thonë që ke dhe gabime në kod, ose analizojnë kodin për mënyrën më të shpejtë për të kryer komandat. Nuk është e thënë që përpiluesi ta kthejë kodin në gjuhën e makinës. 
C++ mund të përkthehet në C, C të përkthehet në Asembli dhe pastaj Asembli të përkthehet në gjuhën e makinës. 

Asembli mbahet si gjuha më e ulët që mund të shkruajnë njerëzit dhe asembler ka qënë programi/përpiluesi i parë që ka përkthyer asemblin në gjuhën e makinës. Asembleri ka qënë përpiluesi i parë i shkruajtur në zero dhe njësha. Gjithçka tjetër ka vazhduar zinxhir. 


Si mund të krijosh një përpilues/kompilator?
Ti nuk duhet të shkruash në 10101 por shumë mirë mund të shkruash në C++ dhe Java që i afrohen më shumë mënyrës si llogjikon njeriu. 

Ja dhe gjuha që mund të krijosh ti për profesorin: 
------------------------
2 shumëzim 4
6 plus 2
15 minus 8
10 pjestim 5
------------------------

Këtë mund ta ruash në një skedar në kompjuter (kodi.shqip)
Pastaj hap përpiluesin e c++ dhe shkruaj dy rreshta kod që të lexojë skedarin dhe të zëvëndësojë 
"2 shumëzim 4" me *cout << 2 * 4 << endl;*
"6 plus 2" me *cout << 6 + 2 << endl;*
"15 minus 8" me *cout << 15 - 8 << endl;*
"10 pjestim 5" me *cout << 10 / 4 << endl;*

Pra, ti e shkruajte në shqip > përpiluesi e ktheu në C++ 
C++ mund ta kompilosh me përpiluesin e C++ për ta kthyer në gjuhën e makinës (machine language).

Gjuha jonë njeh vetëm 4 komanda por kjo s'ka rëndësi sepse zerot dhe njëshat në fund janë njësoj sikur ne ta kishim shkruar edhe në ndonjë nga gjuhët e tjera. 

Disa gjuhë të lejojnë të shprehesh më lehtë, disa të lejojnë të shprehesh më shpejt, disa lexohen më mirë, disa shkruhen më mirë, disa përpilohen më shpejt, disa kanë funksione matematikore shumë të sakta, disa kanë funksione të mira për të hapur skedarë, disa kanë funksione të mira për të organizuar tekstin dhe fotografitë (html), etj etj. 

Besoj se ke një ide më të mirë tani se çfarë ndodh pas kompjuterit. I shtrydha mirë trutë dhe bëra një përmbledhje të shumë klasave që kam marrë dhe vazhdoj të marr në universitet. Edhe këto sa të thashë unë janë thjeshtuar në kulm se ka shumë gjëra të tjera që dhe unë nuk i kuptoj mirë. Shpresoj tu jem përgjigjur të gjitha pyetjeve që ke shtruar por mos nguro po ke paqartësira.

----------


## Gepardi

Edi faleminderit shume.
Po kete pyetje e kisha dhe une dhe e kisha vrare shpesh here mendien, por me ne fund mbas ketij sqarimi krijova nje fare ideje. 
Pershendetje!

----------


## drita

Shume flm cuna dhe me falni nese ju lodha sidomos edi-in

----------


## [xeni]

Nese ndonjeri di ndonje website ku mund ta shkarkoj do me bente nder sikur te me jepte linkun  :buzeqeshje:  

ju falenderoj qe tani...

----------


## edspace

Instalimi i Borland 5.5 falas
http://cplus.about.com/library/weekly/aa031502a.htm

Instalimi i g++ me Cygwin falas
http://cplus.about.com/library/weekly/aa031202a.htm

Microsoft Visual C++ 2005 falas
http://lab.msdn.microsoft.com/express/visualc/

----------


## werewolf

mund te shkarkosh dhe devC++, eshte free software (GPL) e gjen ketu:
http://www.bloodshed.net/devcpp.html

----------


## [xeni]

edspace, werewolf  
falemnderit shume per interesimin dhe ndihmen...

----------


## ILovePejaa

Mund ta perdorni jGRASP me gcc apo ndonje compiler tjeter; jGRASP mund te perdorni per Java, C, C++, ADA etj. jGRASP apo DevC++ jane me shume per fillestare.

http://www.eng.auburn.edu/grasp/

Une perdori visual C++.net dhe neqofse jeni student ndoshta do te keni mundesi te merrni falase nga shkolla ku studioni ne departamentin e shkencave kompjuterike.

----------


## josif

zeno, per mua instalo nje version te cfaredoshem unix/linux dhe tek te gjithe do te gjesh 
g++ compiler-i me i mire per momentin. 

krahas saj unix/linux permban gdb nje debugger shume i fuqishem.

----------


## [xeni]

> zeno, per mua instalo nje version te cfaredoshem unix/linux dhe tek te gjithe do te gjesh 
> g++ compiler-i me i mire per momentin. 
> 
> krahas saj unix/linux permban gdb nje debugger shume i fuqishem.


Josifo, rrofsh, vlla. 
Puna eshte se jam "restricted to use windows".  :buzeqeshje:

----------


## edspace

Dev-C++ që të ka treguar werewolf përdor g++, është falas dhe punon për mrekulli në windows. Unë u detyrova ta përdorja në punë mqns nuk kisha Ms Visual Studio dhe kam ngelur i kënaqur. Nga të gjithë përpiluesit g++ mbahet nga më të mirët për optimizim të kodit dhe për zbatimin e standardeve të C dhe C++. 

Dev-C++ është i ngjashëm me MS Visual C++ dhe shumë i lehtë për tu përdorur.

----------


## josif

> Josifo, rrofsh, vlla. 
> Puna eshte se jam "restricted to use windows".


Ok, atehere zgjidhja me e mire eshte te kerkosh ndonje version te MS Visual Studio C++  
tek shitesat ambulante te CD-ve.

P.S: Ne maltepe duhet te gjesh patjeter

----------


## altiX

Përshëndetje juve adhuruesve të C dhe Cpp,
Edhe unë jam një nga ato por ka një kohë që nuk po mirrem më me një gjë të tillë.Deri para një viti kam pasur interesim më të madhë me C e sidomos me Cpp.Kryesisht kam punuar me Borlandin 5.0 në sistemin operativ të windowsit.Mirëpo ka gati një vit që nuk po mundem ma të shkëputem nga Linuxi.Andaj pyetja ime do të ishte a keni ju njohuri për Cpp në Linux dhe çfarë Compileri do të më preferonit.

----------


## josif

g++ qe e gjen bashke me paketen gcc

----------


## Nocturnal

Po e bej edhe njehere pyetjen:
Do filloj te mesoj C++. Do perdor librin "C++ How to Program." (4th edition) Nese dikush e ka perdorur, me jepni ndonje ide cfare compiler te downlodoj se jo te gjithe jane te sakte.
Thanks

----------


## edspace

Nuk t'u përgjigj njeri sepse kjo temë është diskutuar nja tre herë më parë. Dhjetë tema poshtë kësaj është tema për përpiluesit (compiler). 
http://www.forumishqiptar.com/showthread.php?t=40505

Librat zakonisht të thonë vetë se cilën përpilues/kompajlër duhet të përdorësh. Më i thjeshti për fillestarët është MS Visual C++ 6.0 por nuk mund të përpilojë të gjitha kodet e librit sepse nuk zbaton të gjitha standardet e gjuhës. 

Nëse përdor linux, mund të përdorësh gcc për C dhe g++ dhe C++.

Kombinimi më i mirë që ofron lehtësinë e MS Visual C++ dhe standardet e g++ është përpiluesi Dev-C++. Mendoj se do përpilojë të gjitha kodet që ka libri nqs janë shkruar në gjuhën standarde. Programi është falas dhe mund ta shkarkosh këtu

Herën tjetër hidhi një sy forumit para se të bësh një pyetje.

----------


## el7

Hi

Me duhet te gjej kete version per compiler c++ ose me te ri por me c*ack nqs di ndokush ndonje link per ta shkarkuar te me ndihmoje.Eshte pak urgjente.Thanks

 :buzeqeshje:

----------

