Вы находитесь на странице: 1из 21

Tipos y Lenguajes de programacin

Tipos y Lenguajes de programacin

Benjamin C. Pierce

La Prensa de MIT
Cambridge, Massachusetts
Londres, Inglaterra

2002 Benjamin C. Pierce


Reservados todos los derechos. Ninguna parte de este libro puede ser reproducida
en cualquier forma por ninguno electrnico de medios mecnicos (incluso
fotocopia, grabacin, o almacenaje de informacin y recuperacin) sin el permiso
por escrito del editor.
Este libro fue puesto en el Lucida Brillante por el autor que usa el sistema de
preparacin de documentos de LTEX.
Imprimido y ligado en los Estados Unidos de Amrica.

Biblioteca de Datos de catalogacin en la Publicacin


de Congreso
Perfore, Benjamin C.
Tipos y lenguajes de programacin / Benjamin C. Pierce p.
cm.
Incluye referencias bibliogrficas e ndice.
ISBN 0-262-16209-1 (hc.: papel de alk.)
1. Lenguajes de programacin (Ordenadores electrnicos). Yo.
Ttulo.
QA76.7.P54 2002
005.13dc21

2001044428

Contenido

Prefacio
1

Introduccin
1.1
1.2
1.3
1.4
1.5

Tipos en Ciencia de la Computacin 1


Qu tipo de sistemas son buenos para 4
Tipos de sistemas y diseo de lenguajes 9
Desarrollo Histrico 10
Lectura relacionada 12

Matemticas Preliminares
2.1
2.2
2.3
2.4
2.5

xiii

15

Conjuntos, relaciones y funciones


Conjuntos ordenados
16
Sucesiones
18
Induccin
19
Lecturas anteriores
20

Sistemas sin tipo

21

Expresiones Aritmticas sin tipo


3.1
3.2
3.3
3.4
3.5
3.6

Introduccin
23
Sintaxis
26
Induccin de Trminos 29
Estilos semnticos 32
Evaluacin
34
Notas
43

23

15

vi

Contents

Una implementacin ML de expresiones aritmticas


4.1
4.2
4.3

Sintaxis
46
Evaluacin
47
El Resto de la historia

El clculo Lambda sin tipo


51

5.1
5.2
5.3
5.4
6

Representacin sin nombre de trminos


Trminos y Contextos
76
Desplazamiento y sustitucin
Evaluacin
80

Trminos y Contextos
83
Desplazamiento y sustitucin
Evaluacin
87
Notas
88

Tipos simples
8

75

78

83

85

89

Tipos expresiones aritmticas


91

8.1
8.2
8.3
9

58

Una Realizacin ML del clculo Lambda


7.1
7.2
7.3
7.4

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

Simplemente clculo Lambda


9.1
9.2
9.3
9.4
9.5
9.6
9.7

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

10 Una implementacin ML de Tipos Simples


10.1
10.2
10.3

Contextos
113
Trminos y Tipos
Verificacin de tipos

115
115

108

113

vii

Contents

11 Extensiones Simples

117

11.1 Tipos base


117
11.2 El Tipo de Unidad 118
11.3 Formas derivadas: Secuenciacin y comodines
11.4 Atribucin
121
11.5 Permitir enlaces 124
11.6 Pares
126
11.7 Tuplas
128
11.8 Archivos
129
11.9 Sumas 132
11.10 Variantes
136
11.11 Recursin General
142
11.12 Listas
146
12 Normalizacin
12.1
12.2

149

Normalizacin para Tipos Simples


Notas
152

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

Aumento de Excepciones 172


Manejo de Excepciones 173
Excepciones que producen valores

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

Propiedades de Subtipos y tipos


188
Tipos superiores e inferiores
191
La subtitpificacin y otras caractersticas
193
Cohesin semntica para subtipificacin 200
Interseccin y tipos de Unin
206
Notas
207

182

119

viii
Contenido

16 Metateora de Subtipificacin
16.1
16.2
16.3
16.4

209

Subtipificacin algortmica 210


Tipificacin algortmica 213
Unin y reunin
218
Tipificacin algortmica y el tipos inferiores

220

17 Una Realizacin ML de Subtipificacin


221
17.1
17.2
17.3

Sintaxis
221
Subtipificacin 221
Tipificacin 222

18 Caso de estudio: Objetos Imperativos


18.1
18.2
18.3
18.4
18.5
18.6
18.7
18.8

225

