stringtranslate.com

Operador (programación informática)

En programación de computadoras , los operadores son construcciones definidas dentro de los lenguajes de programación que se comportan generalmente como funciones , pero que difieren sintáctica o semánticamente .

Los ejemplos simples comunes incluyen aritmética (por ejemplo, suma con +), comparación (por ejemplo, " mayor que " con >) y operaciones lógicasAND (por ejemplo , también escritas &&en algunos idiomas). Los ejemplos más complicados incluyen la asignación (generalmente =o :=), el acceso a campos en un registro u objeto (generalmente .) y el operador de resolución de alcance (a menudo ::o .). Los lenguajes suelen definir un conjunto de operadores integrados y, en algunos casos, permiten a los usuarios agregar nuevos significados a los operadores existentes o incluso definir operadores completamente nuevos.

Sintaxis

Sintácticamente los operadores suelen contrastar con las funciones . En la mayoría de los idiomas, las funciones pueden verse como una forma especial de operador de prefijo con nivel de precedencia fijo y asociatividad, a menudo con paréntesis obligatorios, por ejemplo Func(a)(o (Func a)en Lisp ). La mayoría de los lenguajes admiten funciones definidas por el programador, pero en realidad no pueden pretender admitir operadores definidos por el programador, a menos que tengan más que una notación de prefijo y más de un nivel de precedencia. Semánticamente, los operadores pueden verse como una forma especial de función con notación de llamada diferente y un número limitado de parámetros (generalmente 1 o 2).

La posición del operador con respecto a sus operandos puede ser prefijo , infijo o postfijo , y la sintaxis de una expresión que involucra un operador depende de su aridad (número de operandos ), precedencia y (si corresponde), asociatividad . La mayoría de los lenguajes de programación admiten operadores binarios y algunos operadores unarios , y algunos admiten más operandos, como el operador ?: en C, que es ternario. Hay operadores unarios de prefijo, como menos unario -x, y operadores unarios de posfijo, como post-incremento x++ ; y las operaciones binarias son infijas, como x + yo x = y. Las operaciones infijas de mayor aridad requieren símbolos adicionales, como el operador ternario  ?: en C, escrito como a ? b : c– de hecho, dado que este es el único ejemplo común, a menudo se lo denomina operador ternario. Sin embargo, las operaciones de prefijo y sufijo pueden admitir cualquier aridad deseada, como por ejemplo 1 2 3 4 +.

Ocasionalmente, [1] [2] partes de un lenguaje pueden describirse como operadores " matchfix " o " circunfijo " [3] [4] , ya sea para simplificar la descripción o implementación del lenguaje. Un operador circunfijo consta de dos o más partes que encierran sus operandos. Los operadores circunfijos tienen la máxima prioridad, se evalúa su contenido y el valor resultante se utiliza en la expresión circundante. El operador circunfijo más familiar son los paréntesis mencionados anteriormente, que se utilizan para indicar qué partes de una expresión deben evaluarse antes que otras. Otro ejemplo de la física es la notación del producto interno de la notación de soporte de Dirac . Los operadores circunfijos son especialmente útiles para indicar operaciones que involucran muchos o diferentes números de operandos.

La especificación de un lenguaje especificará la sintaxis de los operadores que admite, mientras que los idiomas, como Prolog , que admiten operadores definidos por el programador, requieren que el programador defina la sintaxis.

Semántica

La semántica de los operadores depende particularmente del valor, la estrategia de evaluación y el modo de paso de argumentos (como el cortocircuito booleano). Simplemente, una expresión que involucra un operador se evalúa de alguna manera, y el valor resultante puede ser simplemente un valor (un valor r) o puede ser un objeto que permite la asignación (un valor l).

