fbpx
Wikipedia

Aserción (informática)

En programación, una aserción es un predicado (i.e., una sentencia verdadero-falso) incluido en un programa como indicación de que el programador piensa que dicho predicado siempre se cumple en ese punto del flujo de programa.

Usos

Las aserciones suelen ser útiles para especificar programas y para razonar la corrección de los mismos.

Por ejemplo, el siguiente código contiene dos aserciones:

x := 5; {x > 0} x := x + 1 {x > 1} 

x > 0 y x > 1, y las dos son ciertas en dichos puntos de la ejecución.

Otro ejemplo: una precondición — una aserción al comienzo de una sección de código — determina que se espera que el conjunto de sentencias que la siguen sean ejecutadas. Una postcondición — colocada al final — describe el estado que se espera alcanzar al final de la ejecución.

El ejemplo anterior utiliza la notación introducida por C. A. R. Hoare en su artículo de 1969 "An axiomatic basis for computer programming" ("Una base axiomática para la programación de ordenadores"). Como esta notación normalmente no es aceptada por los compiladores de los lenguajes actuales, los programadores suelen incluir aserciones mediante comentarios. A continuación se incluye un ejemplo en C:

x = 5; /*  {x > 0} */ x = x + 1; /*  {x > 1} */ 

Se han incluido las llaves para distinguir este uso de los comentarios de su uso habitual.

Varios lenguajes de programación modernos incluyen una sentencia de aserción, que no es más que una aserción que se comprueba en tiempo de ejecución. Si su evaluación resulta falsa, se produce un "error de aserción". La intención de estas sentencias de aserción es facilitar la depuración del programa, evitando que dicho fallo quede sin comprobar.

El uso de aserciones ayuda al programador en las tareas de diseño, desarrollo y razonamiento de un programa.

Tipos de aserciones

En lenguajes como Eiffel, las aserciones son parte del proceso de diseño, mientras que en otros, como C o Java, solamente son utilizadas para comprobar suposiciones en tiempo de ejecución.[cita requerida]

Aserciones en el diseño por contrato

Las aserciones pueden ser una forma de documentación: pueden describir el estado en que el código empieza su ejecución (precondición), y el estado que el código espera alcanzar cuando finalice (postcondición); asimismo pueden servir de especificación para los invariantes de clase. En Eiffel, tales aserciones se integran en el código y son automáticamente extraídas para documentar la clase. Esto supone una parte importante del método de diseño por contrato.

Esta aproximación también resulta útil en lenguajes que no las soportan explícitamente: la ventaja de usar sentencias de aserción en lugar de aserciones en comentarios es que las primeras pueden ser comprobadas en cada ejecución; si la aserción no se cumple, puede informarse del error. Esto previene que el código y las aserciones se desfasen (un problema que puede ocurrir con las aserciones comentadas).

Aserciones en tiempo de ejecución

