Что такое «ортогональность»?

124

Что означает «ортогональность», когда речь идет о языках программирования?

Какие есть примеры ортогональности?

AhmetB - Google
источник

Ответы:

255

Ортогональность - это свойство, которое означает, что «изменение A не меняет B». Примером ортогональной системы может служить радио, в котором смена станции не приводит к изменению громкости и наоборот.

Неортогональная система будет похожа на вертолет, в котором изменение скорости может изменить направление.

В языках программирования это означает, что при выполнении инструкции ничего, кроме этой инструкции, не происходит (очень важно для отладки).

Обращение к наборам команд имеет также особое значение .

Пересекать
источник
Этот ответ напоминает мне теорию "суперпозиции" сигналов и систем.
Özgür
1
Очень четкое объяснение различных употреблений этого слова: c2.com/cgi/wiki?DefinitionOfOrthogonal
Лоренцо Солано
Полностью ли функциональное программирование ортогонально?
corazza
Интересный вопрос @yannbane. Теоретически, в зависимости от теоретического функционального языка, это может быть правдой. На практике нет, даже в функциональных языках есть способы изменить состояние.
К. Росс
1
Могу поспорить, что пример вертолета от «Прагматичного программиста» :)
Срикант Каруманагхат,
36

Из книги Эрика С. Раймонда «Искусство программирования UNIX»

Ортогональность - одно из важнейших свойств, позволяющих сделать компактными даже сложные конструкции. В чисто ортогональном дизайне операции не имеют побочных эффектов; каждое действие (будь то вызов API, вызов макроса или языковая операция) изменяет только одно, не затрагивая другие. Есть один и только один способ изменить каждое свойство любой системы, которой вы управляете.

Федерико Клез Каллока
источник
16

Подумайте о том, что он может изменить одну вещь, не оказывая невидимого влияния на другую часть.

Мартин Беккет
источник
12

Если у вас есть набор конструктов. Язык называется ортогональным, если он позволяет программисту свободно смешивать эти конструкции. Например, в C вы не можете вернуть массив (статический массив), C в этом случае считается неортогнальным:

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.
арак
источник
На самом деле я видел это в своей книге и до сих пор не понимаю, что это такое.
AhmetB - Google,
LOL Я использую эту книгу и видел этот вопрос в онлайн-викторине книги. Какое совпадение. Может, мне тоже стоит прочитать первую главу.
AhmetB - Google,
2
Это просто говорит о том, что return и массивы более сложны, когда их объединяют: вы не можете использовать return для массивов, не думая о взаимодействии между ними. В идеале вы должны знать, что означает return и что такое массив, и поэтому вы должны знать, что будет делать возврат массива, но на самом деле это более сложно, потому что C раскрывает детали реализации о массивах (и возврате).
Lee B
Это чувство «ортогональности» покрывается: en.wikipedia.org/wiki/Orthogonality_(programming) , но это новая страница с небольшим содержанием.
outis
1
Это «более правильный» ответ об ортогональности в контексте программирования. «ортогональность» означает, что программная конструкция может быть смешана с любой другой конструкцией, и ее семантика останется прежней.
treecoder
11

В широком смысле ортогональность - это взаимосвязь между двумя вещами, при которой они оказывают минимальное влияние друг на друга.

Этот термин пришел из математики, где два вектора ортогональны, если они пересекаются под прямым углом.

Подумайте о типичном двумерном декартовом пространстве (вы типичная сетка с осями X / Y). Постройте две линии: x = 1 и y = 1. Две линии ортогональны. Вы можете изменить x = 1, изменив x, и это не повлияет на другую строку, и наоборот.

В программном обеспечении этот термин может быть уместно использован в ситуациях, когда вы говорите о двух частях системы, которые ведут себя независимо друг от друга.

timdev
источник
5

Большинство ответов очень многословны и даже неясны. Дело в том, что если инструмент ортогонален, его можно добавить, заменить или удалить в пользу более качественных инструментов, не портя все остальное.

В этом разница между плотником, имеющим молоток и пилу, которые можно использовать для молотка или пиления, или новой комбинацией молоток / пила, которая предназначена для пиления древесины, а затем ее сколачивания. Любой из них будет работать для пиления, а затем молотка, но если вы получите задание, требующее пиления, но не молотка, тогда будут работать только ортогональные инструменты. Точно так же, если вам нужно завинтить вместо молотка, вам не нужно будет выбрасывать пилу, если она перпендикулярна (не смешана) с вашим молотком.

Классическим примером являются инструменты командной строки unix: у вас есть один инструмент для получения содержимого диска (dd), другой для фильтрации строк из файла (grep), третий для записи этих строк в файл (cat) и т. Д. все можно смешивать и сочетать по желанию.

Ли Б
источник
2

Говоря о проектных решениях по языкам программирования, ортогональность можно рассматривать как то, насколько легко вам предсказать другие вещи об этом языке на основе того, что вы видели в прошлом.

Например, на одном языке вы можете иметь:

str.split

для разделения строки и

Len (ул)

для получения длины.

