[Java lista] for: ++i vagy i++?

Peter Verhas peter at verhas.com
2009. Feb. 6., P, 12:40:53 CET


OFF topic:

Csak érdekességképpen annyit, hogy valóban egyes C fordítók valóban
más kódot generáltak a ++i illetve az i++ kifejezésekből, de ez már
nagyon régen volt. Azóta úgy szétoptimalizálják a kódot a fordítók,
hogy nem is ismersz rá. Persze ehhez az kellett, hogy legyen olyan
processzorkapacitás és memória, amelyik kivárható idő alatt ezt
megteszi. A kódoptimalizálás eléggé heurisztikus, ugyanis az abszolút
leggyorsabb kód megkeresése NP teljes feladat, azaz a program
méretével exponenciálisan nő az optimalizáló időigénye.

Amit ma a Java nyelvben látok, az már nagyon sok nyelvben megvolt
korábban is. A Java 90%-át valamilyen formában már kitalálták a Java
előtt, csak nem volt lehetőség használható módon megvalósítani. Annak
idején (1960-as évek, amit én is csak történelemként olvastam) a gépi
kód után kitalálták, hogy legyen programozási nyelv. Lett az Algol 68
meg a FORTRAN. Az Algol 68 kihalt, pedig mint nyelv sokkal jobb volt,
mint a FORTRAN. Csak a FORTRAN-t az akkori gépekkel lehetett fordítani
az Algol68-at pedig praktikusan nem. FORTRAN még ma is létezik (pedig
nem kéne), ahogy MUMPS is. Az is egyszerűen fordítható,
interpretálható, futtatható.

Még egy érdekesség:

1987-ben Hollandiában dolgoztam, és a SUN OS-en futó (nem volt még
Solaris) C fordító hibás kódot generált. Leriportoltuk a SUN-nak, meg
azt is, hogy hol a hiba a fordítóban. Jött is a válasz, hogy amit mi
küldtünk kódot (a fordítóból) az a free C compiler-ből való, és az ő
fordítójuk nem arra épül (persze licence). Csak éppen pontosan azt a
hibát vétette amit az ingyenes (nem volt még GPL de gyakorlatilag
GPL-es) free C fordító. Ilyen ez.


Na dolgozok tovább, mert kikapok a főnöktől.

2009/2/6 Richard Oliver Legendi <roante at freemail.hu>:
> Sziasztok!
>
> Észrevettem egy fura dolgot a for kapcsán. C++-ből még rémlett, hogy
> 'hatékonyabb' for esetén a ++i használata, mint az i++ (kemény 2
> opcode-dal :-) ), és reflexből ezt használtam már X éve Javaban is. Nem
> biztos, hogy ez igaz is, de ezt hallottam, és elhittem :-)
>
> Most gondoltam megnézem, mi is ennek a hitemnek az alapja.
> Írtam egy ilyen osztályt:
>
>
> public class ForTest {
>        void test1() {
>                for (int i=0; i<10; ++i) {
>                        System.out.println(i);
>                }
>        }
>
>        void test2() {
>                for (int i=0; i<10; i++) {
>                        System.out.println(i);
>                }
>        }
> }
>
>
> Lefordítottam, és javap-pal visszafejtve azt tapasztaltam, hogy mind a
> két függvény ugyanarra a kódra fordul:
>
>
> void test1();
>   Signature: ()V
>   Code:
>    0:  iconst_0
>    1:  istore_1
>    2:  iload_1
>    3:  bipush  10
>    5:  if_icmpge       21
>    8:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
>    11: iload_1
>    12: invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
>    15: iinc    1, 1
>    18: goto    2
>    21: return
>
> void test2();
>   Signature: ()V
>   Code:
>    0:  iconst_0
>    1:  istore_1
>    2:  iload_1
>    3:  bipush  10
>    5:  if_icmpge       21
>    8:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
>    11: iload_1
>    12: invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
>    15: iinc    1, 1
>    18: goto    2
>    21: return
>
> Kioptimalizálja a fordító gondolom.
> Ezek szerint tök mindegy, hogy ++i vagy i++?
>
> Ricsi
> _______________________________________________
> Javalist mailing list
> Javalist at javagrund.hu
> http://javagrund.hu/mailman/listinfo/javalist
>
>



-- 
Verhás Péter
ügyvezető
Verhás & Verhás Szoftver Manufaktúra Kft.
peter at verhas.com
t: +36(30)9306805


További információk a(z) Javalist levelezőlistáról