Top 10 de los artículos

YouTube
Gmail
Goole
GayRomeo
Números chinos
Números romanos
Orkut
Costco
Sistema porta hepático
El mundo Factbook

News:

Mecanografíe el sistema

En informática, a mecanografíe el sistema define cómo a lenguaje de programación clasifica valores y expresiones en tipos, cómo puede manipular esos tipos y cómo obran recíprocamente. Un tipo identifica un valor o un sistema de valores como teniendo un significado o un propósito particular (aunque algunos tipos, tales como tipos abstractos y tipos de la función, no se pudieron representar como valores en el programa de computadora corriente). El tipo sistemas varía perceptiblemente entre las idiomas con, quizás, las variaciones más importantes que son sus puestas en práctica operacionales sintácticas y run-time de tiempo de compilación.

A recopilador puede utilizar el de tipo estático de un valor para optimizar el almacenaje que necesita y la opción de los algoritmos para las operaciones en el valor. Por ejemplo, en muchos C recopiladores el “flotador” tipo de datos se representa en 32 pedacitos, de acuerdo con Especificación de IEEE para los números de la coma flotante de la solo-precisión. Así, C utiliza operaciones flotar-punto-específicas en esos valores (adición floating-point, multiplicación, etc.).

La profundidad del tipo apremios y la manera de su evaluación afecta el mecanografiar de la lengua. Además, un lenguaje de programación puede asociar una operación con variar algoritmos concretos en cada tipo en el caso de mecanografíe el polimorfismo. Mecanografíe la teoría es el estudio del tipo sistemas, aunque el tipo concreto sistemas de lenguajes de programación origina de aplicaciones prácticas la arquitectura de computadora, la puesta en práctica del recopilador, y el diseño de la lengua.

Contenido

Base

Asignar tipos de datos (el mecanografiar) da el significado a las colecciones de pedacitos. Los tipos tienen generalmente asociaciones cualquier con valores adentro memoria o con objetos por ejemplo variables. Porque cualquier valor consiste en simplemente un sistema de pedacitos en a computadora, el hardware no hace ninguna distinción incluso en medio direcciones de memoria, código de la instrucción, caracteres, números enteros y números floating-point. La asignación a un tipo informa a programas y a programadores cómo esas colecciones del pedacito deben ser tratadas.

Las funciones importantes que el tipo sistemas proporciona incluyen:

  • Seguridad - El uso de tipos puede permitir a recopilador para detectar código sin setido o probablemente inválido. Por ejemplo, podemos identificar una expresión 3/“hola, mundo” como invalid porque uno no puede dividir (en cualquier sentido generalmente) número entero por a secuencia. Según lo discutido abajo, el mecanografiar fuerte ofrece más seguridad, pero no garantiza necesariamente seguridad completa (véase tipo-seguridad para más información).
  • Optimización - La tipo-comprobación de los parásitos atmosféricos puede proporcionar la información de tiempo de compilación útil. Por ejemplo, si un tipo requiere un valor debe alinear en memoria en un múltiplo de 4 octetos, el recopilador puede poder utilizar instrucciones de máquina más eficientes.
  • Documentación - En un tipo más expresivo sistemas, tipos puede servir como forma de documentación, puesto que pueden ilustrar el intento del programador. Por ejemplo, los timestamps pueden ser un subtipo de número-pero si un programador declara una función como volver un tipo del timestamp más bien que simplemente un tipo del número entero, éste documenta la parte del significado de la función.
  • Abstracción (o modularidad) - los tipos permiten que los programadores piensen de programas en un de alto nivel que el pedacito o el octeto, no incomodando con la puesta en práctica baja. Por ejemplo, los programadores pueden pensar en una secuencia como las colecciones de valor de los caracteres en vez como de arsenal mero de octetos. O, los tipos pueden permitir que los programadores expresen interfaz entre dos subsistemas. Esta ayuda localiza las definiciones requeridas para la interoperabilidad de los subsistemas y previene inconsistencias cuando esos subsistemas se comunican.

Aviso, sin embargo, que el tipo seguridad no es equivalente a la corrección del programa. Un programa se puede dar el resultado incorrecto y mecanografiar con seguridad, no produciendo ningún error del recopilador. Otros métodos sea necesario asegurar un programa está correcto.

