Il codice incondizionato è considerato un ramo?

4

Avere un codice semplice come questo:

int A=5;
object X=Console.ReadLine()
if(Condition)
   DoSomething();
else
   DoStuff();
DoSomethingElse();

Alcune fonti dicono che ci sono in realtà 4 rami: Primo incondizionato, due per il FI e un altro incondizionato dopo la dichiarazione IF. Alcuni dicono che ci sono solo due rami. Cosa sarebbe corretto? Per esempio. Qui: link

    
posta John V 30.01.2013 - 17:15
fonte

3 risposte

2

Le origini della parola "ramo" nel codice provengono dal montaggio. Un esempio di questo può essere visto in assemblaggio MIPS . Un ramo è un'istruzione condizionale.

Prima che qualcuno salti su di me per far notare che MIPS ha un'istruzione b che ha la descrizione di "ramo incondizionatamente" la chiave della differenza tra b (ramo incondizionatamente) e j (salto) è quella le istruzioni di ramo funzionano su indirizzi relativi e le istruzioni di salto funzionano su indirizzi assoluti.

C'è anche una certa terminologia del ramo incondizionato nel regno della predizione del ramo. Una CPU con una pipeline proverà a indovinare da che parte va un estratto conto e dove finirà dopo il ramo. È possibile analizzare l'assembly per verificare che un determinato ramo venga sempre eseguito in base a un determinato insieme di condizioni all'inizio della pipeline. Ad esempio, il ramo si basa se il registro 1 è maggiore di 0 o meno. Se il registro 1 è 0 e nessuna istruzione nella pipeline lo modifica, è in sostanza un ramo incondizionato che può essere eseguito in sicurezza (e non doversi preoccupare di svuotare la pipeline dopo esecuzione speculativa o stallo fino a quando il ramo può essere deciso).

Tutto quanto sopra era per codice di livello molto basso. Nel codice di livello superiore (come dimostrato nella domanda) la terminologia di un ramo è dove il codice può seguire due (o più nel caso di un interruttore (pun non inteso)) percorsi diversi. Da wikipedia

A branch is sequence of code in a computer program which is conditionally executed depending on how the flow of control is altered at the branching point.

Il codice incondizionato non viene eseguito condizionatamente e quindi non è un ramo.

    
risposta data 30.01.2013 - 19:53
fonte
5

Penso che il ramo qui sia pensato per rappresentare un blocco di codice con un singolo percorso lineare (nessun salto inizia o termina nel blocco) meglio conosciuto come blocco di base .

Questo concetto è utile per i compilatori e altri strumenti di analisi per decidere come comportarsi un pezzo di codice (in assenza di eccezioni) poiché ogni blocco di base è quindi un'operazione atomica in termini di codice attorno ad esso.

Ad esempio, l'ottimizzazione dei compilatori può esaminare ciascun blocco di questo tipo e decidere in che modo dipendono le dipendenze per ogni singola istruzione e, eventualmente, riordinarle per un uso più efficiente dei registri e dello stack. Oppure, quando esiste un solo percorso di uscita per un altro blocco con una sola voce, è possibile concatenare i blocchi ed eliminare il salto.

    
risposta data 30.01.2013 - 17:38
fonte
0

Dipende dal tuo contesto. Per alcune analisi, ad esempio cosa fanno i compilatori, si hanno 4 rami, poiché il blocco post-if può variare il suo comportamento a seconda di quale percorso il if va (e se un ramo condizionale ritorna in anticipo). Per alcune analisi come si potrebbe vedere nella copertura del codice varieranno forse per considerare che da qualche parte tra 2 e 4 rami a seconda di cosa si sta facendo e se la priorità è data alla scelta o al percorso .

Nessuna vista è particolarmente "corretta" o meno. Sono invenzioni umane per cercare di ottenere informazioni e intuizioni. Qualsiasi metrica lo faccia meglio per il problema in questione è quello "corretto".

    
risposta data 30.01.2013 - 18:16
fonte

Leggi altre domande sui tag