DU6

Odpovědět
mike04
Donátor
Donátor
Příspěvky: 79
Registrován: 23. 9. 2004 12:00
Typ studia: Informatika Mgr.
Bydliště: Děčín/ Praha
Kontaktovat uživatele:

Příspěvek od mike04 »

Delate tam konverze int/real poli?

By me zajimalo, jestli to mame za ukol, nebo ne.
Uživatelský avatar
Kate
Matfyz(ák|ačka) level III
Příspěvky: 146
Registrován: 8. 1. 2005 10:52
Typ studia: Informatika Mgr.
Bydliště: Milada squat
Kontaktovat uživatele:

Příspěvek od Kate »

mike04 píše:Delate tam konverze int/real poli?

By me zajimalo, jestli to mame za ukol, nebo ne.
pokud si to pamatuju spravne, tak zadna konverze u poli byt nema
Člověk si nemusí nic myslet, aby něco udělal.
Uživatelský avatar
sandius
Matfyz(ák|ačka) level II
Příspěvky: 60
Registrován: 7. 1. 2005 00:52
Typ studia: Informatika Bc.
Bydliště: Tabor / Troja
Kontaktovat uživatele:

Příspěvek od sandius »

Uz je tomu davno, co bylo posledni cviko a moje pamet je derava, v zapiscich o tom taky nic nemam --- takze se zeptam. Jak funguje v Mlaskalu for-cyklus? Je to jenom "syntakticky cukr" za while-cyklus nebo ma stejnou semantiku jako v Pascalu?

V Pascalu (nevim teda, jestli jenom v Borlandim, nebo i p. Wirtha) se totiz for-cyklus resil tak, ze se nejdriv vyhodnotily obe meze, ulozily se do pomocnych promennych a pak se s nima porovnavalo. Cili takovahle procedura:

Kód: Vybrat vše

procedure p1;
  var i: integer;
  begin
    for i := 1 to 10 do
      writeln(i);
  end;
byla v podstate ekvivalentni tehle:

Kód: Vybrat vše

procedure p2;
  var i, ifrom, ito: integer;
  begin
    ifrom := 1; { ukladam si meze }
    ito := 10;
    i := ifrom; { a jedu }
    while i <= ito do
      begin
        writeln(i);
        i := i + 1;
      end;
  end;
Procedury p1 a p2 jsou co se vysledku tyce stejne, takze tam ten rozdil neni tak velky, ale kdyby nekdo pouzil nejakou takovouhle zbesilost:

Kód: Vybrat vše

for i := i to i*2 do ...
tak uz by se to semanticky lisilo docela dost :)

Teda, dost mozna to az moc komplikuju, ale istota je gulomet ;) Nezminoval se o tom nekdo nekde ? Specialni "skryte" promenne se mi tam fakt nechce zavadet.
gASK
Admin(ka) level I
Příspěvky: 635
Registrován: 9. 6. 2005 12:33
Typ studia: Informatika Mgr.
Bydliště: Konečně Vinohrady:)
Kontaktovat uživatele:

Příspěvek od gASK »

sandius píše:Teda, dost mozna to az moc komplikuju, ale istota je gulomet ;) Nezminoval se o tom nekdo nekde ? Specialni "skryte" promenne se mi tam fakt nechce zavadet.
Budeš muset. Pokud si pamatuju implementaci z cvik, tak si tam vyrobíš pomocnou proměnnou (tu mez) a po každým cyklu porovnáváš a zvětšuješ to i o ctx->tab->one() :twisted:

A ano, nejprve vyhodnotíš meze.

Ovšem jestli vymyslíš nějakou úasně geniální implementaci bez tohoto - tak se můžeš těšit na hodně bodů :wink:
When life gives you crap, make crap golems.
Uživatelský avatar
BB
Matfyz(ák|ačka) level I
Příspěvky: 10
Registrován: 9. 2. 2006 00:21
Typ studia: Informatika Bc.
Bydliště: Jizni.mesto/Otava/617.B
Kontaktovat uživatele:

Příspěvek od BB »

gASK píše:A ano, nejprve vyhodnotíš meze.
Yaghob na posledním cviku říkal, že se nemusíme starat o optimalizace.
Když kouknu do jejich vzorového .moa, tak tam najdu forcyklus dělaný spíš jako ten while. Instrukce č. 439 - 446 jsou instrukce pro j := j+1; if c > j then jmp...; Takže for klidně považuj za ten "syntaktický cukr", pokud chceš. Repeat je na tom stejně. Takle ale můžeme mlaskal klidně zredukovat jen na if-then, goto a :=.

