mboost-dp1

Trifork A/S
- Forside
- ⟨
- Forum
- ⟨
- Nyheder
Jeg har aldrig "programmeret" mere end 2 eller 3 bat filer. Men jeg synes da det er et genialt navn ^^
Edsger Wybe Dijkstra: "Go-to statement considered harmful"
http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215....
I øvrigt interessant ræsonnement, at vores intellektuelle evner er stærke til at overskue komplekse statiske relationer, mens vi har vanskeligt ved at visualisere processer i udvikling, hvorfor vi bør tilstræbe at eksekveringsforløbet er let at læse ud fra koden.
#5, #7 Og gosub ;-)
http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215....
I øvrigt interessant ræsonnement, at vores intellektuelle evner er stærke til at overskue komplekse statiske relationer, mens vi har vanskeligt ved at visualisere processer i udvikling, hvorfor vi bør tilstræbe at eksekveringsforløbet er let at læse ud fra koden.
#5, #7 Og gosub ;-)
MortVader (9) skrev:Gosub kalder en subrutine. Det er ikke helt det samme ;)
Rekursive kald af subrutine kan også være nyttige til at opnå samme opførsel som løkker. Du har ret i, at der er forskel på rekursion og "normale" løkker. Rekursive kald putter jo på stakken for hver iteration.
Vh
GrillBiller (2) skrev:jeg troede at goto var et fyfy ord i kodeverden...
Det er det skam ikke. Det er bare et spørgsmål om at bruge det rette værktøj, og det er langt de færreste der laver noget, hvor "goto" er det rette værktøj.
Java er allerede nævnt. Man må ikke bruge "goto" i Java, men det er alligevel et reserveret ord. Hvorfor? Fordi det bliver brugt i bytecoden.
Det samme gælder vel ca. alle andre kompilerede kode-formater.
Goto bliver brugt i primitive systemer. Nogle gange koder man i sådan et primitivt system, men typisk koder man i noget på et højere abstraktionsniveu, som så bliver oversat.
Tag fx. denne Java-kode:
for (int i = 0; i<10; i++) {
System.out.println("Hello World!");
}
I min lille test blev det til noget i denne stil i bytecode:
0:iconst_0
1:istore_1
2:iload_1
3:bipush 10
5:icmpge 22
8:getstatic #2 <Field PrintStream System.out>
11:ldc1 #3 <String "Hello World!">
13:invokevirtual #4 <Method void PrintStream.println(String)>
16:iinc 1 1
19:goto 2
Altså:
0: Tag tallet 0
1: Placer det i variabel 1
2: Tag indholdet i variabel 1
3-4: Og tag tallet 10
5-7: Hvis tal to er større end tal et, gå til 22
8-15: Udskriv "Hello World"
16-18: Forøg variabel 1 med 1
19: Gå til 2
Én simpel for-løkke, to "goto". Den ene implicit, den anden explicit.
På dette niveau er "goto" ikke bare passende, men helt nødvendig. Men det niveau er godt nok besværligt at arbejde med. Derfor fandt man på at kode i et højere abstraktionsniveau, og så oversætte/compile til noget computeren kan bruge.
#11: Ja, så længe computeren selv anvender det på et lavere abstraktionsniveau, så er det fint. Som #8, klogt henviser til Dijkstra, så er goto en abstraktion som giver problemer, da relationerne ender med at være stærkt dynamiske. Lad computeren rode med det og evt. til enkelttilfælde for der kræves ekstrem kodeoptimering, hvor computeren ikke kan løse opgaven.
GÅ NU VÆK.... DUMME HATERE... Der er ikke noget galt i gode gamle goto. Hvis muligt har jeg altid en og kun en goto i alle programmer jeg skriver. (nostalgi er smukt)
Er min favorit beskrivelse af goto.
Det er bare ikke muligt at argumentere logisk mod
Programming microsoft windows with C# af Charles Petzold skrev:The goto is useful for getting out of deeply nested blocks and for writing amusingly obscure code.
Er min favorit beskrivelse af goto.
Det er bare ikke muligt at argumentere logisk mod
amusingly obscure code.
Der er to typer programmører: Dem som er kloge nok til at undgå GOTO og dem som er kloge nok til at bruge GOTO uden problemer.
End of discussion
GOTO "topic" :)
End of discussion
GOTO "topic" :)
gensplejs (15) skrev:1000tusind (14) skrev:Der er to typer programmører: Dem som er kloge nok til at undgå GOTO og dem som er kloge nok til at bruge GOTO uden problemer.
End of discussion
GOTO "topic" :)
Hvad med dem der bruger goto uden at fatte en dart af hvad de laver :-)
De kan vel ikke kaldes programmører.
psn skrev:hey, HEY, stop for fanden!
"Sagde han egentlig ikke lige G-ordet, ham manden?"
Der falder en stille tåre fra mit hjerte. den sang havde jeg lige glemt et kort splitsekund. {epic}
goto minder mig også om de gamle pascal-dage. - Herligt :-)
goto er gemt i de fleste sprog - også de mere højniveau. F.eks. C# har goto. (Hvis man har brug for det, har man for megentligt gjort noget andet galt ;-))
esbenr (18) skrev:goto er gemt i de fleste sprog - også de mere højniveau. F.eks. C# har goto. (Hvis man har brug for det, har man for megentligt gjort noget andet galt ;-))
Tjaa... på den anden side set kan man sagtens finde et par fine anvendelses eksempler fra MS: goto
Nja, det argument giver ingen mening. I så fald burde ord som aload, istore osv også være reserverede.myplacedk (11) skrev:Java er allerede nævnt. Man må ikke bruge "goto" i Java, men det er alligevel et reserveret ord. Hvorfor? Fordi det bliver brugt i bytecoden.
I øvrigt er den goto som kan bruges i de fleste højniveau sprog forskellig fra assembler goto i og med at goto er en statement i fx. C og C# og dermed begrænset til at kunne bruges når der ikke ligger noget på stakken.
#19: Det første eksemel er et eksempel på noget helt andet, nemlig at goto kan bruges til at hoppe til en anden case i en switch statement i C#. Det andet eksempel (som er en rigtig anvendelse af en goto) løses i Java ved at man kan sætte en label på en løkke og bruge break og continue med denne label. Det finder jeg personligt mere elegant en at have en meget mere generel goto mekanisme som kun bør bruges til netop dette formål...
#goto
GOTO i gamle dage i Basic og Fortran 66 blev ofte noget gyseligt kode.
Brugt fornuftigt er det ikke et problem. Fornuftigt kræver bl.a.:
- hopper nedad
- max. en goto i samlede flow i metoden
- bruges til et markant skift i flow
Fornuftigt brug vil formentligt være et sted mellem 0.1 og 1.0 promille af klasserne.
GOTO i gamle dage i Basic og Fortran 66 blev ofte noget gyseligt kode.
Brugt fornuftigt er det ikke et problem. Fornuftigt kræver bl.a.:
- hopper nedad
- max. en goto i samlede flow i metoden
- bruges til et markant skift i flow
Fornuftigt brug vil formentligt være et sted mellem 0.1 og 1.0 promille af klasserne.
#goto læsbarhed
Prøv og regn ud hvad disse 18 linier udskriver:
Prøv og regn ud hvad disse 18 linier udskriver:
INTEGER LBL
INTEGER*4 I
731 GOTO 113
ASSIGN 399 TO LBL
113 I=0
WRITE(*,*) I
247 ASSIGN 601 TO LBL
IF(I) 588,922,399
588 I=I+1
WRITE(*,*) I
GOTO 399
761 GOTO LBL
922 I=I+1
WRITE(*,*) I
GOTO(588,399,922) I
399 GOTO 761
601 CONTINUE
END
mathiass (20) skrev:Nja, det argument giver ingen mening. I så fald burde ord som aload, istore osv også være reserverede.
Det nærmeste jeg kan finde en officiel forklaring:
http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#229308 skrev:The keywords const and goto are reserved, even though they are not currently used. This may allow a Java compiler to produce better error messages if these C++ keywords incorrectly appear in programs.
Så du har ret, jeg kom med en forkert årsag.
Men det er nu alligevel praktisk nok. Jeg har flere gange oplevet at decompile Java, hvor decompileren har opgivet af lave valid kode, og i stedet brugt "goto". Resultatet gav fuldt ud mening for mig, men skulle omskrives for at kunne compiles igen.
Lignende har jeg aldrig oplevet med de andre bytecode funktioner. Andre decompile-problemer har været langt dybere problemer.
tazly (#10) skrev:"Rekursive kald putter jo på stakken for hver iteration."
Det behøver de ikke nødvendigvis at gøre... Kigger man fx på funktionelle sprog. Se fx:
Tail recursion
Selv hvis man ikke har skrevet sine funktioner tail recursive, vil compileren ofte transformere dit program om til
Continuation Passing Style
hvor alle kald er tail calls. Så kan (og vil den ofte) lave Tail Call Optimization på programmet, derfor er rekursion ikke altid så ondt ved stakken.
Hvor vidt det gør sig gældende i de sprog du koder i, skal jeg ikke kunne sige.
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.