Cosa significa "ortogonalità" quando si parla di linguaggi di programmazione?
Quali sono alcuni esempi di ortogonalità?
Cosa significa "ortogonalità" quando si parla di linguaggi di programmazione?
Quali sono alcuni esempi di ortogonalità?
Risposte:
L'ortogonalità è la proprietà che significa "Cambiare A non cambia B". Un esempio di sistema ortogonale potrebbe essere una radio, dove cambiando stazione non si cambia il volume e viceversa.
Un sistema non ortogonale sarebbe come un elicottero in cui cambiare la velocità può cambiare la direzione.
Nei linguaggi di programmazione questo significa che quando si esegue un'istruzione, non accade nient'altro che quell'istruzione (molto importante per il debug).
C'è anche un significato specifico quando si fa riferimento ai set di istruzioni .
Da "Art of UNIX programming" di Eric S. Raymond
L'ortogonalità è una delle proprietà più importanti che può aiutare a rendere compatti anche progetti complessi. In un disegno puramente ortogonale, le operazioni non hanno effetti collaterali; ogni azione (che si tratti di una chiamata API, di una chiamata di macro o di un'operazione di linguaggio) cambia solo una cosa senza influire sugli altri. C'è un solo modo per cambiare ogni proprietà di qualunque sistema tu stia controllando.
Pensa che è in grado di cambiare una cosa senza avere un effetto invisibile su un'altra parte.
Se hai una serie di costrutti. Si dice che una lingua sia ortogonale se consente al programmatore di mescolare liberamente questi costrutti. Ad esempio, in C non è possibile restituire un array (array statico), in questo caso si dice che C non è riconosciuto:
int[] fun(); // you can't return a static array.
// Of course you can return a pointer, but the langauge allows passing arrays.
// So, it is unorthognal in case.
In generale, l'ortogonalità è una relazione tra due cose tale che hanno un effetto minimo l'una sull'altra.
Il termine deriva dalla matematica, dove due vettori sono ortogonali se si intersecano ad angolo retto.
Pensa a un tipico spazio cartesiano bidimensionale (la tipica griglia con assi X / Y). Traccia due linee: x = 1 e y = 1. Le due linee sono ortogonali. Puoi cambiare x = 1 cambiando x, e questo non avrà effetto sull'altra linea e viceversa.
Nel software, il termine può essere utilizzato in modo appropriato in situazioni in cui si parla di due parti di un sistema che si comportano indipendentemente l'una dall'altra.
La maggior parte delle risposte sono molto prolisse e persino oscure. Il punto è: se uno strumento è ortogonale, può essere aggiunto, sostituito o rimosso, a favore di strumenti migliori, senza rovinare tutto il resto.
È la differenza tra un falegname che ha un martello e una sega, che può essere utilizzata per martellare o segare, o avere una combo martello / sega nuova, progettata per segare il legno, quindi martellarlo insieme. Entrambi funzioneranno per segare e poi martellare insieme, ma se ottieni qualche compito che richiede il taglio, ma non il martello, allora funzioneranno solo gli strumenti ortogonali. Allo stesso modo, se hai bisogno di avvitare invece di martellare, non avrai bisogno di gettare via la sega, se è ortogonale (non confusa con) il tuo martello.
L'esempio classico sono gli strumenti a riga di comando unix: hai uno strumento per ottenere il contenuto di un disco (dd), un altro per filtrare le righe dal file (grep), un altro per scrivere quelle righe su un file (cat), ecc. possono essere mescolati e abbinati a piacimento.
Mentre parli delle decisioni di progetto sui linguaggi di programmazione, l'ortogonalità può essere visto come quanto sia facile per te prevedere altre cose su quel linguaggio per ciò che hai visto in passato.
Ad esempio, in una lingua puoi avere:
str.split
per dividere una stringa e
len (str)
per ottenere la lunghezza.
In una lingua più ortogonale, useresti sempre str.x o x (str).
Quando clonereste un oggetto o fareste qualcos'altro, sapreste se usarlo
clone (obj)
o
obj.clone
Questo è uno dei punti principali del fatto che i linguaggi di programmazione siano ortogonali. Ciò ti evita di consultare il manuale o di chiedere a qualcuno.
L'articolo di wikipedia parla di più sull'ortogonalità su progetti complessi o linguaggi di basso livello. Come qualcuno ha suggerito sopra in un commento, il libro di Sebesta parla chiaramente di ortogonalità.
Se usassi solo una frase, direi che un linguaggio di programmazione è ortogonale quando le sue parti sconosciute agiscono come previsto in base a ciò che hai visto. Oppure ... nessuna sorpresa.
;)
da wikipedia :
Informatica
L'ortogonalità è una proprietà di progettazione del sistema che facilita la fattibilità e la compattezza di progetti complessi. L'ortogonalità garantisce che la modifica dell'effetto tecnico prodotto da un componente di un sistema non crea né propaga effetti collaterali ad altri componenti del sistema. Il comportamento emergente di un sistema costituito da componenti dovrebbe essere controllato rigorosamente da definizioni formali della sua logica e non da effetti collaterali derivanti da una scarsa integrazione, ad esempio un design non ortogonale di moduli e interfacce. L'ortogonalità riduce i tempi di test e sviluppo perché è più facile verificare i progetti che non causano effetti collaterali né dipendono da essi.
Ad esempio, un'auto ha componenti e comandi ortogonali (es. Accelerare il veicolo non influenza nient'altro che i componenti coinvolti esclusivamente con la funzione di accelerazione). D'altra parte, un progetto non ortogonale potrebbe avere il suo sterzo che influenza la sua frenata (ad esempio il controllo elettronico della stabilità), o la sua velocità potrebbe modificare le sue sospensioni. 1 Di conseguenza, questo uso è visto come derivato dall'uso di ortogonale in matematica: si può proiettare un vettore su un sottospazio proiettandolo su ciascun membro di un insieme di vettori di base separatamente e aggiungendo le proiezioni se e solo se i vettori di base sono reciprocamente ortogonali.
Un insieme di istruzioni si dice ortogonale se qualsiasi istruzione può utilizzare qualsiasi registro in qualsiasi modalità di indirizzamento. Questa terminologia risulta dal considerare un'istruzione come un vettore i cui componenti sono i campi dell'istruzione. Un campo identifica i registri su cui operare e un altro specifica la modalità di indirizzamento. Un set di istruzioni ortogonali codifica in modo univoco tutte le combinazioni di registri e modalità di indirizzamento.
Da Wikipedia :
L'ortogonalità è una proprietà di progettazione del sistema che facilita la fattibilità e la compattezza di progetti complessi. L'ortogonalità garantisce che la modifica dell'effetto tecnico prodotto da un componente di un sistema non crea né propaga effetti collaterali ad altri componenti del sistema. Il comportamento emergente di un sistema costituito da componenti dovrebbe essere controllato rigorosamente da definizioni formali della sua logica e non da effetti collaterali derivanti da una scarsa integrazione, ad esempio un design non ortogonale di moduli e interfacce. L'ortogonalità riduce i tempi di test e sviluppo perché è più facile verificare i progetti che non causano effetti collaterali né dipendono da essi.
Ad esempio, un'auto ha componenti e comandi ortogonali (es. Accelerare il veicolo non influenza nient'altro che i componenti coinvolti esclusivamente con la funzione di accelerazione). D'altra parte, un design non ortogonale potrebbe avere il suo sterzo che influenza la sua frenata (ad esempio il controllo elettronico della stabilità), o la sua velocità potrebbe modificare le sue sospensioni. [1] Di conseguenza, questo uso è visto come derivato dall'uso di ortogonale in matematica: si può proiettare un vettore su un sottospazio proiettandolo su ciascun membro di un insieme di vettori di base separatamente e aggiungendo le proiezioni se e solo se i vettori di base sono mutuamente ortogonali.
Un insieme di istruzioni si dice ortogonale se qualsiasi istruzione può utilizzare qualsiasi registro in qualsiasi modalità di indirizzamento. Questa terminologia risulta dal considerare un'istruzione come un vettore i cui componenti sono i campi dell'istruzione. Un campo identifica i registri su cui operare e un altro specifica la modalità di indirizzamento. Un set di istruzioni ortogonali codifica in modo univoco tutte le combinazioni di registri e modalità di indirizzamento.
Per dirla nei termini più semplici possibili, due cose sono ortogonali se cambiare l'una non ha effetto sull'altra.
Come esempi della mancanza di ortogonalità in un linguaggio di alto livello, considerare le seguenti regole ed eccezioni in C. Sebbene C abbia due tipi di tipi di dati strutturati, array e record (struct), i record possono essere restituiti dalle funzioni ma gli array no. Un membro di una struttura può essere qualsiasi tipo di dati tranne void o una struttura dello stesso tipo. Un elemento array può essere qualsiasi tipo di dati tranne void o una funzione. I parametri vengono passati per valore, a meno che non siano array, nel qual caso sono, in effetti, passati per riferimento (perché l'aspetto del nome di un array senza pedice in un programma C è interpretato come l'indirizzo del primo elemento dell'array)
Nei linguaggi di programmazione si dice che una caratteristica del linguaggio di programmazione è ortogonale se è limitata senza restrizioni (o eccezioni). Ad esempio, in Pascal le funzioni non possono restituire tipi strutturati. Questa è una restrizione sulla restituzione di valori da una funzione. Pertanto è considerato come una caratteristica non ortogonale. ;)
Ortogonalità nella programmazione:
L'ortogonalità è un concetto importante, che riguarda il modo in cui un numero relativamente piccolo di componenti può essere combinato in un numero relativamente piccolo di modi per ottenere i risultati desiderati. È associato alla semplicità; più ortogonale è il design, meno eccezioni. Ciò rende più facile imparare, leggere e scrivere programmi in un linguaggio di programmazione. Il significato di una caratteristica ortogonale è indipendente dal contesto; i parametri chiave sono la simmetria e la coerenza (ad esempio, un puntatore è un concetto ortogonale).
da Wikipedia
L'ortogonalità in un linguaggio di programmazione significa che un insieme relativamente piccolo di costrutti primitivi può essere combinato in un numero relativamente piccolo di modi per costruire il controllo e le strutture dati del linguaggio. Inoltre, ogni possibile combinazione di primitive è legale e significativa. Ad esempio, considera i tipi di dati. Supponiamo che un linguaggio abbia quattro tipi di dati primitivi (intero, float, double e carattere) e due operatori di tipo (array e puntatore). Se i due operatori di tipo possono essere applicati a se stessi e ai quattro tipi di dati primitivi, è possibile definire un gran numero di strutture di dati. Il significato di una caratteristica del linguaggio ortogonale è indipendente dal contesto della sua comparsa in un programma. (la parola ortogonale deriva dal concetto matematico di vettori ortogonali, che sono indipendenti l'uno dall'altro. ) L'ortogonalità deriva da una simmetria di relazioni tra primitive. Una mancanza di ortogonalità porta a eccezioni alle regole della lingua. Ad esempio, in un linguaggio di programmazione che supporta i puntatori, dovrebbe essere possibile definire un puntatore che punti a qualsiasi tipo specifico definito nel linguaggio. Tuttavia, se i puntatori non sono autorizzati a puntare a array, molte strutture di dati definite dall'utente potenzialmente utili non possono essere definite. Possiamo illustrare l'uso dell'ortogonalità come concetto di progettazione confrontando un aspetto dei linguaggi assembly dei computer mainframe IBM e della serie VAX di minicomputer. Consideriamo un'unica semplice situazione: aggiungendo due valori interi a 32 bit che risiedono nella memoria o nei registri e sostituendo uno dei due valori con la somma. I mainframe IBM hanno due istruzioni per questo scopo,
A Reg1, memory_cell
AR Reg1, Reg2
dove Reg1 e Reg2 rappresentano i registri. La semantica di questi sono
Reg1 ← contents(Reg1) + contents(memory_cell)
Reg1 ← contents(Reg1) + contents(Reg2)
L'istruzione di aggiunta VAX per i valori interi a 32 bit è
ADDL operand_1, operand_2
la cui semantica è
operand_2 ← contents(operand_1) + contents(operand_2)
In questo caso, uno degli operandi può essere un registro o una cella di memoria. Il design dell'istruzione VAX è ortogonale in quanto una singola istruzione può utilizzare registri o celle di memoria come operandi. Esistono due modi per specificare gli operandi, che possono essere combinati in tutti i modi possibili. Il design IBM non è ortogonale. Solo due delle quattro possibilità di combinazione di operandi sono legali e le due richiedono istruzioni diverse, A e AR. Il design IBM è più limitato e quindi meno scrivibile. Ad esempio, non è possibile aggiungere due valori e memorizzare la somma in una posizione di memoria. Inoltre, il design IBM è più difficile da apprendere a causa delle restrizioni e delle istruzioni aggiuntive. L'ortogonalità è strettamente correlata alla semplicità: più ortogonale è il design di una lingua, meno eccezioni richiedono le regole del linguaggio. Meno eccezioni significano un più alto grado di regolarità nel design, che rende la lingua più facile da imparare, leggere e capire. Chiunque abbia appreso una parte significativa della lingua inglese può testimoniare la difficoltà di apprendere le sue numerose eccezioni alle regole (ad esempio, i prima e tranne dopo c).
Per ortogonalità si intende il grado in cui il linguaggio è costituito da un insieme di costrutti primitivi indipendenti che possono essere combinati secondo necessità per esprimere un programma. Le caratteristiche sono ortogonali se non ci sono restrizioni su come possono essere combinate
Example : non-orthogonality
PASCAL: le funzioni non possono restituire tipi strutturati. I linguaggi funzionali sono altamente ortogonali.
L'idea di base dell'ortogonalità è che le cose che non sono concettualmente correlate non dovrebbero essere correlate nel sistema. Parti dell'architettura che in realtà non hanno nulla a che fare con l'altra, come il database e l'interfaccia utente, non dovrebbero essere modificate insieme. Un cambiamento in uno non dovrebbe causare un cambiamento nell'altro.
Verifica ortogonalità delle matrici:
L'ortogonalità può essere anche rispetto alle matrici,
Matrix *(transpose of matrix)= identity matrix.
Fare clic sul collegamento sottostante per visualizzare un video di YouTube sull'ortogonalità.
https://youtu.be/tNekLaxnfW8