Mlaskalovksej for navíc bere ordinální výrazy a z žádného diagramu mi nevyplývá, proč by musely být konstantní. Pak se meze stejně musí vyhodnocovat při každém průchodu.

Kód: Vybrat vše

for i := 1 to j do begin
  if iv[i] = 0 then begin
    shift_left(iv,i);
    iv[j] := 0;
    j := j-1;
  end;
end;
Takže imho skryté proměné na cykly nemají význam, protože pokud je to konstanta, tak si jí načteš stejně rychle jako tu pomocnou proměnnou, konstantní výrazy vyřeší optimalizátor mezikódu (příští semestr) a pokud je to nekonstantní, tak máš stejně smůlu.
gASK
Admin(ka) level I
Příspěvky: 635
Registrován: 9. 6. 2005 12:33
Typ studia: Informatika Mgr.
Bydliště: Konečně Vinohrady:)
Kontaktovat uživatele:

Příspěvek od gASK »

BB píše:
gASK píše:A ano, nejprve vyhodnotíš meze.
Yaghob na posledním cviku říkal, že se nemusíme starat o optimalizace.
Když kouknu do jejich vzorového .moa, tak tam najdu forcyklus dělaný spíš jako ten while. Instrukce č. 439 - 446 jsou instrukce pro j := j+1; if c > j then jmp...; Takže for klidně považuj za ten "syntaktický cukr", pokud chceš. Repeat je na tom stejně. Takle ale můžeme mlaskal klidně zredukovat jen na if-then, goto a :=.

Mlaskalovksej for navíc bere ordinální výrazy a z žádného diagramu mi nevyplývá, proč by musely být konstantní. Pak se meze stejně musí vyhodnocovat při každém průchodu.

Kód: Vybrat vše

for i := 1 to j do begin
  if iv[i] = 0 then begin
    shift_left(iv,i);
    iv[j] := 0;
    j := j-1;
  end;
end;
Takže imho skryté proměné na cykly nemají význam, protože pokud je to konstanta, tak si jí načteš stejně rychle jako tu pomocnou proměnnou, konstantní výrazy vyřeší optimalizátor mezikódu (příští semestr) a pokud je to nekonstantní, tak máš stejně smůlu.
Pravdu díš, musíš si to vyhodnocovat pokaždý. Nu což, říkal jsem - pokud si dobře pamatuji :twisted:
When life gives you crap, make crap golems.
Uživatelský avatar
sandius
Matfyz(ák|ačka) level II
Příspěvky: 60
Registrován: 7. 1. 2005 00:52
Typ studia: Informatika Bc.
Bydliště: Tabor / Troja
Kontaktovat uživatele:

Příspěvek od sandius »

BB píše:Mlaskalovksej for navíc bere ordinální výrazy a z žádného diagramu mi nevyplývá, proč by musely být konstantní. Pak se meze stejně musí vyhodnocovat při každém průchodu.
No, nevim, jestli jsme si spravne porozumeli --- to byla prave moje otazka, jestli to delame tak, jak to dela Pascal, nebo jak to dela C. Pascal totiz meze nevyhodnocuje pri kazdem pruchodu, on to udela jenom jednou, pred vstupem do for-cyklu. C-cko meze vyhodnocuje pri kazdem kroku, protoze C-ckovy for-cyklus je jen a pouze zkratka za while-cyklus s inicializaci a inkrementem.

Ale budiz. Soude podle toho .moa to vypada spis na C-style, takze bude aspon min prace.
Uživatelský avatar
luk
Matfyz(ák|ačka) level II
Příspěvky: 74
Registrován: 6. 6. 2005 18:32
Typ studia: Informatika Mgr.
Bydliště: Praha

Goto revival

Příspěvek od luk »

Zdravím!

Nějak ta diskuse utichla, tak to ve mne probouzí naději, že třeba někdo přišel na to, co s tím, aby goto směrem vzad neskákaly za konec programu :)
Víte někdo? :shock:
Luk
Uživatelský avatar
jhost
Matfyz(ák|ačka) level I
Příspěvky: 2
Registrován: 31. 1. 2006 17:26
Typ studia: Informatika Bc.
Kontaktovat uživatele:

Re: Goto revival

Příspěvek od jhost »

luk píše:Zdravím!

