programado la unua lekcio

 


Kiel oni programas


Komence oni devas lerni multe pri komputiloj kaj programlingvoj ktp. Sed mi pensas ke igi la komputilon fari ion ne estas ĉiam tre malfacila. 

Programi komputilon estas foje tre malfacile cxar oni evoluigis dum longa tempo rimedon por plifaciligi la verkadon de grandaj kompleksaj softvaroj. kaj la cxipoj en komputiloj estas granda kaj kompleksega. do mi parolos komence pri imaginara facila komputilo. oni devas malkovri iom antaux povi skribi sur vera komputilo. mi prezentos tri malsamajn komputiletojn kaj diskutos kiel programi ilin.

  1. memoro-masxino
  2. regxistro-masxino
  3. stako-masxino.
poste mi programos tiujn masxinojn en malsamajn programlingvoj por ke oni povas vidi la malsamecojn inter la lingvoj.

Do, oni komencas kun la memoro-masxinon.

Oni havas kelkajn bazideojn. En komputilo oni havas organizitan memoron. Ĉiu loko en la memoro havas adreson - propran numeron. Kaj oni havas programon, kiu estas en la memoro, do ĉiu instrukcio en la programo havas adreson. Kutime la komputilo rulas la instrukciojn laŭvice : la unua instrukcio kaj poste la dua kaj poste la tria ktp. Sed kiel la komputilo scias kion fari? 

La cxipoj de la komputilo ne estas faritaj hazarde. La instrukcio en loko de la memoro igas la komputilon fari tion ekz. eblas ke 1 signifas "faru nenion", 2 signifas "legu la valoron de la sekvan adreson kiel adreson mem kaj aldoni 1 al la numero kiu trovigxas tie", kaj 3 povus signifi "legu la  du sekvajn adresojn en la memoro kiel adresojn, sumigu la valorojn cxe la adresojn kaj metu la rezulton al la memoradreso kiu trovigxas al la tria adreso en la memoro. poste dauxrigu kun la kvara instrukcio". estas komplika instrukcio! krome la cxipo havas montrilon al la adreso de la rulota instrukcio. rulante la nunan instrukcion la cxipo auxtomate gxisdatigas la montrilon. oni nomas cxi tion montrilon la "instrukcinombrilon".

do estas jam tre bone komenco sed oni bezonas ion alian. oni devas povi decidi kion fari. pro tio oni havas instrukciojn kiuj faras ion se kondicxo estas plenumita. eble ke la numero 4 signifas "lesu la sekvan memoradreson kiel adreson kaj rigardu la numeron kiu trovigxas tie. se gxi estas positiva, dauxrigu per la sekvan instukcion, se ne daurigxo per la postsekvan.

cxu oni bezonas plian instrukcion? eble oni bezonas metodon por diri ion al la programisto (ri ne povas boni legi la voltojn sur la dratoj en la cxipo). malantaux multaj jaroj oni havis lampetojn sur la komputilo por komuniki kun la programisto. Nuntempe oni havas grandan ekranojn.

do ni faru ekxemplon:

ni havas sekvajn komputilon kun suficxa granda memoro. eble 100 adresoj. kaj oni havas sekvajn instrukciojn:

('>' markas la instrukcion, kiun la komputilo nun legas - Do la instukcinombrilon. '.' signafas iun ajn valoron. cxiu programo komencas je la adreso unu)

0 faru nenion

1  legu la 2 sekvajn valorojn. komprenu la unuan kiel adreson kaj la duonan kiel numeron. metu la valoron al la adreson. aldonu 3 al la instrukcinombrilo
ekz: 

> 1
  5
  12
  .
  .

rezultigas

  1
  5
  12
> .
  12

metus la numeron 12 al la adreson 5. 

por kompaktigi la klarigon mi introdukos nun kelkajn mallongigojn. la kvina loko mi skribos 5A. la loko post la nuna valoro en la instrukcinombrilo mi skribos +1A. se oni rigardas la valoron en 5A kiel adreson, mi scribos @5A. la unua instrukcio faras also +2A -> @+1A.

2    legu la 2 sekvajn valorojn. komprenu ambaux kiel adresojn kaj sumigu la valorojn cxe la adresojn kaj metu la rezulton al la unua adreso. aldonu 3 al la instrukcinombrilo

ekz:

> 2
  5
  6
  .
  12
  13

rezultigas

  2
  5
  6
> .
  25
  13

en mia malpli longa skribmaniero: @+1A + @+2A -> @+1A.
 
3   legu la sekvan valoron kiel adreson kaj rigardu la valoron tie. se gxi estas positiva aux nul aldonu 2 al la instrukcinombrilo. se ne,  aldonu 4 al la instrukcinombrilo.

ekz:

> 3
  6
  .
  .
  .
  -2

rezultigas

  3
  6
  .
  .
> .
  -2

