von *strangelet » So 28. Okt 2007, 01:41
Tz ... die Profis mal wieder ...
Die Sache mit den Gotos ist nur leider die, dass man nirgends eine Rücksprungadresse vermerken kann, ergo muss man die Rücksprungadresse kennen, ergo kann die Subroutine nur von einer Stelle aus aufgerufen werden. Oder wie wollte man folgendes Programm mit GOTOs realisieren*):
prog "A";
... (do anything)
prog "A";
Man würde hier das Programm natürlich zweimal einfügen müssen, und wenn es nun aber mehrere Kilobyte groß ist? Durch gut durchdachtes Anwenden von Unterprogrammen lassen sich v.A. größere Programme erheblich in ihrem Speicherumfang reduzieren. DAHER brauchen zumindest diejenigen Programmierer die sich zurecht als solche bezeichnen wollen Unterprogramme. Tip: man kann auch eine ganze Library mit einer Reihe von Subroutinen in ein einziges Unterprogramm packen, die dann über Labels und eine Variable zur Auswahl der Subroutine angesteuert werden. So kommt man auch mit weniger Unterprogrammen aus.
------
*) Bevor irgendwelche klugen Besserwisserkommentare kommen: als D0r Ub0r1337h4xx0r schlechthin weiß ich natürlich, dass es trotzdem geht ;). Man nehme eine Liste her und eine Variable als "Stackpointer" und simuliere damit einen Stack **). Die "Rücksprungadressen" verweisen dann jeweils auf Labels:
Label A
S+1->S
1->List1[S]
goto C
... (do anything)
Label B
S+1->S
2->List[S]
goto C
...
Label C
... (Code aus Unterprogramm A)
List[S]->R
S-1->S
R=1=>goto A
R=2=>goto B
...
Hat aber den Nachteil dass a) der Rücksprung ziemlich lange dauert, b) die Anzahl der Labels und damit die Anzahl der möglichen Stellen für Prozeduraufe begrenzt ist und c) mal ehrlich, wer tut so etwas :?
**) Man kann zwar auch auf die Liste verzichten, aber dann ist keine Rekursion möglich