Nějak ta diskuse utichla, tak to ve mne probouzí naději, že třeba někdo přišel na to, co s tím, aby goto směrem vzad neskákaly za konec programu :)
Víte někdo? :shock:
no mne pride, ze skoky smerom spat su uplne zbytocne, pretoze to ti plne riesia cykly.. no a mozno sa to na ulite rozhodli programatorom v mlaskali takto podlo zatrhnut :shock: teda skakat spat ti spravidla vygeneruje nejaky program, ktory je logicky nespravne, no a ak nahodou tie skoky spat poriesis logicky spravne, tak za teba 'zly' kod pre istotu vygeneruje ulita, aby ta od toho oducili :roll:
Dalej, ved tie skoky spat su skryte, ked generujes kod pre cykly a tam to fpoho funguje.. takze ja v tom vidim nejaky trick od ulity, alebo mozno bug... inak fakt netusim ani po hodinach stravenych nad mojimi 10 riadkami riesiacimi goto a label, ako to prinutit skakat mimo blok..
Uživatelský avatar
luk
Matfyz(ák|ačka) level II
Příspěvky: 74
Registrován: 6. 6. 2005 18:32
Typ studia: Informatika Mgr.
Bydliště: Praha

Re: Goto revival

Příspěvek od luk »

jhost píše: no mne pride, ze skoky smerom spat su uplne zbytocne, pretoze to ti plne riesia cykly.. no a mozno sa to na ulite rozhodli programatorom v mlaskali takto podlo zatrhnut :shock: teda skakat spat ti spravidla vygeneruje nejaky program, ktory je logicky nespravne, no a ak nahodou tie skoky spat poriesis logicky spravne, tak za teba 'zly' kod pre istotu vygeneruje ulita, aby ta od toho oducili :roll:
Dalej, ved tie skoky spat su skryte, ked generujes kod pre cykly a tam to fpoho funguje.. takze ja v tom vidim nejaky trick od ulity, alebo mozno bug... inak fakt netusim ani po hodinach stravenych nad mojimi 10 riadkami riesiacimi goto a label, ako to prinutit skakat mimo blok..
Což o to, ono celé goto je pěkná čuněčinka :D Zdá se mi, že goto zpět nefunguje, díky té pozdní vazbě ke skutečnému návěští, co dělá metoda append_instruction_with_target a faktu, že typicky už nemám k dispozici ten icblock, kde se ten label použil :?
Souhlasím, že goto dozadu je zbytečné, jen doufám, že to pak nebudou uliťáci testovat a nestrhnou mi za to body :shock:
Každopádně díky za odpověď :)
Luk
Pjotr
Matfyz(ák|ačka) level I
Příspěvky: 9
Registrován: 10. 12. 2006 23:04

Příspěvek od Pjotr »

mike04 píše:Delate tam konverze int/real poli?

By me zajimalo, jestli to mame za ukol, nebo ne.
U poli se snad pred prirazenim kontroluje identical_types, coz by na zadnou konverzi vest nemelo.
Uživatelský avatar
Kate
Matfyz(ák|ačka) level III
Příspěvky: 146
Registrován: 8. 1. 2005 10:52
Typ studia: Informatika Mgr.
Bydliště: Milada squat
Kontaktovat uživatele:

Příspěvek od Kate »

tak jsem se zas po delsi dobe dokopala k mlaskalu a zjistila jsem, ze mi vubec neni jasna jedna vec :cry: . vzhledem k tomu, ze se to tu jeste neresilo, to bude asi dost trivialni, takze se uz predem stydim :oops:

jak ve volani fce (f(x,x) napr. od function f(a, var b)), v momente, kdy se dostanete k parametru, resp. promenne, identifikatoru (x) a jeste nevite, v jake jste vlastne funkci (to je o pravidla vys) zjistite, zda ta promenna (x) se ma predat hodnotou (xLDx) nebo referenci (xREF)?

nevim, jak to zjistit, tudiz pak nevim, jestli to prislusneho icblocku mam hodit hodnotu te promenne nebo jen adresu.
z hodnoty pak uz zpetne nezrekonstruuju adresu a davat tam vzdy jen adresy je komplikace pro vyssi vrstvy (kde se muzou provadet ruzne aritmeticke operace, tudiz by se pak stejne nevedelo, jestli na vrcholu dilciho zasobniku je uz hodnota nebo jeste porad adresa).

jedine, co me napadlo, je predavat oboji tak dlouho, dokud nebude jasne, co bude skutecne potreba, ale to mi neprijde moc hezke. prepsiovat pravidlo pro volani funkce tak, aby se identifikatory resily na stejne urovni, kdy uz vim, co to je za fci, mi prijde z nekolika duvodu take nepekne/narocne.