Un programa asocia típicamente cada valor a un tipo particular (aunque un tipo puede tener más de uno subtipo). Otras entidades, por ejemplo objetos, módulos, canales de comunicaciones, dependencias, o aún se mecanografía, puede llegar a ser asociado con un tipo. Por ejemplo:

A mecanografíe el sistema, especificado adentro para cada lenguaje de programación, controla las maneras mecanografiadas programas puede comportarse, y hace comportamiento fuera de estas reglas ilegal. sistema del efecto proporciona típicamente un control más de grano fino que un tipo sistema.

Más formalmente, mecanografíe la teoría tipo sistemas de los estudios.

Mecanografíe la comprobación

El proceso de verificar y de hacer cumplir los apremios de tipos - mecanografíe la comprobación - puede ocurrir cualquiera en de tiempo de compilación (un cheque estático) o tiempo de pasada (un cheque dinámico). Si una especificación de la lengua requiere sus reglas que mecanografían fuertemente (más o menos permitir del IE, solamente eso el tipo automático conversiones que no pierdan la información), uno puede referir al proceso como mecanografiado fuertemente, si no, como mecanografiado débil. Los términos no se utilizan en un sentido terminante.

El mecanografiar estático

Un lenguaje de programación se dice para utilizar mecanografiar estático cuando el tipo comprobación se realiza durante de tiempo de compilación en comparación con tiempo de pasada. Los ejemplos de las idiomas que utilizan mecanografiar estático incluyen C, C++, C#, Java, FORTRAN, PASCAL, y Haskell. El mecanografiar estático permite que muchos errores sean cogido anterior, y tiene en cuenta tan para que la ejecución de programa sea más eficiente (IE, más rápidamente o tomando memoria reducida).

El mecanografiar dinámico

Un lenguaje de programación se dice para utilizar mecanografiar dinámico cuando el tipo comprobación se realiza en el tiempo de pasada (también conocido como “tarde-atando”) en comparación con de tiempo de compilación. Los ejemplos de las idiomas que utilizan mecanografiar dinámico incluyen Lisp, Perl, Python, y Palique. Comparado a los parásitos atmosféricos que mecanografían (o “temprano-que atan”), el mecanografiar dinámico es más flexible debido a limitaciones teóricas en el decidability de ciertos problemas estáticos del análisis del programa; éstos evitan que el mismo nivel de la flexibilidad sea alcanzado con mecanografiar estático[citación necesitada]. Hay también menos código a escribir para una funcionalidad dada, pero el mecanografiar dinámico es más lento en el tiempo de ejecución pues tipo comprobación, entonces hecha, tiempo de las tomas. Al menos en la práctica, para muchos tipos de problema, estas diferencias de la velocidad pueden no ser significativas o sensibles.

Cuando es utilizado por sí mismo, el mecanografiar dinámico confía mucho más en la prueba para el descubrimiento de errores. Si el código entonces no se ejecuta solamente las comprobaciones para del intérprete sintaxis se pueden hacer, en comparación con el tipo adicional cheques hechos en una lengua estáticamente mecanografiada. Estos cheques de tipo estático son necesariamente más simples que los que se puedan aplicar en el tiempo de pasada, puesto que menos información entonces está disponible para el sistema de la lengua. El código infrecuentemente ejecutado tal como tratantes del error, puede tomar más esfuerzo de probar en un contexto que mecanografía dinámico, pero igualmente, no hay ilusión que las partes de un programa dinámico están cabidas para el propósito sin ellos que son probados en comparación con simplemente la tipo-comprobación.

Combinaciones de mecanografiar dinámico y estático

Algunas idiomas estáticamente mecanografiadas tienen una “puerta trasera” en la especificación de la lengua que permite a programadores escribir el código que no mecanografía estáticamente el cheque. Por ejemplo, Java y la mayoría de las idiomas del C-estilo tienen “bastidor"; tales operaciones pueden ser inseguras en el tiempo de pasada, en que pueden causar el comportamiento indeseado debido a mecanografiar incorrecto de valores cuando el programa funciona.

