DU6
- 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:
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:
byla v podstate ekvivalentni tehle:
Procedury p1 a p2 jsou co se vysledku tyce stejne, takze tam ten rozdil neni tak velky, ale kdyby nekdo pouzil nejakou takovouhle zbesilost:
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.
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;
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;
Kód: Vybrat vše
for i := i to i*2 do ...
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.
-
- Admin(ka) level I
- Příspěvky: 635
- Registrován: 9. 6. 2005 12:33
- Typ studia: Informatika Mgr.
- Login do SIS: BUREJ3BM
- Bydliště: Konečně Vinohrady:)
- Kontaktovat uživatele:
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()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.
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ů
When life gives you crap, make crap golems.
- 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:
Yaghob na posledním cviku říkal, že se nemusíme starat o optimalizace.gASK píše:A ano, nejprve vyhodnotíš meze.
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;
-
- Admin(ka) level I
- Příspěvky: 635
- Registrován: 9. 6. 2005 12:33
- Typ studia: Informatika Mgr.
- Login do SIS: BUREJ3BM
- Bydliště: Konečně Vinohrady:)
- Kontaktovat uživatele:
Pravdu díš, musíš si to vyhodnocovat pokaždý. Nu což, říkal jsem - pokud si dobře pamatujiBB píše:Yaghob na posledním cviku říkal, že se nemusíme starat o optimalizace.gASK píše:A ano, nejprve vyhodnotíš meze.
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.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.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;
When life gives you crap, make crap golems.
- 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:
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.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.
Ale budiz. Soude podle toho .moa to vypada spis na C-style, takze bude aspon min prace.
- 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
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?
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?
Luk
- 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
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 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 oducililuk 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?
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..
- 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
Což o to, ono celé goto je pěkná čuněčinka 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žiljhost 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 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
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..
Souhlasím, že goto dozadu je zbytečné, jen doufám, že to pak nebudou uliťáci testovat a nestrhnou mi za to body
Každopádně díky za odpověď
Luk
- Kate
- Matfyz(ák|ačka) level III
- Příspěvky: 146
- Registrován: 8. 1. 2005 10:52
- Typ studia: Informatika Mgr.
- Login do SIS: opock4am
- Bydliště: Milada squat
- Kontaktovat uživatele:
tak jsem se zas po delsi dobe dokopala k mlaskalu a zjistila jsem, ze mi vubec neni jasna jedna vec . vzhledem k tomu, ze se to tu jeste neresilo, to bude asi dost trivialni, takze se uz predem stydim
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
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
Člověk si nemusí nic myslet, aby něco udělal.
- rastik
- Supermatfyz(ák|ačka)
- Příspěvky: 661
- Registrován: 19. 10. 2005 21:45
- Typ studia: Informatika Mgr.
- Login do SIS: wartr3am
- Bydliště: Praha
- Kontaktovat uživatele:
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.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.
- 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:
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.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).
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.
- hippies
- Admin(ka) level I
- Příspěvky: 990
- Registrován: 29. 9. 2004 12:46
- Typ studia: Informatika Mgr.
- Login do SIS: procj4am
- Bydliště: Mladá Boleslav
- Kontaktovat uživatele:
Ja tohle jeste neresim, ale uz v du5 jsem zduplikoval neterminal promenna na promenna a lvalpromenna -> uz dole vim, jak se to pouzije, ..BB píše: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.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).
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.