Newsgroup: it.lavoro.informatica
Titolo: Voi

non sapete nemmeno che nel programmino VW c'erano i GOTO
ROTFL!
-- 
(..) la rivoluzione non è un pranzo di gala, non è una festa letteraria, 
non è un disegno o un ricamo; non si può
fare con tanta eleganza, con tanta serenità e delicatezza, con tanta 
grazia e cortesia. La rivoluzione è un atto
di violenza, è l'azione implacabile di una classe che abbatte il potere 
di un'altra classe. (Mao Tze-tung)

 ROTFL!
 
http://tinyurl.com/boringdelta11
 

 ROTFL!
 
Hai a disposizione qualche pezzo di sorgente ?
Comunque i goto ci sono anche nel kernel linux per questioni di performance.
 


cazzo, questa è una rarissima pillola di saggezza di questo ng.


 cazzo, questa è una rarissima pillola di saggezza di questo ng.
 
Perche`, su cosa credi si basi lo "switch" di C, C++, e Java?
 
 


 
Se hai affermato che nel sw VW ci sono (non credo li abbiano tolti) 
avrai a disposizione qualche pezzo di sorgente per fare simili affermazioni
Sono curioso di vederli.
Che poi il goto esista non significa necessariamente che sia progettato 
male  (basta leggere i sorgenti del kernel linux che sono scritti da 
esperti)
Certo una cosa del genere (e nei sorgenti COBOL ne ho visti)
if ...
goto L1
else
goto L2
end-if
 
e' assolutamente pessimo.
 
 

 Perche`, su cosa credi si basi lo "switch" di ... Java?
 
Su tableswitch e lookupswitch.


dipende, non tutti gli switch vengono tradotti in lockuptable
Se il range è troppo grande il compilatore lo traduce in una serie di if 
..elseif ..
Cosi è in C e C++,suppongo che in java sarà simile.
 

 Su tableswitch e lookupswitch.
 
Che e` (ed era questo il punto) l'equivalente di un goto.
 

 dipende, non tutti gli switch vengono tradotti in lockuptable
 
Il principio di fondo (ed era per rispondere al troll di turno) e` che TUTTO e` "goto". Anche un "else" e` un goto. Qualsiasi istruzione si trasformi in un jump, e` un goto. Che non si usi la parola chiave "goto" esplicitamente, e` irrilevante. Anche la parentesi che chiude un ciclo while e` un "goto".

4ndre4 in data 01/10/2015 17:42:11 disse:

Mi hai rovinato per sempre l'uso di 148 costrutti ma in effetti non hai 
tutto i torti :P
 
-- 
Al3xI98O
«L'importante non è cadere, ma sapersi rialzare»

Il giorno mercoledì 30 settembre 2015 21:21:52 UTC+2, Delta11 ha scritto:
 
La Romagna, che è a due passi dalla Toscana, avendo in tasca la Crusca, chiama il sugo di carne brodo scuro, forse dal colore, che tira al marrone.
Questo sugo bisognerebbe vederlo fare da un bravo cuoco; ma spero vi riuscirà, se non squisito, discreto almeno, con queste mie indicazioni.
Coprite il fondo di una casseruola con fettine sottili di lardone o di carnesecca (quest'ultima è da preferirsi) e sopra alle medesime trinciate una grossa cipolla, una carota e una costola di sedano. Aggiungete qua e là qualche pezzetto di burro, e sopra questi ingredienti distendete carne magra di manzo a pezzetti o a bracioline. Qualunque carne di manzo è buona; anzi per meno spesa si suoi prendere quella insanguinata del collo o altra più scadente che i macellari in Firenze chiamano parature. Aggiungere ritagli di carne di cucina, se ne avete, cotenne o altro, che tutto serve, purché sia roba sana. Condite con solo sale e due chiodi di garofani e ponete la casseruola al fuoco senza mai toccarla.
Quando vi giungerà al naso l'odore della cipolla bruciata rivoltate la carne, e quando la vedrete tutta rosolata per bene, anzi quasi nera, versate acqua fredda quanta ne sta in un piccolo ramaiolo, replicando per tre volte l'operazione di mano in mano che l'acqua va prosciugandosi. Per ultimo, se la quantità della carne fosse di grammi 500 circa, versate nella casseruola un litro e mezzo di acqua calda, o, ciò che meglio sarebbe, un brodo di ossa spugnose, e fatelo bollire adagino per cinque o sei ore di seguito onde ristringere il sugo ed estrarre dalla carne tutta la sua sostanza. Passatelo poi per istaccio, e quando il suo grasso sarà rappreso, formando un grosso velo al disopra, levatelo tutto per rendere il sugo meno grave allo stomaco. Questo sugo, conservandosi per diversi giorni, può servire a molti usi e con esso si possono fare dei buoni pasticci di maccheroni.
I colli e le teste di pollo spezzate, uniti alla carne di manzo, daranno al sugo un sapore più grato.
I resti della carne, benché dissugati, si possono utilizzare in famiglia facendo delle polpette.

 La Romagna, che è a due passi dalla Toscana, avendo in tasca la Crusca, chiama il sugo di carne brodo scuro, forse dal colore, che tira al marrone
Pellegrino


a livello di linguaggio macchina non esiste if .. else
Quindi vengono usati i goto
Ma a livello di linguaggio quello che è importante è la leggibilità
 
 
L1:
	if (!<cond>) goto L2
	...
	goto L1;
L2:
 
 
 
while(<cond>) { ... }
 
 
La prima è una while con i goto,la seconda con l' uso del costrutto while.
Se per lui è la stessa cosa come leggibilità ...
 
 
 

On 01/10/2015 18:07, rootkit wrote:
 > [...]
 >
Niente pomodoro/salsa?
 

 a livello di linguaggio macchina non esiste if .. else
 
Pensi di doverlo spiegare a me? 
 
 


Quale sarebbe questa relazione di equivalenza? Immagino una per cui siano tutti e tre anche equivalenti a inc/dec in un register machine, ad esempio. Per Java e la JVM non sono equivalenti per definizione.


Non è così - vedi la spec della JVM per i dettagli.

 Cosi è in C e C++
 
Stento a crederci. Un esempio di compilatore attuale che si comporta così?

 Stento a crederci.
 
Ah, range non densità o altro. Come non detto

 Quale sarebbe questa relazione di equivalenza? 
 
Lo "switch" rappresenta dei "salti" a parti di codice - e` equivalente ad usare dei "goto". Il fatto che venga implementato come dei lookup e` solo perche` e` un salto condizionale. Di fatto, le chiavi dei lookup rappresentano le "label" di un goto.
 
 


ovviamente no.
Era solo un precisazione.
 


Senza guardare la spec
 
uno switch tipo:
 
int i=...;
 
switch(i) {
	case 1: ...
	case 1000: ...
	case 1000000: ..
}
 
 
il compilatore java fa l'espansione in una lockup table di un milione di 
elementi ?
 
Non credo ma puo darsi.
Un compilatore C probabilmente la converte in una serie di if else
Dico probabilmente in quanto è implementation defined,sta al compilatore 
decidere come convertire.
 
 
 
 


Stai facendo confusione tra encoding, equivalenza e semantica operazionale delle istruzioni. Altrimenti jsr, ifeq, if_acmpeq, tableswitch e goto sono tutte equivalenti perché fanno branch su una "label". Il che ovviamente è una sciocchezza.

 Senza guardare la spec
 
Non puoi - JVM non è l'abstract machine del C o del C++ e certe cose le specifica.
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.tableswitch
 

 Stai facendo confusione tra encoding, equivalenza e semantica operazionale delle istruzioni. Altrimenti jsr, ifeq, if_acmpeq, tableswitch e goto sono tutte equivalenti perché fanno branch su una "label". Il che ovviamente è una sciocchezza.
 
Quelle istruzioni della JVM sono astrazioni. Rappresentano un linguaggio simbolico esattamente come lo e` Java - benche` a livello inferiore. Il processore comprende solo dei salti, condizionali o meno. Quando quel codice viene tradotto in opcode nativi, tutto si riduce a dei jump. Quindi si`, di fondo, sono equivalenti.
 