La presencia de mecanografiar estático en un lenguaje de programación no implica necesariamente la ausencia de todos los mecanismos que mecanografían dinámicos. Por ejemplo, Java utiliza mecanografiar estático, pero ciertas operaciones requieren la ayuda del tipo runtime pruebas, una forma de mecanografiar dinámico. Vea lenguaje de programación para más discusión de las interacciones entre mecanografiar estático y dinámico.

Tipo estático y dinámico que comprueba en la práctica

La opción entre mecanografiar estático y dinámico requiere compensaciones.

El mecanografiar de los parásitos atmosféricos puede encontrar el tipo errores confiablemente en para compilar tiempo. Esto debe aumentar la confiabilidad del programa entregado. Sin embargo, los programadores discrepan excedente cómo ocurre comúnmente el tipo errores, y así qué proporción de esos insectos se escriben que sea cogido por mecanografiar estático. Los abogados que mecanografían estáticos creen que los programas son más confiables cuando los tipo-han comprobado bien, mientras que el mecanografiar dinámico aboga el punto al código distribuido que ha probado confiable y a las bases de datos pequeñas del insecto. El valor de mecanografiar estático, entonces, aumenta probablemente mientras que la fuerza del tipo sistema se aumenta. Abogados de idiomas fuertemente mecanografiadas por ejemplo Ml y Haskell han sugerido que casi todos los insectos pueden ser considerados tipo errores, si los tipos usados en un programa son declarados correctamente por el programador o deducidos correctamente por el recopilador.[1]

Los parásitos atmosféricos que mecanografían dan lugar generalmente al código compilado que se ejecuta más rápidamente. Cuando el recopilador sabe los tipos de datos exactos que son funcionando, pueden producir código automático optimizado. Además, los recopiladores para las idiomas estáticamente mecanografiadas pueden encontrar los atajos del ensamblador más fácilmente. Algunas idiomas dinámico-mecanografiadas por ejemplo Lisp común permita el tipo declaraciones opcional para la optimización por esta misma razón. El mecanografiar estático hace esto penetrante. Vea optimización.

Por el contrario, el mecanografiar dinámico puede permitir que los recopiladores y los intérpretes funcionen más rápidamente, puesto que los cambios al código de fuente en idiomas dinámico-mecanografiadas pueden dar lugar menos a la comprobación a realizarse y a menos código a revisitar. Esto puede reducir también corregir-compilar-prueba-elimina errores del ciclo.

