Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Primer razlike medju kompajlerima...

[es] :: C/C++ programiranje :: Primer razlike medju kompajlerima...

Strane: 1 2

[ Pregleda: 5481 | Odgovora: 28 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Primer razlike medju kompajlerima...11.12.2003. u 10:17 - pre 247 meseci
Ovaj primer je preuzet sa odlicnog http://www.programiranje.net foruma i odlican je kada treba na konkretnom primeru prikazati razlike medju kompajlerima.

Kod:
Code:

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int main()

   int arr[2] = {1, 1}; 
   int a = 0; 
   a = arr[a]++; 
   cout << "a: " << a << endl; 
   cout << "arr[0]: " << arr[0] << endl; 
   cout << "arr[1]: " << arr[1] << endl; 
   system("pause"); 
   return 0; 
}


MinGW:
Code:

a: 1
arr[0]: 2
arr[1]: 1
Press any key to continue . . .


Microsoft Visual C++ 6.0
Code:

a: 1
arr[0]: 1
arr[1]: 2
Press any key to continue . . .


Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 10:50 - pre 247 meseci
Rekao bih da se to pre zove „bag u VC++ 6.0“ nego „razlike između kompajlera“. Silno bih voleo da čujem objašnjenje zašto VC++6.0 pristupa a[1], a ne a[0].

f
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 12:03 - pre 247 meseci
Pa i da je bug, opet je to razlika u kompajlerima, jel'te? :)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

MilošV
Podgorica

Član broj: 7996
Poruke: 484
195.66.163.*



+1 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 12:37 - pre 247 meseci
Samo da dodam :)
Borland:
Code:
a: 1
arr[0]: 2
arr[1]: 1
Press any key to continue . . .
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7173 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 12:38 - pre 247 meseci
Izgleda kao bag vc++ 6, Intel C++ daje:

a: 1
arr[0]: 2
arr[1]: 1


filmil: VC++ pristupa a[0], ali ga ne povecava (a = arr[a]++; ) vec prvo sa ++ poveca a, pa radi referenciranje arr[a] ?!?!

Debug:

Pre a = arr[a]++;

a 0
arr[a] 1


Posle:
a 1
arr[a] 2

Reklo bi se da VC++ prvo uveca brojac sa '++' pa onda referencira [a].. kako je po ISO C++ definisan redosled (i da li je) to mora da kaze neki C++ expert ovde :)

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.dialup.xtra.co.nz



+3 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 13:04 - pre 247 meseci
Nije nikakav bag. To je verovatno posledica ukljucenih optimizacija (kod MinGw ili kod VC-a).

A zasto nije bag? Po standardu vrednost je nedefinisana.
To je slicno ovome: http://www.eskimo.com/~scs/C-faq/q3.1.html
U stvari slicnije je ovome:
http://www.eskimo.com/~scs/C-faq/q3.2.html

A i da je bag, zar ne bi ovo bio bag MinGW-a? Jer kada se uradi arr[a]++ a je 1 pa znaci da je VC ispravno uradio.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 13:07 - pre 247 meseci
Izgleda da je krajnje vreme da se kupi standard za C++.

Kao što je opšte poznato, i = i++ je izraz koji se podvodi pod „nedefinisano ponašanje“ pa je svaki rezultat operacije prihvatljiv.

Ali, to koliko vidim nije isto kao i:

a = arg[a]++.

Što se tiče redosleda izvršavanja, [] ima veći prioritet nego ++, prema standardu.

Citat:

filmil: VC++ pristupa a[0], ali ga ne povecava (a = arr[a]++; ) vec prvo sa ++ poveca a, pa radi referenciranje arr[a] ?!?!


To bi bilo kršenje semantike jezika. ++ uvećava izraz koji je njegov argument. Koliko vidim, VC++ pri računanju izraza ispravno dodeli a = 1, ali zatim kada računa adresu izraza kog treba inkrementirati koristi novu vrednost a za indeksiranje. Koliko sam video u nezvaničnim člancima koji se mogu pronaći na Guglu, to _nije_ ono što bi trebalo da se dogodi. Jer naime:

a = b++;

treba da inkrementira promenljivu b, koja god ona bila. U gornjem izrazu se može videti da se b preslikava u arg[0] tako da bi trebalo da se inkrementira arg[0], bez obzira što je a promenilo vrednost u međuvremenu. Ali naravno, neformalni članci se komotno odnose prema ovim finesama, a C standarda bez plaćanja nema ni od korova — čak ni u biblioteci!

f
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 13:21 - pre 247 meseci
Citat:
srki:
Nije nikakav bag. To je verovatno posledica ukljucenih optimizacija (kod MinGw ili kod VC-a).

Ne bih rekao. Optimizacija je transformacija koda koja daje kod čiji je izlaz uvek ekvivalentan izlazu polaznog programa.

Ako se olabavi taj uslov, onda se svaki program može „izoptimizovati“ do 0 bajtova dužine.