En casos simples, esto es idéntico a las llamadas a funciones habituales; por ejemplo, la suma x + ygeneralmente equivale a una llamada a una función add(x, y)y una comparación menor que x < ya lt(x, y), lo que significa que los argumentos se evalúan de la forma habitual, luego se evalúa alguna función y el resultado se devuelve como un valor. Sin embargo, la semántica puede ser significativamente diferente. Por ejemplo, en la asignación a = bel objetivo ano se evalúa, sino que su ubicación (dirección) se utiliza para almacenar el valor de b– correspondiente a la semántica de llamada por referencia . Además, una asignación puede ser una declaración (sin valor) o puede ser una expresión (valor), siendo el valor en sí un valor r (solo un valor) o un valor l (que se puede asignar). Como otro ejemplo, el operador de resolución de alcance  :: y el operador de acceso al elemento. (como en Foo::Baro a.b) no operan con valores, sino con nombres , esencialmente semántica de llamada por nombre , y su valor es un nombre.

El uso de valores l como operandos de operador es particularmente notable en operadores unarios de incremento y decremento . En C, por ejemplo, la siguiente declaración es legal y está bien definida, y depende del hecho de que la indexación de matrices devuelva un valor l:

x = ++ a [ yo ];  

Un uso importante es cuando un operador binario asociativo por la izquierda modifica su argumento izquierdo (o produce un efecto secundario ) y luego evalúa ese argumento como un valor l. [a] Esto permite una secuencia de operadores que afectan el argumento original, permitiendo una interfaz fluida , similar al método en cascada . Un ejemplo común es el <<operador de la biblioteca C++ iostream, que permite una salida fluida, de la siguiente manera:

cout << "Hola" << " " << "¡mundo!" << fin ;        

Operadores definidos por el usuario

