X: Víš jaký je rozdíl mezi bytekódem Javy nebo C# zpracovávaným virtuálním strojem, a tokeny BASICu zpracovávanými interpretem? Vůbec žádný
Karrex: GOTO je špatné protože to říká Dijkstra*, tečka. A proč? Je totiž dokázáno, že jakýkoliv algoritmus je možné realizovat pomocí pouhých dvou základních stavebních prvků, rozhodování (decision) a zpracování (process). Jestli umíš vývojové diagramy, tak rozhodování je kosočtverec, zpracování obdélník. Nic víc skutečně není potřeba, dokonce i volání podprogramů je jen speciální případ zpracování. Jako zpracování se bere libovolný složený příkaz, nebo blok (což je také složený příkaz, jen navíc s lokálními proměnnými) v programu, který musí mít jeden vstup a jeden výstup. A to je věc kterou GOTO porušuje, navíc zbytečně, protože to jde i bez něho.
Jako příklad ti dám rutinu v C++, používající GOTO. I v případě že tenhle jazyk neovládáš, bude ti po jeho prohlédnutí asi jasné že tudy cesta nevede:
Kód: Vybrat vše
int p,k,l,i,j,d,q,R,t,r;
S1: s=0; p=1;
S2: if (s==0) { i=1; j=n; k=n; l=2*n+1; }
if (s==1) { i=n+1; j=2*n; k=0; l=n+1; }
d=1; q=p; r=p;
S3: if (x[i]>K>x[j]->K) goto S8;
S4: k=k+d; x[k]=x[i]; c[k]=c[i];
S5: i+=1; q-=1; if (q>0) goto S3;
S6: k+=d; if (k==l) goto S13; else x[k]=x[j];c[k]=c[j];
S7: j-=1; r-=1; if (r>0) goto S6; else goto S12;
S8: k+=d; x[k]=x[j]; c[k]=c[j];
S9: j-=1; r-=1; if (r>0) goto S3;
S10: k+=d; if (k==l) goto S13; else x[k]=x[i];c[k]=c[i];
S11: i+=1; q-=1; if (q>0) goto S10;
S12: q=p; r=p; d=-d; t=k; k=l; l=t; if (j-i<p) goto S10; else goto S3;
S13: p+=p; if (p<n) { s=1-s; goto S2; }
if (s==0) for (t=1; t<=n; t+=1) { x[t]=x[t+n];c[t]=c[t+n] }
Když jsem na něj na hovnokod.cz narazil, poznal jsem ho na první pohled. Je to totiž doslovně převedený program z jedné staré učebnice BASICu, kde kromě cyklu FOR neexistoval jiný způsob než GOTO, jak dosáhnout určitých věcí. Proto také, i když jsem v BASICu začínal a dodnes je to můj nejoblíbenější jazyk, každému radím, aby se mu vyhnul velkým obloukem, jestli to s programováním myslí aspoň trochu vážně. Takhle už se to dneska prostě nedělá, naštěstí.
* To co řekli Dijkstra, Knuth, nebo třeba Wirth, je třeba brát zatraceně vážně, protože jen málokdo věděl tak dobře o čem mluví jako tihle mistři.