Pergunta

O que significa “ortogonalidade” quando se fala em linguagens de programação?

Quais são alguns exemplos de ortogonalidade?

Foi útil?

Solução

Ortogonalidade é a propriedade que significa "alterar a não muda B". Um exemplo de sistema ortogonal seria um rádio, onde a alteração da estação não altera o volume e a vice-versa.

Um sistema não ortogonal seria como um helicóptero onde alterar a velocidade pode alterar a direção.

Nas linguagens de programação, isso significa que, quando você executa uma instrução, nada além de essa instrução acontece (muito importante para a depuração).

Há também um significado específico ao se referir a Conjuntos de instruções.

Outras dicas

De Eric S. Raymond's "Art of Unix Programming"

A ortogonalidade é uma das propriedades mais importantes que podem ajudar a tornar os designs complexos compactos. Em um design puramente ortogonal, as operações não têm efeitos colaterais; Cada ação (seja uma chamada de API, uma invocação de macro ou uma operação de idioma) muda apenas uma coisa sem afetar os outros. Existe uma e apenas uma maneira de alterar cada propriedade de qualquer sistema que você esteja controlando.

Pense nisso ser capaz de mudar uma coisa sem ter um efeito invisível em outra parte.

Em termos gerais, a ortogonalidade é uma relação entre duas coisas, de modo que elas tenham um efeito mínimo um no outro.

O termo vem da matemática, onde dois vetores são ortogonais se cruzarem em ângulos retos.

Pense em um espaço cartesiano bidimensional típico (sua grade típica com eixos X/Y). Plote duas linhas: x = 1 e y = 1. As duas linhas são ortogonais. Você pode alterar x = 1 alterando x, e isso não terá efeito na outra linha e vice -versa.

No software, o termo pode ser usado adequadamente em situações em que você está falando de duas partes de um sistema que se comportam independentemente um do outro.

Se você tiver um conjunto de construções. Diz -se que um Langauge é ortogonal Se ele permitir que o programador misture essas construções livremente. Por exemplo, em C, você não pode devolver uma matriz (matriz estática), diz -se que C não é ortomodal neste caso:

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.

A maioria das respostas é muito longa e até obscura. O ponto é: se uma ferramenta for ortogonal, ela pode ser adicionada, substituída ou removida, em favor de melhores ferramentas, sem estragar tudo o mais.

É a diferença entre um carpinteiro com um martelo e uma serra, que pode ser usada para martelar ou serrar, ou ter uma combinação de martelo/serra recém-tocada, projetada para servir madeira e depois junte-a. Ou trabalhará para serrar e depois martelar, mas se você obtiver alguma tarefa que requer serrar, mas não martelando, apenas as ferramentas ortogonais funcionarão. Da mesma forma, se você precisar parafusar em vez de martelar, não precisará jogar fora sua serra, se for ortogonal (não misturada com) seu martelo.

O exemplo clássico é o Unix Command Line Tools: você tem uma ferramenta para obter o conteúdo de um disco (DD), outro para filtrar linhas do arquivo (grep), outro para escrever essas linhas em um arquivo (gato) etc. Estes Todos podem ser misturados e combinados à vontade.

a partir de Wikipedia:

Ciência da Computação

A ortogonalidade é uma propriedade de design do sistema que facilita a viabilidade e a compactação de projetos complexos. A ortogonalidade garante que a modificação do efeito técnico produzido por um componente de um sistema não cria nem propaga os efeitos colaterais a outros componentes do sistema. O comportamento emergente de um sistema que consiste em componentes deve ser controlado estritamente por definições formais de sua lógica e não por efeitos colaterais resultantes da má integração, ou seja, design não ortogonal de módulos e interfaces. A ortogonalidade reduz o tempo de teste e desenvolvimento, porque é mais fácil verificar os projetos que não causam efeitos colaterais nem dependem deles.

Por exemplo, um carro possui componentes e controles ortogonais (por exemplo, acelerando o veículo não influencia mais nada além dos componentes envolvidos exclusivamente com a função de aceleração). Por outro lado, um design não ortogonal pode ter sua influência de direção em sua frenagem (por exemplo, controle eletrônico de estabilidade) ou sua velocidade ajuste sua suspensão.1 Consequentemente, esse uso é visto como derivado do uso da ortogonal em matemática: pode -se projetar um vetor em um subespaço, projetando -o em cada membro de um conjunto de vetores de base separadamente e adicionando as projeções se e somente se os vetores base forem mutuamente ortogonal.

Diz -se que um conjunto de instruções é ortogonal se alguma instrução puder usar qualquer registro em qualquer modo de endereço. Essa terminologia resulta de considerar uma instrução como um vetor cujos componentes são os campos de instrução. Um campo identifica os registros a serem operados e outro especifica o modo de endereço. Um conjunto de instruções ortogonais codifica excoda excoda -se todas as combinações de registros e modos de endereçamento.

A partir de Wikipedia:

A ortogonalidade é uma propriedade de design do sistema que facilita a viabilidade e a compactação de projetos complexos. A ortogonalidade garante que a modificação do efeito técnico produzido por um componente de um sistema não cria nem propaga os efeitos colaterais a outros componentes do sistema. O comportamento emergente de um sistema que consiste em componentes deve ser controlado estritamente por definições formais de sua lógica e não por efeitos colaterais resultantes da má integração, ou seja, design não ortogonal de módulos e interfaces. A ortogonalidade reduz o tempo de teste e desenvolvimento, porque é mais fácil verificar os projetos que não causam efeitos colaterais nem dependem deles.

Por exemplo, um carro possui componentes e controles ortogonais (por exemplo, acelerando o veículo não influencia mais nada além dos componentes envolvidos exclusivamente com a função de aceleração). Por outro lado, um design não ortogonal pode ter sua influência de direção sua frenagem (por exemplo, controle eletrônico de estabilidade) ou sua velocidade ajuste sua suspensão. [1] Consequentemente, esse uso é visto como derivado do uso da ortogonal em matemática: pode -se projetar um vetor em um subespaço, projetando -o em cada membro de um conjunto de vetores de base separadamente e adicionando as projeções se e somente se os vetores base forem mutuamente ortogonal.

Diz -se que um conjunto de instruções é ortogonal se alguma instrução puder usar qualquer registro em qualquer modo de endereço. Essa terminologia resulta de considerar uma instrução como um vetor cujos componentes são os campos de instrução. Um campo identifica os registros a serem operados e outro especifica o modo de endereço. Um conjunto de instruções ortogonais codifica excoda excoda -se todas as combinações de registros e modos de endereçamento.

Para colocá -lo nos termos mais simples possíveis, duas coisas são ortogonais se a mudança de um não tiver efeito sobre o outro.

Enquanto fala sobre decisões do projeto sobre linguagens de programação, a ortogonalidade pode ser vista como é fácil para você prever outras coisas sobre essa linguagem para o que você viu no passado.

Por exemplo, em um idioma que você pode ter:

str.split

para dividir uma corda e

Len (STR)

Para conseguir o lenght.

Em um idioma mais ortogonal, você sempre usaria str.x ou x (str).

Quando você clonaria um objeto ou fazia qualquer outra coisa, saberia se deve usar

Clone (OBJ)

ou

obj.clone

Esse é um dos principais pontos nas linguagens de programação que são ortogonais. Isso evita que você consulte o manual ou pergunte a alguém.

O artigo da Wikipedia fala mais sobre a ortogonalidade em projetos complexos ou idiomas de baixo nível. Como alguém sugeriu acima em um comentário, o livro de Sebesta fala de maneira limpa sobre a ortogonalidade.

Se eu usaria apenas uma frase, diria que uma linguagem de programação é ortogonal quando suas partes desconhecidas agem conforme o esperado com base no que você viu. Ou ... sem surpresas.

;)

Ortogonalidade na programação:

A ortogonalidade é um conceito importante, abordando como um número relativamente pequeno de componentes pode ser combinado de um número relativamente pequeno de maneiras de obter os resultados desejados. Está associado à simplicidade; Quanto mais ortogonal o design, menos exceções. Isso facilita o aprendizado, a leitura e a gravação de programas em uma linguagem de programação. O significado de uma característica ortogonal é independente do contexto; Os principais parâmetros são simetria e consistência (por exemplo, um ponteiro é um conceito ortogonal).

a partir de Wikipedia

Nas linguagens de programação, diz -se que um recurso de linguagem de programação é ortogonal se for limitado sem restrições (ou exceções). Por exemplo, nas funções Pascal não pode retornar tipos estruturados. Esta é uma restrição ao retornar valores de uma função. Portanto, nós é considerado uma característica não ortogonal. ;)

Como exemplos da falta de ortogonalidade em uma linguagem de alto nível, considere as seguintes regras e exceções em C.Embora C tenha dois tipos de dados estruturados, arrays e registros (structs), os registros podem ser retornados de funções, mas os arrays não.Um membro de uma estrutura pode ser de qualquer tipo de dados, exceto void ou uma estrutura do mesmo tipo.Um elemento de array pode ser qualquer tipo de dados, exceto void ou uma função.Os parâmetros são passados ​​por valor, a menos que sejam arrays, caso em que são, na verdade, passados ​​por referência (porque a aparência de um nome de array sem subscrito em um programa C é interpretada como o endereço do primeiro elemento do array)

