De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

En la programación de computadoras , una de las muchas maneras en que los lenguajes de programación se clasifican coloquialmente es si el idioma del sistema de tipos hace que sea inflexible de tipos o tipos débiles ( sin apretar mecanografiado ). 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 lenguajes de programación convencionales.

Generalmente, un lenguaje fuertemente tipado tiene reglas de tipeo más estrictas en el momento de la compilación , lo que implica que es más probable que ocurran 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 los procedimientos y la llamada de funciones. Los lenguajes tipados dinámicamente (donde la verificación de tipos ocurre en tiempo de ejecución ) también se pueden tipear fuertemente. Tenga en cuenta que en los lenguajes de tipado dinámico, los valores tienen tipos, no variables.

Un lenguaje de tipado débil tiene reglas de tipeo 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. [1] Los defensores de los lenguajes de tipado dinámico (generalmente "de tipado débil") encuentran que tales preocupaciones son exageradas y creen que el tipado estático en realidad introduce un conjunto exponencialmente mayor de problemas e ineficiencias. [2] Un concepto diferente pero relacionado es la mecanografía latente .

Historia [ editar ]

En 1974, Liskov y S. Zilles definieron un lenguaje fuertemente tipado como aquel en el que "siempre que un objeto se 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 establecerá sus requisitos de comunicación en términos de estos tipos". [4]

Definiciones de "fuerte" o "débil" [ editar ]

Se ha hecho referencia a varias decisiones de diseño de lenguajes diferentes como evidencia de mecanografía "fuerte" o "débil". Muchos de éstos se entienden con más precisión como la presencia o ausencia de seguridad de tipo , la seguridad de memoria , tipo de comprobación estática , o dinámica tipo de comprobación .

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

Conversiones de tipos implícitas y "juegos de palabras con tipos" [ editar ]

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 "escritura 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 una tipificación débil. La conversión, por otro lado, crea un objeto completamente 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 el juego de palabras hace que el compilador realice optimizaciones inapropiadas . [6]

Hay muchos ejemplos de lenguajes que permiten conversiones de tipos implícitas , pero con seguridad de tipos. Por ejemplo, tanto C ++ como C # permiten a los programas definir operadores para convertir un valor de un tipo a otro de forma semánticamente significativa. 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.

Punteros [ editar ]

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 tipados", ya que la aritmética de punteros se puede utilizar para omitir el sistema de tipos del lenguaje.

Uniones no etiquetadas [ editar ]

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

Verificación de tipo estática [ editar ]

En Luca Cardelli artículo 's de programación con tipo , [7] un 'fuerte sistema de tipo' se describe como uno en el que no existe la posibilidad de un error de tipo de tiempo de ejecución sin marcar. En otras palabras, la ausencia de errores de tiempo de ejecución no comprobados se denomina seguridad o seguridad de tipo ; Los primeros documentos de Tony Hoare llaman a esta propiedad seguridad . [8]

Verificación dinámica de tipos [ editar ]

Algunos lenguajes de programación no tienen verificación de tipo estática. En muchos de estos lenguajes, es fácil escribir programas que serían rechazados por la mayoría de los verificadores de tipos estáticos. Por ejemplo, una variable puede almacenar un número o el valor booleano "falso".

Variación entre lenguajes de programación [ editar ]

