Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Gość Qn`ik

Programowanie

Polecane posty

Co do GOTO to mozna uzywac, choc jest to niewskazane. Jesli poczatkujacemu programiscie dasz GOTO to zaraz okaze sie lekiem na wszystkie mozliwe problemu i czytaniu takiego kodu jest kiepskie (nie pisz ze takie jest zadanie jakiegos goscia, bo sam powinienes miec na ten temat zdanie). Natomiast jesli nie wykonujesz bardzo dalekich skokow jesli chodzi o linie kodu to mozna to przezyc, jednak nie rob tego nagminnie. "Goto zajmuje mniej miejsca w kodzie" - tym mnie rozwaliles. Pewnie ze mozna maniakalnie probowac zrobic jak najwiecej w jednej linii (zboczency uwielbiaja ?: ) tylko pozniej ani ty ani czytajacy sie w tym nie polapia. System przewidywania skokow dziala pod warunkiem ze skok byl skakany, byc moze udaloby sie zauwazyc roznice po wykonaniu petli miliard razy (i to w to samo miejsce, chyba nie sadzisz ze system w magiczny sposob przewidzi gdzie skakac)...

"Podsumowując:goto jest najszybsza mozliwoscia przejscia do innego miejsca w kodzie w c(i kazdym hllu)-bez sprawdzania warunku, bez calla, ktory jest 3 krotnie dłuższy (i również powoduje wczytanie nowej kolejki rozkazów), i bez różnych śmieci dodanych przez kompilator."

Dobrze ze napisales hll. Tym wlasnie rozni sie C od asemblera ze jest jezykiem wysokiego poziomu. Owszem, C jest abstrakcja asemblera, co nie oznacza ze nalezy w nim pisac jak w asemblerze. (nie mowiac o innych hll, jak chocby C++). I nie porownuj CALL i JMP bo jedno nie ma z drugim nic wspolnego (bynajmniej nie uzywa ich sie zamiennie!!). Jeden cykl procesora nic nie zmieni a program bedzie duzo czytelniejszy. I nie chwal sie takimi kawalkami kodu jak ten w ktorym korzystasz z goto.

Link do komentarza
Udostępnij na innych stronach

Ehh, czyli skakac :) Tylko tego nie rozumiem

System przewidywania skokow dziala pod warunkiem ze skok byl skakany, byc moze udaloby sie zauwazyc roznice po wykonaniu petli miliard razy (i to w to samo miejsce, chyba nie sadzisz ze system w magiczny sposob przewidzi gdzie skakac)...

Skoro roznica jest tak smiesznie mala to po co ten caly mechanizm do przewidywania skokow? Przeciez kilka taktow roznicy na miliard to gra nie warta swieczki!?

Owszem, C jest abstrakcja asemblera
no to byla tautologia. Kazdy jezyk jest abstrakcja asemblera.
Link do komentarza
Udostępnij na innych stronach

...

'"Goto zajmuje mniej miejsca w kodzie" - tym mnie rozwaliles. Pewnie ze mozna maniakalnie probowac zrobic jak najwiecej w jednej linii (zboczency uwielbiaja ?: ) tylko pozniej ani ty ani czytajacy sie w tym nie polapia.'

Goto zajmuje mniej miejsca w kodzie programu, nie chodziło mi o źródło ^^ Im program mniejszy tym lepiej...

I nie porownuj CALL i JMP bo jedno nie ma z drugim nic wspolnego (bynajmniej nie uzywa ich sie zamiennie!!). Jeden cykl procesora nic nie zmieni a program bedzie duzo czytelniejszy.

Ma. Przypuśćmy że robisz funkcję void przyjmującą jeden argument...

Pomijajac kod funkcji, wejscie i wyjscie przy uzyciu jmp - 2 (zakładam ze zmienna jest w pamięci), wejscie i wyjscie przy uzyciu calla - 7 (tak zrobi kompilator). W przypadku funkcji bez argumentów 5. Czy to się naprawdę nie opłaca? Dodatkowo np. call to tak naprawdę 3 instrukcje... (tak samo ret).

Przy dużych pętlach okaże się ze marnujemy kilkanaście tysięcy(milionów czasami) cykli...

(nie pisz ze takie jest zadanie jakiegos goscia, bo sam powinienes miec na ten temat zdanie).

Mądre używane goto jest tak samo czytelne jak inne rzeczy - choć łatwiej przy tym nabroić. A jakiś minus musiałem podać, a w prawie każdej książce o c++ przestrzegają przed goto ;)

Link do komentarza
Udostępnij na innych stronach

Cytat z ksiazki o Asemblerze by Eugeniusz Wróbel

"W procesorach Pentium wbudowany został specjalny mechanizm przewidywania rozgalezien (skokow), ktory w Pentium 4 sklada sie z relatywnie skutecznych dwoch ukladow: dynamicznego i statycznego przewidywania skokow. ... stwierdzic mozna ze na 100% to przewidziec mozna jedynie skoki JMP, CALL, INT, RET i RET1."

Dalej autor sugeruje unikanie skokow, a w szczegolnosci warunkowych. Nalezy uzywac instruckji warunkowych jak MOVcc

Link do komentarza
Udostępnij na innych stronach

Ehh, czyli skakac :) Tylko tego nie rozumiem
System przewidywania skokow dziala pod warunkiem ze skok byl skakany, byc moze udaloby sie zauwazyc roznice po wykonaniu petli miliard razy (i to w to samo miejsce, chyba nie sadzisz ze system w magiczny sposob przewidzi gdzie skakac)...

Skoro roznica jest tak smiesznie mala to po co ten caly mechanizm do przewidywania skokow? Przeciez kilka taktow roznicy na miliard to gra nie warta swieczki!?

http://www.aceshardware.com/read.jsp?id=65000294

To nie jest kilka taktow. W przypadku P4 idzie to w setki!!

Owszem, C jest abstrakcja asemblera
no to byla tautologia. Kazdy jezyk jest abstrakcja asemblera.

Nie rozumiesz. C jest abstrakcja asemblera, gdyz rozwiazujac problem za pomoca C, odnosisz sie do zasobow komputera: interesuja cie takie pojecia jak pamiec itd. [Przyklad. Chcesz zrobic jadacy samochod. Robisz w pamiecie obraz samochodu, rysujesz na ekranie, nastepnie funkcja przesuwasz obraz o kilka pikseli] Uzywajac C++ (lub dowolnego innego obiektowego jezyka) poruszasz sie w przestrzeni problemu [Kazesz samochodowi sie narysowac, a nastepnie przemiescic.] Nie jestem najlepszy w tlumaczeniu, moze ktos lepiej to tobie wytlumaczy. (Hmm... Bardziej niz C++, widac to na Javie.

:Freemem

Pomysl nad tym co napisales. W takim wypadku jesli nie chcesz uzywac CALL'i rozwijasz wszystkie funkcje w miejscu wykonania. (wtedy JMP sa nawet niepotrzebne) - problem w tym ze jest ta sama funkcje wywolujesz 5 razy, to umieszczas jej kod 5krotnie. Jesli z kolei chcialbys umiescic funkcje w jednym miejscu w pamieci, to jesli skoczysz do niej z jednego z pieciu miejsc, to nie bedziesz wiedzial gdzie masz wrocic.

Link do komentarza
Udostępnij na innych stronach

http://www.aceshardware.com/read.jsp?id=65000294

To nie jest kilka taktow. W przypadku P4 idzie to w setki!!

To po cholere piszesz cos takiego

System przewidywania skokow dziala pod warunkiem ze skok byl skakany, byc moze udaloby sie zauwazyc roznice po wykonaniu petli miliard razy (i to w to samo miejsce, chyba nie sadzisz ze system w magiczny sposob przewidzi gdzie skakac)...
???
Owszem, C jest abstrakcja asemblera

Nie tylko C. Kazdy kod napisany w dowolnym jezyku jest tlumaczony do postaci kodu maszynowego. Kazdy jezyk jest, wiec abstrakcja asemblera.

Link do komentarza
Udostępnij na innych stronach

:Freemem

Pomysl nad tym co napisales. W takim wypadku jesli nie chcesz uzywac CALL'i rozwijasz wszystkie funkcje w miejscu wykonania. (wtedy JMP sa nawet niepotrzebne) - problem w tym ze jest ta sama funkcje wywolujesz 5 razy, to umieszczas jej kod 5krotnie. Jesli z kolei chcialbys umiescic funkcje w jednym miejscu w pamieci, to jesli skoczysz do niej z jednego z pieciu miejsc, to nie bedziesz wiedzial gdzie masz wrocic.

Nie rozumiem o co ci chodzi?? Czy ja powiedziałem żeby nie używać calli?... Nie... Powiedziałem że użycie goto w pętlach (zamiast funkcji) jest uzasadnione wydajnością...

'rozwijasz wszystkie funkcje w miejscu wykonania. (wtedy JMP sa nawet niepotrzebne) - problem w tym ze jest ta sama funkcje wywolujesz 5 razy, to umieszczas jej kod 5krotnie'

Lol, tego pomysłu to nawet nie skomentuję...

P.S czy napisanie poprawnie mojego nicku wykracza poza Twoje możliwości? :<

Nop fajnie dyskusja o goto a ja dalej nie wiem no a jak zrobić żeby symulowało wciśnięcie klawisza z klawiatury np space??

Są tam jakieś funkcje api ustawiające stan klawiatury, ale wydaje mi się, że najlepszym wyjściem będzie:

short int space=1; <- ustawiasz to na 0 jeśli chcesz 'zasylumować' spację.

Później tylko if(!space) w pętli... i już :P

Link do komentarza
Udostępnij na innych stronach

Nop fajnie dyskusja o goto a ja dalej nie wiem no a jak zrobić żeby symulowało wciśnięcie klawisza z klawiatury np space??

Co dokladnie chcesz uzyskac?

Program czeka sobie az ktos nacisnie spacje, ale od czasu do czasu zachowuje sie jakby ja ktos nacisnal naprawde?

Link do komentarza
Udostępnij na innych stronach

Mormegil:

1)

To po cholere piszesz cos takiego

To byla odpowiedz na pytanie po co jest przewidywanie. [skoro roznica jest tak smiesznie mala to po co ten caly mechanizm do przewidywania skokow?] Biorac pod uwage caly program przyspieszy ci dzialanie, bo skokow bedzie b. duzo. Natomiast jesli brac pod uwage to o czym dyskutowaliscie z Fremen'em to wyeliminowanie sprawdzania warunku w jednej petli niczego nie zmieni.

2)

Co do abstrakcji, to nadal nie rozumiesz o co chodzi. Spojrz: W C tworzysz zmienna - w ASM np. przesuwasz wskaznik stosu, w C robisz For, w ASM np. OP, OP, OP, warunkowe JMP. W C++ tworzysz obiekt typu samochod - w ASM np alokujesz pamiec na stercie, w C++ samochod.jedz, w ASM - wykonujesz jakis kod ktory zmienia zmienna okreslajaca pozycje samochodu. W C (lub w innym jezyku proceduralnym) podejscie do rozwiazania problemu wyglada podobnie do podejscia w ASM. W C++ (lub innym jezyku obiektowym) nijak sie ma ono do tego co wyjdzie w ASM. (No bo jak sie ma jazda samochodem do zmiany zmiennej!).

Fremen: (Sorry, dopiero dzis przeczytalem dokladnie ksywe :P)

1)

Ma. Przypuśćmy że robisz funkcję void przyjmującą jeden argument...

Byla mowa o funkcji postaci: void f(arg1) i do tego sie ustosunkowalem. Pokaz jak chcesz wywolywac ta funkcje bez CALL'i w sposob inny niz ten ktorego nie chcesz skomentowac.

2)

Nie... Powiedziałem że użycie goto w pętlach (zamiast funkcji) jest uzasadnione wydajnością...

prosta petla:

for(i=0;i<10;i++){

f(i);

}

Pokaz mi jak chcesz uzywac GOTO zamiast wywolania funkcji, moze wtedy zjarze twoja koncepcje, bo na razie mnie jakos nie moge sobie nawet tego wyobrazic.

Link do komentarza
Udostępnij na innych stronach

Biorac pod uwage caly program przyspieszy ci dzialanie, bo skokow bedzie b. duzo. Natomiast jesli brac pod uwage to o czym dyskutowaliscie z Fremen'em to wyeliminowanie sprawdzania warunku w jednej petli niczego nie zmieni.
Uzywanie goto w petlach, zwlaszcza duzych, jest wiec nie najlepszym pomyslem.

To napisalem zanim jeszcze cala dyskusja sie zaczela. Moze nie zbyt jasna, ale w tym kryla sie sugestia, ze jak programik jest maciupci to sie nie ma co szczypac i z goto korzystac. Mowmy raczej o prawdziwych projektach.

Mozna dokonac jmp'a do funkcji w zewnetrznym module?

Co do abstrakcji' date=' to nadal nie rozumiesz o co chodzi.[/qoute'] Oh, wydaje mi sie, ze rozumiem lepiej niz Tobie sie wydaje.

Nie wazne czy piszesz w ASM, C, C++ czy czymkolwiek innym. Efekt jest zawsze taki sam. Powstaje kod maszynowy. Oczywiscie im wyzszy poziom abstrakcji, tym bardziej zasmiecony efekt koncowy. Za to czytelniejszy sam kod.

Link do komentarza
Udostępnij na innych stronach

Tak, tylko ze od malych programow nabiera sie zlych nawykow. Tak na prawde znam tylko jedno sensowne zastosowanie GOTO w C/C++ - wychodzenie z zagniezdzonych petli. (Co w javie zostalo pieknie rozwiazane i zaowocowalo wyrzuceniem goto z jezyka).

Co do tej abstrakcji, to widze ze sie nie dogadamy. To na prawde nie ma nic wspolnego z kompilacja i z tym ze wychodzi ze wszystkiego kod maszynowy!! http://64.233.183.104/search?q=cache:Fl-lr...lient=firefox-a

4 strona: abstrakcja wykonawcza i problemowa. O to mniej wiecej chodzi, lapiesz??

Link do komentarza
Udostępnij na innych stronach

Pokaz mi jak chcesz uzywac GOTO zamiast wywolania funkcji, moze wtedy zjarze twoja koncepcje, bo na razie mnie jakos nie moge sobie nawet tego wyobrazic.

Weźmy coś co jest wywoływane ciągle... np. pętlę komunikatów >.>

(petla)drawglscene(w00t){

goto petla;

next0:

ple ple ple}

petla:

PeekMessageA

...

goto next0

Sam poprosiłeś o przykład więc nie mów ze sie chwalę... :P

Ten przykład nie ma większego sensu (bardziej by sie opłacało włożyc to do kodu, zreszta winapi skutecznie zwolni nasz program...), ale załóżmy że zamiast messageloop mamy coś dużego(mnożenie matryc? fizyka?...) i tu mamy trochę wolniej, ale dzięki temu kod jest czytelniejszy, a strata wydajności nie jest az tak strasznie ogromna...

Natomiast jesli brac pod uwage to o czym dyskutowaliscie z Fremen'em to wyeliminowanie sprawdzania warunku w jednej petli niczego nie zmieni.

Serio? Wiesz, bawię się na swoim laptopie(pentium 120, 32 mb ramu, grafa cirrus logic 1 mb) w opengl (dopiero zaczynam) - zrobiłem obracający się kwadrat (bez tekstur).

C (przykład z książki) - [beeep] stąd do Mozambiku, na oko 1 fps.

Konwersja do asma + wywalenie niepotrzebnych rzeczy - około ~15 fps. (warto zanotować, ze z 16 kb, plik zmalał do 1,5 :PPP )

Tak myślę, myśle jak to przyspieszyć... usunąłem jedno porównanie + ~3 fps.

Później usunąłem jeszcze jedną instrukcję i było płynnie!

A teraz załóżmy, że obliczamy oświetlenie w wielkiej pętli... i usuniemy jedno niepotrzebne porównanie... ;)

Abstracja - język c jest abstrakcją assemblera, assembler jest abstrakcją kodu maszynowego, kod maszynowy jest abstrakcją ułożenia bitów w procesorze, ułożenie bitów jest abstrakcją prądu, pojęcie prąd jest abstrakcją ruchu elektronów, a to z kolei jest abstrakcją czegoś jeszcze innego...

w00t! :PPPP

Link do komentarza
Udostępnij na innych stronach

Sorry, nic z tego kodu nie kumam.

(petla)drawglscene(w00t) <-- o co tu chodzi??

Przepisz go jeszcze raz, starannie.

Co do usuwania zbednych rzeczy - moze trzeba zmienic kompilator, albo kazac mu optymalizowac kod?? I pytanie o to jedno usuniete porownanie: czym je zastapiles?? (No chyba ze bylo bezsensownie wstawione przez kompilator i nie sluzylo do niczego, ale nie o takie przypadki mi chodzilo)

Co do abstrakcji to ja juz sie nie odzywam. Niech wam ktos madrzejszy tlumaczy.

Link do komentarza
Udostępnij na innych stronach

Sorry, nic z tego kodu nie kumam.

(petla)drawglscene(w00t) <-- o co tu chodzi??

Przepisz go jeszcze raz, starannie.

Co do usuwania zbednych rzeczy - moze trzeba zmienic kompilator, albo kazac mu optymalizowac kod?? I pytanie o to jedno usuniete porownanie: czym je zastapiles?? (No chyba ze bylo bezsensownie wstawione przez kompilator i nie sluzylo do niczego, ale nie o takie przypadki mi chodzilo)

Co do abstrakcji to ja juz sie nie odzywam. Niech wam ktos madrzejszy tlumaczy.

while(2){ //drawglscene

goto message_loop;

next0:

cos;

}

messageloop:

PeekMessageA();

itp();

goto next0;

Tak by wygladało tłumaczenie na c...

Porównanie całkowicie wywaliłem,... dokładniej było to sprawdzanie, czy program nie działa za szybko... :P To miał być tylko dowód ile czasu może zabrać jedno porównanie... :P

Link do komentarza
Udostępnij na innych stronach

Co do abstrakcji to ja juz sie nie odzywam. Niech wam ktos madrzejszy tlumaczy.
Sprawdz znaczenie slowa abstrakcja w slowniku wyrazow obcych. To sam zrozumiesz :)
Porównanie całkowicie wywaliłem,... dokładniej było to sprawdzanie, czy program nie działa za szybko... :P To miał być tylko dowód ile czasu może zabrać jedno porównanie... :P

Jedno porownanie - 3 fps ??? Sporo, cholera. Zmien opengl na DirectX to bedzie jeszcze wiecej. Ale co to bylo za porownanie dokladnie? Bo jak walnales cos takiego:

if (silnia(500),silnia(1000),silnia(2000),silnia(4000),a==b)

to ja sie nie dziwie

Link do komentarza
Udostępnij na innych stronach

Sprawdz znaczenie slowa abstrakcja w slowniku wyrazow obcych. To sam zrozumiesz Smile

Nie. nie nie nie. Juz nic nie powiem!!

:Fremen

Robienie goto w tym przypadku jest bezcelowe. Po prostu wstawaisz kod w petle. Poza tym ma to niewiele wspolnego z funkcja gdyz ze wzgledu na goto next0 mozesz to stosowac jedynie w scisle okreslonej petli, a funkcje sa m.in. po to by moc ich uzyc wszedzie.

Link do komentarza
Udostępnij na innych stronach

:/

'Ten przykład nie ma większego sensu (bardziej by sie opłacało włożyc to do kodu, zreszta winapi skutecznie zwolni nasz program...), ale załóżmy że zamiast messageloop mamy coś dużego(mnożenie matryc? fizyka?...) i tu mamy trochę wolniej, ale dzięki temu kod jest czytelniejszy, a strata wydajności nie jest az tak strasznie ogromna... '

Link do komentarza
Udostępnij na innych stronach

Można. Tyle że raczej nie wrócisz, a program albo się wykrzaczy, albo pójdzie 'w las'...

Chyba ze ty pisałbyś ten moduł... ale chyba nie oto ci chodzi :]

No to mamy odpowiedz. Czemu z goto sie nie korzysta. Bo nie ma nic wspolnego z programowaniem proceduralnym, czy obiektowym. W duzych projektach (duzo ludzi go pisze) nie da sie z tego korzystac.

Cos wam pokaze:

void proc(char *a, char *b)

{

   while(*a++=*b++);

}

Kto wie co ta procedura robi?

Link do komentarza
Udostępnij na innych stronach

Heh, to cudo kopiuje string b do a :) A najlepsze jest to, ze to dziala ?!

Na zajeciach mielismy napisac funkcje strcpy po swojemu. No to napisalem. Podszedl koles i zaczyna mi tlumaczyc, co kazda linijka mojego kodu robi, oraz jak mozna by to lepiej napisac. I tak linijka po linijce wywalil mi caly kod, a zostawil to cos. :lol:

Link do komentarza
Udostępnij na innych stronach

Kopiuje string? ;o

Mi daje seg fault po skompilowaniu... zreszta: (asm dany przez gcc)

mov byte [ebp-2],97 ;a[0]='a'

mov byte [ebp-1],98 ;a[1]='b'

lea ecx, [ebp-2] ;ecx - adres char a

lea edx, [ebp-4] ;edx - adres char b (pustej)

L2:

mov al, [edx] ;al=b (0)

mov [ecx],al ;ecx = adres b

inc edx ;++

inc ecx ;++

test al,al

jne L2 ;jesli takie same skoncz

Trudno mi uwierzyć ze to może działać :o

Daj cały kod, musiałem gdzies sie pomylić.

Link do komentarza
Udostępnij na innych stronach

tam nie ma operacji porownania tylko przypisanie. = , a nie ==.

Petla sie skonczy, gdy przypisanie zwroci 0. Czyli w momencie, gdy przepisane zostanie 0 z b do a. Jesli b jest "puste" (znaczy sie wskazuje na wartosc 0, nie na adres 0) to petla sie nie wykona.

Edit: :lol: to juz 10 strona naszego kacika :)

Link do komentarza
Udostępnij na innych stronach

Gość
Temat jest zablokowany i nie można w nim pisać.


  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.

×
×
  • Utwórz nowe...