A „agresivne optimizacije“ koje menjaju semantiku programa su marketinški eufemizam. Mnogo je lepše reći „naš kompajler toliko agresivno optimizuje kod da se može desiti da posle optimizacije ne bude ispravan“ nego „naš kompajler ima grešku u algoritmu za optimizaciju“.

Šta onda da pitaju mušterije? Da li optimizacija radi uvek, ponekad ili nikad?

Citat:

A zasto nije bag? Po standardu vrednost je nedefinisana.
To je slicno ovome: http://www.eskimo.com/~scs/C-faq/q3.1.html
U stvari slicnije je ovome:
http://www.eskimo.com/~scs/C-faq/q3.2.html

Na žalost nemam standard pored sebe pa pričam napamet ali ne bi se reklo da je primer sličan ijednom od tih. U oba primera iz C FAQ-a se govori o inkrementiranju promenljive koja se koristi za izračunavanje izraza, a ovde to nije slučaj. Ovde se inkrementira promenljiva koja nema veze sa a.

f
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.dialup.xtra.co.nz



+3 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 13:34 - pre 247 meseci
Citat:
filmil:
Citat:
srki:
Nije nikakav bag. To je verovatno posledica ukljucenih optimizacija (kod MinGw ili kod VC-a).

Ne bih rekao. Optimizacija je transformacija koda koja daje kod čiji je izlaz uvek ekvivalentan izlazu polaznog programa.
Ma naravno. Nisam na to mi mislio. Ali ako je vrednost nedefinisana po standardu onda moze da se razlikuje optimizovana i neoptimizovana verzija. Zato sam rekao da je to mozda posledica optimizacije nekog od kompajlera.

Recimo ovaj kod za zamenu promenljive je po standardu nedefinisan i kada su ukljucene optimizacije moze svasta da bude:
Citat:
For example, it has been reported that when given the code
int a = 123, b = 7654;
a ^= b ^= a ^= b;
the SCO Optimizing C compiler (icc) sets b to 123 and a to 0.


Citat:
Šta onda da pitaju mušterije? Da li optimizacija radi uvek, ponekad ili nikad?
Ako postujes standard optimizacija ce uvek da radi ali ako ne postujes onda moze da se razlikuje rezultat.

Citat:

Na žalost nemam standard pored sebe pa pričam napamet ali ne bi se reklo da je primer sličan ijednom od tih.
Pa i ja sam na brzinu odgovorio. Ucinilo mi se da je prvi primer slican. Mada u stvari prvi primer i jeste slican jer tu isto zavisi da li ima prednost [] ili ++. Zar ne?

Citat:
U oba primera iz C FAQ-a se govori o inkrementiranju promenljive koja se koristi za izračunavanje izraza, a ovde to nije slučaj. Ovde se inkrementira promenljiva koja nema veze sa a.
Pa ima veze sa 'a' ali posrednu vezu.

Sad cu da pogledam da li pise nesto o tome u c++ standardu iz '98 jer sam ga skinuo pre neki dan sa nekog ruskog sajta.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 14:09 - pre 247 meseci
srki, ne znam sta pokusavas da dokazes...

Treba razumeti operatore ++ i --. Evo sta kaze dokumentacija za njih:



Increment operator ( ++ )

Syntax

postfix-expression ++ (postincrement)

++ unary-expression (preincrement)

The expression is called the operand. It must be of scalar type (arithmetic or pointer types) and must be a modifiable lvalue..

Postincrement operator

The value of the whole expression is the value of the postfix expression before the increment is applied.

After the postfix expression is evaluated, the operand is incremented by 1.

Preincrement operator

The operand is incremented by 1 before the expression is evaluated. The value of the whole expression is the incremented value of the operand.

The increment value is appropriate to the type of the operand.

Pointer types follow the rules for pointer arithmetic.

Decrement operator ( -- )

Syntax

postfix-expression -- (postdecrement)

-- unary-expression (predecrement)

The decrement operator follows the same rules as the increment operator, except that the operand is decremented by 1 after or before the whole expression is evaluated.


Ono sto ja pokusavam reci (ne i da dokazem :) je da prici o optimizaciji operatora ++ i -- ovde nema mesta...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 14:18 - pre 247 meseci
Danas nisam imao vremena i za BCC, tako da cu sada da ispravim stvar:
Code:

C:\prj\cxx>bcc32 test.cpp
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
test.cpp:
Turbo Incremental Link 5.65 Copyright (c) 1997-2002 Borland

C:\prj\cxx>test.exe
a: 1
arr[0]: 2
arr[1]: 1
Press any key to continue . . .

Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 14:19 - pre 247 meseci
Tizo, izvini, nisam video tvoj tekst... :(
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7173 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 14:33 - pre 247 meseci
Ovu glavolomku ce resiti neko ko ima kopiju ISO C++ standarda.... i ko ce nam reci da li je ovo definisano standardom ili ne...

Mada je malo cudno da samo MSVC ima probleme sa ovim a da svi ostali rade upravo suprotno.. zanimljivo.

Srki: problem se desava i sa debug i sa release verzijama, tako da ga ne bih pripisao optimizatoru vec samom kompajleru.

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 14:55 - pre 247 meseci
Citat:
srki:
Ako postujes standard optimizacija ce uvek da radi ali ako ne postujes onda moze da se razlikuje rezultat.

Tu je marketing malo više učinio svoje, ali neću komentarisati dalje, pošto je u ovoj temi OT. Daj da rešimo polazni problem. :)