На более ортогональном языке вы всегда должны использовать str.x или x (str).

Когда вы клонируете объект или делаете что-нибудь еще, вы будете знать, использовать ли

Клон (OBJ)

или

obj.clone

Это один из основных моментов ортогональности языков программирования. Это избавит вас от необходимости обращаться к руководству или спрашивать кого-нибудь.

В статье в Википедии больше говорится об ортогональности в сложных проектах или языках низкого уровня. Как кто-то предложил выше в комментарии, книга Sebesta четко говорит об ортогональности.

Если бы я использовал только одно предложение, я бы сказал, что язык программирования ортогонален, когда его неизвестные части действуют так, как ожидалось, исходя из того, что вы видели. Или ... никаких сюрпризов.

;)

Asrail
источник
Этот ответ не согласуется с другими; это просто утверждает согласованность между вызовами функций или общей структурой в отличие от других, которые находятся на линиях «меньшего связывания» или «отсутствия побочных эффектов».
Özgür
Я обычно слышал об этом. Я думаю, что причина его ортогональности в том, что если у вас есть X.ToString и X.GetType, вы можете изменять объект и синтаксис одинаков, или вы можете изменять функцию и синтаксис одинаковыми. Объект не зависит от функции.
dwidel 02
1

из википедии :

Компьютерная наука

Ортогональность - это свойство системного дизайна, обеспечивающее выполнимость и компактность сложных конструкций. Ортогональность гарантирует, что изменение технического эффекта, производимого компонентом системы, не создает и не распространяет побочные эффекты на другие компоненты системы. Возникающее поведение системы, состоящей из компонентов, должно строго контролироваться формальными определениями ее логики, а не побочными эффектами, возникающими в результате плохой интеграции, то есть неортогональной конструкции модулей и интерфейсов. Ортогональность сокращает время тестирования и разработки, потому что легче проверять проекты, которые не вызывают побочных эффектов и не зависят от них.

Например, у автомобиля есть ортогональные компоненты и элементы управления (например, ускорение автомобиля не влияет ни на что другое, кроме компонентов, задействованных исключительно в функции ускорения). С другой стороны, неортогональная конструкция может влиять на торможение (например, электронный контроль устойчивости) или регулировку скорости на подвеску. 1 Следовательно, это использование считается производным от использования ортогональности в математике: можно проецировать вектор на подпространство, проецируя его на каждый член набора базисных векторов отдельно и добавляя проекции тогда и только тогда, когда базисные векторы взаимно ортогональны.

Набор команд называется ортогональным, если любая инструкция может использовать любой регистр в любом режиме адресации. Эта терминология является результатом рассмотрения инструкции как вектора, компонентами которого являются поля инструкции. Одно поле определяет регистры, с которыми нужно работать, а другое определяет режим адресации. Набор ортогональных команд однозначно кодирует все комбинации регистров и режимов адресации.

TheVillageIdiot
источник
О, спасибо, я только что посетил эту заглушку en.wikipedia.org/wiki/Orthogonality_%28programming%29 Извините.
AhmetB - Google,
1

Из Википедии :

Ортогональность - это свойство системного дизайна, обеспечивающее выполнимость и компактность сложных конструкций. Ортогональность гарантирует, что изменение технического эффекта, производимого компонентом системы, не создает и не распространяет побочные эффекты на другие компоненты системы. Эмерджентное поведение системы, состоящей из компонентов, должно строго контролироваться формальными определениями ее логики, а не побочными эффектами, возникающими в результате плохой интеграции, то есть неортогональной конструкции модулей и интерфейсов. Ортогональность сокращает время тестирования и разработки, потому что легче проверять проекты, которые не вызывают побочных эффектов и не зависят от них.

Например, у автомобиля есть ортогональные компоненты и элементы управления (например, ускорение автомобиля не влияет ни на что другое, кроме компонентов, задействованных исключительно в функции ускорения). С другой стороны, неортогональная конструкция может влиять на рулевое управление на торможение (например, электронный контроль устойчивости) или скорость на регулировку подвески [1]. Следовательно, это использование считается производным от использования ортогональности в математике: можно спроецировать вектор на подпространство, проецируя его на каждый член набора базисных векторов отдельно и добавляя проекции тогда и только тогда, когда базисные векторы взаимно ортогональные.

Набор команд называется ортогональным, если любая инструкция может использовать любой регистр в любом режиме адресации. Эта терминология является результатом рассмотрения инструкции как вектора, компонентами которого являются поля инструкции. Одно поле определяет регистры, с которыми нужно работать, а другое определяет режим адресации. Набор ортогональных команд однозначно кодирует все комбинации регистров и режимов адресации.

Проще говоря, две вещи ортогональны, если изменение одной не влияет на другую.

Лоуренс Гонсалвес
источник
1

