Linux: a 'goto' ártalmas a kernel kódban?

Címkék

A tanult szakmám rendszerprogramozó. Annak idején mikor a programozás alapjait tanultam, a Pascal ismeretek körül volt egy olyan általános nézet, hogy struktúrált programozás a mai divat, mindent eljárásokkal (függvényekkel) kell megoldani, és ami nagy ívben kerülendő a kódban a "goto" "break" "continue" átkozott hármas.

Edsger W. Dijkstra 1968-ban írt egy "Go To Statement Considered Harmful" című írást ez ügyben. Sokak szerint a "goto" alkalmazása "spagetti" kódot eredményez. A másik ismert személyiség aki ezt a nézetet vallja Niklaus Wirth, aki a Pascal nyelvet fejlesztette. Linus Torvalds szerint ez nem így van. Szerinte a "goto" nem ártalmas. A "goto" kérdés minden éven visszatér az LKML-en, és minden alkalommal flamet vált ki. Most Rob Wilkens kérdezte Linus-t, hogy miért kódol "goto" utasításokat a Linux forrásába? Példa:

Linus kódja:


 		if (spin_trylock(&tty_lock.lock))
 			goto got_lock;
 		if (tsk == tty_lock.lock_owner) {
 			WARN_ON(!tty_lock.lock_count);
 			tty_lock.lock_count++;
 			return flags;
 		}
 		spin_lock(&tty_lock.lock);
 	got_lock:
 		WARN_ON(tty_lock.lock_owner);

Wilkens szerint így kéne kinéznie:

if (!(spin_trylock(&tty_lock.lock))){
				if (tsk ==tty_lock.lock_owner){
					WRAN_ON(!tty_lock.lcok_count);
					tty_lock.lock_count++;
					return flags;
				}
			}
			WARN_ON(tty_lock.lock_owner);

Linus szerint a "goto" használata maximum az olyan hülye nyelvekben ártalmas, mint a Pascal, de szerinte a C-ben ez nem okoz gondot, ha kellően van alkalmazva. Szerinte olvashatóbb a "goto" kód, mint az if-ek sorozata.

A thread itt indul. Neked mi a véleményed?

Hozzászólások

goto rulez - lehet leugatni engem is ;)


A programreszletben kb ugyanarra fordul le a ket kodreszlet.

Szerintem kicsit assembly emberek hasznaljak a goto-t, es ha tavoli ugrasok vannak benne, akkor valami hihetetlenul olvashatatlan, az eloreugras meg foleg, ha pedig keresztben vannak, akkor idegbajt kapsz.

Egyszoval lehet ertelmesen hasznalni, de nem vetnem be nagy mennyisegben a programomban, csak nagyon indokolt esetekben.

A break es continue-t en is hasznalom, mert nekem kezre all.

van egy ilyen dolog a ? : operatorral is, van ahol tiltjak. Esszel kell csinalni.

Laci

Hi,

Mindenki olyan stílusban írja a programokat, amit szeret. Ha a program jól működik és megvalósítja azt, amire szánták akkor tök mindegy, hogy van goto vagy nincs.

Én speciel nem használom (c/c++).

Nem igaz. Az, hogy egy program helyes csak egy a sok szempont közül. Egyáltalán nem mindegy, hogy ha ránézel a kódra akkor hányingert kapsz-e, vagy sem, és hogy mennyire kell megerõltetni magad, ha módosítani akarsz rajta.

Egyébként goto nem szimpatikus, de a break-continue (last-next:) nem rontja az olvashatóságot annyira, mint a sok if és flag. Indokolt esetben az ember elnéz egy goto-t, de ebben a kódrészletben szerintem nem indokolt.

A goto nagyon hasznos tud lenni.

Pl. tipikusan jol alkalmazhato az olyan library-k hasznalatakor

ahol sok hasznalat utan free-elendo struktura stb, van, es

az ember mindig ellenorzi a fuggvenyek visszateresi erteket es ha baj van akkor szepen meghivja a goto-t.

szoval a

goto out1

goto out2

goto out3

stb...

szerkezetre gondolok.

Persze mindez helyettesitheto sok-sok iffel, de ez tipikusan az

a helyzet amikor a goto atlathatobb kodot eredmenyez.

balsa

Írtam már egy-két progit c++-ban (épületgépészet, épületvillamosság témakörben AutoCAD-hez (windowsos, lehet sydney)) de még nem volt olyan probléma, amihez feltétlenül goto kellett volna. A legmélyebb if struktúrám 3 szint mély.

Tény, hogy sok dolgot egyszerübben és szebben meg lehet oldani goto-val. Basic-es és Pascal -os koromban én is használtam. De egy idő után már én is eltévedtem benne (modjuk úgy 3 hónap elég hozzá).

Amúgy egy ismeretlen kód goto-val vagy a nélkül is lehet ronda. Mindenkinek a saját gyereke tetszik a legjobban.

A lényeg: fölösleges a goto témát túlragozni. Mindenki saját belátása szerint dönt. Ha szükség van rá, használni kell és kész.

2.4.20-ac1:

sunshine:/usr/src/linux# egrep -ir "goto" * | wc -l

17101

