stringtranslate.com

Escritura fuerte y débil

En programación de computadoras , una de las muchas formas en que los lenguajes de programación se clasifican coloquialmente es si el sistema de tipos del lenguaje lo hace fuertemente tipado o débilmente tipado ( tipo flexible ). Sin embargo, no existe una definición técnica precisa de lo que significan los términos y diferentes autores no están de acuerdo sobre el significado implícito de los términos y las clasificaciones relativas de la "fuerza" de los sistemas de tipos de los principales lenguajes de programación. [1] Por esta razón, los escritores que desean escribir sin ambigüedades sobre sistemas de tipos a menudo evitan los términos "tipificación fuerte" y "tipificación débil" en favor de expresiones específicas como " seguridad de tipos ".

Generalmente, un lenguaje fuertemente tipado tiene reglas de escritura más estrictas en el momento de la compilación , lo que implica que es más probable que se produzcan errores y excepciones durante la compilación. La mayoría de estas reglas afectan la asignación de variables, los valores de retorno de funciones, los argumentos de procedimientos y las llamadas a funciones. Los lenguajes tipados dinámicamente (donde la verificación de tipos ocurre en tiempo de ejecución ) también se pueden tipificar fuertemente. En los lenguajes de tipado dinámico, los valores, en lugar de las variables, tienen tipos.

Un lenguaje de tipo débil tiene reglas de escritura más flexibles y puede producir resultados impredecibles o incluso erróneos o puede realizar una conversión de tipo implícita en tiempo de ejecución. [2] Un concepto diferente pero relacionado es el de tipificación latente .

Historia

En 1974, Barbara Liskov y Stephen Zilles definieron un lenguaje fuertemente tipado como aquel en el que "cada vez que un objeto pasa de una función que llama a una función llamada, su tipo debe ser compatible con el tipo declarado en la función llamada". [3] En 1977, K. Jackson escribió: "En un lenguaje fuertemente tipado, cada área de datos tendrá un tipo distinto y cada proceso indicará sus requisitos de comunicación en términos de estos tipos". [4]

Definiciones de "fuerte" o "débil"

Se ha hecho referencia a varias decisiones diferentes de diseño de lenguaje como evidencia de tipificación "fuerte" o "débil". Muchos de estos se entienden con mayor precisión como la presencia o ausencia de seguridad de tipos , seguridad de memoria , verificación de tipos estática o verificación de tipos dinámica .

"Tipo fuerte" generalmente se refiere al uso de tipos de lenguajes de programación para capturar invariantes del código y garantizar su corrección, y definitivamente excluir ciertas clases de errores de programación. Por lo tanto, existen muchas disciplinas de "tipificación fuerte" que se utilizan para lograr estos objetivos.

Conversiones de tipos implícitas y "juegos de palabras de tipos"

Algunos lenguajes de programación facilitan el uso de un valor de un tipo como si fuera un valor de otro tipo. Esto a veces se describe como "tipificación débil".

Por ejemplo, Aahz Maruch observa que " la coerción ocurre cuando tienes un lenguaje escrito estáticamente y usas las características sintácticas del lenguaje para forzar el uso de un tipo como si fuera un tipo diferente (considera el uso común de void* en C ). La coerción suele ser un síntoma de tipificación débil, por otro lado, la conversión crea un objeto nuevo del tipo apropiado". [5]

Como otro ejemplo, GCC describe esto como un juego de palabras y advierte que romperá el alias estricto . Thiago Macieira analiza varios problemas que pueden surgir cuando los juegos de palabras hacen que el compilador realice optimizaciones inapropiadas . [6]

Hay muchos ejemplos de lenguajes que permiten conversiones de tipos implícitas , pero de forma segura. Por ejemplo, tanto C++ como C# permiten que los programas definan operadores para convertir un valor de un tipo a otro con una semántica bien definida. Cuando un compilador de C++ encuentra tal conversión, trata la operación como una llamada a función. Por el contrario, convertir un valor al tipo C void* es una operación insegura que es invisible para el compilador.

Consejos

Algunos lenguajes de programación exponen punteros como si fueran valores numéricos y permiten a los usuarios realizar operaciones aritméticas con ellos. Estos lenguajes a veces se denominan "débilmente tipificados", ya que la aritmética de punteros se puede utilizar para evitar el sistema de tipos del lenguaje.

Sindicatos sin etiquetar

Algunos lenguajes de programación admiten uniones sin etiquetar , que permiten ver un valor de un tipo como si fuera un valor de otro tipo.

Comprobación de tipo estática

En el artículo Typeful Programming de Luca Cardelli , [7] un "sistema de tipos fuertes" se describe como aquel en el que no hay posibilidad de que se produzca un error de tipo en tiempo de ejecución sin comprobar. En otros escritos, la ausencia de errores de tiempo de ejecución no verificados se denomina seguridad o seguridad de tipo ; Los primeros artículos de Tony Hoare llaman a esto seguridad de propiedad . [8]

Variación entre lenguajes de programación.

Algunas de estas definiciones son contradictorias, otras son meramente conceptualmente independientes y otras son casos especiales (con restricciones adicionales) de otras definiciones más "liberales" (menos estrictas). Debido a la amplia divergencia entre estas definiciones, es posible defender afirmaciones sobre la mayoría de los lenguajes de programación de que están fuertemente o débilmente tipificados. Por ejemplo:

Ver también

Referencias

  1. ^ "Qué saber antes de debatir sobre sistemas tipográficos | Ovidio [blogs.perl.org]". blogs.perl.org . Consultado el 27 de junio de 2023 .
  2. ^ "CS1130. Transición a la programación OO. - Primavera de 2012: versión a su propio ritmo". Universidad de Cornell, Departamento de Ciencias de la Computación. 2005. Archivado desde el original el 23 de noviembre de 2015 . Consultado el 23 de noviembre de 2015 .{{cite web}}: Mantenimiento CS1: bot: estado de la URL original desconocido ( enlace )
  3. ^ Liskov, B; Zilles, S (1974). "Programación con tipos de datos abstractos". Avisos ACM SIGPLAN . 9 (4): 50–59. CiteSeerX 10.1.1.136.3043 . doi :10.1145/942572.807045. 
  4. ^ Jackson, K. (1977). "Procesamiento paralelo y construcción de software modular". Diseño e Implementación de Lenguajes de Programación . Apuntes de conferencias sobre informática. vol. 54, págs. 436–443. doi :10.1007/BFb0021435. ISBN 3-540-08360-X.
  5. ^ Ahz. "Mecanografía: fuerte versus débil, estática versus dinámica" . Consultado el 16 de agosto de 2015 .
  6. ^ "Juegos de palabras tipográficos y alias estrictos - Blog Qt". Blog de Qt . Consultado el 18 de febrero de 2020 .
  7. ^ Luca Cardelli, "Programación tipográfica"
  8. ^ Hoare, CAR 1974. Consejos sobre el diseño de lenguajes de programación. En Confiabilidad de los sistemas informáticos , ed. C. Bunyan. vol. 20 págs. 505–534.
  9. ^ Mundo de la información. 1983-04-25 . Consultado el 16 de agosto de 2015 .
  10. ^ Kernighan, Brian (1981). "Por qué Pascal no es mi lenguaje de programación favorito". Archivado desde el original el 6 de abril de 2012 . Consultado el 22 de octubre de 2011 .
  11. ^ "CLHS: Capítulo 4" . Consultado el 16 de agosto de 2015 .
  12. ^ "Manual del usuario de CMUCL: el compilador". Archivado desde el original el 8 de marzo de 2016 . Consultado el 16 de agosto de 2015 .