za nakopnuti spravnym smerem predem dekuji :wink:
Člověk si nemusí nic myslet, aby něco udělal.
Uživatelský avatar
rastik
Supermatfyz(ák|ačka)
Příspěvky: 661
Registrován: 19. 10. 2005 21:45
Typ studia: Informatika Mgr.
Bydliště: Praha
Kontaktovat uživatele:

Příspěvek od rastik »

Kate píše:jak ve volani fce (f(x,x) napr. od function f(a, var b)), v momente, kdy se dostanete k parametru, resp. promenne, identifikatoru (x) a jeste nevite, v jake jste vlastne funkci (to je o pravidla vys) zjistite, zda ta promenna (x) se ma predat hodnotou (xLDx) nebo referenci (xREF)?

jedine, co me napadlo, je predavat oboji tak dlouho, dokud nebude jasne, co bude skutecne potreba, ale to mi neprijde moc hezke. prepsiovat pravidlo pro volani funkce tak, aby se identifikatory resily na stejne urovni, kdy uz vim, co to je za fci, mi prijde z nekolika duvodu take nepekne/narocne.
Ja som sa k tomu este nedostal, ale zatial predpokladam vytvaranie tych dvoch verzii. Pre mna to prepisovanie moc znamenat nebude, staci mi par zmien (predavam vzdy celu strukturu). Aj tak musim pri skladani parametrov riesil kontrolu typov a pripadne konverzie, toto je uz iba minimum navyse.
Uživatelský avatar
BB
Matfyz(ák|ačka) level I
Příspěvky: 10
Registrován: 9. 2. 2006 00:21
Typ studia: Informatika Bc.
Bydliště: Jizni.mesto/Otava/617.B
Kontaktovat uživatele:

Příspěvek od BB »

Kate píše:nevim, jak to zjistit, tudiz pak nevim, jestli to prislusneho icblocku mam hodit hodnotu te promenne nebo jen adresu.
z hodnoty pak uz zpetne nezrekonstruuju adresu a davat tam vzdy jen adresy je komplikace pro vyssi vrstvy (kde se muzou provadet ruzne aritmeticke operace, tudiz by se pak stejne nevedelo, jestli na vrcholu dilciho zasobniku je uz hodnota nebo jeste porad adresa).
Tohle řeším tak, že předávám "nahoru" icblok s načtenou proměnnou pro aritmetické operace a zároveň s tím i ls_id_ci. Jakmile se k tomu něco přičte, tak identifikátor můžu zahodit (už to neni l-val) a pokud to načítám jako vařenou proměnnou, tak to je jedinej případ, kdy zahodím icblok a vyrobim si z identifikátoru tu referenci.
Asi záleží hlavně na tvé gramatice, já totiž "o patro výš" už neřeším, jestli jsem dostal proměnnou nebo výraz, takže v icbloku potřebuju hodnotu a jeden pointer (resp. iterator) navíc už mě snad nerozhází.

Přijde mi to jako nejjednodušší řešení - žádné velké změny v původním kódu a hlavně: problem solved.
Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

Příspěvek od hippies »

BB píše:
Kate píše:nevim, jak to zjistit, tudiz pak nevim, jestli to prislusneho icblocku mam hodit hodnotu te promenne nebo jen adresu.
z hodnoty pak uz zpetne nezrekonstruuju adresu a davat tam vzdy jen adresy je komplikace pro vyssi vrstvy (kde se muzou provadet ruzne aritmeticke operace, tudiz by se pak stejne nevedelo, jestli na vrcholu dilciho zasobniku je uz hodnota nebo jeste porad adresa).
Tohle řeším tak, že předávám "nahoru" icblok s načtenou proměnnou pro aritmetické operace a zároveň s tím i ls_id_ci. Jakmile se k tomu něco přičte, tak identifikátor můžu zahodit (už to neni l-val) a pokud to načítám jako vařenou proměnnou, tak to je jedinej případ, kdy zahodím icblok a vyrobim si z identifikátoru tu referenci.
Asi záleží hlavně na tvé gramatice, já totiž "o patro výš" už neřeším, jestli jsem dostal proměnnou nebo výraz, takže v icbloku potřebuju hodnotu a jeden pointer (resp. iterator) navíc už mě snad nerozhází.

Přijde mi to jako nejjednodušší řešení - žádné velké změny v původním kódu a hlavně: problem solved.
Ja tohle jeste neresim, ale uz v du5 jsem zduplikoval neterminal promenna na promenna a lvalpromenna -> uz dole vim, jak se to pouzije, ..
Odpovědět

Zpět na „2006“