Qu es la Programacin orientada a objetos? 225


Objetos
228
Generadores de objeto 229
Subtipificacin 229
Adicin de variables de Instancia 230
Clases simples
231
Adicin de Variables de Instancia
Llamando Mtodos de Superclase

233
234

18.9 Clases con sigo misma 234


18.10 Iniciar Recursin a travs de la misma
235
18.11 Iniciar Recursin y orden de evaluacin
237
18.12 Una implementacin ms eficiente
241
18.13 Recapitulacin 244
18.14 Notas
245
19 Estudio del caso: Peso pluma Java
19.1
19.2
19.3
19.4
19.5
19.6
19.7

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

21 Metateora de Tipos Recursivos


21.1
21.2
21.3
21.4
21.5
21.6
21.7

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

Tipos de variables y sustituciones


317
Dos Visiones de tipos de variables 319
Tipificacin basada en restricciones 321
Unificacin
326
Tipos principales
329
Anotaciones de Tipo implcitas 330
Dejar el Polimorfismo 331
Notas
336

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

Borrado, tipificacin y reconstruccin de tipos

340

354

Contents

23.7 Borrado y orden de evaluacin


23.8 Fragmentos de Sistema F 358
23.9 Parametricity
359
23.10 Impredicativity
360
23.11 Notas
361

357

24 Tipos Existenciales
363
24.1
24.2
24.3
24.4

Motivacin
363
Abstraccin de datos existenciales
Codificaciones existenciales
377
Notas
379

25 Una Realizacin ML de Sistema F


25.1
25.2
25.3
25.4
25.5

381

Representacin annima de Tipos


Tipo de cambio y sustitucin
Trminos 383
Evaluacin
385
Tipificacin 386

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

Tipos Existenciales Bounded


Notas
408

400
406

27 Caso de estudio: Objetos Imperativos, Redux

411

28 Metateoria de cuantificacin Bounded

417

28.1
28.2

Exposicin
417
Tipificacin Minimal 418

28.3
28.4
28.5
28.6
28.7
28.8

Subtipificacin en Kernel F <: 421


Subtipificacin en Full F <:
424
Indecidibilidad de F <:
427
Unir y encontrar
432
Existenciales acotadas
435
Requisito saltado y el Tipo de Fondo

436

xi

Contents

VI

Sistemas de pedido ms alto 437

29 Type Operators y Kinding


29.1
29.2

Intuiciones
Definiciones

439

440
445

30 Polimorfismo de Pedido ms alto


30.1
30.2
30.3
30.4
30.5

449

Definiciones
449
Ejemplo
450
Propiedades 453
Fragmentos de F 461
Yendo Adelante: Tipos Dependientes

31 Subtipificacin de pedido ms alto


31.1
31.2
31.3
31.4

462

467

Intuiciones
467
Definiciones
469
Propiedades 472
Notas
472

32 Estudio del caso: Objetos Puramente Funcionales

475

32.1 Objetos simples


475
32.2 Subtipificacin 476
32.3 Requisito saltado
477
32.4 Tipos de interfaz
479
32.5 Envo de mensajes a Objetos
480
32.6 Clases simples
481
32.7 Actualizacin polimorfa 482
32.8 Adicin de Variables de Caso 485
32.9 Clases "Conmigo"
486
32.10 Notas
488

Apndices

491

Soluciones de Ejercicios Seleccionados

Convenciones Notacionales
B.1
B.2
B.3

565

Nombres de Metavariable 565


Regla Llamando Convenciones 565
El nombramiento y Convenciones Subscripting

Referencias
ndice

493

605

567

566

Prefacio

El estudio de tipos de sistemas


y de lenguajes de programacin de un tipo terico perspectivo se ha convertido en un campo energtico con importantes
aplicaciones en ingeniera de software, diseo de lenguajes, la implementacin del
compilador de alto rendimiento,y la seguridad.Este texto ofrece una introduccin
completa de las definiciones fundamentales, resultados, y tcnicas en el rea.

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

Figure P-1: Dependencia de Captulos

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.

Las pruebas de programas son demasiado aburridas para el proceso social de


matemticas para trabajar.
Richard - DeMillo, Richard Lipton, y Alan Perlis,
1979
... As que no se basan en procesos sociales para la verificacin. David - Eneldo,
1999
Los mtodos formales nunca tendrn un impacto significativo hasta que ellos
puedan ser usados por la gente que no los entiende. atribuido a Tom Melham

Вам также может понравиться