Data Abstraction and Modularity abstraction is the key
Data Abstraction and Modularity abstraction is the key principle to control the complexity specification user program B, Z, HOL, Isabelle library operating system microprocessor Java, ML, Haskell C assembly language transitor machine instructions electro-physics boolean circuits
abstraction: 자세한 속사정을 감춘다는 의미 - fixed interface - implementation/representation-independence Types are “the” language of interface Abstraction example: functional abstraction - fixed interface: name and its type - implementation-independence add(x, y) sort(a)
abstraction: 자세한 속사정을 감춘다는 의미 - fixed interface - implementation/representation-independence Abstraction example: data abstraction interface of int queue exception Empty. Q val emptyqueue: queue val enqueue: queue * int -> queue val dequeue: queue -> int * queue implementation of int queue exception Empty. Q val emptyqueue =. . . fun enqueue(q, n) =. . . fun dequeue(q) =. . .
interface of car val makeit: engine * size -> car val getin: car * animal -> car val getoff: car -> car val drive: car -> car implementation of car fun makeit(e, s) =. . . fun getin(c, a) =. . .
Language Support for Data Abstraction Use type-checking to enforce the separation: -abstract data type -module * Type checking checks if every computation is done through the interface. * Type checking checks if no information other than the interface is assumed.
In n. ML, done by signature matching structure Queue : QUEUE = struct type queue = T | N of int * queue val emptyqueue = T fun enqueue(q, n) = n: : q fun dequeue(q) =. . . end signature QUEUE = sig type queue val emptyqueue: queue val enqueue: queue * int -> queue val dequeue: queue -> int * queue end
In C, pretended by. h and. c files queue. h struct queue {. . . }; struct nqpair {. . . }; queue *emptyqueue; queue *enqueue(queue*, int); nqpair *dequeue(queue*); queue. c struct queue {. . . }; struct nqpair {. . . }; queue *emptyqueue {. . . }; queue *enqueue(queue* q, int x) {. . . }; nqpair *dequeue(queue* q) {. . . }; How to hide and check? 별드레게 무러바
Modules are more general than abstract data type - Modules are collection of definitions - Signatures are interfaces - Signature matching (wrapping modules by signatures) hides those not in the signature - Modules can be parameterized by modules/types Remember the OCaml modules and signatures
Abstraction is the must in civilization. Also true in computer science. Also true in programming: - interface, implementation-independence Language support for abstraction: - functional abstraction, data abstraction - abstract data type, module n. ML: structure, signature, functors C++: class, class template Ada: package, generic package - type-system automaticallys checks if the programs violates the principle n. ML/Haskell: sound C++, Ada: not sound
Object-Oriented Programming v. s. Value-Oriented Programming imperative v. s. applicative 물건중심 기계중심 명령형 객체지향 값중심 생각중심 함수형 Two representative programming paradigms. What are they?
fun eval(Var x, env, mem) = (entry env x, mem) | eval(Add(e, e’), env, mem) = let val (z, mem’) = eval(e, env, mem) val (z’, mem’’) = eval(e’, env, mem’) in (z+z’, mem’’) end | eval(Assign(x, e), env, mem) = let val (v, mem’) = eval(e, env, mem) val mem’’ = assign(mem’, x, v) in (v, mem’’) end
- Slides: 30