Un lenguaje puede contener un número fijo de operadores integrados (por ejemplo , +, -, *, <, <=, !, = , etc. en C y C++ , PHP ), o puede permitir la creación de operadores definidos por el programador. (por ejemplo , Prólogo , [5] Seed7 , [6] F# , OCaml , Haskell ). Algunos lenguajes de programación restringen los símbolos de operador a caracteres especiales como + o := mientras que otros también permiten nombres como (por ejemplo, Pascal ).div

La mayoría de los lenguajes tienen un conjunto de operadores incorporado, pero no permiten operadores definidos por el usuario, ya que esto complica significativamente el análisis. [b] Muchos lenguajes solo permiten el uso de operadores para tipos integrados, pero otros permiten el uso de operadores existentes para tipos definidos por el usuario; esto se conoce como sobrecarga del operador . Sin embargo, algunos lenguajes permiten definir nuevos operadores, ya sea en tiempo de compilación o en tiempo de ejecución. Esto puede implicar metaprogramación (especificar los operadores en un idioma separado) o dentro del propio idioma. La definición de nuevos operadores, particularmente la definición en tiempo de ejecución, a menudo hace imposible el análisis estático correcto de los programas, ya que la sintaxis del lenguaje puede ser Turing completa, por lo que incluso construir el árbol de sintaxis puede requerir resolver el problema de detención, lo cual es imposible. Esto ocurre con Perl , por ejemplo, y algunos dialectos de Lisp .

Ejemplos

Ejemplos comunes que difieren sintácticamente son las operaciones aritméticas matemáticas , por ejemplo, ">" para " mayor que ", con nombres a menudo fuera del conjunto de identificadores de funciones del lenguaje y llamadas con una sintaxis diferente de la sintaxis del lenguaje para llamar a funciones. Como función, "mayor que" generalmente se denominaría mediante un identificador, como gto greater_thany se llamaría como función, como gt(x, y). En cambio, la operación utiliza el carácter especial >(que se tokeniza por separado durante el análisis léxico ) y notación infija, como x > y.

Ejemplos comunes que difieren semánticamente (por el modo de paso de argumentos) son las operaciones booleanas, que frecuentemente incluyen una evaluación de cortocircuito : por ejemplo, una conjunción de cortocircuito (X E Y) que sólo evalúa argumentos posteriores si los anteriores no son falsos, en un lenguaje con funciones estrictas de llamada por valor. En cambio, esto se comporta de manera similar a if/then/else.

Los operadores menos comunes incluyen:

Compilacion

Un compilador puede implementar operadores y funciones con llamadas a subrutinas o con código en línea . Algunos operadores integrados admitidos por un lenguaje tienen una asignación directa a una pequeña cantidad de instrucciones que se encuentran comúnmente en las unidades centrales de procesamiento , aunque otros ( por ejemplo , '+' usado para expresar concatenación de cadenas ) pueden tener implementaciones complicadas.

Sobrecarga del operador

En algunos lenguajes de programación, un operador puede ser polimórfico ad hoc , es decir, tener definiciones para más de un tipo de datos (como en Java , donde el +operador se usa tanto para la suma de números como para la concatenación de cadenas). Se dice que un operador así está sobrecargado . En lenguajes que admiten la sobrecarga de operadores por parte del programador (como C++ ) pero tienen un conjunto limitado de operadores, la sobrecarga de operadores se utiliza a menudo para definir usos personalizados para los operadores.

En el ejemplo , los operadores son: (mayor que) y (menor que).IF ORDER_DATE > "12/31/2011" AND ORDER_DATE < "01/01/2013" THEN CONTINUE ELSE STOP>AND<

Coerción de operando

Algunos lenguajes también permiten que los operandos de un operador se conviertan implícitamente, o se coaccionen , a tipos de datos adecuados para que se produzca la operación. Por ejemplo, en Perl las reglas de coerción conducen a 12 + "3.14"producir el resultado de 15.14. El texto "3.14"se convierte al número 3.14 antes de que se pueda realizar la adición. Además, 12es un número entero y 3.14es un número de punto flotante o de punto fijo (un número que tiene un lugar decimal), por lo que el número entero se convierte en un número de punto flotante o de punto fijo, respectivamente.

JavaScript sigue reglas opuestas: al encontrar la misma expresión anterior, convertirá el número entero 12en una cadena "12"y luego concatenará los dos operandos para formar "123.14".

En presencia de coerciones en un lenguaje, el programador debe conocer las reglas específicas con respecto a los tipos de operandos y el tipo de resultado de la operación para evitar errores de programación sutiles.

Funciones del operador en lenguajes de programación.

La siguiente tabla muestra las características del operador en varios lenguajes de programación:

Ver también

Notas

  1. ^ Por el contrario, un operador asociativo derecho con su argumento correcto, aunque esto es más raro.
  2. ^ La introducción de un nuevo operador cambia la especificación léxica del lenguaje, lo que cambia el análisis léxico . La aridad y precedencia del operador es entonces parte de la sintaxis de la frase del lenguaje, lo que cambia el análisis a nivel de frase. Por ejemplo, agregar un operador @requiere lexing y tokenización de este carácter, y la estructura de la frase (árbol de sintaxis) depende de la aridad y precedencia de este operador.

Referencias

  1. ^ "Formularios de entrada del operador: documentación de Wolfram Language". referencia.wolfram.com .
  2. ^ "Manual de Maxima 5.42.0: 7. Operadores". maxima.sourceforge.net .
  3. ^ "Operadores de prefijo, sufijo y circunfijo". mythryl.org .
  4. ^ "Operadores". doc.perl6.org .
  5. ^ "SWI-Prolog - op/3". www.swi-prolog.org .
  6. ^ "Declarar un operador". semilla7.sourceforge.net .
  7. ^ "PHP: Operadores de control de errores - Manual". php.net .
  8. ^ "Operadores". docs.perl6.org .
  9. ^ "Funciones". docs.perl6.org .
  10. ^ Goldberg, Adela. "Smalltalk-80: el lenguaje y su implementación, p. 27, ISBN 0-201-11371-6" (PDF) .