kial 2 kaj 4 kaj ne 2 kaj 3? por ke oni povus uzi la sekvan instrukcion

4 legu la sekvan valoron kiel adreson kaj metu gxin en la instrukcinombrilo.

ekz:

> 4
  5
  .
  .
  .

rezultigas

  4
  5
  .
  .
> .

5 presu la nombron kiu trovigxas cxe la adreso montrigxi de la sekva valoro kaj haltu!

ekz.

  5
  4
  .
  12

primas 12 kaj haltas.

niaj unuaj programoj


kun cxi tiuj instukcioj oni povas fari jen tre multe

do la unua programo:

senfina buklo

4 1

estas senfina buklo. la komputilo legas 4 'legu la sekvan valoron kiel adreson kaj saltu tein' sed la sekva valoro estas la unu! do la komputilo saltas al la adreso unu kaj legas nun denove la 4.

la dua programo:

sumigado

2 6 7 5 6 123 234

2 signifas en nia instrukcaro 'legu la 2 sekvajn valorojn kiel adresojn kaj sumigi la valorojn kiuj trovigxas tie. metu la rezulton al la unua adreso' la du adresoj estas 6 kaj 7. sur la 6. loko estas 123, sur la 7. 234. do la komputilo sumigas 123 kaj 234 kaj metas 357 al la 6. loko. gxi daurigas cxe la 4. adreso -> la 5! 'presu la nombron kiu trovigxas cxe la adreso montrigxi de la sekva valoro kaj haltu'. do la komputilo presas 357 kaj haltas. 

entute, la programo sumigas 123 kaj 234 kaj montras la rezulton.

sumigado en buklo

cxu ni povas fari ion da pli kompleksa ? eble sumigi cxiujn nombrojn inter du nombroj? kiel fari gxin?

ekzemple: oni volas kalkuli 5 + 6 + 7 + 8 + 9

ni bezonas la unuan nombron kaj la dua nombron kaj lokon por la sumon. do mi skribas

1 98 0 1 99 5 1 100 9 
metas 0 al la adreso 98 5 al la adreso 99 kaj 9 al la adresso 100.
oni volas stori la sumon cxe 98.

nun di skribas teston. ni devas trovi la diferencon inter la nombro al 99 kaj la nombro al 100. ni ankoraux ne havas operacion por fari gxin. do mi difinas

6 (unua adreso) (dua adreso)

subraktu la nombron al la dua adreso de la nombro al la unua adreso kaj metu la rezulton al la unua adreso. 

ekz.

> 6
  4
  5
  7
  3

rezultigas:

  6
  4
  5
> 4
  3

aux malpli longe: @+1A - @+2A -> @+1A

do la ideo estas nun fari buklon kaj en cxiu iteracio (kiu signifas "paso") tra la buklon oni kalkulas la distanzon inter la nuna valoro cxe 99 kaj la valoro cxe 100. se gxi estas positiva oni finas la buklon. se ne, oni faras la buklon denove.

por fari la teston oni bezonas lokon por stori la distancon inter 99A kaj 100A sen sxangi la du valorojn. do oni bezonas novan lokon, exz 97. do oni komencas per: 1 97 0 -- oni metas nulon al la adreso 97.  faras 97A + 99A -> 97A (instrukcio 2), 97A - 100A -> 97A (instrukcio 6), kaj poste instruktio 3 sur 97A. se negativa aux nulo, oni aldonas 99A al 98A (instrukcio 2) kaj aldonas 1 al 99 (ankaux instrukcio 2), se positiva oni presas la valoron en 98A kaj finas.

do:

1 98 0 # metu 0 al 98. on storos la sumon cxi-tie
1 99 5 # la unua valoro de la buklo
1 100 9 # la dua valoro de la buklo
1 97 0 # valoro kie oni storas la distancon inter 99A kaj 100A
1 96 1 # oni bezonos unu.
0 0 0 ... # gxis adreso 20.
2 97 98 # 97A + 98A -> 97A kio signifas : kopiu la nunan valoron de la buklovaloro al 97A 
6 97 100 # 97A - 100A -> 97A kio signifas : subtrahi la zelvaloron de la buklovaloro
3 97 4 40 4 60 # se 97A negativ (se buklovaloro estas malpli granda aux egalas ol zelvaloro, iru al 40. aliakaze iru al 60)
 0 0 0 ... # gxis adreso 40.
2 98 99 # aldonu la buklovaloron (99) al la sumo (98)
2 98 97 # aldonu unu al la buklovaloron
1 97 0 # rekomencigi la lokon kie oni kalkulis la diferencon inter buklovaloro kaj zelvaloro
4 20 # saltu al 20
0 0 0 ... gxis adreso 60.
5 98 # presu la valoron cxe 98 kaj eliru.

Commentaires

Posts les plus consultés de ce blog

mia unua afiŝo

Kial mi havas nun blogon ĉe blogger