A Habanero Java programozási nyelv

Vezérlési szerkezetek

A Habanero Java a Javából ismert összes vezérlési szerkezetet támogatja, amelyeket a párhuzamos végrehajtásra gondolva a következő foreach-jellegű ciklus-konstrukciókkal egészítettek ki.

Foreach ciklusok

A következő konstrukciókban a ciklus tartományát meg lehet adni region vagy arrayView típusú objektummal is. A példákban csak a tartományokkal történő definiálás szerepel, ezek helyére egyszerűen beírható egy arrayView objektum is.
Sajnos a fentieken kívül semmi mással nem definiálható a ciklus tartománya, így a foreach ciklus Javabeli képességeit elvesztettük.

For

for(point[i_1,...] : [lo1:hi1,...]) Stmt;

Ez még nem párhuzamos konstrukció, csak a Javából ismert foreach-ciklus, mely sorban bejárja a tartományt, az elemek lexikografikus sorrendjében.
Az 1.2-es verziótól kezdve általában használhatók a koordinátaváltozók a ciklus törzsében elhelyezett párhuzamos szerkezetekben is. Korábban a párhuzamos szerkezetekben használható külső változókra tett megszorítás miatt csak a következőhöz hasonló formában lehetett használni a koordinátaváltozókat párhuzamos szerkezetekben:

for(point[ii] : R) { final i = ii; async System.out.println(i); }

Forall

forall(point[i1,...] : [lo1:hi1,...]) Stmt;

A tartomány minden eleméhez létrehoz egy tevékenységet, és abban hajtja végre a ciklusmagot. Tartozik hozzá egy implicit finish, így a hagyományos ciklusokhoz hasonlóan, a szülő tevékenység csak akkor mehet tovább, ha a ciklusban minden elem feldolgozása befejeződött.
Ezen felül minden forall-ciklushoz tartozik egy névtelen phaser, melyhez a létrehozott tevékenységek kapcsolódnak.

forall(point[i] : [1:5]) { System.out.println("1 - Child " + i); next single { System.out.println("Phase transition."); } System.out.println("2 - Child " + i); }

A fenti kód végrehajtásának eredményeképpen először mind az 5 tevékenység kiírja az első üzenetét, melyek sorrendje a konkurencia miatt előre nem tudható. Ezután valamelyik tevékenység kiírja a "Phase transition." sort, tehát ez egyszer kerül megjelenítésre. Végül következhetnek a második üzenetek, melyek sorrendje szintén nem megjósolható. Mindez phaser explicit deklarációja nélkül.

Foreach

foreach(point[i_1,...] : [lo_1:hi_1,...]) [phased[(ph_1<mode_1>,...)]] Stmt;

A forall-hoz hasonlóan külön tevékenységeket hoz létre, de nem tartozik hozzá implicit finish, így a szülő folyamat azonnal tovább mehet. A konstrukcióhoz nem tartozik implicit phaser sem, a létrejövő tevékenységeket már korábban létrehozott phaserekhez kapcsolni a phased kulcsszó segítségével, explicit módon lehet.

Szemantikailag a következő ciklussal egyezik meg:

for(point[i_1,...] : [lo_1:hi_1,...]) async [phased[(ph_1<mode_1>,...)]] Stmt;

Ateach

ateach(point[i_1,...] : distribution) Stmt;

Ebben a konstrukcióban a ciklus tartományát region és arrayView mellett dist típusú objektummal is meg lehet adni.

A foreach-hez hasonlóan hozza létre a párhuzamos tevékenységeket, és region vagy arrayView tartomány esetén azzal teljesen megegyezően működik. Adott dist típusú objektum esetén azonban a tartomány minden pontjához a hozzá tartozó tevékenységet a leképezés által meghatározott helyen hajtja végre. Ez a lehetőség elosztott tömbök esetén lenne hasznos, hogy a tömb minden elemét ott dolgozzunk fel, ahol fizikailag megtalálható.

Adott tartomány és a hozzá tartozó leképezés esetén:

region R = [1:5]; dist D = dist.factory.random(R); //point -> place ateach(point[i] : D) [phased...] Stmt; //a fenti ateach szemantikailag azonos a következő ciklussal: for(point[i] : R) //R == dist.region async at(D.get(i)) [phased...] Stmt;