Академический Документы
Профессиональный Документы
Культура Документы
Benjamin C. Pierce
La Prensa de MIT
Cambridge, Massachusetts
Londres, Inglaterra
2001044428
Contenido
Prefacio
1
Introduccin
1.1
1.2
1.3
1.4
1.5
Matemticas Preliminares
2.1
2.2
2.3
2.4
2.5
xiii
15
21
Introduccin
23
Sintaxis
26
Induccin de Trminos 29
Estilos semnticos 32
Evaluacin
34
Notas
43
23
15
vi
Contents
Sintaxis
46
Evaluacin
47
El Resto de la historia
5.1
5.2
5.3
5.4
6
Trminos y Contextos
83
Desplazamiento y sustitucin
Evaluacin
87
Notas
88
Tipos simples
8
75
78
83
85
89
8.1
8.2
8.3
9
58
II
49
Fundamentos 52
La programacin en el clculo Lambda
Formalidades 68
Notas
73
6.1
6.2
6.3
45
Tipos
91
La Relacin escrita
92
Seguridad = Progreso + Preservacin 95
99
Tipos de funcin
99
La Relacin escrita
100
Propiedades de escritura 104
La correspondencia Curry-Howard
Erasure y Typability
109
Curry-Style vs. Church-Style
111
Notas
111
Contextos
113
Trminos y Tipos
Verificacin de tipos
115
115
108
113
vii
Contents
11 Extensiones Simples
117
149
13 Referencias
13.1
13.2
13.3
13.4
13.5
13.6
14.1
14.2
14.3
III
153
Introduccin
153
Escritura 159
Evaluacin
159
Almacenamiento de tipos
Seguridad
165
Notas
170
14 Excepciones
162
171
Subtipificacin
15 Subtipificacin
149
175
179
181
15.1
15.2
Bajo consumo
181
La Relacin de Subtipo
15.3
15.4
15.5
15.6
15.7
15.8
182
119
viii
Contenido
16 Metateora de Subtipificacin
16.1
16.2
16.3
16.4
209
220
Sintaxis
221
Subtipificacin 221
Tipificacin 222
225
233
234
247
Introduccin
247
Descripcin 249
Sistemas de tipos nominales y estructurales
Definiciones
254
Propiedades
261
Codificacin contra Objetos Primitivos 262
Notas
263
251
ix
Contents
IV
Tipos recurrentes
20 Tipos Recurrentes
20.1
20.2
20.3
20.4
265
267
Ejemplos
268
Formalidades 275
Subtipificacin 279
Notas
279
281
Induccin y Coinduccin
282
Tipos finitos e Infinitos
284
Subtipificacin 286
Una generalidad en transitividad 288
Comprobacin de pertenencia
290
Algoritmos ms eficientes
295
rboles regulares 298
21.8 Tipos-
299
21.9 Contando Subexpresiones
304
21.10 Generalidad: Un Algoritmo Exponencial
21.11 Subtipificacin Iso-recursiva de tipos
21.12 Notas
312
Polimorfismo
315
22 Reconstruccin de Tipo
22.1
22.2
22.3
22.4
22.5
22.6
22.7
22.8
309
311
317
23 Tipos Universales
339
23.1
23.2
23.3
23.4
23.5
Motivacin
339
Variedades de Polimorfismo
Sistema F
341
Ejemplos
344
Propiedades bsicas 353
23.6
340
354
Contents
357
24 Tipos Existenciales
363
24.1
24.2
24.3
24.4
Motivacin
363
Abstraccin de datos existenciales
Codificaciones existenciales
377
Notas
379
381
26 Cuantificacin Bounded
26.1
26.2
26.3
368
381
382
389
Motivacin
Definiciones
Ejemplos
389
391
396
26.4
Seguridad
26.5
26.6
400
406
411
417
28.1
28.2
Exposicin
417
Tipificacin Minimal 418
28.3
28.4
28.5
28.6
28.7
28.8
436
xi
Contents
VI
Intuiciones
Definiciones
439
440
445
449
Definiciones
449
Ejemplo
450
Propiedades 453
Fragmentos de F 461
Yendo Adelante: Tipos Dependientes
462
467
Intuiciones
467
Definiciones
469
Propiedades 472
Notas
472
475
Apndices
491
Convenciones Notacionales
B.1
B.2
B.3
565
Referencias
ndice
493
605
567
566
Prefacio
Pblico
El libro se dirige a dos audiencias principales: los estudiantes de posgrado y los
investigadores que se especializan en lenguajes de programacin y teora de
tipos,estudiantes de posgrado y estudiantes avanzados de pregrado de todas las reas
de ciencias de la computacin que quieren una introduccin a los conceptos clave de la
teora de lenguajes de programacin. Para el primer grupo, el libro da un recorrido
exhaustivo de la materia,con la profundidad suficiente para seguir directamente a la
literatura de investigacin. Para el siguiente, esto proporciona el material introductorio
extenso y una riqueza de ejemplos, ejercicios, y estudios del caso. Esto puede servir
de texto principal tanto para cursos de nivel nivel de posgrado como para seminarios
avanzados en lenguajes de programacin.
Objetivos
Un objetivo primario es la cobertura de temas principales,incluyendo semntica bsica
operativa y tcnicas asociadas a pruebas reconstruccin, la clculo lambda , sistemas
de tipo simple, polimorfismo universal y existencial, tipos de reconstruccin, subtipos,
tipos acotadas, tipos recursivos y operadores de tipo, con discusiones ms cortos de
muchos otros temas.
Un segundo objetivo principal es el pragmatismo. El libro se concentra en el uso de
sistemas de tipo en lenguajes de programacin, a cargo de algunos temas (como la
semntica de denotativa) que probablemente sera incluido en mas texto matemticos
para el tipo de Clculo Lambda.El sustrato computacional subyacente es un clculo
lambda de llamada por valor, lo que coincide con los lenguajes de programacin ms
actuales y se extiende fcilmente a las construcciones imperativas como referencias y
excepciones.
xiv
Preface
Para cada rasgo de lengua, las preocupaciones principales son las motivaciones
prcticas para considerar este rasgo, las tcnicas necesarias para demostrar la
seguridad de las lenguas que lo incluyen,que plantea en particular, el diseo y anlisis
de algoritmos de comprobacin de tipos.
Un objetivo adicional es el respeto para la diversidad del campo; las portadas de
numerosos libros con temas individuales y varias combinaciones bien entendidas pero
no intentan juntar todo en un sistema unificado . Han dado presentaciones unificadas
para algunos subconjuntos de los temas por ejemplo, muchas variedades de tipos de
flecha pueden ser elegantemente y de modo compacto tratadas en la nota uniforme
de sistemas de tipo puros pero el campo en conjunto todava crece demasiado
rpido para ser totalmente sistematizado.
El libro es diseado para la facilidad del uso, tanto en cursos como para el
autoestudio. Las soluciones son proporcionadas a la mayor parte de los ejercicios.
Las definiciones principales son organizadas en figuras independientes para una
referencia fcil. Las dependencias entre conceptos y sistemas son hechas tan
explcitas como sea posible. El texto se complementa con una extensa bibliografa e
ndice.
Un principio de organizacin final es la honestidad. Todos los sistemas discutidos en
el libro (excepto unos pocos que slo se menciona de pasada) son implementados.
cada captulo se acompaa de una typechecker e intrprete que se utilizan para
comprobar los ejemplos mecnicamente. Estas implementaciones estn disponibles en
el sitio web del libro y se puede utilizar para los procesos de programacin,
experimentando con extensiones y proyectos de clase ms grandes.
Para conseguir estos objetivos, algunas otras propiedades deseables han sido
necesariamente sacrificadas. La ms importantes es la exhaustividad de la cobertura.
El inspeccin del rea entera de lenguajes de programacin y sistemas de tipo es
probablemente imposible en un libro seguramente en un libro de texto.La atencin se
centra en el desarrollo cuidadoso de los conceptos bsicos; numerosas referencias a la
literatura de investigacin se suministran como puntos de partida para el estudio
adicional. Un segundo no objetivo es la eficacia prctica de los algoritmos de
verificacin de tipos : esto no es un libro sobre compilador de fuerza industrial o
realizacin typechecker.
Estructura
La parte I del libro discute los sistemas . Conceptos bsicos de la sintaxis abstracta,
definiciones inductivas y pruebas, reglas de inferencia y semntica operacional
se introdujo por primera vez en el contexto de un lenguaje muy simple de nmeros
y booleanos, que se repiten para el clculo lambda
La Parte II cubre el clculo lambda simplemente tipos y una variedad de caractersticas
bsicas del lenguaje, tales como productos, sumas, registros, variantes, referencias, y
las excepciones. Un captulo preliminar sobre las expresiones aritmticas de tipo
proporciona una suave introduccin a la idea clave de la seguridad de tipos. Un
captulo opcional desarrolla una prueba de normalizacin para el clculo lambda
simplemente escrito utilizando el mtodo de Tait.
xv
Prefacio
La parte III aborda el mecanismo fundamental de subtipos; que incluye un anlisis detallado
de la metateora y dos estudios de casos prolongados. Parte IV abarca tipos recursivos,
tanto en la sencilla iso-recursiva y las formulaciones equirecursivas ms difciles. El segundo
de los dos captulos de esta parte se desarrolla la metateora de un sistema con tipos y
subtipos equi-recursivo en el marco matemtico de coinducin. Parte V ocupa polimorfismo,
con captulos sobre tipo de de reconstruccin de estilo ML, el ms poderoso , polimorfismo
impredicativos de System F, la cuantificacin existencial y sus conexiones con tipos
abstractos de datos y la combinacin de polimorfismo y subtipos de sistemas con la
cuantificacin acotadada.Parte VI trata de operadores de tipo. Un captulo cubre los
conceptos bsicos; la prxima desarrolla sistema F y su metateora; el siguiente combina
a operadores de tipo y cuantificacin acotada para Sistema F
estudio del caso de cierre.
; el ltimo captulo es un
Las dependencias principales entre captulos son perfiladas en la Figura p-1. Las flechas
grises indican que slo la parte de un captulo posterior depende de uno ms temprano.
Las principales dependencias entre captulos se resumen en la figura P-1. Las flechas
grises indican que slo una parte de un captulo posterior depende de una anterior. El
tratamiento de cada caracterstica del lenguaje discutido en el libro sigue un patrn comn.
Ejemplos motivadores son en primer lugar; luego definiciones formales; luego las pruebas
de propiedades bsicas tales como la seguridad de tipos; entonces (por lo general en un
captulo aparte) una investigacin ms profunda de la metateora, llevando a verificacin de
tipos de algoritmos y sus pruebas de solidez, integridad y terminacin; y finalmente (de
nuevo en un captulo aparte) la realizacin concreta de estos algoritmos como un programa
de OCaml (Objetivo Caml).
Una importante fuente de ejemplos a lo largo del libro es el anlisis y diseo de
caractersticas para la programacin orientada a objetos. Cuatro captulos de estudios de
casos desarrollan diferentes enfoques en detalle un modelo simple de objetos y clases
(captulo 18) imperativas convencionales, un clculo bsico basado en Java (Captulo 19)
un relato ms refinada de objetos imperativas utilizando cuantificacin acotada (Captulo
27) y un tratamiento de objetos y clases en el entorno puramente funcional del Sistema
F , usando tipos existenciales (el Captulo 32).
Para mantener el libro lo suficientemente pequeo para ser cubierto en un semestre
curso avanzado-y ligero como para ser llevados por el promedio de estudiantes de posgrado
era necesario excluir muchos temas interesantes e importantes. Enfoques denotacional y
axiomticos a la semntica se omiten por completo; hay libros que cubren estos enfoques y
abordarlos aqu empaara fuertemente pragmtico, la perspectiva orientada a la
implementacin de este libro. Se sugieren las ricas conexiones entre los sistemas de tipo y
lgica en algunos lugares pero sin revelar en detalle; si bien son importantes stas nos
llevara demasiado lejos. Muchas de las funciones avanzadas de los lenguajes de
programacin
xvi
Preface
xvii
Preface
y los sistemas de tipo slo se mencionan de pasada, por ejemplo, los tipos de
dependencia, tipos de interseccin y la correspondencia de Curry-Howard;
secciones breves sobre estos temas proporcionan puntos de partida para la lectura
adicional. Por ltimo a excepcin de una breve incursin en el ncleo del lenguaje
Java y similares (captulo 19), el libro se centra exclusivamente en los sistemas
basados en el clculo lambda; Sin embargo los conceptos y mecanismos
desarrollados en este entorno se pueden transferir directamente a las reas
relacionadas, tales como lenguajes con tipos concurrentes, lenguajes
ensambladores , y clculos de objetos especializados.
Conocimientos requeridos
El texto asume ninguna preparacin en la teora de lenguajes de programacin
pero los lectores debe comenzar con un grado de madurez matemtica -en
particular, los cursos de pregrado riguroso en matemticas discretas, algoritmos y la
lgica elemental.
Los lectores deben estar familiarizados con la programacin funcional, al menos,
uno de orden superior lenguaje (Esquema, ML, Haskell etc.) y con los conceptos
bsicos de los lenguajes de programacin y compiladores (sintaxis abstracta,
gramticas de BNF, evaluacin, mquinas abstractas, etc.). Este material est
disponible en muchos textos de pregrado; Me gusta especialmente Fundamentos
de lenguajes de programacin por Friedman Wand, y Haynes (2001) y Lenguaje de
Programacin Pragmtica de Scott (1999). La experiencia con un lenguaje
orientado a objetos tal como Java (Arnold y Gosling, 1996) es til en varios
captulos.
Los captulos sobre implementaciones concretas de typecheckers presentan
fragmentos significativos de cdigo en OCaml (o Objetivo Caml), un dialecto
popular de ML. El conocimiento previo de OCaml es til en estos captulos pero no
es absolutamente necesario; slo se utiliza una pequea parte del lenguaje y las
caractersticas se explican en su primera aparicin. Estos captulos constituyen un
hilo distinto del resto del libro y pueden ser omitidos por completo si se desea. El
mejor libro de texto sobre OCaml en este momento es Cousineau y Mauny (1998).
Los materiales tutoriales que vienen con la distribucin OCaml (disponible en
http://caml.inria.fr y http://www.ocaml.org) son tambin muy legible.
Los lectores familiarizados con el otro dialecto principal de ML, Standard ML no
deberan tener problemas para seguir los fragmentos de cdigo OCaml. Libros de
texto populares en ML estndar incluyen los de Paulson (1996) y Ullman (1997).
Esquema del curso
Un curso de postgrado intermedio o avanzado debe ser capaz de cubrir la mayor
parte del libro en un semestre. Figura P-2 ofrece un programa de estudios de la
muestra a partir de un nivel superior, un
xviii Preface
curso para estudiantes de doctorado en la Universidad de Pensilvania(dos
de 90 conferencias minutos a la semana, en la supuesta preparacin previa
mnima en la teora del lenguaje de programacin, pero se lleva rpidamente).
Para un estudiante universitario o un curso de postgrado de introduccin,
hay una serie de posibles caminos a travs del material. Un curso sobre
sistemas de tipo de programacin se concentrara en los captulos que
introducen diversas caractersticas de escritura e ilustran sus usos y omiten la
mayora de los captulos metateora e implementacin. Como alternativa un
curso sobre la teora bsica y la aplicacin de sistemas de tipo progresara a
travs de todos los primeros captulos probablemente saltarse el captulo 12 (y
tal vez 18 y 21) y sacrificar el material ms avanzado hacia el final del libro.
Los tratamientos ms cortos tambin pueden construirse mediante la seleccin
de captulos particulares de inters usando el diagrama de dependencia en la
Figura P-1.
El libro tambin es adecuado como texto principal para un curso ms
general de posgrado en la teora de lenguajes de programacin. Tal curso
podra pasar la mitad a dos tercios de un semestre de trabajo a travs de la
mayor parte del libro y dedicar el resto a, por ejemplo, una unidad de la teora
de la concurrencia basada en el libro pi- clculo lambda de Milner (1999), una
introduccin a Hoare lgica y semntica axiomtica (por ejemplo Winskel
1993) o un estudio de las caractersticas del lenguaje avanzadas como
continuaciones o sistemas de mdulos.
En un curso en proyectos a largo plazo juegan un papel importante puede
ser deseable posponer parte del material terico (por ejemplo, la normalizacin
y tal vez algunos de los captulos sobre metateora) para que una amplia gama
de ejemplos puede ser cubierta antes de que los estudiantes eligen proyectos
de temas.
Ejercicios
La mayora de los captulos incluyen extensos ejercicios-algunos diseados
para lpiz y papel, algunos ejemplos que involucran programacin en los
clculos que se est discutiendo, y algunas relativas ampliaciones de las
implementaciones ML de estos clculos.La dificultad de cada ejercicio se
estima se indica utilizando la siguiente escala:
*
**
***
****
Verificacin rpida
30 segundos a 5 minutos
Fcil
1 hora
Moderado
3 horas
Desafo
> 3 horas
Los ejercicios marcados con * pretenden ser los controles en tiempo real de
los conceptos importantes. A los lectores se les recomienda hacer una pausa
para cada uno de ellos antes de pasar al material que sigue. En cada captulo
se recomienda un conjunto ms o menos de tareas asignados de ejercicios.
Preface xix
Lectura
Tema
Lectura
1
Descripcin general del curso; historia; administrivia 1, (2)
2.
Preliminares: sintaxis, semntica operacional 3, 4
3.
Introduccin al clculo lambda 5.1, 5.2
4.
La formalizacin del clculo lambda 5.3, 6, 7
5.
Tipos; el tipo simple de clculo lambda 8, 9, 10
6.
Extensiones simples; formas derivadas 11
7.
Ms extensiones 11
8.
Normalizacin 12
9.
Referencias; excepciones 13, 14
10.
Subtipificacin 15
11.
Metateora de subtipos 16, 17
12.
Objetos imperativos 18
13.
Java Ligero 19
14.
Tipos recursivos 20
15.
Metateora de tipos recursivos 21
16.
Metateora de tipos recursivos 21
17.
Tipo de reconstruccin 22
18.
Polimorfismo universal 23
19.
Polimorfismo existencial; ADTs 24, (25)
20.
Cuantificacin acotada 26, 27
21.
Metateora de cuantificacin acotada 28
22.
Tipos de operadores 29
23.
Metateora de F 30
24.
Subtipos de orden superiors 31
25.
Objetos Puramente Funcionales 32
26.
Lectura de desbordamiento
La figura p-2: programa de estudios de muestra para un curso de graduado
avanzado
Soluciones completas para la mayora de los ejercicios se presentan en el Apndice
A. Para ahorrar a los lectores la frustracin de la bsqueda de soluciones a los
pocos ejercicios para los que las soluciones no estn disponibles los ejercicios estn
marcados -++.
Convenciones tipogrficas
La mayora de los captulos introducen las caractersticas de algn tipo de sistema en
un estilo discursivo, a continuacin, se definira el sistema formal como un conjunto de
reglas de inferencia en una o ms figuras. Para facilitar la consulta estas definiciones
se presentan habitualmente en su totalidad, incluyendo no slo las nuevas normas
para las caractersticas que se est discutiendo por el momento, sino tambin el resto
de las reglas necesarias para constituir un clculo completo. Las nuevas piezas se
fijan en un fondo gris para hacer el "delta" de los sistemas anteriores visualmente
evidente.
xx
Preface
Una caracterstica inusual de la produccin del libro es que todos los ejemplos
tienen typechecked mecnicamente durante la composicin tipogrfica: un
guin pasa a travs de cada captulo, extrae los ejemplos genera y compila
una typechecker personalizado que contiene las caractersticas en discusin,
lo aplica a los ejemplos, e inserta el las respuestas del corrector en el texto. El
sistema que hace las partes fuertes de esta, llamada TinkerType fue
desarrollado por Michael Levin y yo (2001). El financiamiento para esta
investigacin fue proporcionado por la Fundacin Nacional para la Ciencia a
travs de subvenciones CCR-9701826 Fundamentos de principios para
Programacin con Objetos y CCR-9912352 Modulares Tipo Systems.
Recursos Electrnicos
Un sitio web asociado con este libro se puede encontrar en la siguiente URL:
http://www.cis.upenn.edu/~bcpierce/tapl
Los recursos disponibles en este sitio incluyen erratas para el texto
sugerencias para proyectos de curso, los punteros a material complementario
contribuido por los lectores y una coleccin de implementaciones
(typecheckers e intrpretes simples) de los clculos cubierto en cada captulo
del texto.
Estas implementaciones ofrecen un entorno para experimentar con los
ejemplos en el libro y probar soluciones a los ejercicios. Tambin han sido
pulidos para facilitar la lectura y la modificabilidad y se han utilizado con xito
por los estudiantes en mis cursos como la base de ambos ejercicios de
aplicacin y pequeos proyectos de curso ms grandes. Las
implementaciones estn escritos en OCaml. El compilador OCaml est
disponible sin costo a travs de http://caml.inria.fr e instala muy fcilmente en
la mayora de plataformas.
Los lectores tambin deben ser conscientes de los tipos de foros una lista de
correo electrnico que cubre todos los aspectos de los sistemas de tipos y sus
aplicaciones. La lista es moderada para asegurar razonablemente bajo
volumen y una alta relacin seal-ruido en anuncios y discusiones. Archivos e
instrucciones
de
suscripcin
se
pueden
encontrar
en
http://www.cis.upenn.edu/~bcpierce/types.
Agradecimientos
A los lectores que encuentren valor en este libro deben su mayor gratitud a
cuatro mentores-Luca Cardelli Bob Harper Robin Milner y John Reynolds-que
me ensearon ms de lo que s de los lenguajes de programacin y tipos.
El resto que he aprendido sobre todo a travs de colaboraciones; adems
de Luca Bob Robin y Juan, mis socios en estas investigaciones han incluido
Martn
xxi
Preface
Abadi, Gordon Plotkin, Randy Pollack, David N. Turner, Didier Rmy, Davide
Sangiorgi, Adriana Compagnoni, Martin Hofmann, Giuseppe Castagna, Martin
Steffen, Kim Bruce, Naoki Kobayashi, Haruo Hosoya, Atsushi Igarashi, Philip
Wadler, Peter Buneman, Vladimir Gapeyev, Michael Levin, Peter Sewell, Jrme
Vouillon, y Eijiro Sumii. Estas colaboraciones son la fundacin no slo de mi
entendimiento, sino tambin de mi placer en el tema.
La estructura y la organizacin de este texto han sido mejoradas por
discusiones sobre la pedagoga con Thorsten Altenkirch, Bob Harper, y John
Reynolds, y el texto s mismo por correcciones y comentarios de Jim Alexander,
Penny Anderson, Josh Berdine, Tony Bonner, John Tang Boyland, Dave Clarke,
Diego Dainese, Olivier Danvy, Matthew Davis, Vladimir Gapeyev, Bob Harper, Eric
Hilsdale, Haruo Hosoya, Atsushi Igarashi, Robert Irwin, Takayasu Ito, Assaf Kfoury,
Michael Levin, Vassily Litvinov, Pablo Lpez Olivas, Dave MacQueen, Narciso
Marti-Oliet, Philippe Meunier, Robin Milner, Matti Nyknen, Gordon Plotkin, John
Prevost, Fermin Reig, Didier Rmy, John Reynolds, James Riely, Ohad Rodeh,
Jrgen Schlegelmilch, Alan Schmitt, Andrew Schoonmaker, Temblores de Olin,
Perdita Stevens, Chris Stone, Eijiro Sumii, Val Tannen, Jrme Vouil-lon, y Philip
Wadler. (Pido perdn si he omitido por descuido a alguien de esta lista.) Luca
Cardelli, Roger Hindley, Dave MacQueen, John Reynolds, y Jonathan Seldin
ofrecieron las perspectivas de las personas enteradas en algunos puntos
histricos enredados.
Los participantes en mis seminarios de graduado en universidad de Indiana en
1997 y 1998 y en la universidad de Pensilvania en 1999 y 2000 soldiered por
versiones tempranas del manuscrito; sus reacciones y comentarios me dieron la
direccin crucial en la formacin del libro ya que usted lo ve. Bob Prior y su equipo
de La Prensa de MIT expertamente dirigieron el manuscrito por muchas fases del
proceso de publicacin. El diseo del libro est basado en macros de LTEX
desarrollado por Christopher Manning para La Prensa de
MIT.