Perché alcuni linguaggi di programmazione hanno istruzioni di interruzione, ma non istruzioni di interruzione di ordine superiore? [chiuso]

5

Potrei essere stato esposto a lingue esattamente sbagliate, ma sebbene molti abbiano cicli e istruzioni di interruzione, nessuna delle lingue che conosco ha istruzioni di interruzione di ordine superiore¹. Mentre un'istruzione di interruzione regolare termina il ciclo più interno all'interno del quale viene eseguita, tale istruzione break(n) termina il n di cicli più interni.

Ad esempio, usando una simile affermazione, potrei scrivere in Python:

for i in range(100):
    for j in range(100):
        if foo(i,j):
            break(2)

Come Python manca di una simile affermazione, tuttavia, devo fare qualcosa di simile al seguente:

broken = False
for i in range(100):
    for j in range(100):
        if foo(i,j):
            broken = True
            break
    if broken:
        break

(Sono consapevole che ci sono altri modi per fare ciò, come ad esempio l'aumento delle eccezioni. esempio.)

In un altro esempio, questo è uno dei motivi principali per utilizzare un'istruzione goto in C / C ++ . Mentre goto consente un equivalente vicino di una interruzione di ordine superiore, introduce un nuovo elemento sintattico (a meno che uno già usi goto s). Per non dimenticare che goto è disapprovato da molti - sia giustificato o meno.

Mentre vedo che usare una frase break di ordine superiore non è qualcosa che la maggior parte delle persone usa quotidianamente, questo vale anche per molte altre funzionalità linguistiche. Inoltre, un'istruzione di interruzione di ordine superiore non mi sembra difficile da implementare e sarebbe piuttosto intuitiva da usare.

C'è una buona ragione per cui i linguaggi di programmazione dovrebbero avere un'istruzione break ma non un'istruzione break di ordine superiore? Sto pensando a problemi concettuali inerenti, paradigmi rotti o vulnerabilità degli errori.

¹Anche se, alla ricerca di questa domanda, ho imparato che PHP li ha.

    
posta Wrzlprmft 15.09.2014 - 18:23
fonte

2 risposte

12

Is there a good reason why so few programming languages have higher-order break statements?

Usando i tag SO come metrica, i sette linguaggi di programmazione più popolari in uso oggi sono Java, C #, Javascript, PHP, Python, C ++ e Objective C. Di questi linguaggi,

  • Java e Javascript hanno etichettato break

  • C ++, C # e Objective C hanno goto , che è una dichiarazione di controllo più generale che risolve lo stesso problema. Inoltre, tutti hanno break , naturalmente, ma non presenta interruzioni multilivello o con etichetta

  • PHP ha entrambi nidificati (multi-livello) break e goto

  • e Python è l'uomo dispari senza goto e senza etichetta break .

Quindi forse una domanda migliore è,

Perché Python non ha goto o etichetta break ? ;)

Questa domanda ha una risposta a questo domanda:

Guido rejected it because "code so complicated to require this feature is very rare". The PEP does mention some workarounds, though (such as the exception technique), while Guido feels refactoring to use return will be simpler in most cases.

Personalmente, penso che Python dovrebbe avere uno o entrambi, ma che è supponente quindi non prenderlo come parte di questa risposta.

    
risposta data 15.09.2014 - 19:25
fonte
-2

Poiché while e until forniscono semantica più chiara. Forniscono astrazioni di livello superiore per esprimere l'intento del programmatore. La semantica di break è indispensabile al livello inferiore delle istruzioni al computer. Sono più vicini a quelli del codice macchina - come goto , break è zucchero sintattico sottile su JMP .

Il consiglio di base di McConnell:

When to Use a for Loop. If you have a condition under which execution has to jump out of a loop, use a while loop instead....Most complicated looping tasks are better handled by a while loop. -- Code Complete [first edition] pp 329.

Questa è solo un'estensione del suo consiglio più generale:

Use break and continue only with caution. Use of break eliminates the possibility of treating a loop as a black box. Limiting yourself to only one statement to control a loop's exit condition is a powerful way to simplify your loops. Using break forces the person reading your code to look inside the loop for an understanding of the loop control. This makes the loop more difficult to understand. -- Code Complete [first edition] pp 337-338.

Alla fine il suo "punto chiave" è:

Minimize the number of factors that affect the loop. Simplify! Simplify! Simplify! Second treat the inside of the loop as if it were a routine -- keep as much of the control as possible outside the loop. Explicitly state the conditions under which the body of the loop is to be executed. Don't make the reader look inside the loop to understand the loop control. Think of a loop as a black box: The surrounding program knows the control conditions but not the contents.

    
risposta data 15.09.2014 - 18:34
fonte

Leggi altre domande sui tag