Tenga en cuenta que algunas de estas definiciones son contradictorias, otras son meramente independientes desde el punto de vista conceptual y otras son casos especiales (con limitaciones adicionales) de otras definiciones más "liberales" (menos fuertes). Debido a la amplia divergencia entre estas definiciones, es posible defender afirmaciones acerca de la mayoría de los lenguajes de programación de que tienen una tipificación fuerte o débil. Por ejemplo:

  • Java , Pascal , Go , Ada y C requieren que todas las variables tengan un tipo declarado y admiten el uso de conversiones explícitas de valores aritméticos para otros tipos aritméticos. A veces se dice que Java, C #, Ada y Pascal tienen un tipo más fuerte que C, una afirmación que probablemente se basa en el hecho de que C admite más tipos de conversiones implícitas, y C también permite que los valores de puntero se emitan explícitamente mientras que Java y Pascal no hacer. Java en sí puede considerarse más fuertemente tipado que Pascal, ya que las formas de evadir el sistema de tipos estáticos en Java están controladas por la máquina virtual Java.sistema de tipos. C # y VB.NET son similares a Java en ese sentido, aunque permiten deshabilitar la verificación dinámica de tipos al poner explícitamente segmentos de código en un "contexto inseguro". El sistema de tipos de Pascal se ha descrito como "demasiado fuerte", porque el tamaño de una matriz o cadena es parte de su tipo, lo que dificulta mucho algunas tareas de programación. [9]
  • Smalltalk , Perl , Ruby , Python y Self están todos "fuertemente tipados" en el sentido de que los errores de tipeo se evitan en tiempo de ejecución y hacen poca conversión de tipo implícita , pero estos lenguajes no utilizan la verificación de tipos estáticos: el compilador no verifica o hacer cumplir las reglas de restricción de tipo. El término tipado de pato se utiliza ahora para describir el paradigma de tipado dinámico utilizado por los lenguajes de este grupo.
  • El Lisp familia de lenguas son todos "inflexible" en el sentido de que se evitan los errores de escritura en tiempo de ejecución. Algunos dialectos Lisp como Common Lisp o Clojure admiten varias formas de declaraciones de tipos [10] y algunos compiladores ( CMUCL [11] y relacionados) usan estas declaraciones junto con la inferencia de tipos para habilitar varias optimizaciones y también formas limitadas de comprobaciones de tipos en tiempo de compilación.
  • ML estándar , F # , OCaml , Haskell y Rust se verifican de forma estática, pero el compilador infiere automáticamente un tipo preciso para la mayoría de los valores.
  • Visual Basic es un lenguaje híbrido. Además de las variables con tipos declarados, también es posible declarar una variable de tipo de datos "Variante" que puede almacenar datos de cualquier tipo. Sus conversiones implícitas son bastante liberales donde, por ejemplo, se pueden sumar variantes de cadena y pasar el resultado a una variable entera. Visual Basic tiene un tipo débil.
  • El lenguaje ensamblador , Forth se puede caracterizar como sin tipo . No hay verificación de tipo; Depende del programador asegurarse de que los datos proporcionados a las funciones sean del tipo apropiado. Cualquier conversión de tipo requerida es explícita.
  • Tcl se puede caracterizar como de tipo manifiesto: el tipo de un valor se deriva exclusivamente de su representación, cuya evaluación depende del contexto.

Por esta razón, los escritores que desean escribir sin ambigüedades sobre sistemas de tipos a menudo evitan el término "tipificación fuerte" en favor de expresiones específicas como " seguridad de tipos ".

Ver también [ editar ]

  • El tipo de datos incluye una discusión más detallada de los problemas de mecanografía.
  • Comparación de lenguajes de programación
  • Escritura latente
  • Seguridad de la memoria
  • Diseño por contrato (mecanografía fuerte como formulario de contrato implícito)
  • Tipo de seguridad
  • Tipo de sistema

Referencias [ editar ]

  1. ^ "CS1130. Transición a la programación orientada a objetos. - Primavera de 2012 - versión autodirigida" . Universidad de Cornell, Departamento de Ciencias de la Computación. 2005. Archivado desde el original en 2005 . Consultado el 23 de noviembre de 2015 .
  2. ^ "La efectividad irrazonable de la tipificación dinámica para programas prácticos" . Vimeo . 12 de septiembre de 2013 . Consultado el 21 de marzo de 2021 .
  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 en informática. 54 . págs. 436–443. doi : 10.1007 / BFb0021435 . ISBN 3-540-08360-X.
  5. ^ Aahz. "Escritura: fuerte frente a débil, estático frente a dinámico" . Consultado el 16 de agosto de 2015 .
  6. ^ "Tipo de juego de palabras y alias estricto - Qt Blog" . Blog de Qt . Consultado el 18 de febrero de 2020 .
  7. ^ Luca Cardelli, "Programación tipográfica"
  8. ^ Hoare, CAR 1974. Sugerencias sobre el diseño de lenguajes de programación. En Computer Systems Reliability , ed. C. Bunyan. Vol. 20 págs. 505–534.
  9. ^ InfoWorld . 1983-04-25 . Consultado el 16 de agosto de 2015 .
  10. ^ "CLHS: Capítulo 4" . Consultado el 16 de agosto de 2015 .
  11. ^ "Manual del usuario de CMUCL: el compilador" . Archivado desde el original el 8 de marzo de 2016 . Consultado el 16 de agosto de 2015 .