Citat:

Pa i ja sam na brzinu odgovorio. Ucinilo mi se da je prvi primer slican. Mada u stvari prvi primer i jeste slican jer tu isto zavisi da li ima prednost [] ili ++. Zar ne?

Pre nego što sam odgovorio potražio sam standard u biblioteci. Prioriteti operatora su dobro definisani i uvek je [] većeg prioriteta nego ++. (http://www.difranco.net/cop2220/op-prec.htm)

Citat:
Sad cu da pogledam da li pise nesto o tome u c++ standardu ...


Očekujem(o) nestrpljivo.

f
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 16:22 - pre 247 meseci
Nemam ni ja standard, ali imam "Bibliju" (The C++ Programming Language 3rd edition - B. Stroustrup). Elem, najpre u odeljku 6.2 Operator summary strana 120 imate operatore poređane po prioritetu i tu se vidi da subscripting i post increment imaju isti prioritet. Onda liznete prst, okrenete stranu i vidite paragraf 6.2.2 Evaluation Order, strana 122:

Citat:
The order of evaluation of subexpressions within an expression is undefined. In particular, you cannot assume that the expression is evaluated left to right.


Dakle, standard dozvoljava i jedno i drugo. Međutim, ja sam gori od standarda i kad bih video takav kod u programu koji održavam, autor bi leteo kroz prozor...
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7173 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 16:28 - pre 247 meseci
Citat:

Dakle, standard dozvoljava i jedno i drugo. Međutim, ja sam gori od standarda i kad bih video takav kod u programu koji održavam, autor bi leteo kroz prozor...


Ja sam hteo isto da kazem.. no reko', prvo da proverimo kako stoji to sa standardom pre nego sto ospem paljbu :-) Ko pise ovakav kod zasluzuje da umre :)

Nije mi jasno sta se postize sa ovom kripticnoscu osim mogucnosti da to negde ne proradi ...

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 16:32 - pre 247 meseci
Citat:
Dragi Tata:
poređane po prioritetu i tu se vidi da subscripting i post increment imaju isti prioritet.

Ovaj... a šta je onda sa referencama u kojima stoji da [] ima veći prioritet od .++? Jedan od linkova sam već dao, a ima ih dosta.

f
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 16:45 - pre 247 meseci
Filipe, ja gledam Stroustupovu knjigu. Ako laže on, lažem i ja.

Što se linkova tiče, ovaj koji si ti ostavio
http://www.difranco.net/cop2220/op-prec.htm

uopšte ne pominje postinkremetiranje, već samo preinkrement

ovaj:

http://www.cppreference.com/operator_precedence.html

grupiše oba operatora u isti koš, ali ni tu se ne pravi razlika između pre i post inkrementacije, što je greška.

ovaj:
http://www.cs.niu.edu/~abyrnes/csci241/precedence.htm

kaže nešto slično kao što ti tvrdiš, ali bih rekao da greše, a još su i nepotpuni.

ovaj:

http://web.ics.purdue.edu/~cs240/misc/operators.html

opet ne pravi razliku između pre i post inkrementiranja

itd, itd...

 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 16:52 - pre 247 meseci
E, da. Tabela u BS knjizi je slična ovoj na MSDN-u, samo što je potpunija:

http://msdn.microsoft.com/libr...pluslang_c.2b2b_.operators.asp

Mada, zanimljivo je da su se i u MS dokumentaciji zeznuli:

Citat:
Operators in the same segment of the table have equal precedence and are evaluated left to right in an expression unless explicitly forced by parentheses.


Kao što smo videli, ovo nije tačno, ali po standardu i ne mora da bude tačno.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7173 Profil

icon Re: Primer razlike medju kompajlerima...11.12.2003. u 17:01 - pre 247 meseci
http://anubis.dkuug.dk/jtc1/sc22/open/n2356/

Ovo je CD (commitee draft) dakle vrlo rana faza standarda, ali pretpostavljam da nista nije menjano do IS faze, tako da je valjda OK da se koristi kao referenca:

5. Expressions:

4 Except where noted, the order of evaluation of operands of individual
operators and subexpressions of individual expressions, and the order
in which side effects take place, is unspecified. Between the previ-
ous and next sequence point a scalar object shall have its stored
value modified at most once by the evaluation of an expression. Fur-
thermore, the prior value shall be accessed only to determine the
value to be stored. The requirements of this paragraph shall be met
for each allowable ordering of the subexpressions of a full expres-
sion; otherwise the behavior is undefined.

[Example:
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // `i' becomes 9

i = ++i + 1; // the behavior is undefined
i = i + 1; // the value of 'i' is incremented
--end example]


DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

[es] :: C/C++ programiranje :: Primer razlike medju kompajlerima...

Strane: 1 2

[ Pregleda: 5481 | Odgovora: 28 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.