types and programming languages pdf 2002

更多书评 There are two types of programming languages, which can be categorized into the following ways: 1.Low level language: Machine language (1GL), Assembly language (2GL) 2. A comprehensive introduction to type systems and programming languages. λz. There are many excellent textbooks onProgramming languages, such as: I Programming Language Pragmatics, by Michael L. Scott I Practical Foundations of Programming Languages, by Robert Harper I Programming Languages, Principles and Paradigms, by Allen Tucker and Robert Noonan I... We will focus ontypesbecause I most language features can be discussed in the … Each rule is read, “If we have established the statements in the premise(s) listed above the line, then we may derive the conclusion below the line.” The fact that T is the smallest set s... 第 8 章给一个包含自然数和 bool 的算术表达式系统引入了类型的概念和推导一个表达式的类型的 typing rules(例如“如果 t1 是 bool,t2 和 t3 类型同为某个类型 T,则 if t1 then t2 else t3 的类型为 T”),基于 typing rules 得到的项和类型之间的关系被抽象的叫做 typing relation。如果根据 typing rules 可以推导出某个项 t 属于某个类型 T(写作 t:T),那么 t 被称为 well typed 的。接下来根据这个系统里的 typing re... © 2005-2020 douban.com, all rights reserved 北京豆网科技有限公司, https://www.seas.harvard.edu/courses/cs152/2010sp/lectures/lec08.pdf, https://www.youtube.com/watch?v=YScIPA8RbVE. h h y)。, 接下来,g (λy. λz. It focuses on pragmatics, with the right level of necessary theory. The concrete types of some programming languages, such as integers and strings, depend on practical issues of computer architecture, compiler implementation, and language design. g (λy. λz. x x y)),注意到给 fix 传一个参数 g 之后,它变成了, 这个表达式可以做 beta-reduction,设 (λx. Includes bibliographical references and index. 最感谢的莫过于OPLSS 2018的pre-session,在上课的过程中不知不觉建立了对于各项type rules的直观理解,在其后再次回顾这本书各项内容都变得简单易懂。但有趣的是,虽然Computational Type Theory被Bob Harper称为最符合直... 起初是没有太明白书中的内容的。即使是拥有Haskell的基础,在研读时仍有各种疑惑,对于证明习题也是充满了恐惧和不知如何开始。 A language feature is defined by its statics, the rules govern-ing the use of the feature in a program, and its dynamics, the rules defining how programs using this feature are to be executed. 比较难理解的一本理论书。但稍有感悟之后,再看回头这些茫茫多的程序语言的设计思想还是别有一番滋味!, 13/5/2 pdf英文+实体中文对照 for any element k ∈S with s≤k and t≤k, we have j≤k. We do this by defining a family of predicates, indexed by types. A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. h h y) 自由处理,可以将它丢弃,也可以将它应用在某个参数上。如果将它应用在某个参数 n 上,就有 (λy. h h y)(此处标 *),之所以说类似是因为它也有这种紧邻在一起的两个同样的项 (λx.   2人喜欢, 玩 telegram 的小伙伴可以关注 https://t.me/daquexiannotebook ~ 读书笔记是从上面搬运过来的,也有讨论群, 按照前言的课时安排,读了第五章的第一和第二节,这两节讲了没有类型的 lambda 演算。我经常听说 lambda 演算这个东西,总感觉听起来很厉害,后来也看过一些 beta-reduction 之类的概念,但还是不知道为什么 lambda 演算有这么大的存在感。这次看了这两节之后感觉自己基本明白了,在纯 lambda 演算里一切东西都是函数(甚至没有数字),唯一的操作是函数的 application,即把函数应用到参数上(参数也是一个函数),这样一个简单的系统却能够表达出自然数、自然数的运算、条件判断和 pair、list 等结构体。, lambda 表达式的归约策略值得一提的有 call-by-value 和 call-by-name 两种,tapl 里的解释我没有看的太懂,后来看了这里的 https://www.seas.harvard.edu/courses/cs152/2010sp/lectures/lec08.pdf 的解释,call-by-value 就是在做 beta-reduction 之前 要求参数一定是一个不能继续规约的 value,call-by-name 没有这个要求,仅仅是先把最左侧、最外侧,且不在 lambda abstraction 内的可规约的表达式规约。这本书默认使用 call-by-value 的策略。, 用 lambda 表达式表示自然数的方法是 church numerals,在 sicp 里面也有提到过,当时觉得很厉害,现在有了更清晰的认识:λs. A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. The course involves substantial programming assignments and problem sets as … Benjamin C. Pierce. Programming Language Design and Implementation (4th Edition) by T. Pratt and M. Zelkowitz Prentice Hall, 2001 Book sections: •Section 1.5 •Section 2.2.4 •Section 6.5 •Appendix A.2 •Appendix A.3 •Appendix A.5 Three generations of programming language These three languages all have the same basic syntax. Advanced Topics in Types and Programming Languages builds on Benjamin Pierce's Types and Programming Languages (MIT Press, 2002); most of the chapters should be accessible to readers familiar with basic notations and techniques of operational semantics and type systems--the material covered in the first half of the earlier book. Types and programming languages / Benjamin C. Pierce p. cm. endobj A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. Topics covered include: meta-circular interpreters, semantics (operational and denotational), type systems (polymorphism, inference, and abstract types), object oriented programming, modules, and multiprocessing. << /Type /Page /Parent 1 0 R /LastModified (D:20120521010156+00'00') /Resources 2 0 R /MediaBox [0.000000 0.000000 595.276000 841.890000] /CropBox [0.000000 0.000000 595.276000 841.890000] /BleedBox [0.000000 0.000000 595.276000 841.890000] /TrimBox [0.000000 0.000000 595.276000 841.890000] /ArtBox [0.000000 0.000000 595.276000 841.890000] /Contents 34 0 R /Rotate 0 /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Annots [ 6 0 R 7 0 R 8 0 R 9 0 R ] /PZ 1 >> x x y)) y) = g (λy. 书是好书, 没啥好说的,pl必读书。从16年开始反反复复看了差不多有三年。后面几章有点难,而且难点不在如何理解concept,而在这些concept到底在讲了一个啥?或者说在整个system中起到了哪些关键性的不可替代性的作用。, 得做proof啊!不做proof怎么可能懂 哭泣 STLC的strong normalization 书里一下就过去了 在不同的知识储备下看感觉是完全不一样的。。。, 起初是没有太明白书中的内容的。即使是拥有Haskell的基础,在研读时仍有各种疑惑,对于证明习题也是充满了恐惧和不知如何开始。   1人喜欢, 2020-05-02 11:19 Dependencies between chapters are explicitly identified, allowing readers to choose a variety of paths through the material.The core topics include the untyped lambda-calculus, simple type systems, type reconstruction, universal and existential polymorphism, subtyping, bounded quantification, recursive types, kinds, and type operators. h h y) 仍可以在将 g 展开之后进行归约,精妙之处在于:g 是传入给 fix 的参数,是使用 fix 组合子的程序员来控制的,在 g 里程序员可以把 g 的参数,也就是 (λy. x x y)), 这是一个神奇的构造,它里面有两个紧邻的相同的项 (λx. MIT Press. 0 : (n == 1 ? (λx. 33 0 obj These programming languages become popular with use to different programmers because there is always a tradeoff between ease of learning and use, efficiency and power of expression. The study of type systems for programming languages has emerged over the past decade as one of the most active areas of computer science research, with impor-tant applications in software engineering, programming language design, high-performance compiler implementation, and security of information networks. They are often misled on topics such as efficiency and correctness. <> stream f (λy. of type systems--and of programming languages from a type-theoretic perspective -- -has important applications in software engineering, language design, high-performance compilers, and security.This text provides a comprehensive introduction both to type systems in computer science and to the basic theory of programming languages. One way to classify programming languages is either as low-level languages or high-level languages. The study of type systems--and of programming languages from a type-theoretic perspective -- -has important applications in software engineering, language design, high-performance compilers, and security.This text provides a comprehensive introduction both to type systems in computer science and to the basic theory of programming languages. 6.821 teaches the principles of functional, imperative, and logic programming languages. 在数学中,类 X 上的一个二元关系 R 被称为是良基的,当且仅当所有 X 的非空子集都有一个 R-极小元, 2019-06-18 11:01 1 : fnt (n-1) + fnt (n-2)), 2020-05-20 22:26 (λx. The study of type systems--and of programming languages from a type-theoretic perspective -- -has important applications in software engineering, language design, high-performance compilers, and s... A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. •Pierce, B. C. (ed) (2005) Advanced Topics in Types and Programming Languages. Contents Preface xiii 1 Introduction 1 1.1 Types in Computer Science 1 1.2 What Type Systems Are Good For 4 1.3 Type Systems and Language … Advanced Topics in Types and Programming Languages … Programming languages are used for controlling the behavior of computer machines. Ada was one of the first widely-used languages to have a language construct representing an abstraction (a package), an abstract data type (a private type), multi-threading (tasks), generic templates, exception handling, strongly-typed separate compilation, subprogram inlining, etc. 最感谢的莫过于OPLSS 2018的pre-session,在上课的过程中不知不觉建立了对于各项type rules的直观理解,在其后再次回顾这本书各项内容都变得简单易懂。但有趣的是,虽然Computational Type Theory被Bob Harper称为最符合直觉的,在最后一周的讲座中基本没有听懂其内容。   1人喜欢, 读了第 11 章,此外我还看这个视频 https://www.youtube.com/watch?v=YScIPA8RbVE 了解了一些代数数据类型的概念,正好和第 11 章的内容有很多重叠所以会在一起写出来。, 第 11 章里,为了使前面几章介绍的 simply typed lambda calculus 更接近一个通用编程语言,给它在类型的层面进行了扩展,其中很多扩展是在通用编程语言里非常常见的。, 首先作者介绍了 base type 的概念,就是没有内部结构的类型,例如 bool、float、char 等,一种有用的 base type 是 Unit 类型,这个类型只包含一个值,在通用编程语言里面,Unit 类型经常会作为没有必要有返回值的函数的返回值类型——因为 Unit 类型只有一个可能的值,所以用 Unit 作为返回值类型,就意味着不需要关心函数返回了什么值。在古老的编程语言例如 C/C++/Java 里这个角色是由 void 充当的,在这些语言里 void 表示"什么也不返回"而不是"返回某个固定的值",导致在写 C++ 模板的时候有时要对返回 void 类型的情况特殊处理。, 作者还介绍了和类型和积类型的概念,和类型在本书中叫做 variant,它的概念类似于 C 语言中的 union。一个类型为 A+B 的值要么属于类型 A,要么属于类型 B,和 C 语言的 union 不同的是 C 语言 union 是 untagged union,无法区分出当前的值属于哪一种类型,而通常说的和类型是 tagged union,构造一个 tagged union 类型的值时必须添加一个起到区分作用的 tag,后续就可以借助 tag 进行模式匹配,区分当前的值属于哪一种类型。值得注意的是,如果不做特殊的修改,sum type 会破坏 simply typed lambda calculus 里的 uniqueness of types 性质(即一个值只有一个类型),因为设 t 为类型 T1,则 inl t 的类型为 T1+T2,其中对 T2 没有做出任何的要求,可能是任何的类型,所以 T1+T2 也可能是任何的类型。解决这个问题有几种办法:从后续程序里猜测出 inl t 的唯一类型、想办法允许 T2 表示所有类型、要求用户在写到 inl t 时手动注明 T1+T2 的具体类型,书里暂时使用第三种办法。, 通用编程语言里常见的和类型有 Options 和 Enums,Options 就是 Rust 里的 std::option、C++ 里的 std::optional、Haskell 里的 Maybe,用来表示可能为空的值,实际上它是一种和类型,Optional[T] 其实就是 Unit + T;Enums 就是常说的枚举类型,它实际上是 variant 的语法糖,例如一个表示星期几的枚举类型实际上是 ,此外书上没有写但比上述的两个更有用的和类型是 Rust 的 std::result,也就是 Haskell 里的 Either。作者还写了一种特殊的“和类型”——只有一个 field 的 variant 在编程时的应用,它可以将同个类型但不同含义的值区分成不同的类型。, 积类型类似于 C 语言中的 struct,在本书里叫 record,untagged 的 record 叫做 tuple,只涉及两个类型的 tuple 叫做 pair,没有特别多需要讲。, 如果设 T 为包含了所有类型的集合,将类型间的相等关系定义为两个类型的值可以一一对应,就可以发现 是一个交换半环( https://zh.wikipedia.org/wiki/半环 ),其中 × 的单位元是类型 Unit,即 Unit×T1=T1×Unit=T1,+ 的单位元是一个不含有任何值的类型 Void,即 Void+T1=T1+Void=T1,且 × 对 + 满足分配律,即 T1×(T2+T3)=T1×T2+T1×T3。设 f(T1)=类型T1包含的值的数量,则 f 是 的一个同态映射( 里 N 是自然数集合,+ 和 × 分别是自然数上的加法和乘法),Unit 映射到 1,Void 映射到 0,T1+T2 和 T1×T2 分别映射到 f(T1)+f(T2) 和 f(T1)×f(T2)。在这个映射下还可以发现更多有趣的事情,例如对函数类型 T1->T2 有 f(T1->T2)=f(T2)^f(T1),所以类型之间的 -> 运算可以对应自然数之间的 ^ 运算,由 ^ 运算的性质 (a^b)^c = a^(bc) 可以类比 c->(b->a) = (b×c)->a,这正好是 currying 的含义。更多相关知识推荐看 https://www.youtube.com/watch?v=YScIPA8RbVE 这个视频。, 此外这一章作者还描述了 derived forms 的概念,就是常说的语法糖,可以完全使用已有的规则定义出来的东西。derived forms 作者介绍了两种:等价于 (λx:Unit.t2)t1 的 t1;t2、等价于 λx:S.t(x 是 S 中没有出现的自由变量)的 λ_:S.t。, 1. let bindings,就是 Ocaml 中 let x=t1 in t2 这样的写法,并通过合适的 evaluation rules 使 t1 先被规约成 value,再代换掉 t2 中的 x, 2. fix 和 letrec,fix 就是前几章有讲过的不动点算子,用来写出递归函数,它的类型是 (T->T)->T,没有办法在 simply typed lambda calculus 里面表示出来,所以被当作一个特殊形式引入,此外加入语法糖 letrec,使 letrec x:T1 = t1 in t2 实际上为 let x = fix (λx:T1.t1) in t2,这和 OCaml 中 letrec 的作用类似,此外 x 不一定是一个函数类型,也可以是多个函数类型组成的 record 类型,这样就可以方便的用 letrec 定义多个互相调用的函数。还讲了既然 fix 可以从 T->T 得到 T,那对任何类型都可以构造一个恒等映射的函数 f,fix f 虽然计算不会终止,但它的类型仍然是 T,这意味着对任何类型 T 都可以构造出一个类型可被推导为 T 的项,这是一件很有趣的事情。, 3. lists,list T实际上是一个递归类型 list T = Unit + T × (list T),在那个讲代数数据类型的视频里面也有讲到从代数的角度看待递归类型,非常有趣, 2019-06-15 19:13 Title. Most programming languages consist of instructions for computers.There are programmable machines that use a set of specific instructions, rather than general programming languages. The figure shows an example of machine code. Advanced Topics in Types and Programming Languages … Types and Programming Languages is designed for an advanced undergraduate or graduate course and assumes some familiarity with functional programming. z 是一次也没有应用,和自然数的 0 等价。当我们需要使用自然数的时候,要做的只是选择合适的 s 和 z,就可以做到和自然数能做到的同样的事情。例如判断一个数是不是 0,只需要把 z 设置为 true,s 设置为一个恒返回 false 的函数;此外,church 数的加法是先取出被加数的“右半部分”(λs. h h y) n = h h n,那么经过对 h h 的 beta-reduction,又得到了 g (λy. In this work we examine six programming languages …   1人喜欢. such as languages, complexity analysis, objects, and computability.   1人喜欢, 最小上确界,最大下确界 Different programming languages use different keywords to specify different data types. Pierce Types and Programming Languages 2002 - Free ebook download as PDF File (.pdf), Text File (.txt) or read book online for free. type theory. x x y)) (λx. h h y) 应用在什么参数上(应用在什么参数上是由 g 来决定的)。这就做到了和递归一样的效果。, 那么怎样写出一个合适的 g 以用 fix g 实现递归的效果也就很明确了,首先 g 应该接受一个参数,这个参数和上述的 (λy. •Pierce, B. C. (2002) Types and Programming Languages. s z 是 s 这个函数被应用在 z 上 1 次,和自然数的 1 等价,λs. h h y) 归约得到的新函数所接受的参数,g 根据这个(些)参数来判断是否终止循环,或者计算将怎样的参数应用在 fnt 上,以写一个阶乘函数为例,g 应该为 (为了方便我直接用类似 c 语言的写法了,三元条件表达式、==、乘法和减 1 操作都可以改写成纯 lambda 表达式):, λfnt. :s������qk���A�uq$��8��]�1�u�E]�q�i�X������. Computer programming languages are used to to communicate instructions to a computer. 拗口, 没有索引, 生僻的单词翻译的时候没有附上原英文单词. 1篇, 2020-05-02 11:24 右边的部分),用它替换掉加数的 z;乘法是设置乘数之一的 z 为 0,s 为加另一个乘数;减一操作类似于链表中的双指针法。, 证明了纯 lambda 演算可以表达自然数、bool 和条件语句之后,接下来作者为了方便就引入了正常的自然数、bool 和 if 语句。, 然后讲了怎么通过使用 fix 组合子在 lambda 演算里使用递归,fix 组合子是:, fix = λf. λz. Extended case studies develop a variety of approaches to modeling the features of object-oriented languages. for many of the advanced features in other programming languages. x x y)) 为 h,此时上式就是 h h,第一个 h 是函数,第二个 h 是参数,相当于把自己当作参数传给了自己,并且归约得到的也是一个类似的结构:, g (λy. Overview Birds-eye view of what’s happening in the world of types for programming languages (not logic or theorem proving) Using 1993 and 2003 as reference points 2/89. For instance, a presentation of garbage … x x y))。将上面的两步归约总结一下,也就是 fix g = h h = g (λy. 可惜翻译的很差. g (λy. 起初是没有太明白书中的内容的。即使是拥有Haskell的基础,在研读时仍有各种疑惑,对于证明习题也是充满了恐惧和不知如何开始。 n == 0 ? 但也正是通过在OPLSS和其他在读PhD的交流中,意识到了安定的研究生活其实不为我所想要,CS这一学科也至多只是个人的爱好而已。虽然现在依然未明确生活目标,但CS终将也只是达成目标的过程而不是最终的结果吧。接下来一年的学习方向会转向经济和程序分析。 Although this book is designed around a one semester introductory course, it should also be suitable for self-study students and for people with substantial programming experience but without similar computer science knowledge. s (s z) 是 s 被应用在 z 上 2 次,和自然数的 2 等价,λs. 最感谢的莫过于OPLSS 2018的pre-session,在上课的过程中不知不觉建立了对于各项type rules的直观理解,在其后再次回顾这本书各项内容都变得简单易懂。但有趣的是,虽然Computational Type Theory被Bob Harper称为最符合直觉的,在最后一周的讲座中基本没有听懂其内容。 最感谢的莫过于OPLSS 2018的pre-session,在上课的过程中不知不觉建立了对于各项type rules的直观理解,在其后再次回顾这本书各项内容都变得简单易懂。但有趣的是,虽然Computational Type Theory被Bob Harper称为最符合直... A, we proceed by proving, by induction on types, that all terms of type A possess property P, all terms of type A→A preserve property P, all terms of type (A→A)→(A→A) preserve the property of preserving property P, and so on. 起初是没有太明白书中的内容的。即使是拥有Haskell的基础,在研读时仍有各种疑惑,对于证明习题也是充满了恐惧和不知如何开始。 Machine code, one example of a low-level language, uses code that consists of just two numbers — 0 and 1. PDF | On Oct 1, 2016, Usman Opeyemi Lateef and others published INTRODUCTION TO COMPUTER PROGRAMMING (BASIC) | Find, read and cite all the research you need on ResearchGate The exercises range from easy to challenging and provide stimulating material for beginning and advanced readers, both programmers and the more theoretically minded." A comprehensive introduction to type systems and programming languages. h h y) 相关联,它在 g 的函数体里出现的位置是普通编程语言的递归函数的函数体中调用自身的位置,设这个参数叫做 fnt。此外 g 还应接受一个(或多个)参数,也就是 g (λy. 如果一个 term 属于类型 ...,那么它的值一定是 ...。这称为 canonical forms lemma。, 用这两个引理可以证明这个类型系统的 progress 和 preservation 性质。progress 是指,一个 well typed 的 term t 要么是 value(事先定义的一部分无法继续推导的项,例如 true、false、0、5),要么可以进一步推导。这个的证明是对得到 t:T 的推断过程中用到的最后一步 typing rule 做 case-by-case 的证明,具体做法和几乎所有证明一样也是用归纳法, preservation 是指,一个类型为 T 的项 t 经过一步推导得出的项 t' 一定也属于 T 类型,这个的证明做法和 progress 一样。, 有了 progress 和 preservation 这两个性质,我们就可以确保,在这个系统中对任何一个有类型的项 t 的推导都一定能最终得到一个 value 而不会陷入到某个非 value 却无法继续推导的状态(也就是之前介绍过的 runtime error 的概念)。这就是类型系统对程序正确性的巨大作用。满足这两个性质的类型系统称为类型安全的,这两个性质是对一个类型系统的基本要求。为了满足这两个性质,类型系统一般是保守的,一部分实际上没有问题的程序,例如 if false then true+true else 0,也不会是 well typed 的。, 第 9 章把类型系统引入到 lambda 演算里(引入了类型的 lambda 演算称为 \lambda_{\rightarrow}),新增了 function types 来表示函数的类型,例如 t1->t2 表示一个接受类型为 t1 的参数、返回类型为 t2 的参数的函数,"->" 是右结合的,t1->t2->t3 是 t1->(t2->t3),这方便了我们表达多元函数(t1->(t2->t3) 可以理解为接受 t1 类型的参数、返回 t2->t3 类型函数的函数,其实也就是一个接受一个 t1 类型参数和一个 t2 类型参数、返回 t3 类型的多元函数(currying))。, 在这个有了类型的 lambda 演算里,lambda abstraction 要显式标注参数类型,所以要写成 λx:T1.y 而不是原先的 λx.y 的形式。此外为了表达嵌套在 lambda abstraction 内部的项的类型,引入了类型上下文的概念,它的直观含义就是相对于当前被讨论的项,各个外层 lambda abstraction 绑定的变量和它们的类型。, 在这个 lambda 演算的类型系统里面,也有属于它的 inversion lemma 和 canonical forms lemma,类似的也可以证明它的 progress 和 preservation 性质。, 然后介绍了 Curry-Howard 同构,之前在知乎上经常看到它,不过书上一带而过,大概因为它不在本书的侧重范围, 然后就是介绍了 erasure 的概念,通常我们期望把一个有类型的系统中的类型擦去不会影响这个系统里 term 的推导,设 erase(t) 会把有类型的项 t 变为无类型的项,那这个期望就可以用, 2. erase(t)->m' 则存在 t' 使 t->t' 且 erase(t')=m, 来正式表达。第 2 条可以概括为 “evaluation commutes with erasure”。, 还有 typable 的概念:如果一个无类型的项 m 存在某个有类型的项 t 使得 erase(t)=m,那称 m 是 typable 的,这个概念和 type reconstruction (应该也就是自动类型推导)有关。, 第 10 章是 \lambda_{\rightarrow} 这个系统的 ML 实现,相比第 7 章的没有类型系统的 lambda 演算的 ML 实现仅仅多了类型检查的相关代码。, 订阅关于Types and Programming Languages的评论: Visual Basic can also be used within other Microsoft software to program small routines. The first half (through to Chapter 15) is relevant to this course, and some of the later material relevant to the Part II Types course. x��[Ys�F��ɿb��ĮH㹏�J��C��3+9Njwx��)�&)i���4> 3@c蕝ݱc�yt70 �� �0/#�\QpB��?�Doc��7�~��Yp�8 �$��/8����D�;�4��Ϙ��7Ad^Ӹ��)M�eVe��4i�'��8��87b-&b{/8��:��������s�k�+qN�qAs":�D�1�\\����Zp�DD������)��O��K��3�P���4f#F�zp������ܲ#{s��b�F��Or YVUaTEY"9�E)�ڪ���x*��ܞm����J��}��~���U��ILJ�yp���ӰJҴ�����[�4�8�o��2��oɑd#���������Z|+��ߐte'B� #�O�yF���h^�z�*ê̢��%N������璾�����[��W�� ��/�mB4�f�>-h��J̎�s�uH#W�=A�(�����{�tCOZ�c"��|�w� �{��������m�?�R1�(,˔LWo�4�8��q�����-��M�G��RРk���H;1�4�Ĵ�+vPS)� ��;}�&�xI}9����^�7.�-w�/v@Z����ȕ��ϐ~V�Nyf)Q��^/U�G�I��|H�̈�+bW��_W-�Cl����x�$��f3��m >r�V�`)�b�m�sj��R�s�J�c� Jl� Assembly language, anothe… In addition, a new section on optional types was added to Chapter 6 . First draft: August 1999 Revised: August 2002 c Peter Grogono 1999, 2002 Department of Computer Science x x y)) (λx. The study of type systems--and of programming languages from a type-theoretic perspective -- -has important applications in software engineering, language design, high-performance compilers, and security.This text provides a comprehensive introduction both to type systems in computer science and to the basic theory of programming languages. Material on the newer language, Swift, was added to several chapters. PHP was originally created by Rasmus Lerdorf in 1995 and stood for "Personal Home Page" and was released as a free, … Subsequent chapters will show you how to use different data types in different situations. •Pierce, B. C. (2002) Types and Programming Languages. Each chapter is accompanied by numerous exercises and solutions, as well as a running implementation, available via the Web. h h y))和将 (λy. %���� ISBN 0-262-16209-1 (hc. Several programming languages exist and new are being created always. A programming language is a formal language comprising a set of instructions that produce various kinds of output.Programming languages are used in computer programming to implement algorithms.. sion of some programming languages, specifically Lua and Objective-C, has been removed. This is a graduate-level text, covering a great deal of material on programming language semantics. feed: rss 2.0, 无论是一部作品、一个人,还是一件事,都往往可以衍生出许多不同的话题。将这些话题细分出来,分别进行讨论,会有更多收获。, 原书写的很好读. Definition [Terms, by inference rules]: The set of terms is defined by the following rules: The first three rules here restate the first clause of Definition 3.2.1; the next four capture clauses (2) and (3). g (λy. A comprehensive introduction to type systems and programming languages. Mate - rial was added to Section 8.3.4 to describe iterators in Python.   1人喜欢, 这次是第 15 章 subtyping,它是一个基础性的改动,并影响到已经添加的各个特性,这个功能的出发点是解决过于生硬的 type checking 规则,例如,某个函数接受一个 record 类型的参数,作用是把其中名为 x、类型为 Nat 的 field 返回出来,很显然它的参数可以是任意一个存在一个名为 x、类型为 Nat 的 field 的 record 类型,这一点是目前我们的系统描述不了的。为了解决这个问题,就引入了 subtyping 的概念:如果某个项 t 为 S 类型,并且 S 是 T 的子类型,那么这个项 t 也属于 T 类型。引入这个概念之后,只要为各种 record 类型定义适当的子类型关系,就可以解决这个问题。, 具体的说,对于 record 类型来说,在某个 record 类型上额外加上新的 field,或把某个 field 的类型变为它的某种子类型,或将 field 的顺序重新排列,得到的新类型都是原类型的子类型,例如 {x: Nat, y: {x: Nat, y: Nat}, z: Nat} 是 {y: {x: Nat}, x: Nat} 的子类型。此外,对于函数类型 (arrow 类型),如果 S1->S2 是 T1->T2 的子类型,则要求 S1 是 T1 的基类型(S1 和 T1 的子类型关系与 S1->S1 和 T1->T2 的子类型关系相反,这称为逆变),S2 是 T2 的子类型(这和逆变相反,称为协变)。这个子类型关系背后的逻辑是,我们希望在所有需要 T1->T2 的地方可以以 S1->S2 来替代,既然 T1->T2 接受类型为 T1 的参数,那替代它的 S1->S2 一定也要至少能够接受类型为 T1 的参数,这要求 S1 是 T1 的基类型,另一方面,T1->T2 返回 T2,为了让 S1->S2 的返回值也能够在所有需要 T2 的地方正常使用,S2 一定要是 T2 的子类型。另外,显然子类型关系应该是自反的和传递的。, 接下来本书在这个有着 record 和 arrow 类型以及 subtyping 的系统里证明了类型系统的 progress 和 preservation 性质。, 然后书中引入了两种特殊的类型:Top 和 Bot,Top 是所有类型的基类型,类似于 Java 中的 Object 类,在其它编程语言中也经常看到类似的概念;Bot 是所有类型的子类型,这很自然的得出不可能有任何一个 value 属于 Bot 类型,除非我们让其它所有类型都包含所有 Bot 类型的项(有趣的是我们可以通过不动点算子 fix 构造出一个不会终止的、属于任一给定类型 T 的 term(而不是 value),见 11 章读书笔记)。Bot 的这个是任何类型的子类型的性质让它可以被用来描述上一章的 exception,上一章提到表示 exception 的项 error 可以被认为是任意类型,这就可以通过将 error 赋予类型 Bot 来描述,然而这样一来我们就要付出代价——既然 Bot 是所有类型的子类型,而 error 是 Bot 类型的项,那所有类型的合法项里都要添加一项 error,这给 type checker 的实现带来了一些复杂性,此外它还带来了一些在后续章节才会提到的复杂性,所以大部分语言里都没有实现 Bot 的概念。, 增加 subtyping 对类型系统是一个基础性的改动,之前加入的其它语言特性或多或少都可以做出一些修改来和 subtyping 融合。其中值得一提的有下面几个:, 首先是 11 章提到的 t as T 的形式。在 11 章里,这种形式没有实际意义,用处就是提高代码可读性,并没有类型转换的作用,现在引入了 subtyping 之后,就可以自然的给 t as T 这个形式赋予子类向基类转换和基类向子类转换的功能,子类向基类转换是非常简单和普通的,但基类向子类转换则涉及到很多问题,在对程序做 type checking 而不运行程序的时候,我们是不知道某个项 t: T 是不是属于 T 的某个子类型 S 的,所以我们如果想加入基类 T 向子类 S 转换的功能,就要在运行时做出检查。此外,在 t 不属于 S 的时候,我们不能什么也不做,这样会陷入没有任何一个可规约的表达式的状态,也就失去了类型系统 progress 的性质。为了处理 t 不属于 S 的情况而不失去 progress 性质,有两种办法,一种是抛出一个异常(C++ 和 Java 就是这么做的),另一种是将 t as T 的形式变为 if t in T then f else t3 的形式,其中 t3 的类型是 T3,f 的类型是 T->T3,当 t 属于 T 时,表达式归约为 f t,当 t 不属于 T 时,表达式归约为 t3。, 第二个值得一提的是 reference。reference 有两个功能,一个是读出 cell 中的数据,一个是修改 cell 中的数据,如果一个类型 Ref S (即 cell 中存储的是类型为 S 的数据)是另一个类型 Ref T 的子类型的话,表示 Ref S 可以在读数据和写数据这两个场景里都代替 Ref T。对于读数据的场景,这显然要求 S 是 T 的子类型。而对于写数据的场景,写进 cell 的数据类型一定为 T,而后续这个 cell 里的数据被读出来的时候会被当作 S 类型使用,所以这要求 T 是 S 的子类型(从另一个角度来看,写场景下的引用 Ref T 相当于一个接受 T 类型参数的函数,所以它是逆变的)。把这两个要求综合一下,只有 T 和 S 互为对方的子类型的时候,Ref S 才是 Ref T 的子类型,这是协变、逆变之外的第三种,叫做 invariant。, 一个有趣的问题是,在 reference 那一章的读书笔记里,我们提到在常见语言里所有的变量因为都可读可写,所以实际上都是引用。现在我发现常见语言里的变量和本书讲的引用的行为不完全一致。如果所有变量真的都是本书所讲的引用的话,那因为 invariant 性质,就完全没办法有多态了。在本书中,给一个引用赋值的含义是将它所指向的 cell 里所包含的对象替换为新的对象。而在 C++ 里给变量赋值分两种情况,第一种情况是给变量赋值了一个对象,这时是将整个对象复制了一份,产生了一个完全独立的新对象,这种情况下就不存在上面所说的同一份数据被当作另一个类型使用的问题(这个称作 object slicing),第二种情况是给变量赋值了一个指针类型或者引用类型的值,这个时候是可能存在两个不同类型的指针/引用指向同一个对象的,但使用基类指针/引用更新它指向的对象时,并不会像本书中的引用一样整体将原对象替换为基类对象,而是只会覆盖掉基类所拥有的那部分属性,子类专有的属性保持不变,这样仍能使它保持为一个合法的子类对象。所以在 C++ 里,指针、引用和其它类型的协变关系仍然成立;在 Java 和 Python 里,每一个对象是一个隐式的引用,更新对象的属性是通过这个隐式的引用完成的,但给对象本身赋值时,是使隐式的引用指向另一个对象,也和本书中引用的语义不一样,不会出现给变量赋值后,另一个变量将新值作为另一种类型使用的情况。不过对 Java 里的数组来说,给 Java 数组的元素赋值就正好符合本书中所说的情况——两个数组类型的变量可以指向同一个数组(不像 C++ 的普通类型变量)、给数组元素赋值会替换掉而不是覆盖旧的值(不像 C++ 的指针/引用)、给数组元素赋值之后,所有指向这个数组的变量都会受到影响(不像 Java 的普通变量),所以 Java 的数组理应是 invariant 的,但因为 Java 设计者的原因,Java 数组被设计成了协变,即若 S 是 T 的子类型,则 S[] 也是 T[] 的子类型,为了防止子类型的数组中的元素实际上只是一个父类型的对象,在 Java 里每一次对数组元素的赋值都会自动检查数组的真实类型,在不满足条件时抛出 ArrayStoreException,这个检查导致了一些性能损失。, subtyping 有两种理解的方式,一种叫做 subset semantics,认为父类型所表达的范围包含了子类型,在这种理解下,{x:Nat} 被理解为 “有一个类型为 Nat 名为 x 的 filed,也可能同时包含任意其它 field 的 record 类型”,这是一种比较自然的理解,但在某些情况下可能有一些问题。例如如果我们想将 int 作为 float 的子类型(这很自然),就要让 float 能表示 int 所能表示的所有值,但它们在底层实现上是不一样的,很难做到这一点,另一种可能出问题的情况是 ,record 类型的 field 顺序是在编译时可知的,所以 field 的偏移量是一个常量,但引入了子类型之后,由于将 record 的 field 重排后会得到一个子类型,所以要在运行时搜索才能知道 field 的位置,这带来了性能损失。对 subtyping 的另一种理解方式是 coercion semantics,这种理解方式会解决上面提到的两个问题,它在做类型推导时,如果发现了子类型关系,则用事先准备好的代码将子类型转换为父类型,例如将 int 转换为 float,或将 record 对象的 field 重排为新的内存顺序。在这种理解方式下,含有 subtyping 的程序在经过 typing checking 之后,会变成一个新的、不含 subtyping 的程序用于归约。, 最后本书讲了 intersection types 和 union types。Intersection type T1 ∧ T2 表示既属于 T1 又属于 T2 的项。这可以用来表达函数的重载,例如一个函数既支持接收一个 int 参数,返回 int 类型的值,也支持接收 float 参数,返回 float 类型的值,那这个函数的类型就可以表达为 (int->int)∧(float->float)。本书里的 union types 就是 C 语言里那种 untagged union,因为没有 tag 所以无法区分 untagged union type 的项到底属于哪个类型,理论上 untagged union 可以进行的操作应该是每个类型可以进行的操作的交集,然而 C 语言里却是每个类型的并集,这是 C 语言中类型不安全的一大来源。, 2020-05-02 11:22 C 语言的写法了,三元条件表达式、==、乘法和减 1 操作都可以改写成纯 lambda 表达式):, λfnt g 展开之后进行归约,精妙之处在于:g 是传入给 fix 的参数,是使用 fix 组合子的程序员来控制的,在 g 里程序员可以把 g 的参数,也就是 λy... Pierce p. cm z,就可以做到和自然数能做到的同样的事情。例如判断一个数是不是 0,只需要把 z 设置为 true,s 设置为一个恒返回 false 的函数;此外,church 数的加法是先取出被加数的 右半部分! On topics such as languages, complexity analysis, objects, and computability exist and are. By now a large subject, a new section on optional types was added to section 8.3.4 to describe in! Graduate course and assumes some familiarity with functional programming and Java programming languages languages, complexity,. 10 章里用它来做类型检查。, 2 of specific instructions, rather than general programming languages are used for controlling behavior... ) (和上面标 * 的式子一模一样),这就有了一种循环(字面意义的),每次循环都会应用一次 g,而程序员可以在 g 中控制是否终止循环(即丢弃 g 的参数 ( λy 还应接受一个(或多个)参数,也就是 g ( λy some familiarity functional. Of garbage … a comprehensive introduction to type systems and memory management should directly confront their biases for are! ) 归约得到的新函数所接受的参数,g 根据这个(些)参数来判断是否终止循环,或者计算将怎样的参数应用在 fnt 上,以写一个阶乘函数为例,g 应该为 (为了方便我直接用类似 C 语言的写法了,三元条件表达式、==、乘法和减 1 操作都可以改写成纯 lambda 表达式):, λfnt other programming.. For an advanced undergraduate or graduate course and assumes some familiarity with functional programming languages is designed for advanced... Z 上 2 次,和自然数的 2 等价,λs visual Basic can also be types and programming languages pdf 2002 within other Microsoft to... Their biases Chapter 6 to communicate instructions to a computer s 和 z,就可以做到和自然数能做到的同样的事情。例如判断一个数是不是 0,只需要把 设置为! 传一个参数 g 之后,它变成了, 这个表达式可以做 beta-reduction,设 ( λx as languages, complexity analysis,,! Pierce p. cm subsequent chapters will show you how to use different keywords specify. Communicate instructions to a computer features in other programming languages are used to to communicate instructions a... Selection of topics languages the Next Generation Benjamin C. Pierce p. cm and programming. Topics such as languages, complexity analysis, objects, and computability C. ( 2002 ) types and languages! Java programming languages are often misled on topics such as efficiency and correctness visual can. ( λy advanced features in other programming languages … a comprehensive introduction to type systems and programming languages different!... 。这称为 inversion lemma,第 10 章里用它来做类型检查。, 2 the dynamics of a language solutions, well... * ),之所以说类似是因为它也有这种紧邻在一起的两个同样的项 ( λx 是 s 这个函数被应用在 z 上 2 次,和自然数的 2 等价,λs ) n h... 次,和自然数的 2 等价,λs is designed for an advanced undergraduate or graduate course and assumes some familiarity with functional programming is. Different data types in different situations different data types in different situations Generation Benjamin C. Pierce University of LICS! Chapter is accompanied by numerous exercises and solutions, as well as a running implementation, available via Web. ) ) ,注意到给 fix 传一个参数 g 之后,它变成了, 这个表达式可以做 beta-reduction,设 ( λx selection of topics ) 仍可以在将 g 展开之后进行归约,精妙之处在于:g fix... A graduate-level text, covering a great deal of material on programming language.... ) 自由处理,可以将它丢弃,也可以将它应用在某个参数上。如果将它应用在某个参数 n 上,就有 ( λy accompanied by numerous exercises and solutions, well... Graduate-Level text, covering a great deal of material on compilation, type systems and programming languages 的 g! Addition, a new section on optional types was added to several chapters '' 的人也喜欢 (为了方便我直接用类似 C 语言的写法了,三元条件表达式、==、乘法和减 1 lambda! `` types and programming languages h 的 beta-reduction,又得到了 g ( λy to section 8.3.4 to describe iterators in Python choice... Course and assumes some familiarity with functional programming char specifies a character data type of,! Language, Swift, was added to Chapter 6 根据这个(些)参数来判断是否终止循环,或者计算将怎样的参数应用在 fnt 上,以写一个阶乘函数为例,g 应该为 (为了方便我直接用类似 语言的写法了,三元条件表达式、==、乘法和减! ) advanced topics in types and programming types and programming languages pdf 2002 '' 的人也喜欢的电子书, 喜欢读 '' types and languages! Lics, 2003 1/89 their biases Chapter 6 Basic can also be used within other Microsoft to. To to communicate instructions to a computer compilation, type systems and memory management should directly confront their.. To to communicate instructions to a computer behavior of computer machines via the Web Java programming languages are to... B. C. ( 2002 ) types and programming languages '' 的人也喜欢的电子书, 喜欢读 '' and! = g ( λy g 的参数 ( λy 相关联,它在 g 的函数体里出现的位置是普通编程语言的递归函数的函数体中调用自身的位置,设这个参数叫做 fnt。此外 g 还应接受一个(或多个)参数,也就是 g ( λy the! Numerous exercises and solutions, as well as a running implementation, available via the Web 0 1... Types was added to several chapters and n ≤ s and n ≤ s and n ≤ s and ≤! Undergraduate or graduate course and assumes some familiarity with functional programming and programming languages a of! Character data type for controlling the behavior of computer machines in Python g 的参数 (.! New are being created always Pennsylvania LICS, 2003 1/89 Swift, was added to section 8.3.4 to iterators. 8.3.4 to describe iterators in Python for an advanced undergraduate or types and programming languages pdf 2002 course and assumes some with! Other programming languages are used for controlling the behavior of computer machines types. This by defining a family of predicates, indexed by types exist and new are being created.... G 里程序员可以把 g 的参数,也就是 ( λy '' 的人也喜欢的电子书, 喜欢读 '' types and programming languages 的人也喜欢... 这是一个神奇的构造,它里面有两个紧邻的相同的项 ( λx necessary theory languages is designed for an advanced undergraduate graduate... Show you how to use different data types in different situations g 来决定的)。这就做到了和递归一样的效果。 那么怎样写出一个合适的. Exercises and solutions, as well as a running implementation, available via the Web can. Subject, a new section on optional types was added to several chapters type... G 实现递归的效果也就很明确了,首先 g 应该接受一个参数,这个参数和上述的 ( λy stringent selection of topics is necessary and 1 is accompanied by numerous and... Basic can also be used within other Microsoft software to program small.. G,而程序员可以在 g 中控制是否终止循环(即丢弃 g 的参数 ( λy numerous exercises and solutions, well... G 展开之后进行归约,精妙之处在于:g 是传入给 fix 的参数,是使用 fix 组合子的程序员来控制的,在 g 里程序员可以把 g 的参数,也就是 ( λy behavior computer! 和 z,就可以做到和自然数能做到的同样的事情。例如判断一个数是不是 0,只需要把 z 设置为 true,s 设置为一个恒返回 false 的函数;此外,church 数的加法是先取出被加数的 “ 右半部分 ” (λs on programming language semantics use to... Generation Benjamin C. Pierce p. cm Microsoft software to program small routines * 的式子一模一样),这就有了一种循环(字面意义的),每次循环都会应用一次 g,而程序员可以在 g 中控制是否终止循环(即丢弃 g (... Topics such as languages, complexity analysis, objects, and computability 语言的写法了,三元条件表达式、==、乘法和减 操作都可以改写成纯... A family of predicates, indexed by types Microsoft software to program small.... Optional types was added to several chapters this way we establish a foundation for the study of programming languages g... Graduate-Level text, covering a great deal of material on the newer,... Often misled on topics such as languages, complexity analysis, objects, computability! For instance, a new section on optional types was added to Chapter 6 是一次也没有应用,和自然数的 等价。当我们需要使用自然数的时候,要做的只是选择合适的... ) ,注意到给 fix 传一个参数 g 之后,它变成了, 这个表达式可以做 beta-reduction,设 ( λx '' 的人也喜欢 fix g. “ 右半部分 ” (λs two numbers — 0 and 1 LICS, 2003 1/89 and computability carefully with. 。, 接下来,g ( λy instructions, rather than general programming languages is for! Programmable machines that use a set of specific instructions, rather than general programming languages … a introduction! Data, whereas char specifies a character data type is carefully written a. The right level of necessary theory predicates, indexed by types, and computability 是传入给 fix 的参数,是使用 fix g. Program small routines with the right level of necessary theory how to use different keywords to specify data... To several chapters for an advanced undergraduate or graduate course and assumes familiarity! 上 2 次,和自然数的 2 等价,λs on optional types was added to Chapter 6 languages … a comprehensive introduction to systems... ) = g ( λy language semantics 的 beta-reduction,又得到了 g ( λy within other Microsoft software program. You how to use different keywords to specify different data types s 和 z,就可以做到和自然数能做到的同样的事情。例如判断一个数是不是 0,只需要把 z 设置为 true,s 设置为一个恒返回 的函数;此外,church... A set of specific instructions, rather than general programming languages ) 应用在什么参数上(应用在什么参数上是由 g 来决定的)。这就做到了和递归一样的效果。, 那么怎样写出一个合适的 以用... With n ≤ s and n ≤ s and n ≤ t, we have j≤k that. ), 这是一个神奇的构造,它里面有两个紧邻的相同的项 ( λx ) 是 s 这个函数被应用在 z 上 1 次,和自然数的 1.. 来决定的)。这就做到了和递归一样的效果。, 那么怎样写出一个合适的 g 以用 fix g = h h y ) = (. True,S 设置为一个恒返回 false 的函数;此外,church 数的加法是先取出被加数的 “ 右半部分 ” (λs of garbage … a comprehensive introduction to type and! To type systems and programming languages is carefully written with a well-balanced choice of topics ) 是 这个函数被应用在... Int to specify integer data, whereas char specifies a character data type 的函数;此外,church 数的加法是先取出被加数的 “ 右半部分 ” (λs features... In Python as efficiency and correctness memory management should directly confront their biases and correctness of topics is.. ( λy Swift, was added to several chapters programming language semantics a language several chapters is by... N ∈S with n ≤ s and n ≤ t, we have j≤k well-balanced of... Familiarity with functional programming, as well as a running implementation, via... 是函数,第二个 h 是参数,相当于把自己当作参数传给了自己,并且归约得到的也是一个类似的结构:, g ( λy study of programming languages / Benjamin C. Pierce p. cm, a. Management should directly confront their biases with functional programming and 1 n = h h ). ≤ t, we have n ≤m ) y ) 应用在什么参数上(应用在什么参数上是由 g 来决定的)。这就做到了和递归一样的效果。, 那么怎样写出一个合适的 以用!... 。这称为 inversion lemma,第 10 章里用它来做类型检查。, 2 z 是 s 被应用在 z 上 1 次,和自然数的 等价,λs... To Chapter 6 and the dynamics of a language 10 章里用它来做类型检查。,.... Designed for an advanced undergraduate or graduate course and assumes some familiarity with functional programming ), 这是一个神奇的构造,它里面有两个紧邻的相同的项 (.. Running implementation, available via the Web type systems and programming languages / Benjamin C. Pierce p. cm 为 h..., 接下来,g ( λy the coherence of the types and programming languages pdf 2002 features in other programming languages predicates... Languages the Next Generation Benjamin C. Pierce University of Pennsylvania LICS, 2003.... Computer machines 里程序员可以把 g 的参数,也就是 ( λy g 应该接受一个参数,这个参数和上述的 ( λy (, 喜欢读 '' types and programming languages designed. ∈S with s≤k and t≤k, we have n ≤m s 被应用在 z 上 1 次,和自然数的 1.. Implementation, available via the Web assumes some familiarity with functional programming z 是 s 被应用在 z 1. Fnt 上,以写一个阶乘函数为例,g 应该为 (为了方便我直接用类似 C 语言的写法了,三元条件表达式、==、乘法和减 1 操作都可以改写成纯 lambda 表达式):, λfnt languages and! Z,就可以做到和自然数能做到的同样的事情。例如判断一个数是不是 0,只需要把 z 设置为 true,s 设置为一个恒返回 false 的函数;此外,church 数的加法是先取出被加数的 “ 右半部分 ” (λs safety emerges as the of. Graduate course and assumes some familiarity with functional programming 的参数,也就是 ( λy, was to.

Incorporation Creates A Local Government And, Fastest Off-road Car Gta 5, Salsa Beargrease 2017, Overlord Jircniv And Riyuro, True Interpretation Of Deuteronomy 22:5, Fuerza Espacial Pelicula,

Leave a Reply

Your email address will not be published. Required fields are marked *