Tipos y Lenguajes de programación
Tipos y Lenguajes de programación
Benjamin C. Pierce
La Prensa de MIT Cambridge, Massachusetts Londres, Inglaterra
©!! Benjamin C. Pierce "eser#ados todos los derechos. $inguna parte de este libro puede ser reproducida en cual%uier &orma por ninguno electrónico de medios mec'nicos (incluso &otocopia, grabación, o almacenaje de in&ormación y recuperación) sin el permiso por escrito del editor. *ste libro &ue puesto en el Lucida Brillante por el autor %ue usa el sistema de preparación de documentos de L+T*. Imprimido y ligado en los *stados -nidos de m/rica.
Biblioteca de 0atos de catalogación en la Publicación de Congreso Per&ore, Benjamin C. Tipos y lenguajes de programación 1 Benjamin C. Pierce p. cm. Incluye re&erencias bibliogr'&icas e 2ndice. I3B$ !45465!746 (hc.8 papel de al9.) 6. Lenguajes de programación (:rdenadores electrónicos). ;o. T2tulo. <=5.=.P>? !! !!>.6@Adc6
!!6!???
Contenido
Pre&acio
iii
6
Introducción 6 6.6 Tipos en Ciencia de la Computación 6 6.
Lectura relacionada 6
Matem'ticas Preliminares 6> .6 Conjuntos, relaciones y &unciones . Conjuntos ordenados 65 .@ 3ucesiones 6 .? Inducción 67 .> Lecturas anteriores !
I 3istemas sin tipo @
6
*presiones ritm/ticas sin tipo @.6 Introducción @ @. 3intais 5 @.@ Inducción de T/rminos 7 @.? *stilos sem'nticos @ @.> *#aluación @? @.5 $otas ?@
@
6>
#i
Contents
?
-na implementación ML de epresiones aritm/ticas ?.6 3intais ?5 ?. *#aluación ?= ?.@ *l "esto de la historia ?7 > >.6 >. >.@ >.?
*l c'lculo Lambda sin tipo >6 Fundamentos > La programación en el c'lculo Lambda Formalidades 5 $otas =@
5
"epresentación sin nombre de t/rminos => 5.6 T/rminos y Contetos =5 5. 0esplaGamiento y sustitución = 5.@ *#aluación !
=
-na "ealiGación ML del c'lculo Lambda =.6 T/rminos y Contetos @ =. 0esplaGamiento y sustitución > =.@ *#aluación = =.? $otas
II
Tipos simples
?>
>
@
7
Tipos epresiones aritm/ticas 76 .6 Tipos 76 . La "elación escrita 7 .@ 3eguridad H Progreso Preser#ación 7>
7
3implemente c'lculo Lambda 77 7.6 Tipos de &unción 77 7. La "elación escrita 6!! 7.@ Propiedades de escritura 6!? 7.? La correspondencia Curry4EoJard 7.> *rasure y Typability 6!7 7.5 Curry43tyle #s. Church43tyle 666 7.= $otas 666
6! -na implementación ML de Tipos 3imples 6!.6 Contetos 66@ 6!. T/rminos y Tipos 66> 6!.@ Keri&icación de tipos 66>
6!
66@
#ii
Contents
66 *tensiones 3imples
66=
66.6 Tipos base 66= 66. *l Tipo de -nidad 66 66.@ Formas deri#adas8 3ecuenciación y comodines 66.? tribución 66 66.> Permitir enlaces 6? 66.5 Pares 65 66.= Tuplas 6 66. rchi#os 67 66.7 3umas 6@ 66.6! Kariantes 6@5 66.66 "ecursión eneral 6? 66.6 Listas 6?5 6 $ormaliGación 6.6 6.
6?7
$ormaliGación para Tipos 3imples $otas 6>
6@ "e&erencias
6>@
[email protected] Introducción 6>@ 6@. *scritura 6>7 6@.@ *#aluación 6>7 6@.? lmacenamiento de tipos 6@.> 3eguridad 65> [email protected] $otas 6=! 6? *cepciones
65
6=6
6?.6 umento de *cepciones 6= 6?. Manejo de *cepciones 6=@ 6?.@ *cepciones %ue producen #alores
III
6?7
6=>
3ubtipi&icación 6=7
6> 3ubtipi&icación 6>.6 6>. 6>.@ 6>.? 6>.> 6>.5 6>.= 6>.
66
Bajo consumo 66 La "elación de 3ubtipo 6 Propiedades de 3ubtipos y tipos 6 Tipos superiores e in&eriores 676 La subtitpi&icación y otras caracter2sticas 67@ Cohesión sem'ntica para subtipi&icación !! Intersección y tipos de -nión !5 $otas !=
667
#iii Contenido
65 Metateor2a de 3ubtipi&icación !7 65.6 3ubtipi&icación algor2tmica 6! 65. Tipi&icación algor2tmica 6@ 65.@ -nión y reunión 6 65.? Tipi&icación algor2tmica y el tipos in&eriores
!
6= -na "ealiGación ML de 3ubtipi&icación
6=.6 6=. 6=.@
6 3intais 6 3ubtipi&icación 6 Tipi&icación
6 Caso de estudio8 :bjetos Imperati#os
>
6.6 ¿ 6. :bjetos 6.@ eneradores de objeto 7 6.? 3ubtipi&icación 7 6.> dición de #ariables de Instancia @! 6.5 Clases simples @6 6.= dición de Kariables de Instancia @@ 6. Llamando M/todos de 3uperclase @? 6.7 Clases con sigo misma @? 6.6! Iniciar "ecursión a tra#/s de la misma @> 6.66 Iniciar "ecursión y orden de e#aluación @= 6.6 -na implementación m's e&iciente ?6 6.6@ "ecapitulación ?? 6.6? $otas ?> 67 *studio del caso8 Peso pluma Na#a ?= 67.6 Introducción ?= 67. 0escripción ?7 67.@ 3istemas de tipos nominales y estructurales 67.? 0e&iniciones >? 67.> Propiedades 56 67.5 Codi&icación contra :bjetos Primiti#os 5 67.= $otas 5@
>6
i
Contents
IK
Tipos recurrentes
! Tipos "ecurrentes !.6 !. !.@ !.?
5> 5=
*jemplos 5 Formalidades => 3ubtipi&icación =7 $otas =7
6 Metateor2a de Tipos "ecursi#os
6
6.6 Inducción y Coinducción 6. Tipos &initos e In&initos ? 6.@ 3ubtipi&icación 5 6.? -na generalidad en transiti#idad 6.> Comprobación de pertenencia 7! 6.5 lgoritmos m's e&icientes 7> 6.= +rboles regulares 7 6. Tipos-O 77 6.7 Contando 3ubepresiones @!? 6.6! eneralidad8 -n lgoritmo *ponencial 6.66 3ubtipi&icación Iso4recursi#a de tipos 6.6 $otas @6
K
Polimor&ismo
@!7 @66
@6>
"econstrucción de Tipo
@6=
.6 Tipos de #ariables y sustituciones @6= . 0os Kisiones de tipos de #ariables @67 .@ Tipi&icación basada en restricciones @6 .? -ni&icación @5 .> Tipos principales @7 .5 notaciones de Tipo impl2citas @@! .= 0ejar el Polimor&ismo @@6 . $otas @@5 @ Tipos -ni#ersales @.6 @. @.@ @.? @.> @.5
@@7
Moti#ación @@7 Kariedades de Polimor&ismo @?! 3istema F @?6 *jemplos @?? Propiedades b'sicas @>@ Borrado, tipi&icación y reconstrucción de tipos
@>?
Contents
@.= Borrado y orden de e#aluación @. Fragmentos de 3istema F @> @.7 Parametricity @>7 @.6! Impredicati#ity @5! @.66 $otas @56
@>=
? Tipos *istenciales
?.6 ?. ?.@ ?.?
@5@ Moti#ación @5@ bstracción de datos eistenciales Codi&icaciones eistenciales @== $otas @=7
@5
> -na "ealiGación ML de 3istema F @6 >.6 "epresentación anónima de Tipos @6 >. Tipo de cambio y sustitución @ >.@ T/rminos @@ >.? *#aluación @> >.> Tipi&icación @5 5 Cuanti&icación Bounded 5.6 5. 5.@ 5.? 5.> 5.5
@7
Moti#ación 0e&iniciones *jemplos 3eguridad ?!! Tipos *istenciales Bounded $otas ?!
@7 @76 @75 ?!5
= Caso de estudio8 :bjetos Imperati#os, "edu
?66
Metateoria de cuanti&icación Bounded .6 *posición ?6= . Tipi&icación Minimal ?6 .@ 3ubtipi&icación en Kernel F <: ?6 .? 3ubtipi&icación en Full F <: ?? .> Indecidibilidad de F <: ?= .5 -nir y encontrar ?@ .= *istenciales acotadas ?@> . "e%uisito saltado y el Tipo de Fondo
?6=
?@5
i
Contents
KI
3istemas de pedido m's alto ?@=
7 Type :perators y inding 7.6 Intuiciones ??! 7. 0e&iniciones ??>
?@7
@! Polimor&ismo de Pedido m's alto ??7 @!.6 0e&iniciones ??7 @!. *jemplo ?>! @!.@ Propiedades ?>@ @!.? Fragmentos de F ω ?56 @!.> ;endo delante8 Tipos 0ependientes ?5 @6 3ubtipi&icación de pedido m's alto @6.6 Intuiciones ?5= @6. 0e&iniciones ?57 @6.@ Propiedades ?= @6.? $otas ?=
?5=
@ *studio del caso8 :bjetos Puramente Funcionales @.6 :bjetos simples ?=> @. 3ubtipi&icación ?=5 @.@ "e%uisito saltado ?== @.? Tipos de inter&aG ?=7 @.> *n#2o de mensajes a :bjetos ?! @.5 Clases simples ?6 @.= ctualiGación polimor&a ? @. dición de Kariables de Caso ?> @.7 Clases QConmigoQ ?5 @.6! $otas ?
p/ndices
?=>
?76
3oluciones de *jercicios 3eleccionados
B
Con#enciones $otacionales >5> B.6 $ombres de Meta#ariable >5> B. "egla Llamando Con#enciones >5> B.@ *l nombramiento y Con#enciones 3ubscripting
"e&erencias Rndice
5!>
>5=
?7@
>55
Pre&acio
*l estudio de tipos de sistemas A y de lenguajes de programación de un tipo 4 teórico perspecti#o A se ha con#ertido en un campo energ/tico con importantes aplicaciones en ingenier2a de so&tJare, diseDo de lenguajes, la implementación del compilador de alto rendimiento,y la seguridad.*ste teto o&rece una introducción completa de las de&iniciones &undamentales, resultados, y t/cnicas en el 'rea.
PSblico *l libro se dirige a dos audiencias principales8 los estudiantes de posgrado y los in#estigadores %ue se especialiGan en lenguajes de programación y teor2a de tipos,estudiantes de posgrado y estudiantes a#anGados de pregrado de todas las 'reas de ciencias de la computación %ue %uieren una introducción a los conceptos cla#e de la teor2a de lenguajes de programación. Para el primer grupo, el libro da un recorrido ehausti#o de la materia,con la pro&undidad su&iciente para seguir directamente a la literatura de in#estigación. Para el siguiente, esto proporciona el material introductorio etenso y una ri%ueGa de ejemplos, ejercicios, y estudios del caso. *sto puede ser#ir de teto principal tanto para cursos de ni#el ni#el de posgrado como para seminarios a#anGados en lenguajes de programación.
:bjeti#os -n objeti#o primario es la cobertura de temas principales,incluyendo sem'ntica b'sica operati#a y t/cnicas asociadas a pruebas reconstrucción, la c'lculo lambda , sistemas de tipo simple, polimor&ismo uni#ersal y eistencial, tipos de reconstrucción, subtipos, tipos acotadas, tipos recursi#os y operadores de tipo, con discusiones m's cortos de muchos otros temas. -n segundo objeti#o principal es el pragmatismo. *l libro se concentra en el uso de sistemas de tipo en lenguajes de programación, a cargo de algunos temas (como la sem'ntica de denotati#a) %ue probablemente ser2a incluido en mas teto matem'ticos para el tipo de C'lculo Lambda.*l sustrato computacional subyacente es un c'lculo lambda de llamada por #alor, lo %ue coincide con los lenguajes de programación m's actuales y se etiende &'cilmente a las construcciones imperati#as como re&erencias y ecepciones.
i#
Pre&ace
Para cada rasgo de lengua, las preocupaciones principales son las moti#aciones pr'cticas para considerar este rasgo, las t/cnicas necesarias para demostrar la seguridad de las lenguas %ue lo incluyen,%ue plantea en particular, el diseDo y an'lisis de algoritmos de comprobación de tipos. -n objeti#o adicional es el respeto para la di#ersidad del campoU las portadas de numerosos libros con temas indi#iduales y #arias combinaciones bien entendidas pero no intentan juntar todo en un sistema uni&icado . Ean dado presentaciones uni&icadas para algunos subconjuntos de los temas por ejemplo, muchas #ariedades de Vtipos de &lechaW pueden ser elegantemente y de modo compacto tratadas en la nota uni&orme de sistemas de tipo puros A pero el campo en conjunto toda#2a crece demasiado r'pido para ser totalmente sistematiGado. *l libro es diseDado para la &acilidad del uso, tanto en cursos como para el autoestudio. Las soluciones son proporcionadas a la mayor parte de los ejercicios. Las de&iniciones principales son organiGadas en &iguras independientes para una re&erencia &'cil. Las dependencias entre conceptos y sistemas son hechas tan epl2citas como sea posible. *l teto se complementa con una etensa bibliogra&2a e 2ndice. -n principio de organiGación &inal es la honestidad. Todos los sistemas discutidos en el libro (ecepto unos pocos %ue sólo se menciona de pasada) son implementados. cada cap2tulo se acompaDa de una typechec9er e int/rprete %ue se utiliGan para comprobar los ejemplos mec'nicamente. *stas implementaciones est'n disponibles en el sitio Jeb del libro y se puede utiliGar para los procesos de programación, eperimentando con etensiones y proyectos de clase m's grandes. Para conseguir estos objeti#os, algunas otras propiedades deseables han sido necesariamente sacri&icadas. La m's importantes es la ehausti#idad de la cobertura. *l inspección del 'rea entera de lenguajes de programación y sistemas de tipo es probablemente imposible en un libro seguramente en un libro de teto.La atención se centra en el desarrollo cuidadoso de los conceptos b'sicosU numerosas re&erencias a la literatura de in#estigación se suministran como puntos de partida para el estudio adicional. -n segundo no objeti#o es la e&icacia pr'ctica de los algoritmos de #eri&icación de tipos 8 esto no es un libro sobre compilador de &uerGa industrial o realiGación typechec9er.
*structura La parte I del libro discute los sistemas . Conceptos b'sicos de la sintais abstracta, de&iniciones inducti#as y pruebas, reglas de in&erencia y sem'ntica operacional se introdujo por primera #eG en el conteto de un lenguaje muy simple de nSmeros y booleanos, %ue se repiten para el c'lculo lambda La Parte II cubre el c'lculo lambda simplemente tipos y una #ariedad de caracter2sticas b'sicas del lenguaje, tales como productos, sumas, registros, #ariantes, re&erencias, y las ecepciones. -n cap2tulo preliminar sobre las epresiones aritm/ticas de tipo proporciona una sua#e introducción a la idea cla#e de la seguridad de tipos. -n cap2tulo opcional desarrolla una prueba de normaliGación para el c'lculo lambda simplemente escrito utiliGando el m/todo de Tait.
Pre&acio
#
La parte III aborda el mecanismo &undamental de subtiposU %ue incluye un an'lisis detallado de la metateor2a y dos estudios de casos prolongados. Parte IK abarca tipos recursi#os, tanto en la sencilla iso4recursi#a y las &ormulaciones e%uirecursi#as m's di&2ciles. *l segundo de los dos cap2tulos de esta parte se desarrolla la metateor2a de un sistema con tipos y subtipos e%ui4recursi#o en el marco matem'tico de coindución. Parte K ocupa polimor&ismo, con cap2tulos sobre tipo de de reconstrucción de estilo ML, el m's poderoso , polimor&ismo impredicati#os de 3ystem F, la cuanti&icación eistencial y sus coneiones con tipos abstractos de datos y la combinación de polimor&ismo y subtipos de sistemas con la cuanti&icación acotadada.Parte KI trata de operadores de tipo. -n cap2tulo cubre los conceptos b'sicosU la próima desarrolla sistema F ω y su metateor2aU el siguiente combina a operadores de tipo y cuanti&icación acotada para 3istema F ωU el Sltimo cap2tulo es un estudio del caso de cierre. Las dependencias principales entre cap2tulos son per&iladas en la Figura p46. Las &lechas grises indican %ue sólo la parte de un cap2tulo posterior depende de uno m's temprano. Las principales dependencias entre cap2tulos se resumen en la &igura P46. Las &lechas grises indican %ue sólo una parte de un cap2tulo posterior depende de una anterior. *l tratamiento de cada caracter2stica del lenguaje discutido en el libro sigue un patrón comSn. *jemplos moti#adores son en primer lugarU luego de&iniciones &ormalesU luego las pruebas de propiedades b'sicas tales como la seguridad de tiposU entonces (por lo general en un cap2tulo aparte) una in#estigación m's pro&unda de la metateor2a, lle#ando a #eri&icación de tipos de algoritmos y sus pruebas de solideG, integridad y terminaciónU y &inalmente (de nue#o en un cap2tulo aparte) la realiGación concreta de estos algoritmos como un programa de :Caml (:bjeti#o Caml). -na importante &uente de ejemplos a lo largo del libro es el an'lisis y diseDo de caracter2sticas para la programación orientada a objetos. Cuatro cap2tulos de estudios de casos desarrollan di&erentes en&o%ues en detalle un modelo simple de objetos y clases (cap2tulo 6) imperati#as con#encionales, un c'lculo b'sico basado en Na#a (Cap2tulo 67) un relato m's re&inada de objetos imperati#as utiliGando cuanti&icación acotada (Cap2tulo =) y un tratamiento de objetos y clases en el entorno puramente &uncional del 3istema F ω, usando tipos eistenciales (el Cap2tulo @). Para mantener el libro lo su&icientemente pe%ueDo para ser cubierto en un semestre curso a#anGado4y ligero como para ser lle#ados por el promedio de estudiantes de posgrado era necesario ecluir muchos temas interesantes e importantes. *n&o%ues denotacional y aiom'ticos a la sem'ntica se omiten por completoU hay libros %ue cubren estos en&o%ues y abordarlos a%u2 empaDar2a &uertemente pragm'tico, la perspecti#a orientada a la implementación de este libro. 3e sugieren las ricas coneiones entre los sistemas de tipo y lógica en algunos lugares pero sin re#elar en detalleU si bien son importantes /stas nos lle#ar2a demasiado lejos. Muchas de las &unciones a#anGadas de los lenguajes de programación
#i
Pre&ace
Figure P468 0ependencia de Cap2tulos
#ii
Pre&ace
y los sistemas de tipo sólo se mencionan de pasada, por ejemplo, los tipos de dependencia, tipos de intersección y la correspondencia de Curry4EoJardU secciones bre#es sobre estos temas proporcionan puntos de partida para la lectura adicional. Por Sltimo a ecepción de una bre#e incursión en el nScleo del lenguaje Na#a y similares (cap2tulo 67), el libro se centra eclusi#amente en los sistemas basados en el c'lculo lambdaU 3in embargo los conceptos y mecanismos desarrollados en este entorno se pueden trans&erir directamente a las 'reas relacionadas, tales como lenguajes con tipos concurrentes, lenguajes ensambladores , y c'lculos de objetos especialiGados. Conocimientos re%ueridos *l teto asume ninguna preparación en la teor2a de lenguajes de programación pero los lectores debe comenGar con un grado de madureG matem'tica 4en particular, los cursos de pregrado riguroso en matem'ticas discretas, algoritmos y la lógica elemental. Los lectores deben estar &amiliariGados con la programación &uncional, al menos, uno de orden superior lenguaje (*s%uema, ML, Eas9ell etc.) y con los conceptos b'sicos de los lenguajes de programación y compiladores (sintais abstracta, gram'ticas de B$F, e#aluación, m'%uinas abstractas, etc.). *ste material est' disponible en muchos tetos de pregradoU Me gusta especialmente Fundamentos de lenguajes de programación por Friedman Xand, y Eaynes (!!6) y Lenguaje de Programación Pragm'tica de 3cott (6777). La eperiencia con un lenguaje orientado a objetos tal como Na#a (rnold y osling, 6775) es Stil en #arios cap2tulos. Los cap2tulos sobre implementaciones concretas de typechec9ers presentan &ragmentos signi&icati#os de código en :Caml (o :bjeti#o Caml), un dialecto popular de ML. *l conocimiento pre#io de :Caml es Stil en estos cap2tulos pero no es absolutamente necesarioU sólo se utiliGa una pe%ueDa parte del lenguaje y las caracter2sticas se eplican en su primera aparición. *stos cap2tulos constituyen un hilo distinto del resto del libro y pueden ser omitidos por completo si se desea. *l mejor libro de teto sobre :Caml en este momento es Cousineau y Mauny (677). Los materiales tutoriales %ue #ienen con la distribución :Caml (disponible en http811caml.inria.&r y http811JJJ.ocaml.org) son tambi/n muy legible. Los lectores &amiliariGados con el otro dialecto principal de ML, 3tandard ML no deber2an tener problemas para seguir los &ragmentos de código :Caml. Libros de teto populares en ML est'ndar incluyen los de Paulson (6775) y -llman (677=). *s%uema del curso -n curso de postgrado intermedio o a#anGado debe ser capaG de cubrir la mayor parte del libro en un semestre. Figura P4 o&rece un programa de estudios de la muestra a partir de un ni#el superior, un
#iii Pre&ace curso para estudiantes de doctorado en la -ni#ersidad de Pensil#ania(dos de 7! con&erencias minutos a la semana, en la supuesta preparación pre#ia m2nima en la teor2a del lenguaje de programación, pero se lle#a r'pidamente). Para un estudiante uni#ersitario o un curso de postgrado de introducción, hay una serie de posibles caminos a tra#/s del material. -n curso sobre sistemas de tipo de programación se concentrar2a en los cap2tulos %ue introducen di#ersas caracter2sticas de escritura e ilustran sus usos y omiten la mayor2a de los cap2tulos metateor2a e implementación. Como alternati#a un curso sobre la teor2a b'sica y la aplicación de sistemas de tipo progresar2a a tra#/s de todos los primeros cap2tulos probablemente saltarse el cap2tulo 6 (y tal #eG 6 y 6) y sacri&icar el material m's a#anGado hacia el &inal del libro. Los tratamientos m's cortos tambi/n pueden construirse mediante la selección de cap2tulos particulares de inter/s usando el diagrama de dependencia en la Figura P46. *l libro tambi/n es adecuado como teto principal para un curso m's general de posgrado en la teor2a de lenguajes de programación. Tal curso podr2a pasar la mitad a dos tercios de un semestre de trabajo a tra#/s de la mayor parte del libro y dedicar el resto a, por ejemplo, una unidad de la teor2a de la concurrencia basada en el libro pi4 c'lculo lambda de Milner (6777), una introducción a Eoare lógica y sem'ntica aiom'tica (por ejemplo Xins9el 677@) o un estudio de las caracter2sticas del lenguaje a#anGadas como continuaciones o sistemas de módulos. *n un curso en proyectos a largo plaGo juegan un papel importante puede ser deseable posponer parte del material teórico (por ejemplo, la normaliGación y tal #eG algunos de los cap2tulos sobre metateor2a) para %ue una amplia gama de ejemplos puede ser cubierta antes de %ue los estudiantes eligen proyectos de temas. *jercicios La mayor2a de los cap2tulos incluyen etensos ejercicios4algunos diseDados para l'piG y papel, algunos ejemplos %ue in#olucran programación en los c'lculos %ue se est/ discutiendo, y algunas relati#as ampliaciones de las implementaciones ML de estos c'lculos.La di&icultad de cada ejercicio se estima se indica utiliGando la siguiente escala8 * **
***
****
Keri&icación r'pida @! segundos a > minutos F'cil
Y 6 hora
Moderado
Y @ horas
0esa&2o
Z @ horas
Los ejercicios marcados con [ pretenden ser los controles en tiempo real de los conceptos importantes. los lectores se les recomienda hacer una pausa para cada uno de ellos antes de pasar al material %ue sigue. *n cada cap2tulo se recomienda un conjunto m's o menos de tareas asignados de ejercicios.
Pre&ace i
Lectura
Tema
Lectura
6 0escripción general del cursoU historiaU administri#ia 6, () . Preliminares8 sintais, sem'ntica operacional @, ? @. Introducción al c'lculo lambda >.6, >. ?. La &ormaliGación del c'lculo lambda >.@, 5, = >. TiposU el tipo simple de c'lculo lambda , 7, 6! 5. *tensiones simplesU &ormas deri#adas 66 =. M's etensiones 66 . $ormaliGación 6 7. "e&erenciasU ecepciones 6@, 6? 6!. 3ubtipi&icación 6> 66. Metateor2a de subtipos 65, 6= 6. :bjetos imperati#os 6 6@. Na#a Ligero 67 6?. Tipos recursi#os ! 6>. Metateor2a de tipos recursi#os 6 65. Metateor2a de tipos recursi#os 6 6=. Tipo de reconstrucción 6. Polimor&ismo uni#ersal @ 67. Polimor&ismo eistencialU 0Ts ?, (>) !. Cuanti&icación acotada 5, = 6. Metateor2a de cuanti&icación acotada . Tipos de operadores 7 @. Metateor2a de F\ @! ?. 3ubtipos de orden superiors @6 >. :bjetos Puramente Funcionales @ 5. Lectura de desbordamiento La &igura p48 programa de estudios de muestra para un curso de graduado a#anGado 3oluciones completas para la mayor2a de los ejercicios se presentan en el p/ndice . Para ahorrar a los lectores la &rustración de la bSs%ueda de soluciones a los pocos ejercicios para los %ue las soluciones no est'n disponibles los ejercicios est'n marcados 4.
Con#enciones tipogr'&icas La mayor2a de los cap2tulos introducen las caracter2sticas de algSn tipo de sistema en un estilo discursi#o, a continuación, se de&inira el sistema &ormal como un conjunto de reglas de in&erencia en una o m's &iguras. Para &acilitar la consulta estas de&iniciones se presentan habitualmente en su totalidad, incluyendo no sólo las nue#as normas para las caracter2sticas %ue se est/ discutiendo por el momento, sino tambi/n el resto de las reglas necesarias para constituir un c'lculo completo. Las nue#as pieGas se &ijan en un &ondo gris para hacer el QdeltaQ de los sistemas anteriores #isualmente e#idente.
Pre&ace
-na caracter2stica inusual de la producción del libro es %ue todos los ejemplos tienen typechec9ed mec'nicamente durante la composición tipogr'&ica8 un guión pasa a tra#/s de cada cap2tulo, etrae los ejemplos genera y compila una typechec9er personaliGado %ue contiene las caracter2sticas en discusión, lo aplica a los ejemplos, e inserta el las respuestas del corrector en el teto. *l sistema %ue hace las partes &uertes de esta, llamada Tin9erType &ue desarrollado por Michael Le#in y yo (!!6). *l &inanciamiento para esta in#estigación &ue proporcionado por la Fundación $acional para la Ciencia a tra#/s de sub#enciones CC"47=!65 Fundamentos de principios para Programación con :bjetos y CC"4776@> Modulares Tipo 3ystems. Recursos Electrónicos
-n sitio Jeb asociado con este libro se puede encontrar en la siguiente -"L8 http811JJJ.cis.upenn.edu1]bcpierce1tapl Los recursos disponibles en este sitio incluyen erratas para el teto sugerencias para proyectos de curso, los punteros a material complementario contribuido por los lectores y una colección de implementaciones (typechec9ers e int/rpretes simples) de los c'lculos cubierto en cada cap2tulo del teto. *stas implementaciones o&recen un entorno para eperimentar con los ejemplos en el libro y probar soluciones a los ejercicios. Tambi/n han sido pulidos para &acilitar la lectura y la modi&icabilidad y se han utiliGado con /ito por los estudiantes en mis cursos como la base de ambos ejercicios de aplicación y pe%ueDos proyectos de curso m's grandes. Las implementaciones est'n escritos en :Caml. *l compilador :Caml est' disponible sin costo a tra#/s de http811caml.inria.&r e instala muy &'cilmente en la mayor2a de plata&ormas. Los lectores tambi/n deben ser conscientes de los tipos de &oros una lista de correo electrónico %ue cubre todos los aspectos de los sistemas de tipos y sus aplicaciones. La lista es moderada para asegurar raGonablemente bajo #olumen y una alta relación seDal4ruido en anuncios y discusiones. rchi#os e instrucciones de suscripción se pueden encontrar en http811JJJ.cis.upenn.edu1]bcpierce1types.
gradecimientos los lectores %ue encuentren #alor en este libro deben su mayor gratitud a cuatro mentores4Luca Cardelli Bob Earper "obin Milner y Nohn "eynolds4%ue me enseDaron m's de lo %ue s/ de los lenguajes de programación y tipos. *l resto %ue he aprendido sobre todo a tra#/s de colaboracionesU adem's de Luca Bob "obin y Nuan, mis socios en estas in#estigaciones han incluido Mart2n
i
Pre&ace
badi, ordon Plot9in, "andy Pollac9, 0a#id $. Turner, 0idier "/my, 0a#ide 3angiorgi, driana Compagnoni, Martin Eo&mann, iuseppe Castagna, Martin 3te&&en, im Bruce, $ao9i obayashi, Earuo Eosoya, tsushi Igarashi, Philip Xadler, Peter Buneman, Kladimir apeye#, Michael Le#in, Peter 3eJell, N/r^me Kouillon, y *ijiro 3umii. *stas colaboraciones son la &undación no sólo de mi entendimiento, sino tambi/n de mi placer en el tema. La estructura y la organiGación de este teto han sido mejoradas por discusiones sobre la pedagog2a con Thorsten lten9irch, Bob Earper, y Nohn "eynolds, y el teto s2 mismo por correcciones y comentarios de Nim leander, Penny nderson, Nosh Berdine, Tony Bonner, Nohn Tang Boyland, 0a#e Clar9e, 0iego 0ainese, :li#ier 0an#y, MattheJ 0a#is, Kladimir apeye#, Bob Earper, *ric Eilsdale, Earuo Eosoya, tsushi Igarashi, "obert IrJin, Ta9ayasu Ito, ssa& &oury, Michael Le#in, Kassily Lit#ino#, Pablo LópeG :li#as, 0a#e Mac
Las pruebas de programas son demasiado aburridas para el proceso social de matem'ticas para trabajar. "ichard 4 0eMillo, "ichard Lipton, y lan Perlis, 67=7 ... s2 %ue no se basan en procesos sociales para la #eri&icación.0a#id 4 *neldo, 6777 Los m/todos &ormales nunca tendr'n un impacto signi&icati#o hasta %ue ellos puedan ser usados por la gente %ue no los entiende. A atribuido a Tom Melham