Wilkens-sel atiratjuk mindegyiket if-re. ;-)

Arra senki nem gondolt, hogy ez csak egy kod-reszlet?

Ki tudja az eredeti kodban mi van, gondolok itt arra, hogy a got_lock labelt mas is hasznalhatja, sokkal elorebb !

>Amikor te rendszerprogramozóként tanultál, akkor Pascal ismereteknél nem nagyon mondhatták, hogy kerülendő a "goto", "break" "continue" átkozott hármas, ugyanis akkor a Pascalban sem break, sem continue nem volt :)))

Az object oriented pascalba se volt? Hmm. Lehet akkor C oran mondtak. Mindegy erre konkretan emlekszem, mert ezt allandoan elmondtak hogy ez nem hogy nem elegans, hanem tilos. Sot a szakdolgozatnal az oreg rutin viszgaelnok meg ra is keresett ezekre a szovakra a forrasban.

Az mar viszont imho baj lenne. Pont azt szoktak mondani, hogy a tavoli goto-k miatt lesz a kod atlathatatlan. Az ilyen kozeli ugrasokat meg megbocsajtjak (pl. Linus kodja), de azokat mar nem. Foleg, ha nem allandoan nezed a forraskodot. "Mi van ha egy ev mulva veszed elo, mert valamit modositani kell?"

LOL latom ez mar majd' egy eve szurja a szemed. :-)

en soha eletemben nem hasznaltam meg a goto-t. viszont lattam egy sracot egy versenyen, aki meg commodore-on tanult basicben programozni, es mindenhol if feltetel then goto xy formatumu vizsgalatokat hasznalt. na imho az LOL volt a javabol. elhiszem, hogy van amikor hasznos tud lenni, de en akkor is inkabb elkerulom a hasznalatat, ha kisebb lesz tole a kod. nem tudom miert, bennem ez igy alakult ki. az meg, hogy linus hogy hasznal-e goto-t, vagy nem, erre a muveszetekben azt mondjak, hogy muveszi szabadsag :) pl egy olyan kolto, mint Arany, vagy Petofi megsertheti a magyar nyelv szabalyait, vagy egy olyan zongoramuvesz, mint pl Cziffra Gyorgy megengedheti maganak, hogy a Dongo c. munek a gyors felso szolamat oktavparhuzamban jacca (hozzateszem, hogy nem semmi, amit csinal....).

Ugyanigy, egy olyan nevu, es elismertsegu programozo, mint Torvalds, megengedheti maganak, hogy megsertsen egy (amugy sem tul biztos labakon allo) iratlan szabalyt. Viszont epp ugy, ahogy az iment felsorolt nagy muveszek, o sem viheti/viszi ezt tulzasba, mert az mar az esztetikum (muveszetek eseteben)/a kod olvashatosaganak (program eseten) rovasara megy.

Na ja. Bár legjobb tudomásom szerint nem úgy készülnek az új kernelverziók, hogy egy hexeditorral nekiesnek a /vmlinuz-nak... Szóval szerintem nem kell tűzzel-vassal irtani a GOTO-t (főleg az ilyen hardverközeli kódokban, mint a kernel), de csak erősen indokolt esetben kéne használni.

Nálunk a főiskolán pl. ha struktúrált programnyelvből vizsgáztál (elsősorban Pascalból, de C-ból is), tutter bukta volt a GOTO használata. Úgyanígy pl. az exit() (vagy mi van pascalban, de rég volt....) használata is, pedig akkor nem azt írtad, hogy if "valami_fontos_nem_ok" then exit;, hanem hogy if NOT "valami_fontos_nem_ok" then begin "az_EGÉSZ_program" end;

Hát ne mondja senki, hogy ez átláthatóbb. Csak épp nem lehet belőle Jackson-ábrát rajzolni (boaaaa)...

end.

>nálunk a főiskolán pl. ha struktúrált programnyelvből vizsgáztál (elsősorban Pascalból, de C-ból is), tutter bukta volt a GOTO használata.

Na pontosan erre akartam kiterni.

BTW: aki tanult Pukler Tóni-nál (irt egy-ket algoritmusos konyvet, a gyori foiskolan is tanit (mostmar egyetem)), es algoritmusa nem volt jo, mert volt benne goto az tuti kasza volt ;-)

Most olvastam egy igen tanulságos, tudományos értekezést:

idézet:

"

Néhány megfigyelés az igazi programozóról, és a strukturált programozásról:

1. Az igazi programozó nem fél a GOTO-tól.

2. Az igazi programozó öt lap hosszú DO ciklust ír anélkül, hogy belezavarodna.

3. Az igazi programozó szereti az aritmetikai IF-eket - érdekesebb tőlük a program.

4. Az igazi programozó önmódosító kódot ír - különösen akkor, ha meg bír vele spórolni 20 nanoszekundumot egy kis ciklus közepén.

5. Mivel a FORTRANban nincs strukturált REPEAT, UNTIL vagy CASE utasítás, az igazi programozónak nem kell ügyelnie arra, hogy ne használja ezeket. (De persze szükség esetén szimulálhatja őket GOTO-val.)

"

forrás: http://www.szabilinux.hu/orlando_unix/igazi.html