C'è qualche ragione per cui lo zero dovrebbe essere uguale a falso in un nuovo linguaggio di programmazione? [duplicare]

0

Comprendo che 0 è falso perché la matematica lo ha stabilito molto tempo fa e C lo ha stabilito nel mondo della programmazione, di cui abbiamo parlato qui . Tuttavia, oltre a seguire convenzioni consolidate, c'è qualche ragione per cui un nuovo linguaggio di programmazione non dovrebbe rendere 0 uguale a vero? Sembra che risolverebbe molti problemi, come nelle situazioni in cui 0 è un valore di ritorno valido di una funzione (come quando si restituisce un indice).

Ad esempio, supponiamo che io stia lavorando con una griglia in cui un utente può selezionare le righe:

function getSelectedRowIndex()
{
    //return the index of the selected row - assume the first row is selected, returning 0
}

var selectedRowIndex = getSelectedRowIndex();  //returned 0

//the following will be evaluated as true, despite a valid row being selected
if (!selectedRowIndex)
{
    alert("Please select a row before continuing.");
}

Vedo questo errore più e più volte nel codice di più persone. È molto più conveniente valutare una variabile da sola. Fare 0 uguale a true eliminerebbe questo potenziale bug. Questo è solo un esempio e sono sicuro che molte persone potrebbero pensare agli altri.

Quindi abbiamo stabilito che c'è un certo valore nel rendere 0 uguale a true, ma qual è il valore nel mantenerlo uguale al passato falso rispettando ciò che è sempre stato fatto?

    
posta dallin 05.10.2013 - 03:03
fonte

1 risposta

2

La mia migliore risposta, dalla massa degli altri discussi.

Questa convenzione proviene dall'Assemblea.

Quando esegui un confronto, ad es. se a > b o se a = b

ciò che effettivamente accade (almeno in motorola 6502) è che il processore SOTTRATTO i due valori! allora il risultato è facilmente negoziabile, perché è zero o qualcosa di diverso da zero.

l'istruzione branch è fatta per funzionare con zero essendo un valore ottimizzato perché tipicamente vuoi diramarti quando un indice array raggiunge lo zero.

quindi, branchng è ottimizzato per gli zeri, e quindi il branching basato sul confronto si è evoluto per usare zero per indicare true di false di un'operazione booleana come = o >.

PS

Anche perché un confronto bit a bit di due numeri è fondamentalmente la stessa cosa di una sottrazione bit per bit usando il link [Adder] - sottrattore nell'ALU. quindi in questo modo, non hai istruzioni extra in giro. Ma se utilizzi la sottrazione per il confronto booleano devi consentire che il risultato della sottrazione di interi sia zero significherà che qualcosa è vero o falso . quindi falso è zero.

sooooooooooo

Suppongo che la ragione per mantenerla in questo modo sia perché, in origine, c'erano buone ragioni per farlo, oltre a "ci siamo sentiti come". quelle buone ragioni che sospetto sono ora irrilevanti, ma, nel profondo di OTOH, sospetto anche che le stesse ottimizzazioni si verifichino con i booleani nelle lingue moderne

Wikipedia nota che:

Bandiera zero

Determinare se due valori sono uguali richiede ALU per determinare se il risultato è zero. Questo può essere ottenuto alimentando ciascun bit del risultato in una porta NOR. La bellezza di questo è che un singolo gate NOR multiporta richiede meno hardware di un intero array di gate equivalenti a 2 porte.

link

Quindi, zero ha un significato speciale per CPU e ALU. Questo è il motivo per cui zero è falso.

sospetto che il design di ALU non abbia trancato questa fondamentale ottimizzazione del design, anche nei processori più recenti, e come tale, le persone che scrivono compilatori in assembly o in prossimità di linguaggi di assemblaggio probabilmente devono ancora affrontare la "sporcizia" dell'equazione con zero . E dovresti sapere anche tutto questo. solo perché.

link

"Molti programmatori che potresti intervistare in questi giorni sono propensi a considerare la ricorsione, i puntatori e persino le strutture dati come un dettaglio di implementazione stupido che è stato sottratto dai tanti e felici linguaggi di programmazione di oggi." Quando è stata l'ultima volta dovevi scrivere un algoritmo di ordinamento? "ridacchiavano.

Tuttavia, non mi interessa davvero. Voglio che il mio medico ER comprenda l'anatomia, anche se tutto ciò che deve fare è mettere i nodi del defibrillatore computerizzato sul mio petto e premere il grande pulsante rosso, e voglio che i programmatori conoscano la programmazione fino al livello della CPU, anche se Ruby on Rails leggi la tua mente e costruisci per te un sito di networking sociale collaborativo Web 2.0 completo con tre clic del mouse. "

link

    
risposta data 05.10.2013 - 04:50
fonte

Leggi altre domande sui tag