Co oznacza „ortogonalność”, gdy mówimy o językach programowania?
Jakie są przykłady ortogonalności?
Co oznacza „ortogonalność”, gdy mówimy o językach programowania?
Jakie są przykłady ortogonalności?
Odpowiedzi:
Ortogonalność to właściwość, która oznacza, że „Zmiana A nie zmienia B”. Przykładem systemu ortogonalnego może być radio, w którym zmiana stacji nie powoduje zmiany głośności i odwrotnie.
System nieortogonalny byłby jak helikopter, w którym zmiana prędkości może zmienić kierunek.
W językach programowania oznacza to, że podczas wykonywania instrukcji nie dzieje się nic oprócz tej instrukcji (bardzo ważne przy debugowaniu).
W odniesieniu do zestawów instrukcji istnieje również określone znaczenie .
Z książki „Art of UNIX Programming” Erica S. Raymonda
Ortogonalność to jedna z najważniejszych właściwości, która może pomóc w uzyskaniu zwartości nawet złożonych projektów. W czysto ortogonalnym projekcie operacje nie mają skutków ubocznych; każda akcja (czy to wywołanie API, wywołanie makra czy operacja językowa) zmienia tylko jedną rzecz bez wpływu na inne. Istnieje jeden i tylko jeden sposób zmiany każdej właściwości systemu, który kontrolujesz.
Pomyśl o tym, że jest w stanie zmienić jedną rzecz bez niewidocznego wpływu na inną.
Jeśli masz zestaw konstrukcji. Mówi się, że langauge jest ortogonalny, jeśli pozwala programiście dowolnie mieszać te konstrukcje. Na przykład w C nie można zwrócić tablicy (tablicy statycznej), mówi się, że C jest nieortogenalne w tym przypadku:
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.
Mówiąc ogólnie, ortogonalność to relacja między dwiema rzeczami, która ma na siebie minimalny wpływ.
Termin pochodzi z matematyki, w której dwa wektory są ortogonalne, jeśli przecinają się pod kątem prostym.
Pomyśl o typowej dwuwymiarowej przestrzeni kartezjańskiej (typowa siatka z osiami X / Y). Narysuj dwie linie: x = 1 iy = 1. Te dwie linie są ortogonalne. Możesz zmienić x = 1, zmieniając x, co nie będzie miało wpływu na drugą linię i odwrotnie.
W oprogramowaniu termin ten może być odpowiednio używany w sytuacjach, gdy mówisz o dwóch częściach systemu, które zachowują się niezależnie od siebie.
Większość odpowiedzi jest bardzo rozwlekła, a nawet niejasna. Chodzi o to, że jeśli narzędzie jest ortogonalne, można je dodać, wymienić lub usunąć na korzyść lepszych narzędzi, bez skręcania wszystkiego innego.
To jest różnica między stolarzem posiadającym młotek i piłę, której można używać do kucia lub piłowania, a posiadaniem nowego zestawu młotek / piła, który jest przeznaczony do piłowania drewna, a następnie wbijania go razem. Albo będą pracować przy piłowaniu, a następnie młotkowaniu, ale jeśli dostaniesz jakieś zadanie, które wymaga piłowania, ale nie młotkowania, będą działać tylko narzędzia ortogonalne. Podobnie, jeśli musisz wkręcać zamiast młotkiem, nie musisz wyrzucać piły, jeśli jest prostopadła (nie pomieszana) z młotkiem.
Klasycznym przykładem są narzędzia wiersza poleceń unix: masz jedno narzędzie do pobierania zawartości dysku (dd), drugie do filtrowania wierszy z pliku (grep), drugie do zapisywania tych wierszy do pliku (cat) itd. wszystkie można dowolnie mieszać i dopasowywać.
Mówiąc o decyzjach projektowych dotyczących języków programowania, ortogonalność może być postrzegana jako to, jak łatwo jest przewidzieć inne rzeczy dotyczące tego języka w odniesieniu do tego, co widziałeś w przeszłości.
Na przykład w jednym języku możesz mieć:
str.split
do dzielenia łańcucha i
len (str)
za uzyskanie długości.
W języku bardziej ortogonalnym zawsze używałbyś str.x lub x (str).
Gdybyś sklonował obiekt lub zrobił cokolwiek innego, wiedziałbyś, czy użyć
klon (obj)
lub
obj.clone
To jeden z głównych punktów dotyczących ortogonalności języków programowania. To pozwala uniknąć zajrzenia do instrukcji lub zadawania pytań.
Artykuł w Wikipedii mówi więcej o ortogonalności w złożonych projektach lub językach niskiego poziomu. Jak ktoś zasugerował powyżej w komentarzu, książka Sebesta mówi wyraźnie o ortogonalności.
Gdybym użył tylko jednego zdania, powiedziałbym, że język programowania jest ortogonalny, gdy jego nieznane części działają zgodnie z oczekiwaniami na podstawie tego, co widziałeś. Albo ... bez niespodzianek.
;)
z wikipedii :
Informatyka
Ortogonalność to właściwość projektu systemu, która ułatwia wykonalność i zwartość złożonych projektów. Ortogonalność gwarantuje, że modyfikacja efektu technicznego wytwarzanego przez komponent systemu nie powoduje ani nie propaguje skutków ubocznych na inne komponenty systemu. Wyłaniające się zachowanie systemu składającego się z komponentów powinno być ściśle kontrolowane przez formalne definicje jego logiki, a nie przez skutki uboczne wynikające ze słabej integracji, tj. Nieortogonalnego projektu modułów i interfejsów. Ortogonalność skraca czas testowania i opracowywania, ponieważ łatwiej jest zweryfikować projekty, które nie powodują skutków ubocznych ani nie są od nich zależne.
Na przykład samochód ma ortogonalne komponenty i elementy sterujące (np. Przyspieszenie pojazdu nie wpływa na nic innego, jak tylko na komponenty związane wyłącznie z funkcją przyspieszania). Z drugiej strony, nieortogonalna konstrukcja może mieć wpływ na układ kierowniczy na hamowanie (np. Elektroniczna kontrola stabilności) lub regulować prędkość zawieszenia. 1 W konsekwencji, to użycie jest postrzegane jako wyprowadzone z użycia ortogonalności w matematyce: można rzutować wektor na podprzestrzeń, rzutując go na każdy element zbioru wektorów bazowych oddzielnie i dodając rzuty wtedy i tylko wtedy, gdy wektory bazowe są wzajemnie ortogonalne.
O zestawie instrukcji mówi się, że jest ortogonalny, jeśli jakakolwiek instrukcja może wykorzystywać dowolny rejestr w dowolnym trybie adresowania. Terminologia ta wynika z rozważania instrukcji jako wektora, którego składowymi są pola instrukcji. Jedno pole identyfikuje rejestry, na których mają być obsługiwane, a inne określa tryb adresowania. Zestaw instrukcji ortogonalnych w unikalny sposób koduje wszystkie kombinacje rejestrów i trybów adresowania.
Z Wikipedii :
Ortogonalność to właściwość projektu systemu, która ułatwia wykonalność i zwartość złożonych projektów. Ortogonalność gwarantuje, że modyfikacja efektu technicznego wytwarzanego przez komponent systemu nie powoduje ani nie propaguje skutków ubocznych na inne komponenty systemu. Wyłaniające się zachowanie systemu składającego się z komponentów powinno być ściśle kontrolowane przez formalne definicje jego logiki, a nie przez skutki uboczne wynikające ze słabej integracji, tj. Nieortogonalnego projektu modułów i interfejsów. Ortogonalność skraca czas testowania i opracowywania, ponieważ łatwiej jest zweryfikować projekty, które nie powodują skutków ubocznych ani nie są od nich zależne.
Na przykład samochód ma ortogonalne komponenty i elementy sterujące (np. Przyspieszenie pojazdu nie wpływa na nic innego, jak tylko na komponenty związane wyłącznie z funkcją przyspieszania). Z drugiej strony, nieortogonalna konstrukcja może mieć wpływ na układ kierowniczy na hamowanie (np. Elektroniczna kontrola stabilności) lub jego prędkość modyfikować zawieszenie. [1] W konsekwencji, to użycie jest postrzegane jako wyprowadzone z użycia ortogonalności w matematyce: można rzutować wektor na podprzestrzeń, rzutując go na każdy element zbioru wektorów bazowych oddzielnie i dodając rzutowanie wtedy i tylko wtedy, gdy wektory bazowe są wzajemnie ortogonalne.
O zestawie instrukcji mówi się, że jest ortogonalny, jeśli jakakolwiek instrukcja może wykorzystywać dowolny rejestr w dowolnym trybie adresowania. Terminologia ta wynika z rozważania instrukcji jako wektora, którego składowymi są pola instrukcji. Jedno pole identyfikuje rejestry, na których mają być obsługiwane, a inne określa tryb adresowania. Zestaw instrukcji ortogonalnych w unikalny sposób koduje wszystkie kombinacje rejestrów i trybów adresowania.
Mówiąc najprościej z możliwych, dwie rzeczy są ortogonalne, jeśli zmiana jednej nie ma wpływu na drugą.
Jako przykłady braku ortogonalności w języku wysokiego poziomu, rozważ następujące reguły i wyjątki w C. Chociaż C ma dwa rodzaje ustrukturyzowanych typów danych, tablice i rekordy (struktury), rekordy mogą być zwracane z funkcji, ale tablice nie. Elementem struktury może być dowolny typ danych, z wyjątkiem void lub struktury tego samego typu. Element tablicy może być dowolnym typem danych z wyjątkiem void lub funkcji. Parametry są przekazywane przez wartość, chyba że są to tablice, w którym to przypadku są w efekcie przekazywane przez referencję (ponieważ pojawienie się nazwy tablicy bez indeksu w programie C jest interpretowane jako adres pierwszego elementu tablicy)
W językach programowania mówi się, że funkcja języka programowania jest ortogonalna, jeśli jest ograniczona bez ograniczeń (lub wyjątków). Na przykład w funkcji Pascal funkcje nie mogą zwracać typów strukturalnych. To jest ograniczenie dotyczące zwracania wartości z funkcji. Dlatego uważamy, że jest to cecha nieortogonalna. ;)
Ortogonalność w programowaniu:
Ortogonalność to ważna koncepcja, która dotyczy tego, jak stosunkowo niewielką liczbę elementów można połączyć na stosunkowo niewielką liczbę sposobów, aby uzyskać pożądane wyniki. Kojarzy się z prostotą; im bardziej ortogonalny projekt, tym mniej wyjątków. Ułatwia to naukę, czytanie i pisanie programów w języku programowania. Znaczenie cech ortogonalnych jest niezależne od kontekstu; kluczowe parametry to symetria i spójność (na przykład wskaźnik jest pojęciem ortogonalnym).
Ortogonalność w języku programowania oznacza, że stosunkowo niewielki zestaw konstrukcji prymitywnych można łączyć na stosunkowo niewielką liczbę sposobów, aby zbudować kontrolę i struktury danych języka. Co więcej, każda możliwa kombinacja prymitywów jest legalna i znacząca. Na przykład rozważ typy danych. Załóżmy, że język ma cztery pierwotne typy danych (liczba całkowita, zmiennoprzecinkowa, podwójna i znakowa) oraz dwa operatory typu (tablica i wskaźnik). Jeśli dwa operatory typu można zastosować do siebie i czterech pierwotnych typów danych, można zdefiniować dużą liczbę struktur danych. Znaczenie funkcji języka ortogonalnego jest niezależne od kontekstu jej pojawienia się w programie. (słowo ortogonalne pochodzi z matematycznej koncepcji wektorów ortogonalnych, które są od siebie niezależne. ) Ortogonalność wynika z symetrii relacji między pierwotnymi. Brak ortogonalności prowadzi do wyjątków od reguł języka. Na przykład w języku programowania, który obsługuje wskaźniki, powinno być możliwe zdefiniowanie wskaźnika wskazującego na dowolny określony typ zdefiniowany w języku. Jeśli jednak wskaźniki nie mogą wskazywać tablic, nie można zdefiniować wielu potencjalnie przydatnych struktur danych zdefiniowanych przez użytkownika. Możemy zilustrować użycie ortogonalności jako koncepcji projektowej, porównując jeden aspekt języków asemblera komputerów mainframe IBM i serii minikomputerów VAX. Rozważamy jedną prostą sytuację: dodanie dwóch 32-bitowych wartości całkowitych, które znajdują się w pamięci lub rejestrach i zastąpienie jednej z dwóch wartości sumą. Komputery mainframe IBM mają do tego celu dwie instrukcje,
A Reg1, memory_cell
AR Reg1, Reg2
gdzie Reg1 i Reg2 reprezentują rejestry. Ich semantyka to
Reg1 ← contents(Reg1) + contents(memory_cell)
Reg1 ← contents(Reg1) + contents(Reg2)
Instrukcja dodawania VAX dla 32-bitowych wartości całkowitych to
ADDL operand_1, operand_2
którego semantyka jest
operand_2 ← contents(operand_1) + contents(operand_2)
W tym przypadku operand może być rejestrem lub komórką pamięci. Konstrukcja instrukcji VAX jest ortogonalna, ponieważ pojedyncza instrukcja może używać albo rejestrów, albo komórek pamięci jako argumentów. Istnieją dwa sposoby określania operandów, które można łączyć na wszystkie możliwe sposoby. Projekt IBM nie jest ortogonalny. Tylko dwie z czterech możliwości kombinacji operandów są dozwolone, a dwie wymagają różnych instrukcji, A i AR. Projekt IBM jest bardziej ograniczony, a zatem mniej zapisywalny. Na przykład nie można dodać dwóch wartości i przechowywać sumy w lokalizacji pamięci. Ponadto projekt IBM jest trudniejszy do nauczenia z powodu ograniczeń i dodatkowych instrukcji. Ortogonalność jest ściśle związana z prostotą: im bardziej ortogonalny jest projekt języka, tym mniej wyjątków wymagają reguły językowe. Mniejsza liczba wyjątków oznacza wyższy stopień regularności w projekcie, co ułatwia naukę, czytanie i zrozumienie języka. Każdy, kto nauczył się istotnej części języka angielskiego, może zaświadczyć o trudnościach w nauce wielu wyjątków od jego reguł (np. I przed e, z wyjątkiem po c).
Ortogonalność oznacza stopień, w jakim język składa się z zestawu niezależnych konstrukcji pierwotnych, które można łączyć w razie potrzeby w celu wyrażenia programu. Funkcje są ortogonalne, jeśli nie ma ograniczeń co do sposobu ich łączenia
Example : non-orthogonality
PASCAL: funkcje nie mogą zwracać typów strukturalnych. Języki funkcjonalne są wysoce ortogonalne.
Podstawową ideą ortogonalności jest to, że rzeczy, które nie są powiązane koncepcyjnie, nie powinny być powiązane w systemie. Części architektury, które tak naprawdę nie mają nic wspólnego z innymi, takie jak baza danych i interfejs użytkownika, nie powinny być zmieniane razem. Zmiana na jedną nie powinna powodować zmiany w drugiej.
Sprawdź ortogonalność macierzy:
Ortogonalność może również odnosić się do macierzy,
Matrix *(transpose of matrix)= identity matrix.
Kliknij poniższy link, aby obejrzeć film z YouTube na temat ortogonalności.
https://youtu.be/tNekLaxnfW8