Una aserción puede ser utilizada para verificar que una suposición hecha por el programador durante la implementación del programa sigue siendo válida durante la ejecución del programa. Por ejemplo, considérese el siguiente código en Java:

 int total = contarUsuarios(); if (total % 2 == 0) { // total es par } else { // total es impar assert(total % 2 == 1); } 

En Java, % es el operador resto (módulo) — si el primer operando es negativo, el resultado puede ser también negativo, Aquí, el programador ha asumido que la variable total no es negativa, así que el resto de una división entre 2 siempre será 0 o 1. La aserción explicita esta suposición — si contarUsuarios devuelve un valor negativo, es probable que haya un fallo en el programa.[cita requerida]

Una gran ventaja de esta técnica es que cuando se produce algún error este es inmediata y directamente detectado, evitando posibles daños colaterales ocultos. Puesto que un error de aserción normalmente informa de la línea de código donde se produce, se puede localizar el error sin necesidad de una depuración más exhaustiva.

Las aserciones también suelen colocarse en puntos que se supone que no se alcanzan durante la ejecución. Por ejemplo, las aserciones pueden ser colocadas en la cláusula default de una estructura switch en lenguajes como C, C++ y Java. Los casos que intencionadamente no se manejan pueden provocar errores que aborten el programa.

En Java, las aserciones han sido parte del lenguaje desde la versión 1.4. Los errores de aserción resultan en AssertionError cuando el prorgama es ejecutado con los parámetros correctos, sin los cuales las sentencias de aserción son ignoradas. En C y C++, son añadidas por el fichero de cabeceras estándar assert.h definiendo assert (aserción) como una macro que devuelve un error en caso de fallo y finaliza el programa.

Las inclusión en los lenguajes de construcciones de aserción facilitan el desarrollo guiado por pruebas (Test-driven Development - TDD) al no necesitar de una librería independiente que implemente dichas aserciones.

Aserciones durante el ciclo de desarrollo

Durante el ciclo de desarrollo, el programador normalmente ejecuta su programa con las aserciones activadas. Cuando una aserción resulta falsa y se produce el correspondiente error, el programador automáticamente recibe un aviso. Muchas implementaciones además detienen la ejecución del programa — esto resulta útil ya que si el programa sigue ejecutándose tras la violación de una aserción, este entra en un estado corrupto que puede hacer más difícil la localización del problema.[cita requerida] Gracias a la información proporcionada por el error de aserción (punto del código que ha provocado el fallo, quizás el stack trace o incluso todo el contexto de la aserción violada), el programador puede corregir el problema. De este modo, las aserciones sirven como potente herramienta de depuración.

Aserciones estáticas

Las aserciones que son comprobadas en tiempo de compilación reciben el nombre de aserciones estáticas. Este tipo de aserciones resultan particularmente útiles en la metaprogramación de plantillas.

Desactivación de las aserciones

Las aserciones suelen ser implementadas de modo que puedan ser activadas o desactivadas, normalmente en el conjunto del programa. Sin embargo, los lenguajes que distinguen entre distintos tipos de aserciones – p.ej. pre y postcondiciones – suelen permitir activarlas o desactivarlas de forma independiente. Si las aserciones son desactivadas, no se comprueban en tiempo de ejecución. De esta forma el programador puede colocar aserciones en lugares donde en otro caso no tendría sentido ponerlas (p.ej., comprobar que no se accede a un array mediante índices fuera de rango). Puesto que las aserciones son en principio una herramienta de desarrollo, normalmente son desactivadas cuando el programa en cuestión es publicado. Por otra parte, como algunas versiones del programa pueden incluir aserciones y otras no, es primordial que su desactivación no modifique el comportamiento del programa. En otras palabras, las aserciones deben ser libres de efectos colaterales. Una alternativa en el caso de C o C++ es redefinir la macro assert para evaluar la expresión incluso cuando las aserciones están desactivadas.

La eliminación de las aserciones del código de producción es un proceso que se realiza de forma casi automática. Normalmente se realiza mediante compilación condicional, por ejemplo utilizando el preprocesador de C o C++ o pasando un parámetro de ejecución, como en Java. Algunas personas, sin embargo, se oponen a la eliminación de las aserciones basándose en una analogía que compara la ejecución con aserciones y sin ellas en la fase de desarrollo con la práctica de la natación en una piscina con la vigilancia de un socorrista para después nadar solo en el mar. Asimismo añaden que las aserciones también ayudan a desarrollar un programa a prueba de fallos.

Comparación con los manejadores de errores

Es importante establecer las semejanzas y diferencias entre las aserciones y las rutinas de control de errores. Las aserciones deberían ser utilizadas para documentar situaciones lógicamente imposibles y descubrir posibles errores de programación— si ese "imposible" ocurre, es que algo fundamental está claramente equivocado. Esto difiere del control de errores: la mayoría de las condiciones de error son posibles, aunque deberían ser muy poco probables en la práctica. El uso de aserciones como mecanismo general de control de errores suele ser algo desacertado: las aserciones no permiten al programa recuperarse de los errores, y un fallo de aserción suele suponer una terminación abrupta del programa. Asimismo las aserciones no suelen mostrar mensajes de error comprensibles por el usuario.

Considérese el siguiente ejemplo de uso de aserciones para manejar un error:

 int *ptr = malloc(sizeof(int) * 10);  assert(ptr != NULL);  // usar ptr 

Aquí, el programador advierte que malloc puede devolver un puntero a NULL si no resulta posible realizar la asignación de memoria. Esto es posible: el sistema operativo no garantiza que cada llamada a malloc termine con éxito, y el programa debe estar preparado para manejar el error. Una aserción quizás no es la mejor elección en este caso, ya que un error causado por malloc no es lógicamente imposible — es una posibilidad legítima, aunque no es muy común que suceda. En este ejemplo, es cierto que la aserción resulta útil, aclarando que el programador ha decidido de forma deliberada no construir una rutina robusta de control de errores de asignación de memoria.

El programador también puede decidirse por una utilización mixta de aserciones y rutinas estándar de control de errores para un mismo problema. Esto es útil en situaciones donde el programador quiere recibir aviso inmediato del error, pero con la seguridad de que será manejado de forma correcta en situaciones reales de explotación del programa. En el ejemplo anterior, esto supondría añadir una rutina de control de errores, pero también habría que mantener la aserción para que el programador supiese del fallo de memoria durante el proceso de depuración. Esto permite al programador localizar errores de forma más sencilla, lo que a su vez hará que el usuario final pueda ejecutar el programa sin recibir mensajes de error innecesarios. Esta táctica solamente resulta útil cuando el error especificado no supone la terminación abrupta del programa o afecte a los datos que este maneja, sino que hará que el programa siga funcionando aunque sea más lentamente o de forma menos eficiente.

Enlaces externos

  • Hoare, C. A. R. (2001). . research.microsoft.com. Archivado desde el original el 27 de diciembre de 2007. 
  • . java.sun.com. Archivado desde el original el 23 de febrero de 2008. 
  • «Using Assertions». java.sun.com. Artículo técnico. 
  •   Datos: Q741248

aserción, informática, programación, aserción, predicado, sentencia, verdadero, falso, incluido, programa, como, indicación, programador, piensa, dicho, predicado, siempre, cumple, punto, flujo, programa, Índice, usos, tipos, aserciones, aserciones, diseño, co. En programacion una asercion es un predicado i e una sentencia verdadero falso incluido en un programa como indicacion de que el programador piensa que dicho predicado siempre se cumple en ese punto del flujo de programa Indice 1 Usos 2 Tipos de aserciones 2 1 Aserciones en el diseno por contrato 2 2 Aserciones en tiempo de ejecucion 2 3 Aserciones durante el ciclo de desarrollo 2 4 Aserciones estaticas 3 Desactivacion de las aserciones 4 Comparacion con los manejadores de errores 5 Enlaces externosUsos EditarLas aserciones suelen ser utiles para especificar programas y para razonar la correccion de los mismos Por ejemplo el siguiente codigo contiene dos aserciones x 5 x gt 0 x x 1 x gt 1 x gt 0 y x gt 1 y las dos son ciertas en dichos puntos de la ejecucion Otro ejemplo una precondicion una asercion al comienzo de una seccion de codigo determina que se espera que el conjunto de sentencias que la siguen sean ejecutadas Una postcondicion colocada al final describe el estado que se espera alcanzar al final de la ejecucion El ejemplo anterior utiliza la notacion introducida por C A R Hoare en su articulo de 1969 An axiomatic basis for computer programming Una base axiomatica para la programacion de ordenadores Como esta notacion normalmente no es aceptada por los compiladores de los lenguajes actuales los programadores suelen incluir aserciones mediante comentarios A continuacion se incluye un ejemplo en C x 5 x gt 0 x x 1 x gt 1 Se han incluido las llaves para distinguir este uso de los comentarios de su uso habitual Varios lenguajes de programacion modernos incluyen una sentencia de asercion que no es mas que una asercion que se comprueba en tiempo de ejecucion Si su evaluacion resulta falsa se produce un error de asercion La intencion de estas sentencias de asercion es facilitar la depuracion del programa evitando que dicho fallo quede sin comprobar El uso de aserciones ayuda al programador en las tareas de diseno desarrollo y razonamiento de un programa Tipos de aserciones EditarEn lenguajes como Eiffel las aserciones son parte del proceso de diseno mientras que en otros como C o Java solamente son utilizadas para comprobar suposiciones en tiempo de ejecucion cita requerida Aserciones en el diseno por contrato Editar Las aserciones pueden ser una forma de documentacion pueden describir el estado en que el codigo empieza su ejecucion precondicion y el estado que el codigo espera alcanzar cuando finalice postcondicion asimismo pueden servir de especificacion para los invariantes de clase En Eiffel tales aserciones se integran en el codigo y son automaticamente extraidas para documentar la clase Esto supone una parte importante del metodo de diseno por contrato Esta aproximacion tambien resulta util en lenguajes que no las soportan explicitamente la ventaja de usar sentencias de asercion en lugar de aserciones en comentarios es que las primeras pueden ser comprobadas en cada ejecucion si la asercion no se cumple puede informarse del error Esto previene que el codigo y las aserciones se desfasen un problema que puede ocurrir con las aserciones comentadas Aserciones en tiempo de ejecucion Editar Una asercion puede ser utilizada para verificar que una suposicion hecha por el programador durante la implementacion del programa sigue siendo valida durante la ejecucion del programa Por ejemplo considerese el siguiente codigo en Java int total contarUsuarios if total 2 0 total es par else total es impar assert total 2 1 En Java es el operador resto modulo si el primer operando es negativo el resultado puede ser tambien negativo Aqui el programador ha asumido que la variable total no es negativa asi que el resto de una division entre 2 siempre sera 0 o 1 La asercion explicita esta suposicion si contarUsuarios devuelve un valor negativo es probable que haya un fallo en el programa cita requerida Una gran ventaja de esta tecnica es que cuando se produce algun error este es inmediata y directamente detectado evitando posibles danos colaterales ocultos Puesto que un error de asercion normalmente informa de la linea de codigo donde se produce se puede localizar el error sin necesidad de una depuracion mas exhaustiva Las aserciones tambien suelen colocarse en puntos que se supone que no se alcanzan durante la ejecucion Por ejemplo las aserciones pueden ser colocadas en la clausula default de una estructura switch en lenguajes como C C y Java Los casos que intencionadamente no se manejan pueden provocar errores que aborten el programa En Java las aserciones han sido parte del lenguaje desde la version 1 4 Los errores de asercion resultan en AssertionError cuando el prorgama es ejecutado con los parametros correctos sin los cuales las sentencias de asercion son ignoradas En C y C son anadidas por el fichero de cabeceras estandar a href Assert h html title Assert h assert h a definiendo assert i asercion i como una macro que devuelve un error en caso de fallo y finaliza el programa Las inclusion en los lenguajes de construcciones de asercion facilitan el desarrollo guiado por pruebas Test driven Development TDD al no necesitar de una libreria independiente que implemente dichas aserciones Aserciones durante el ciclo de desarrollo Editar Durante el ciclo de desarrollo el programador normalmente ejecuta su programa con las aserciones activadas Cuando una asercion resulta falsa y se produce el correspondiente error el programador automaticamente recibe un aviso Muchas implementaciones ademas detienen la ejecucion del programa esto resulta util ya que si el programa sigue ejecutandose tras la violacion de una asercion este entra en un estado corrupto que puede hacer mas dificil la localizacion del problema cita requerida Gracias a la informacion proporcionada por el error de asercion punto del codigo que ha provocado el fallo quizas el stack trace o incluso todo el contexto de la asercion violada el programador puede corregir el problema De este modo las aserciones sirven como potente herramienta de depuracion Aserciones estaticas Editar Las aserciones que son comprobadas en tiempo de compilacion reciben el nombre de aserciones estaticas Este tipo de aserciones resultan particularmente utiles en la metaprogramacion de plantillas Desactivacion de las aserciones EditarLas aserciones suelen ser implementadas de modo que puedan ser activadas o desactivadas normalmente en el conjunto del programa Sin embargo los lenguajes que distinguen entre distintos tipos de aserciones p ej pre y postcondiciones suelen permitir activarlas o desactivarlas de forma independiente Si las aserciones son desactivadas no se comprueban en tiempo de ejecucion De esta forma el programador puede colocar aserciones en lugares donde en otro caso no tendria sentido ponerlas p ej comprobar que no se accede a un array mediante indices fuera de rango Puesto que las aserciones son en principio una herramienta de desarrollo normalmente son desactivadas cuando el programa en cuestion es publicado Por otra parte como algunas versiones del programa pueden incluir aserciones y otras no es primordial que su desactivacion no modifique el comportamiento del programa En otras palabras las aserciones deben ser libres de efectos colaterales Una alternativa en el caso de C o C es redefinir la macro assert para evaluar la expresion incluso cuando las aserciones estan desactivadas La eliminacion de las aserciones del codigo de produccion es un proceso que se realiza de forma casi automatica Normalmente se realiza mediante compilacion condicional por ejemplo utilizando el preprocesador de C o C o pasando un parametro de ejecucion como en Java Algunas personas sin embargo se oponen a la eliminacion de las aserciones basandose en una analogia que compara la ejecucion con aserciones y sin ellas en la fase de desarrollo con la practica de la natacion en una piscina con la vigilancia de un socorrista para despues nadar solo en el mar Asimismo anaden que las aserciones tambien ayudan a desarrollar un programa a prueba de fallos Comparacion con los manejadores de errores EditarEs importante establecer las semejanzas y diferencias entre las aserciones y las rutinas de control de errores Las aserciones deberian ser utilizadas para documentar situaciones logicamente imposibles y descubrir posibles errores de programacion si ese imposible ocurre es que algo fundamental esta claramente equivocado Esto difiere del control de errores la mayoria de las condiciones de error son posibles aunque deberian ser muy poco probables en la practica El uso de aserciones como mecanismo general de control de errores suele ser algo desacertado las aserciones no permiten al programa recuperarse de los errores y un fallo de asercion suele suponer una terminacion abrupta del programa Asimismo las aserciones no suelen mostrar mensajes de error comprensibles por el usuario Considerese el siguiente ejemplo de uso de aserciones para manejar un error int ptr malloc sizeof int 10 assert ptr NULL usar ptr Aqui el programador advierte que malloc puede devolver un puntero a NULL si no resulta posible realizar la asignacion de memoria Esto es posible el sistema operativo no garantiza que cada llamada a malloc termine con exito y el programa debe estar preparado para manejar el error Una asercion quizas no es la mejor eleccion en este caso ya que un error causado por malloc no es logicamente imposible es una posibilidad legitima aunque no es muy comun que suceda En este ejemplo es cierto que la asercion resulta util aclarando que el programador ha decidido de forma deliberada no construir una rutina robusta de control de errores de asignacion de memoria El programador tambien puede decidirse por una utilizacion mixta de aserciones y rutinas estandar de control de errores para un mismo problema Esto es util en situaciones donde el programador quiere recibir aviso inmediato del error pero con la seguridad de que sera manejado de forma correcta en situaciones reales de explotacion del programa En el ejemplo anterior esto supondria anadir una rutina de control de errores pero tambien habria que mantener la asercion para que el programador supiese del fallo de memoria durante el proceso de depuracion Esto permite al programador localizar errores de forma mas sencilla lo que a su vez hara que el usuario final pueda ejecutar el programa sin recibir mensajes de error innecesarios Esta tactica solamente resulta util cuando el error especificado no supone la terminacion abrupta del programa o afecte a los datos que este maneja sino que hara que el programa siga funcionando aunque sea mas lentamente o de forma menos eficiente Enlaces externos EditarHoare C A R 2001 Assertions a personal perspective research microsoft com Archivado desde el original el 27 de diciembre de 2007 Programming With Assertions in Java java sun com Archivado desde el original el 23 de febrero de 2008 Using Assertions java sun com Articulo tecnico Datos Q741248 Obtenido de https es wikipedia org w index php title Asercion informatica amp oldid 131111278, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos