Executando verificação de segurança...
6

O que é Ortogonalidade?

"Ortogonalidade é quando cada recurso da linguagem funciona de forma independente, e qualquer combinação desses recursos é válida e previsível." GPT, CHAT.

O livro Conceitos de Linguagens de Programação, de Robert W. Sebesta, remete bastante ao conceito de ortogonalidade. Aparentemente, essa grande palavra se refere à forma como é possível correlacionar os tipos de dados e as estruturas de controle de maneira previsível, ou seja, não se faz necessário decorar regras específicas daquela linguagem (exceções). Assim sendo, uma linguagem com alta ortogonalidade permite que o programador a utilize de maneira intuitiva, sem precisar se apegar a detalhes específicos e situacionais da linguagem em questão.

A ortogonalidade está intrinsecamente ligada ao custo da linguagem, já que, quanto menos intuitiva ela for, e quanto mais exceções e regras situacionais possuir, mais complicado e lento se torna o processo de treinar programadores para trabalharem com ela.

Ortogonalidade nem sempre é sinônimo de algo positivo. Geralmente, faz-se necessário abrir mão de parte da performance visando aumentar a ortogonalidade, já que a possibilidade de realizar diversos tipos de combinações de maneira livre se reflete em mais trabalho para o compilador.

Quanto mais específico for o problema que o seu programa resolve, mais performático ele será, pois não precisará lidar com uma grande variedade de casos. Se a função do seu programa for apenas mostrar a string "Hello World" no terminal, ele será extremamente eficiente e rápido. Note que, ao utilizar uma linguagem de tipagem forte, você estará abrindo mão de estar mais “livre” para estar mais restrito, o que reduz o trabalho do compilador em ter que “adivinhar” os tipos.

Alta Ortogonalidade:

  1. Python
  2. Ruby
  3. Haskell

Baixa Ortogonalidade:

  1. C
  2. C++
  3. Assembly
Carregando publicação patrocinada...
2
1
1
2

Nunca tinha ouvido falar no conceito de ortogonalidade para linguagens de programação, mas achei interessante. De um jeito vulgar, será que não podemos dizer que, se em uma linguagem há muitas maneiras de resolver um problema simples (ordenar uma lista de dados, por exemplo), essa linguagem teria baixa ortogonalidade; em contrapartida que, quando há menos maneiras de fazer isso a linguagem teria alta ortogonalidade, ou seja, se uma pessoa diz que utilizou um recurso A e um recurso B dentro da linguagem, pode-se ter uma ideia boa do problema que ela resolveu?
Não sei se fui claro, mas fiquei com essa indagação.

0

Na verdade, eu acredito que o conceito de ortogonalidade não está exatamente ligado à quantidade de formas pelas quais se pode resolver um problema, mas sim à forma como essas soluções, estruturas de dados e tipos primitivos podem conversar entre si. Apesar disso, uma linguagem que possui alta ortogonalidade geralmente terá várias formas de resolver um mesmo problema, ainda que isso, por si só, não signifique algo positivo.

2

Interessante a separação de linguagens com base em seu nível de ortogonalidade. No livro "Programador Pragmático", em um dos exercícios propostos, é feito uma provocação sobre qual tipo de linguagem seria mais ortogonal: Procedural vs Orientada a Objetos. O livro nos induz a escolher uma ou outra, pois são as opções apresentadas, entretanto a resposta esperada é que o conceito de ortogonalidade independe de linguagem oi ferramentas. Uma linguagem procedural pode ser menor ortogonal a medida que é possível escrever funções que controlam o fluxo de execução dependente de outras funções. Assim como, linguagens orientada a objetos também pode oferecer um menor nível de ortogonalidade a medida que é possível escrever um código com abuso do uso de heranças, interfaces, métodos "que sabem demais". Portanto, independente da linguagem ou modelo arquitetural, o livro apresenta a ideia que a ortogonalidade de um sistema depende mais da forma como se constrói do que da ferramenta em si.

2

Bem interessante esse ponto de vista. A forma como o livro citado (Conceitos de Linguagens de Programação) leva em consideração a ortogonalidade está muito mais relacionada ao projeto e à finalidade da linguagem, de modo que eu compartilho da visão do autor (Robert W. Sebesta).

Ps: Ainda vou ler o Programador Pragmático.

2

Haskell alta ortagonalidade? Bem, não sei não. Não mexi tanto em Haskell, então posso estar falando besteira, mas nunca vi nenhuma linguagem de programação como Haskell. As outras linguagens geralmente implementam algumas features da programação funcional, mas não chega nem perto do poder que o Haskell tem.

C e C++ são bem ortogonais ao meu ver. Afinal, muito da sintaxe de hoje surgiu com o C, que por sua vez foi inspirado em linguagens anteriores a C. Coisas como for loop, while, switch e outros conceitos, estão presentes em praticamente todas as linguagens modernas.

A linguagem menos ortogonal ao meu ver seria o Rust, por causa do ownership e borrow check. A maioria dos programadores "sofrem" em aprender Rust, que não é difícil quando você realmente senta a bunda na cadeira e estuda isso seriamente. No entanto, não da para negar que o processo é mais íngreme que todas as outras linguagens.

Poderiamos também falar sobre fundamentos. Ele estão presentes em todos os lugares, mesmo fora do escopo da área de TI. Afinal, são fundamentos! Porém não sei se é correto afirmar que todo fundamento é ortogonal, mas nem tudo que é ortogonal é um fundamento. A princípio me parece correto, mas eu precisaria pesquisar mais sobre a fundo.


Ótimo post. Gosto desses que discutem algo, especialmente temas de valor.

1

O C++ em especial possui uma complexidade as vezes até exagerada, muitas vezes em decorrência de fatores históricos e de design da linguagem, o que o torna pouco ortogonal.

Já o C possui várias regras especiais e casos de exceção, não se comportando de maneira uniforme ou intuitiva (em alguns casos), devemos levar em consideração que C permite o acesso direto a memória, o que gera a necessidade do uso de regras restritas para evitar problemas, podendo ser confuso e contraintuitivo, mas se usado da maneira correta garante alta eficiência.

1

Você mencionou que a ortogonalidade reduz o esforço de memória (menos exceções). Isso é verdade, mas existe um "ponto de virada".

Se cada recurso pode ser combinado com qualquer outro, a linguagem pode se tornar complexa demais. O ALGOL 68 é o exemplo clássico: era tão ortogonal que se tornou difícil de implementar e de entender.

A ortogonalidade deve servir à legibilidade. Se a liberdade de combinação gerar códigos "mágicos" ou ilegíveis, ela fere o propósito de facilitar a manutenção.

0