E` *ovvio*, poi, che ad alto livello convenga usare i costrutti del linguaggio come while / for / if, etc... ed evitare il goto il piu` possibile (che resta ancora, pero`, il modo migliore per uscire da un loop interno - e probabilmente l'unico caso in cui ha senso usarlo).


Una spiegazione di una tableswitch e basta
Dove sta scritto che uno switch viene sempre tradotto in una tableswitch ?
 

 Il processore comprende solo dei salti, condizionali o meno. Quando quel codice viene tradotto in opcode nativi, tutto si riduce a dei jump. Quindi si`, di fondo, sono equivalenti.
 
Ecco l'inghippo. Un processore che comprende solo dei salti? Al massimo puoi avere un sistema di tipo transport triggered che all'opposto muove in giro i dati (ovvero comprende solo un'istruzione del tipo "mov") e non ha salti/control flow esplicito. Qualsiasi modello computazionale basato su branch ad una sola istruzione si voglia considerare deve poter almeno trasformare un pattern di bit *e* operare salti. Quindi no, non sono equivalenti secondo quanto affermi per via di una questione di computabilità di base.
 
Adesso se vogliamo lasciar perdere questa ipotesi di equivalenza che non regge e tornare alla semantica operazionale della JVM. Come fare a
ridurre ad un insieme di gotos (sulla VM o nativi del processore host che siano è irrilevante) una tableswitch, che come da specifica deve fare pop della key dallo stack, check dei ranges e seguente lookup con match in constant-time prima di arrivare ai branches? Di modifiche ai generatori per Jikes JVM ne ho fatte diverse in passato e non c'è verso che un qualunque compiler writer ti dica che quelle istruzioni sono "equivalenti": si starebbe parlando di un emitter non conforme alla spec della JVM e quindi non di Java. Questo è.

 Dove sta scritto che uno switch viene sempre tradotto in una tableswitch(/lookupswitch) ?
 
Nella spec che bisognerebbe conoscere per poterne discutere?


L' ho letta ma non ne ho trovata traccia
Se mi puoi dire dove.
 


Ecchelaquà
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.10
 


 
Grazie,ho capito
in pratica fa dei salti alle istruzione che servono