language agnostic - ¿Qué es "ortogonalidad"?
language-agnostic terminology (17)
Al hablar sobre las decisiones de los proyectos sobre los lenguajes de programación, se puede ver la ortogonalidad, ya que es fácil predecir otras cosas sobre ese lenguaje por lo que ha visto en el pasado.
Por ejemplo, en un idioma, puede tener:
str.split
para dividir una cadena y
Len (str)
para obtener la longitud.
En un idioma más ortogonal, siempre usaría str.x o x (str).
Cuando clona un objeto o hace cualquier otra cosa, sabría si usarlo o no.
clonar (obj)
o
obj.clone
Ese es uno de los principales puntos en los lenguajes de programación que son ortogonales. Eso evita que consulte el manual o pregunte a alguien.
El artículo de wikipedia habla más sobre ortogonalidad en diseños complejos o idiomas de bajo nivel. Como alguien sugirió anteriormente en un comentario, el libro de Sebesta habla limpiamente sobre la ortogonalidad.
Si utilizara solo una oración, diría que un lenguaje de programación es ortogonal cuando sus partes desconocidas actúan según lo esperado según lo que ha visto. O ... sin sorpresas.
;)
¿Qué significa "ortogonalidad" cuando se habla de lenguajes de programación?
¿Cuáles son algunos ejemplos de ortogonalidad?
Como ejemplos de la falta de ortogonalidad en un lenguaje de alto nivel, considere las siguientes reglas y excepciones en C. Aunque C tiene dos tipos de tipos de datos estructurados, matrices y registros (estructuras), los registros pueden devolverse de las funciones pero las matrices no. Un miembro de una estructura puede ser cualquier tipo de datos excepto vacío o una estructura del mismo tipo. Un elemento de matriz puede ser cualquier tipo de datos excepto vacío o una función. Los parámetros se pasan por valor, a menos que sean matrices, en cuyo caso pasan, en efecto, por referencia (porque la apariencia de un nombre de matriz sin un subíndice en un programa C se interpreta como la dirección del primer elemento de la matriz)
De Eric S Raymond, "Art of UNIX programming"
La ortogonalidad es una de las propiedades más importantes que pueden ayudar a que los diseños complejos incluso sean compactos. En un diseño puramente ortogonal, las operaciones no tienen efectos secundarios; cada acción (ya sea una llamada API, una macro invocación o una operación de idioma) cambia solo una cosa sin afectar a otras. Hay una y solo una forma de cambiar cada propiedad de cualquier sistema que controle.
De la Wikipedia :
La ortogonalidad es una propiedad de diseño del sistema que facilita la viabilidad y la compacidad de los diseños complejos. La ortogonalidad garantiza que la modificación del efecto técnico producido por un componente de un sistema no crea ni propaga efectos secundarios a otros componentes del sistema. El comportamiento emergente de un sistema que consta de componentes debe controlarse estrictamente mediante definiciones formales de su lógica y no mediante los efectos secundarios que resultan de una integración deficiente, es decir, el diseño no ortogonal de módulos e interfaces. La ortogonalidad reduce las pruebas y el tiempo de desarrollo porque es más fácil verificar diseños que no causan efectos secundarios ni dependen de ellos.
Por ejemplo, un automóvil tiene componentes y controles ortogonales (por ejemplo, la aceleración del vehículo no influye en nada más que los componentes involucrados exclusivamente con la función de aceleración). Por otro lado, un diseño no ortogonal puede tener su influencia de dirección en el frenado (por ejemplo, control de estabilidad electrónico), o su velocidad ajustar su suspensión. [1] En consecuencia, se considera que este uso se deriva del uso de ortogonal en matemáticas: uno puede proyectar un vector en un subespacio al proyectarlo en cada miembro de un conjunto de vectores de base por separado y agregar las proyecciones si y solo si los vectores de base son mutuamente ortogonales.
Se dice que un conjunto de instrucciones es ortogonal si cualquier instrucción puede usar cualquier registro en cualquier modo de direccionamiento. Esta terminología resulta de considerar una instrucción como un vector cuyos componentes son los campos de instrucción. Un campo identifica los registros a ser operados, y otro especifica el modo de direccionamiento. Un conjunto de instrucciones ortogonales codifica de forma exclusiva todas las combinaciones de registros y modos de direccionamiento.
Para ponerlo en los términos más simples posibles, dos cosas son ortogonales si cambiar una no tiene efecto sobre la otra.
En los lenguajes de programación, se dice que una característica del lenguaje de programación es ortogonal si está limitada sin restricciones (o excepciones). Por ejemplo, en Pascal, las funciones no pueden devolver tipos estructurados. Esta es una restricción para devolver valores de una función. Por lo tanto, se considera como una característica no ortogonal. ;)
En términos generales, la ortogonalidad es una relación entre dos cosas, de modo que tienen un efecto mínimo el uno sobre el otro.
El término proviene de las matemáticas, donde dos vectores son ortogonales si se cruzan en ángulo recto.
Piense en un espacio cartesiano bidimensional típico (su cuadrícula típica con ejes X / Y). Trace dos líneas: x = 1 e y = 1. Las dos líneas son ortogonales. Puede cambiar x = 1 cambiando x, y esto no tendrá efecto en la otra línea, y viceversa.
En el software, el término puede usarse apropiadamente en situaciones en las que se habla de dos partes de un sistema que se comportan de forma independiente.
La idea básica de la ortogonalidad es que las cosas que no están relacionadas conceptualmente no deberían estar relacionadas en el sistema. Las partes de la arquitectura que realmente no tienen nada que ver con la otra, como la base de datos y la IU, no deberían modificarse juntas. Un cambio a uno no debería causar un cambio en el otro.
La mayoría de las respuestas son muy largas, e incluso oscuras. El punto es: si una herramienta es ortogonal, se puede agregar, reemplazar o eliminar, a favor de mejores herramientas, sin atornillar todo lo demás.
Es la diferencia entre un carpintero que tiene un martillo y una sierra, que puede usarse para martillar o serrar, o que tiene un combo de martillo / sierra de nuevo diseño, que está diseñado para cortar madera y luego martillarlo. Cualquiera de los dos funcionará para serrar y martillar, pero si se realiza una tarea que requiere aserrar, pero no martillar, solo las herramientas ortogonales funcionarán. Del mismo modo, si necesita atornillar en lugar de martillar, no necesitará tirar su sierra, si es ortogonal (no se mezcla con) su martillo.
El ejemplo clásico son las herramientas de línea de comandos de Unix: tiene una herramienta para obtener los contenidos de un disco (dd), otra para filtrar líneas del archivo (grep), otra para escribir esas líneas en un archivo (cat), etc. todos pueden mezclarse y combinarse a voluntad.
La ortogonalidad en un lenguaje de programación significa que un conjunto relativamente pequeño de constructos primitivos puede combinarse en un número relativamente pequeño de formas para construir el control y las estructuras de datos del lenguaje. Además, cada combinación posible de primitivos es legal y significativa. Por ejemplo, considere los tipos de datos. Supongamos que un idioma tiene cuatro tipos de datos primitivos (entero, flotante, doble y carácter) y dos operadores de tipo (matriz y puntero). Si los dos operadores de tipo se pueden aplicar a sí mismos y a los cuatro tipos de datos primitivos, se puede definir una gran cantidad de estructuras de datos. El significado de una característica del lenguaje ortogonal es independiente del contexto de su aparición en un programa. (la palabra ortogonal proviene del concepto matemático de vectores ortogonales, que son independientes entre sí). La ortogonalidad se sigue de una simetría de relaciones entre primitivos. La falta de ortogonalidad conduce a excepciones a las reglas del lenguaje. Por ejemplo, en un lenguaje de programación que admita punteros, debería ser posible definir un puntero para apuntar a cualquier tipo específico definido en el idioma. Sin embargo, si los punteros no pueden apuntar a las matrices, no se pueden definir muchas estructuras de datos potencialmente útiles definidas por el usuario. Podemos ilustrar el uso de la ortogonalidad como un concepto de diseño al comparar un aspecto de los lenguajes de ensamblaje de las computadoras mainframe de IBM y la serie de miniordenadores VAX. Consideramos una situación simple simple: agregar dos valores enteros de 32 bits que residen en memoria o registros y reemplazar uno de los dos valores con la suma. Los mainframes de IBM tienen dos instrucciones para este propósito, que tienen los formularios
A Reg1, memory_cell
AR Reg1, Reg2
donde Reg1 y Reg2 representan registros. La semántica de estos son
Reg1 ← contents(Reg1) + contents(memory_cell)
Reg1 ← contents(Reg1) + contents(Reg2)
La instrucción de adición VAX para valores enteros de 32 bits es
ADDL operand_1, operand_2
cuya semántica es
operand_2 ← contents(operand_1) + contents(operand_2)
En este caso, cualquier operando puede ser un registro o una celda de memoria. El diseño de la instrucción VAX es ortogonal porque una sola instrucción puede usar registros o celdas de memoria como operandos. Hay dos formas de especificar operandos, que se pueden combinar de todas las formas posibles. El diseño de IBM no es ortogonal. Solo dos de cuatro posibilidades de combinaciones de operandos son legales, y las dos requieren instrucciones diferentes, A y AR. El diseño de IBM es más restringido y, por lo tanto, menos modificable. Por ejemplo, no puede agregar dos valores y almacenar la suma en una ubicación de memoria. Además, el diseño de IBM es más difícil de aprender debido a las restricciones y las instrucciones adicionales. La ortogonalidad está estrechamente relacionada con la simplicidad: cuanto más ortogonal es el diseño de un idioma, menos excepciones requieren las reglas del lenguaje. Menos excepciones significan un mayor grado de regularidad en el diseño, lo que hace que el idioma sea más fácil de aprender, leer y comprender. Cualquiera que haya aprendido una parte significativa del idioma inglés puede dar testimonio de la dificultad de aprender sus muchas excepciones de reglas (por ejemplo, yo antes de e, excepto después de c).
Ortogonalidad significa el grado en que el lenguaje consiste en un conjunto de constructos primitivos independientes que se pueden combinar según sea necesario para expresar un programa. Las características son ortogonales si no hay restricciones sobre cómo se pueden combinar
Example : non-orthogonality
PASCAL: las funciones no pueden devolver tipos estructurados. Los lenguajes funcionales son altamente ortogonales.
Piensa que ha sido capaz de cambiar una cosa sin tener un efecto no visto en otra.
Primera vez que escucha la palabra, pero Wikipedia parece tener algo:
Si tienes un conjunto de construcciones. Se dice que un lenguaje es ortogonal si permite al programador mezclar estos constructos libremente. Por ejemplo, en C no se puede devolver una matriz (matriz estática), C se dice que es no ortogonal en este 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.
Verificar ortogonalidad de matrices:
La ortogonalidad también puede ser con respecto a las matrices,
Matrix *(transpose of matrix)= identity matrix.
Haga clic en el enlace a continuación para ver un video de YouTube sobre ortogonalidad.
https://youtu.be/tNekLaxnfW8
de Orthogonality :
Ciencias de la Computación
La ortogonalidad es una propiedad de diseño del sistema que facilita la viabilidad y la compacidad de los diseños complejos. La ortogonalidad garantiza que la modificación del efecto técnico producido por un componente de un sistema no crea ni propaga efectos secundarios a otros componentes del sistema. El comportamiento emergente de un sistema que consta de componentes debe controlarse estrictamente mediante definiciones formales de su lógica y no mediante los efectos secundarios que resultan de una integración deficiente, es decir, el diseño no ortogonal de módulos e interfaces. La ortogonalidad reduce las pruebas y el tiempo de desarrollo porque es más fácil verificar diseños que no causan efectos secundarios ni dependen de ellos.
Por ejemplo, un automóvil tiene componentes y controles ortogonales (por ejemplo, la aceleración del vehículo no influye en nada más que los componentes involucrados exclusivamente con la función de aceleración). Por otro lado, un diseño no ortogonal puede tener su influencia de dirección en el frenado (por ejemplo, control de estabilidad electrónico), o su velocidad ajustar su suspensión. Orthogonality En consecuencia, se considera que este uso se deriva del uso de ortogonal en matemáticas: uno puede proyectar un vector en un subespacio al proyectarlo en cada miembro de un conjunto de vectores de base por separado y agregar las proyecciones si y solo si los vectores de base son mutuamente ortogonales.
Se dice que un conjunto de instrucciones es ortogonal si cualquier instrucción puede usar cualquier registro en cualquier modo de direccionamiento. Esta terminología resulta de considerar una instrucción como un vector cuyos componentes son los campos de instrucción. Un campo identifica los registros a ser operados, y otro especifica el modo de direccionamiento. Un conjunto de instrucciones ortogonales codifica de forma exclusiva todas las combinaciones de registros y modos de direccionamiento.
Orthogonality es la propiedad que significa "Cambiar A no cambia B". Un ejemplo de un sistema ortogonal sería una radio, donde cambiar la estación no cambia el volumen y viceversa.
Un sistema no ortogonal sería como un helicóptero donde cambiar la velocidad puede cambiar la dirección.
En los lenguajes de programación, esto significa que cuando ejecuta una instrucción, nada más que esa instrucción sucede (muy importante para la depuración).
También hay un significado específico cuando se refiere a conjuntos de instrucciones .
Ortogonalidad en la programación:
La ortogonalidad es un concepto importante que aborda cómo se puede combinar un número relativamente pequeño de componentes en un número relativamente pequeño de formas para obtener los resultados deseados. Está asociado con la simplicidad; cuanto más ortogonal es el diseño, menos excepciones. Esto hace que sea más fácil aprender, leer y escribir programas en un lenguaje de programación. El significado de una característica ortogonal es independiente del contexto; los parámetros clave son simetría y consistencia (por ejemplo, un puntero es un concepto ortogonal).