Ortogonalidade significa o grau em que o idioma consiste em um conjunto de construções primitivas independentes que podem ser combinadas conforme necessário para expressar um programa. Os recursos são ortogonais se não houver restrições sobre como eles podem ser combinados

Example : non-orthogonality

Pascal: As funções não podem retornar tipos estruturados. Os idiomas funcionais são altamente ortogonais.

A idéia básica de ortogonalidade é que coisas que não estão relacionadas conceitualmente não devem estar relacionadas no sistema. Partes da arquitetura que realmente não têm nada a ver com a outra, como o banco de dados e a interface do usuário, não precisam ser alteradas juntas. Uma mudança para um não deve causar alteração no outro.

A ortogonalidade em uma linguagem de programação significa que um conjunto relativamente pequeno de construções primitivas pode ser combinado em um número relativamente pequeno de maneiras de construir as estruturas de controle e dados do idioma. Além disso, toda combinação possível de primitivas é legal e significativa. Por exemplo, considere os tipos de dados. Suponha que um idioma tenha quatro tipos de dados primitivos (número inteiro, flutuação, dupla e caractere) e dois operadores de tipo (matriz e ponteiro). Se os dois operadores de tipo puderem ser aplicados a si mesmos e aos quatro tipos de dados primitivos, um grande número de estruturas de dados poderá ser definido. O significado de um recurso de linguagem ortogonal é independente do contexto de sua aparência em um programa. (A palavra ortogonal vem do conceito matemático de vetores ortogonais, que são independentes um do outro.) A ortogonalidade segue a partir de uma simetria de relações entre os primitivos. A falta de ortogonalidade leva a exceções às regras do idioma. Por exemplo, em uma linguagem de programação que suporta ponteiros, deve ser possível definir um ponteiro para apontar para qualquer tipo específico definido no idioma. No entanto, se os ponteiros não tiverem permissão para apontar para matrizes, muitas estruturas de dados potencialmente úteis definidas pelo usuário não podem ser definidas. Podemos ilustrar o uso da ortogonalidade como um conceito de design, comparando um aspecto das linguagens de montagem dos computadores de mainframe da IBM e da série VAX de minicomputadores. Consideramos uma única situação simples: adicionando dois valores inteiros de 32 bits que residem na memória ou registra e substituindo um dos dois valores pela soma. Os mainframes da IBM têm duas instruções para esse fim, que têm os formulários

A Reg1, memory_cell
AR Reg1, Reg2

onde Reg1 e Reg2 representam registros. A semântica destes são

Reg1 ← contents(Reg1) + contents(memory_cell)
Reg1 ← contents(Reg1) + contents(Reg2)

A instrução de adição VAX para valores inteiros de 32 bits é

ADDL operand_1, operand_2

cuja semântica é

operand_2 ← contents(operand_1) + contents(operand_2)

Nesse caso, qualquer operando pode ser um registro ou uma célula de memória. O design da instrução VAX é ortogonal, pois uma única instrução pode usar registros ou células de memória como operandos. Existem duas maneiras de especificar operandos, que podem ser combinados de todas as maneiras possíveis. O design da IBM não é ortogonal. Apenas duas em cada quatro possibilidades de combinações de operando são legais e as duas exigem instruções diferentes, A e AR. O design da IBM é mais restrito e, portanto, menos gravável. Por exemplo, você não pode adicionar dois valores e armazenar a soma em um local de memória. Além disso, o design da IBM é mais difícil de aprender devido às restrições e às instruções adicionais. A ortogonalidade está intimamente relacionada à simplicidade: quanto mais ortogonal o design de um idioma, menos exceções que as regras do idioma exigem. Menos exceções significam um maior grau de regularidade no design, o que facilita o aprendizado, a leitura e a compreensão. Qualquer pessoa que tenha aprendido uma parte significativa do idioma inglês pode testemunhar a dificuldade de aprender suas muitas exceções de regras (por exemplo, eu antes de E, exceto após c).

Verifique a ortogonalidade das matrizes:

Ortogonalidade também pode ser em relação a matrizes,

Matrix *(transpose of matrix)= identity matrix. 

Clique no link abaixo para visualizar um vídeo do YouTube sobre a ortogonalidade.
https://youtu.be/tneklaxnfw8

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top