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 let emptyqueue =. . . let enqueue q n =. . . let 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 let makeit(e, s) =. . . let 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 ML, done by signature matching module Queue : QUEUE = struct type queue = T | N of int * queue let emptyqueue = T let enqueue q n = n: : q let dequeue q =. . . end module type 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 ML modules and module types
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 ML: module, module type, functor C++: class, class template Ada: package, generic package - type-system automaticallys checks if the programs violates the principle 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