В качестве примеров отсутствия ортогональности в языке высокого уровня рассмотрим следующие правила и исключения в C. Хотя C имеет два типа структурированных типов данных: массивы и записи (структуры), записи могут быть возвращены из функций, а массивы - нет. Член структуры может быть любым типом данных, кроме void или структурой того же типа. Элемент массива может быть любого типа данных, кроме void или функции. Параметры передаются по значению, если они не являются массивами, и в этом случае они фактически передаются по ссылке (поскольку появление имени массива без индекса в программе на C интерпретируется как адрес первого элемента массива)

Воображение
источник
0

В языках программирования функция языка программирования называется ортогональной, если она ограничена без ограничений (или исключений). Например, в Pascal функции не могут возвращать структурированные типы. Это ограничение на возврат значений из функции. Поэтому мы рассматриваем это как неортогональную функцию. ;)

Дил
источник
0

Ортогональность в программировании:

Ортогональность - важная концепция, касающаяся того, как относительно небольшое количество компонентов может быть объединено относительно небольшим количеством способов для получения желаемых результатов. Это связано с простотой; чем более ортогонален дизайн, тем меньше исключений. Это упрощает изучение, чтение и написание программ на языке программирования. Значение ортогонального признака не зависит от контекста; ключевыми параметрами являются симметрия и согласованность (например, указатель - это ортогональное понятие).

из Википедии

Маджид
источник
0

Ортогональность в языке программирования означает, что относительно небольшой набор примитивных конструкций может быть объединен относительно небольшим количеством способов для создания структур управления и данных языка. Более того, любая возможная комбинация примитивов допустима и значима. Например, рассмотрим типы данных. Предположим, что в языке есть четыре примитивных типа данных (целое число, число с плавающей запятой, двойное и символьное) и два оператора типа (массив и указатель). Если два оператора типа могут быть применены к себе и к четырем примитивным типам данных, можно определить большое количество структур данных. Значение функции ортогонального языка не зависит от контекста ее появления в программе. (Слово ортогональный происходит от математической концепции ортогональных векторов, которые независимы друг от друга. ) Ортогональность следует из симметрии отношений между примитивными существами. Отсутствие ортогональности приводит к исключениям из правил языка. Например, в языке программирования, поддерживающем указатели, должна быть возможность определить указатель, указывающий на любой конкретный тип, определенный в языке. Однако, если указателям не разрешено указывать на массивы, многие потенциально полезные пользовательские структуры данных не могут быть определены. Мы можем проиллюстрировать использование ортогональности в качестве концепции дизайна, сравнив один аспект языков ассемблера мэйнфреймов IBM и миникомпьютеров серии VAX. Мы рассматриваем одну простую ситуацию: добавляем два 32-битных целых числа, которые находятся либо в памяти, либо в регистрах, и заменяем одно из двух значений суммой. В мэйнфреймах IBM для этого есть две инструкции:

A Reg1, memory_cell
AR Reg1, Reg2

где Reg1 и Reg2 представляют собой регистры. Семантика этих

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

Инструкция сложения VAX для 32-битных целочисленных значений:

ADDL operand_1, operand_2

чья семантика

operand_2 ← contents(operand_1) + contents(operand_2)

В этом случае любой операнд может быть регистром или ячейкой памяти. Дизайн команд VAX является ортогональным в том смысле, что одна команда может использовать в качестве операндов либо регистры, либо ячейки памяти. Есть два способа указать операнды, которые можно комбинировать всеми возможными способами. Дизайн IBM не ортогонален. Только две из четырех возможных комбинаций операндов допустимы, и для двух требуются разные инструкции, A и AR. Дизайн IBM более ограничен и поэтому менее доступен для записи. Например, вы не можете сложить два значения и сохранить сумму в ячейке памяти. Кроме того, дизайн IBM сложнее изучить из-за ограничений и дополнительных инструкций. Ортогональность тесно связана с простотой: чем более ортогонален дизайн языка, тем меньше исключений требуют языковые правила. Меньшее количество исключений означает более высокую степень регулярности дизайна, что упрощает изучение, чтение и понимание языка. Любой, кто изучил значительную часть английского языка, может засвидетельствовать трудность изучения многих исключений из правил (например, i до e, кроме c).

Воображение
источник
0

Ортогональность означает степень, в которой язык состоит из набора независимых примитивных конструкций, которые можно комбинировать по мере необходимости для выражения программы. Элементы ортогональны, если нет ограничений на то, как их можно комбинировать.

Example : non-orthogonality

PASCAL: функции не могут возвращать структурированные типы. Функциональные языки очень ортогональны.

мали
источник
0

Основная идея ортогональности состоит в том, что вещи, которые концептуально не связаны, не должны быть связаны в системе. Части архитектуры, которые на самом деле не имеют ничего общего с другими, такие как база данных и пользовательский интерфейс, не должны изменяться вместе. Изменение одного не должно вызывать изменение другого.

acohen
источник
-5

Проверяем ортогональность матриц:

Ортогональность может быть и по отношению к матрицам,

Matrix *(transpose of matrix)= identity matrix. 

Щелкните ссылку ниже, чтобы просмотреть видеоролик YouTube о ортогональности.
https://youtu.be/tNekLaxnfW8

Roopesh
источник
Очевидно, речь идет о программировании.
aggsol 07