idiomas Estático-mecanografiadas que carecen mecanografíe la inferencia (por ejemplo Java) requiera que los programadores declaren los tipos que piensan un método o una función para utilizar. Esto puede servir como documentación adicional para el programa, que el recopilador no permitirá que el programador no haga caso o permita para mandilar fuera de la sincronización. Sin embargo, una lengua puede ser mecanografiada estáticamente sin requerir el tipo declaraciones (los ejemplos incluyen Scala y C#3.0), así que éste no es una consecuencia necesaria de mecanografiar estático.

El mecanografiar dinámico permite las construcciones que una cierta comprobación de tipo estático rechazaría como ilegal. Por ejemplo, eval las funciones, que ejecutan datos arbitrarios como código, llegan a ser posibles (sin embargo, el mecanografiar dentro de ése código evaluado pudo seguir siendo estático). Además, el mecanografiar dinámico acomoda código transitorio y prototyping, tal como permitir que una secuencia sea utilizada en lugar de una estructura de datos. Realces recientes a las idiomas estáticamente mecanografiadas (e.g. Haskell Tipos de datos algebraicos generalizados) han permitido que las funciones eval sean escritas en una manera tipo-segura.

Dinámico mecanografiando típicamente marcas el metaprogramming más eficaz y más fácil utilizar. Por ejemplo, C++ plantillas sea típicamente más incómodo escribir que el equivalente Rubí o Python código.[la citación necesitó] Construcciones más avanzadas del tiempo de pasada por ejemplo metaclasses y introspection sea a menudo más difícil de utilizar en idiomas estático-mecanografiadas.

El mecanografiar fuerte y débil

Una definición de mecanografiado fuertemente implica el prevenir del éxito para una operación en las discusiones que tienen el tipo incorrecto. A C molde ido mal ejemplifica el problema de mecanografiar fuerte ausente; si un programador echa un valor a partir de un tipo a otro en C, no sólo debe el recopilador permitir el código en compila tiempo, pero el tiempo de pasada debe permitirlo también. Esto puede permitir un código más compacto y más rápido de C, pero puede hacer el eliminar errores más difícil.

Algunos observadores utilizan el término lengua memoria-segura (o apenas lengua segura) para describir las idiomas que no permiten que ocurran las operaciones indefinidas. Por ejemplo, una lengua memoria-segura compruebe los límites de arsenal, o bien garantice estáticamente que (es decir, en compile el tiempo antes de que ejecución) los accesos de ese arsenal fuera de los límites del arsenal causarán errores de tiempo de compilación y quizás runtime.

El mecanografiar débil significa que una lengua convierte implícito (o los moldes) tipos cuando está utilizada. Revisitando el ejemplo anterior, tenemos:

var x: = 5;    // (1)  (dos números enteros)
var y: = “37”; // (2)  (una secuencia y un número entero)
 x + y;         // (3)  (?)

No está claro qué resultado uno conseguiría en una lengua débil mecanografiada. Algunas idiomas, por ejemplo Básico visual, produciría código runnable produciendo el resultado 42: el sistema convertiría la secuencia “37” en el número 37 para tener fuertemente sentido de la operación. Otras idiomas tienen gusto Javascript produciría el resultado “537”: el sistema convertiría el número 5 a la secuencia “5” y después concatenaría los dos. En básico visual y Javascript, el tipo que resulta es determinado por las reglas que toman ambos operandos en la consideración. En algunas idiomas, por ejemplo AppleScript, el tipo del valor que resulta es determinado por el tipo del operando extremo izquierdo solamente.

El diseño cuidadoso de la lengua también ha permitido que las idiomas aparezcan débil-mecanografiadas (por mecanografíe la inferencia y otras técnicas) para la utilidad mientras que preservar la comprobación y la protección del tipo ofreció por idiomas fuerte-mecanografiadas. Los ejemplos incluyen VB.Net, C#, y Java.

Reducción de el sobrecargar del operador, por ejemplo no usar “+” para el encadenamiento de la secuencia además de la adición aritmética, puede reducir algo de la confusión causada por mecanografiar débil.[la citación necesitó] Por ejemplo, PHP utiliza períodos (.) para el encadenamiento de la secuencia, y semejantemente Ada utiliza el signo "&" (y).

Sistemas con seguridad e inseguro mecanografiados

Artículo principal: Mecanografíe la seguridad

Una tercera manera de categorizar el tipo sistema de un lenguaje de programación utiliza la seguridad de operaciones y de conversiones mecanografiadas. Los informáticos consideran una lengua “tipo-segura” si no permite las operaciones o las conversiones que conducen a las condiciones erróneas.

Otra vez tengamos una mirada en el ejemplo del pseudocode:

var x: = 5;     // (1)
var y: = “37”;  // (2)
var z: = x + y; // (3)

En idiomas tenga gusto Básico visual z variable en el ejemplo adquiere el valor 42. Mientras que el programador puede o no puede haber pensado esto, la lengua define el resultado específicamente, y el programa no estrella ni asigna un valor mal definido al Z. A este respecto, tales idiomas son tipo-seguras.

Ahora miremos el mismo ejemplo en C:

interno x = 5;
carbón y [] = “37”;
char* z = x + y;

En este ejemplo z señalará a los caracteres de una dirección de memoria cinco más allá de y, equivalente a dos caracteres después del carácter cero que termina de la secuencia señalada por al Y. El contenido de esa localización es indefinido, y pudo mentir fuera de memoria direccionable. El cómputo mero de tal indicador puede dar lugar en comportamiento indefinido (programa incluyendo que se estrella) según estándares de C, y a sistemas típicos el dereferencing z a este punto podía hacer el programa estrellarse. Tenemos un programa bien-mecanografiado, pero memoria-no seguro - una condición que no pueda ocurrir en una lengua tipo-segura.

Polimorfismo y tipos

Artículo principal: Polimorfismo (informática)

El término “polimorfismo” refiere a la capacidad del código (particularmente, los métodos o las clases) de actuar en valores de tipos múltiples, o a la capacidad de diversos casos de la misma dato-estructura de contener los elementos de diversos tipos. Mecanografíe los sistemas que permiten polimorfismo lo hacen generalmente así que para mejorar el potencial para la reutilización del código: en una lengua con polimorfismo, los programadores necesitan solamente poner una estructura de datos en ejecución tal como una lista o arsenal sociable una vez que, más bien que una vez para cada tipo de elemento con el cual planean utilizarlo. Por los informáticos este razón llaman a veces el uso de ciertas formas de polimorfismo programación genérica. Las fundaciones tipo-teóricas del polimorfismo se relacionan de cerca con las de abstracción, modularidad y (en algunos casos) el subtyping.

El mecanografiar del pato

Artículo principal: El mecanografiar del pato

En el “pato que mecanografía,” una declaración que llama un método en un objeto no confía en el tipo del objeto; solamente que el objeto, de cualquier tipo, debe poner el método en ejecución llamó. El mecanografiar del pato es una manifestación dinámico-mecanografiada, orientada al objeto de tipo estructural sistemas, en comparación con a tipo nominativo sistemas.

Acuñado inicialmente cerca Alex Martelli en Python la comunidad, aplicaciones que mecanografían del pato la premisa que (que refiere a un valor) “si camina como un pato, y los quacks como un pato, después él es un pato”.

Tipo especializado sistemas

Mucho se ha creado el tipo sistemas que se especializa para el uso en ciertos ambientes, con ciertos tipos de datos, o para el análisis estático out-of-band del programa. Éstos se basan con frecuencia en ideas de formal mecanografíe la teoría y esté solamente disponible como parte de sistemas de la investigación del prototipo.

Tipos dependientes

Tipos dependientes se basan en la idea de usar escalares o los valores a describen más exacto el tipo de un cierto otro valor. Por ejemplo, la “matriz (3.3)” pudo ser el tipo de una matriz 3×3. Podemos entonces definir reglas que mecanografían tales como la regla siguiente para la multiplicación de la matriz:

matrix_multiply: matriz (k,m) matriz del × (m,n) matriz del → (k,n)

donde k, m, n son los valores positivos arbitrarios del número entero. Una variante de Ml llamado Ml dependiente se ha creado basó en este tipo sistema, pero porque es la tipo-comprobación de tipos dependientes convencionales undecidable, no todos los programas que los usan se pueden tipo-comprobar sin una cierta clase de limitaciones. El ml dependiente limita la clase de igualdad que puede decidir a Aritmética de Presburger; otras idiomas por ejemplo Epigram haga el valor de todas las expresiones en la lengua decidible de modo que el tipo comprobación pueda ser decidible.

Tipos lineares

Tipos lineares, basado en la teoría de lógica linear, y relacionado de cerca con tipos de la unicidad, son los tipos asignados a los valores que tienen la característica que tienen una y solamente una referencia a ellos siempre. Éstos tienen valores para describir grande valores inmutables por ejemplo secuencias, archivos, y así sucesivamente, porque cualquier operación que destruya simultáneamente un objeto linear y crea un objeto similar (por ejemplo 'str = str + “a”') puede ser optimizado “debajo de la capilla” en una mutación sobre el terreno. Esto no es normalmente posible porque tales mutaciones podrían causar efectos secundarios en las partes del programa que llevaba a cabo otras referencias al objeto, violando transparencia de referencia. También se utilizan en el sistema operativo del prototipo Singularidad para la comunicación entre procesos, estáticamente asegurándose de que los procesos no puedan compartir objetos en memoria compartida para prevenir condiciones de la raza. Limpio lengua (a Haskell- como lengua) utiliza este tipo sistema para ganar muchos de velocidad mientras que caja fuerte restante.

Tipos de la intersección

Los tipos de la intersección son tipos que describen los valores a los cuales pertenezca ambos de dos otros tipos dados con los sistemas de valor traslapados. Por ejemplo, en C el carbón firmado tiene gama -128 a 127 y el carbón sin firmar tiene gama 0 a 255, así que el tipo de la intersección de estos dos tipos tendría gama 0 a 127. Tal tipo de la intersección se podía pasar con seguridad en esperar de las funciones cualquiera carbones firmados o sin firmar, porque es compatible con ambos tipos.

Los tipos de la intersección son útiles para describir tipos sobrecargados de la función: Por ejemplo, si el “→ interno interno” es el tipo de funciones que toman una discusión del número entero y que vuelven un número entero, y “flotador del → del flotador” es el tipo de funciones que toman una discusión del flotador y que vuelven un flotador, entonces la intersección de estos dos tipos se puede utilizar para describir las funciones que hacen uno o el otro, basadas en qué tipo de entrada se dan. Tal función se podía pasar en otra función que contaba con una función interna del “→ interno” con seguridad; no utilizaría simplemente “la funcionalidad del flotador del → del flotador”.

De una jerarquía subclassing, la intersección de un tipo y un tipo del antepasado (tal como su padre) es el tipo derivado. La intersección de los tipos del hermano es vacía.

La lengua de Forsythe incluye una puesta en práctica general de los tipos de la intersección. Una forma restricta es tipos del refinamiento.

Tipos de la unión

Tipos de la unión son los tipos que describen los valores a los cuales pertenezca cualquiera de dos tipos. Por ejemplo, en C, el carbón firmado tiene gama -128 a 127, y el carbón sin firmar tiene gama 0 a 255, así que la unión de estos dos tipos tendría gama -128 a 255. Cualquier función que maneja este tipo de la unión tendría que ocuparse de números enteros en esta gama completa. Más generalmente, las únicas operaciones válidas en un tipo de la unión son las operaciones que son válidas encendido ambos los tipos que eran unioned. El concepto de la “unión” de las c es similar a los tipos de la unión, pero no es typesafe porque permite las operaciones que son válidas encendido cualquiera mecanografíe, más bien que ambos. Los tipos de la unión son importantes en el análisis del programa, donde ellos se utilizan para representar los valores simbólicos que naturaleza exacta (eg., valor o el tipo) no se sabe.

En una jerarquía subclassing, la unión de un tipo y un tipo del antepasado (tal como su padre) es el tipo del antepasado. La unión de los tipos del hermano es un subtipo de su antepasado común (es decir, todas las operaciones permitidas en su antepasado común se permiten en el tipo de la unión, pero pueden también tener otras operaciones válidas en campo común).

Tipos existenciales

Los tipos existenciales se utilizan con frecuencia para representar módulos y tipos de datos abstractos debido a su capacidad de separar la puesta en práctica de interfaz. Por ejemplo, en pseudocode de C, el tipo “T = ∃X {X a; f interna (X); } “describe un interfaz del módulo que tenga un miembro de los datos del tipo X y una función que toma un parámetro del iguales tipo X y vueltas al número entero. Esto se podía poner en ejecución de diversas maneras; por ejemplo:

  • intT {a interna; f interna (interna); }
  • floatT {flote a; f interna (flotador); }

Estos tipos son ambos subtipos del tipo existencial más general T y corresponden a los tipos concretos de la puesta en práctica, así que cualquier valor de uno de estos tipos es un valor del tipo T. Dado un valor “t” del tipo “T”, sabemos que “t.f (t.a)” bien-está mecanografiado, sin importar lo que el tipo abstracto X es. Esto da la flexibilidad para los tipos que eligen satisfechos a una puesta en práctica particular mientras que aíslan a los clientes que utilizan solamente los valores del tipo del interfaz - el tipo existencial - de estas opciones.

Declaración explícito o implícito e inferencia

Para más detalles en este asunto, vea Mecanografíe la inferencia.

Muchos sistemas de tipo estático, tales como c y Java, requieren tipo declaraciones: El programador debe asociar explícitamente cada uno variable a un tipo particular. Otros, tales como Haskell, se realizan mecanografíe la inferencia: El recopilador dibuja conclusiones sobre los tipos de variables basadas en cómo los programadores utilizan esas variables. Por ejemplo, dado una función f (x, y) cuál agrega x y y junto, el recopilador puede deducir eso x y y deben ser los números - puesto que la adición se define solamente para los números. Por lo tanto, cualesquiera llaman a f a otra parte en el programa que especifica un tipo no numérico (tal como una secuencia o una lista) pues una discusión señalaría un error.

Las constantes y las expresiones numéricas y de la secuencia en código pueden e implican a menudo mecanografían adentro un contexto particular. Por ejemplo, una expresión 3.14 pudo implicar un tipo de floating-point, mientras que [1, 2, 3] pudo implicar una lista de los números enteros - típicamente arsenal.

El tipo inferencia es solamente posible si es decidible en el tipo teoría en la pregunta. Tipo sistema, una versión de Haskell de Hindley-Milner, es una restricción de Sistema Fω a los tipos polimórficos supuestos rank-1, en los cuales el tipo inferencia es decidible. La mayoría de los recopiladores de Haskell permiten arbitrario-alinean polimorfismo como extensión, pero ésta hace el tipo inferencia undecidable. (El tipo comprobación es decidible, sin embargo, y los programas rank-1 todavía tienen tipo inferencia; se rechazan programas polimórficos espesos más altos a menos que tipo explícito dado las anotaciones.)

Tipos de tipos

A tipo de tipos es a bueno. Las clases aparecen explícitamente adentro programación typeful, por ejemplo a mecanografíe a constructor en Haskell lenguaje de programación.

Los tipos caen en varias amplias categorías:

Compatibilidad: equivalencia y el subtyping

Un tipo-inspector para una lengua estáticamente mecanografiada debe verificar que el tipo de cualesquiera expresión es constante con el tipo esperado por el contexto en el cual esa expresión aparece. Por ejemplo, en declaración de asignación de la forma x: = e, el tipo deducido de la expresión e debe ser constante con el tipo declarado o deducido de la variable x. Esta noción de la consistencia, llamada compatibilidad, es específico a cada lenguaje el de programación.

Si el tipo de e y el tipo de x son los mismos y la asignación se permite para ese tipo, después esto es una expresión válida. En el tipo más simple sistemas, por lo tanto, la cuestión de si dos tipos son compatibles reduce a la de si son igual (o equivalente). Diversas idiomas, sin embargo, tienen diversos criterios para cuando dos el tipo expresiones se entiende para denotar el mismo tipo. Éstos diferentes teorías del equational de tipos varíe extensamente, dos casos extremos que son tipo estructural sistemas, en cuál mecanografía cualesquiera dos sea equivalente que describa los valores con la misma estructura, y tipo nominativo sistemas, en cuál denota el tipo sintácticamente distinto las expresiones de no dos el mismo tipo (es decir, los tipos deben tener el mismo “nombre” para ser iguales).

En idiomas con el subtyping, la relación de la compatibilidad es más compleja. Particularmente, si A es un subtipo de B, entonces un valor del tipo A se puede utilizar en un contexto en donde uno de tipo B espera, aunque el revés no es verdad. Como equivalencia, la relación del subtipo se define diferentemente para cada lenguaje de programación, con muchas variaciones posibles. La presencia de paramétrico o ad hoc polimorfismo en una lengua puede también tener implicaciones para el tipo compatibilidad.

Controversia

Hay a menudo conflictos entre los que prefieran fuerte y/o las idiomas estático-mecanografiadas y las que prefieren mecanografiar dinámico o de la libre-forma. Los primeros abogados del grupo para la detección temprana de errores durante la compilación y el funcionamiento runtime creciente, mientras que los últimos abogados del grupo para rápido prototyping eso son posibles con un sistema que mecanografía más dinámico y ese tipo errores son solamente un subconjunto pequeño de errores en un programa.[2][3]. Se relaciona con esto la consideración que a menudo no hay necesidad de declarar manualmente mecanografía adentro un lenguaje de programación con el tipo inferencia; así, los gastos indirectos se bajan automáticamente para algunas idiomas.

Referencias

Vea también

Wikibooks Programación del Ada tiene una página en el asunto de
Wikibooks Haskell tiene una página en el asunto de

Acoplamientos externos

The original article is from Wikipedia. To view the original article please click here.
Creative Commons Licence