En lógica matemática y ciencias de la computación , algunas teorías de tipos y sistemas de tipos incluyen un tipo superior que comúnmente se denota con top o el símbolo ⊤. El tipo superior a veces se denomina también tipo universal , o supertipo universal, ya que todos los demás tipos del sistema de tipos de interés son subtipos del mismo y, en la mayoría de los casos, contiene todos los objetos posibles del sistema de tipos. Está en contraste con el tipo de fondo , o el subtipo universal , del cual todos los demás tipos son supertipos y, a menudo, el tipo no contiene miembros en absoluto.
Soporte en lenguajes de programación
Varios lenguajes de programación mecanografiados brindan soporte explícito para el tipo superior.
En los lenguajes de tipado estático , hay dos conceptos diferentes, a menudo confusos, cuando se habla del tipo superior.
- Una clase base universal u otro elemento en la parte superior de una jerarquía de clases de tiempo de ejecución (a menudo relevante en la programación orientada a objetos ) o jerarquía de tipos ; A menudo es posible crear objetos con este tipo (tiempo de ejecución), o se puede encontrar cuando se examina la jerarquía de tipos mediante programación, en lenguajes que la admiten.
- Un tipo estático ( tiempo de compilación ) en el código a cuyas variables se les puede asignar cualquier valor (o un subconjunto del mismo, como cualquier valor de puntero de objeto), similar a la escritura dinámica
El primer concepto a menudo implica el segundo, es decir, si existe una clase base universal, entonces una variable que puede apuntar a un objeto de esta clase también puede apuntar a un objeto de cualquier clase. Sin embargo, varios lenguajes tienen tipos en el segundo aspecto anterior (por ejemplo, void *
en C ++, id
en Objective-C, interface {}
en Go), tipos estáticos cuyas variables pueden aceptar cualquier valor de objeto, pero que no reflejan los tipos de tiempo de ejecución real que un objeto puede tener. en el sistema de tipos, por lo que no son tipos superiores en el primer aspecto.
En los lenguajes de tipado dinámico, el segundo concepto no existe (de todos modos, se puede asignar cualquier valor a cualquier variable), por lo que solo se discute el primero (jerarquía de clases). Este artículo intenta quedarse con el primer concepto cuando se habla de los tipos principales, pero también menciona el segundo concepto en los idiomas en los que es significativo.
Nombre | Idiomas |
---|---|
Object | Smalltalk , JavaScript , Ruby (pre-1.9.2), [1] y algunos otros. |
java.lang.Object | Java . A menudo se escribe sin el prefijo del paquete, como Object . Además, es no un supertipo de los tipos primitivos; sin embargo, desde Java 1.5, el autoboxing permite la conversión de tipo implícita o explícita de un valor primitivo a Object , por ejemplo,((Object)42).toString() |
System.Object [2] | C # , Visual Basic .NET y otros lenguajes de .NET Framework |
std::any | C ++ desde C ++ 17 |
object | Python desde la unificación de tipo / clase [3] en la versión 2.2 (solo objetos de estilo nuevo; los objetos de estilo antiguo en 2.x carecen de esto como clase base) |
TObject | Objeto Pascal |
t | Lisp , muchos dialectos como Common Lisp |
Any? | Kotlin [4] |
Any | Scala , [5] Swift , [6] Julia [7] |
ANY | Eiffel [8] |
UNIVERSAL | Perl 5 |
Variant | Visual Basic hasta la versión 6 |
interface{} | Ir |
BasicObject | Ruby (versión 1.9.2 y posteriores) |
any y unknown [9] | TypeScript ( unknown habiendo sido introducido en la versión 3.0 [10] ) |
mixed | PHP (a partir de la versión 8.0) |
Los siguientes lenguajes orientados a objetos no tienen una clase base universal:
- C ++ . El puntero al tipo void puede aceptar cualquier puntero que no sea de función, aunque el tipo void en sí no es el tipo universal sino el tipo de unidad . Desde C ++ 17, la biblioteca estándar proporciona el tipo superior
std::any
. - Objetivo-C . Es posible crear una nueva clase base sin especificar una clase principal para una clase, aunque esto es muy inusual.
Object
se utiliza convencionalmente como clase base en los tiempos de ejecución originales de Objective-C. En las bibliotecas OpenStep y Cocoa Objective-C,NSObject
es convencionalmente la clase base universal. El tipo superior de punteros a objetos esid
. - Rápido . Es posible crear una nueva clase base sin especificar una clase principal para una clase. El protocolo
Any
puede aceptar cualquier tipo.
Otros idiomas
Los lenguajes que no están orientados a objetos generalmente no tienen supertipo universal o soporte de polimorfismo de subtipo.
Si bien Haskell carece de subtipificación a propósito, tiene varias otras formas de polimorfismo, incluido el polimorfismo paramétrico . El parámetro de clase de tipo más genérico es un parámetro a
sin restricciones (sin una restricción de clase de tipo ). En Rust ,
es el parámetro más genérico (
no lo es, ya que implica el Sized
rasgo por defecto).
El tipo superior se utiliza como tipo genérico , más aún en lenguajes sin polimorfismo paramétrico . Por ejemplo, antes de introducir genéricos en Java 5 , las clases de colección en la biblioteca de Java (excluyendo las matrices de Java) contenían referencias de tipo Object
. De esta forma, cualquier tipo no intrínseco podría insertarse en una colección. El tipo superior también se usa a menudo para sujetar objetos de tipo desconocido.
El tipo superior también puede verse como el tipo implícito de lenguajes no tipados estáticamente. Los lenguajes con mecanografía en tiempo de ejecución a menudo proporcionan reducción (o refinamiento de tipo ) para permitir descubrir un tipo más específico para un objeto en tiempo de ejecución. En C ++, el downcasting de void *
no se puede realizar de una manera segura , donde los downcasts fallidos son detectados por el tiempo de ejecución del lenguaje.
En lenguajes con un sistema de tipo estructural , la estructura vacía sirve como tipo superior. Por ejemplo, los objetos en OCaml se escriben estructuralmente; el tipo de objeto vacío (el tipo de objetos sin métodos) < >
, es el tipo superior de tipos de objeto. Cualquier objeto OCaml puede actualizarse explícitamente a este tipo, aunque el resultado no sería de utilidad. Go también usa tipificación estructural; y todos los tipos implementan la interfaz vacía:, interface {}
que no tiene métodos, pero aún puede volver a un tipo más específico.
En lógica
La noción de top también se encuentra en el cálculo proposicional , correspondiente a una fórmula que es verdadera en todas las interpretaciones posibles. Tiene un significado similar en el cálculo de predicados . En la lógica de descripción , top se utiliza para hacer referencia al conjunto de todos los conceptos. Esto es intuitivamente como el uso del tipo superior en lenguajes de programación. Por ejemplo, en Web Ontology Language (OWL), que admite varias lógicas de descripción, top corresponde a la clase owl:Thing
, donde todas las clases son subclases de owl:Thing
. (el tipo de fondo o conjunto vacío corresponde a owl:Nothing
).
Ver también
- Jerarquía de raíz única
Notas
- ^ "Clase: BasicObject (Ruby 1.9.2)" . Consultado el 7 de abril de 2014 .
- ^ System.Object
- ^ Unificación de tipo / clase de Python
- ^ Matilla, Hugo (27 de febrero de 2019). "Conceptos básicos de Kotlin: tipos. Cualquiera, Unidad y Nada" . Medio . Consultado el 16 de septiembre de 2019 .
- ^ "Una descripción general del lenguaje de programación Scala" (PDF) . 2006 . Consultado el 7 de abril de 2014 .
- ^ "Tipos - El lenguaje de programación Swift (Swift 5.3)" . docs.swift.org . Consultado el 2 de noviembre de 2020 .
- ^ "Tipos · El lenguaje de Julia" . Consultado el 15 de mayo de 2021 .
- ^ "Norma ECMA-367. Eiffel: lenguaje de análisis, diseño y programación" (PDF) . 2006 . Consultado el 10 de marzo de 2016 .
- ^ https://2ality.com/2020/06/any-unknown-typescript.html
- ^ https://mariusschulz.com/blog/the-unknown-type-in-typescript
Referencias
- Pierce, Benjamin C. (2002). Tipos y lenguajes de programación . Prensa del MIT . ISBN 0-262-16209-1.
enlaces externos
- c2.com: tipo superior