2006년 4월 21일 금요일

[PL]Ch.1 - Introduction

. Text
  Concepts in programming languages, John C. Mitchell

. 교과서
. Computability
  어떤 문제가 계산가능하고 아닌지 판별함.
  컴퓨터가 풀 수 있는 문제의 영역을 정의함.
  예를들어 halting problem을 푸는 program은 undecidable하기 때문에 만들 수 없음.

. compile-time : program은 주어졌지만 input은 주어지지 않았음.
  (conservative, static)

. Run-time : program과 input 모두 주어져 있음.
  http://en.wikipedia.org/wiki/Runtime
  프로그램이 수행중인 상태(from beginning to termination)
  (dynamic)
  type check, array boundary check, garbage collection, exception handling 등을 할 수 있다.

. exception handling
  http://en.wikipedia.org/wiki/Exception_handling
  정상적인 excution flow에 영항을 주는 어떤 조건이 일어났을 때, 그것을 처리하기 위한 방법
  signal, event handler등을 사용할 수 있다.
  ex) page fault, divide by zero

. garbage collection
  http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29
  Automatic memory management
  더 이상 사용되지 않는(access되지 않는) memory space를 찾아내서 다른 곳에 이용할 수 있게 만듬.

. automatic method
  사용자가 신경을 덜 쓸 수 있게 해준다. 에러를 덜 내게 도와준다.
  실행 속도가 느려진다. (efficiency가 떨어진다.)

. Languages : Listp, ML, C, C++, Smalltalk, Algol, cobol, Fortran ..

. 1950년대 programming language를 만든 이유
  . computer instruction을 쉽게 적기 위해서
  . 당시에는 컴퓨터가 비싼 것이었으므로 small and efficiency가 매우 중요했음.

. BNF : Backus Naur Form, Fortran의 문법을 기술하기 위해 사용됨.

. Fortran
  . 최초로 ordinary mathematical notation을 expression에서 사용하게 됨.
  . subroutine, arrays, formatted input and output 지원
  . recursive call을 안됨.

. subroutine(procedure, function)
  큰 프로그램의 일부분으로 특정한 작업을 다른 곳과 비교적 독립적으로 수행한다.
  http://en.wikipedia.org/wiki/Subroutine

. array : 같은 type의 데이터를 담는 연속된 메모리 공간
  index(offset)을 통해 접근할 수 있다.
  multi-dimensional array도 가능하다.
  http://en.wikipedia.org/wiki/Array
  장점 : access가 O(1)에 가능, locality of reference(Sequential locality)가 있어서 좋다.
  단점 : 중간에 있는 원소를 insert, delete 할 때 O(n)

. locality of reference
  http://en.wikipedia.org/wiki/Locality_of_reference
  . Temporal locality : 한 곳이 reference되면 가까운 시간 내에 다시 그 곳이 reference된다.
  . Spatial locality : 한 곳이 reference되면 그 근처도 reference될 확률이 크다.
  . Sequential locality : memory는 sequential하게 access될 확률이 높다.

. formatted input and output
  변수를 받고 찍을 때 형식(format)을 정의할 수 있다.
  예를 들면 C에서 printf("%d", 변수)를 하면 정수형이 되고
  printf("%.3f", 변수)를 하면 소수 셋째짜리까지 출력한다.

. Cobol
  . business application을 위해 만들어짐.
  . common english와 비슷한 문법

. Lisp, Algol
  . stack memory management
  . recursive functions or procedures

. Lisp
  . higher-order function
  . http://en.wikipedia.org/wiki/Higher_order_function
  . Take one or more functions as an input
  . output a function
  . garbage collection

. Algol
  . type system
  . data structuring

. records(or structs, composition)
  http://en.wikipedia.org/wiki/Record_%28computer_science%29
  단순하고 관련있는 data, object를 모아서 함께 관리하는 것.
  관리하기 편해지고 spatial locality를 이용할 수 있어서 좋다.

. abstract data types(ADT)
  http://en.wikipedia.org/wiki/Abstract_data_types
  data들과 그 data들에 수행할 수 있는 operation들을 모은 것
  information hiding을 통해 user가 알지 않아도 되는 implementation detail을 숨긴다.
  ex) Java - List, Stack, Queue, Map, Priority Queue
     C++ - STL containers

. objects
  어떤 것(물건, 값의 덩어리). 특정한 크기로 특정한 곳에 있는 연속된 메모리 공간으로 관리된다.

. interoperability
  http://en.wikipedia.org/wiki/Interoperability
  공동의 작업을 위해 서로 다른 system이 같이 일할 수 있는 능력.

. global variable (free variable)
  http://en.wikipedia.org/wiki/Global_variable
  어떤 subroutine에도 속하지 않고 프로그램의 어느 context에서든 access될 수 있다.

. local variable
  local scope, function, block 내에서 자신이 declare된 것에서만 acess 될 수 있다.
  call stack에 주로 저장한다.
  recursive call을 할 경우 각 instance에 대해서만 local variable이 유효하다.
  (서로 다른 memory 공간을 이용한다.)

. static local variable
  local variable처럼 특정 function에서만 access되지만
  recursive call을 하거나 그 function을 다음번에 다시 call했을 때도
  같은 memory 공간을 이용한다.

. argument

. parameter

. expression
  evaluation이 가능한 단위, 대부분 evaluation value를 가진다.


. script language

. referential transparency

. side-effects

------------
. 강의노트
. Function call의 overhead는 얼마나 큰가?
. abstract을 위해 지불한 cost는 무엇인가?
. Lanugage
  . a conceptual universe
  . framework for problem-solving
  . useful conecpts and programming methods
. understand the languages you use, by comparison
. appreciate history, diversity of ideas in programming
. be prepared for new programming methods, paradigms

. critical thought
  . properties of languages, not syntax or sales pitch - syntax는 그리 중요하지 않다.
  . sales pitch : A salesperson's talk is what they say in order to persuade someone to buy something from them = sales talk

. lagnuage and implementation
  . every conveniecn has its cost

. value of language concepts
  . parable : a short story which is told in order to make a normal or religious point
  . 과거에는 recursive call, data structure는 없었지만 지금은 어디서나 쓴다.
. Moral - principles and beliefs concerning right and wrong behaviour
. current examples
  . function passing : STL functino objects 같은 걸로 C++에서도 구현되어 있다.
  . continuation : used in web languages for workflow processing
  . 앞으로 할 일을 function으로 define 한 것
  . representation of execution state

. function object = functor(class object에서 operator()를 overload함)
  . function object가 function의 pointer보다 나은 점
  1. result를 global, local variable이 아닌 member variable로 가질 수 있어 안전하다.
  2. inline이 가능하다.(compiler가 지원하면)

. Language in common use
  . C가 줄고 C++도 약간 줄었다.
  . Java가 많이 늘었다. (Sun microsystems) - OOP가 유행이다.
  . PHP가 늘었다. - 웹 프로그램을 많이 한다.(java, php의 증가)
  . Perl이 줄었다.
  . C#도 순위권에 들기 시작했다. - MS가 밀고 있음.

. Language groups
  . Multi-purpose languages
  . C, C++, Java
  . Visual Basic
  . Object pascal : Delphi, Kylix
  . Lisp, scheme, ML
  . Scripting languages
  . Perl, PHP
  . Tcl, Shell
  . Special-purpose languages
  . SQL
  . Prolog

. Commercial trend over past 5 years
  . Increasing use of type-safe languages : Java, C#
  (compile time에 에러잡기, type checking)
  . scripting languages, other languages for web applications
  . Perl is widely known as "the duct-tape of the Internet"

. Teaching trends
  . Java replacing C as most common intro language
  . Less emphasis on how data, control represented in machine

. Research and development trends
  . Modularity
  . Java, C++ : standardization of new module features
  . Program analysis
  . Automated error detection, programming env, compilation
  . isolation and security(특히 web에서)
  . sandboxing, language-based security

. sandbox
  . a security mechanism for safely running prrograms
  . Hydra라는 OS에서 나옴, OS가 특정 process의 resource를 제한함.

. What's worth studying
  . Dominant languages and paradigms
  . C, C++, Java
  . Imperative and object-oriented languages
  . Important implementation ideas
  . Performance challenges
  . Concurrency
  . Design tradeoffs
  . Concepts that research community is exploring for new programming languages and tools

. Programming Domains
  . Scientific applications - Fortran
  . Large number of floating point computations
  . Business applications
  . Produce reports, use decimal numbers and characters
  . 유효자리계산, truncation, 은행 등.
  . Arificial intelligence - prolog, lisp
  . smbols rather than numbers manipulated
  . system programming - C
  . Need efficiency because of continuous use
  . scripting languages - shell, JCL(Job control language), Perl
  . Put a list of commands in a file to be executed
  . Special-purpose languages - SQL

. floating point의 문제점
  . 너무 큰 수와 너무 작은 수를 곱하고, 나누었을 때
  . 계산속도(time complexity)
  . Overflow

. Language evaluation criteria
  . readability factors
  . the most important criterium
  . factors
     . overall simplicity
       . Too many features is bad
       . multiplicity of features is bad
     . Orthogonality
       . makes the language easy to learn and read
       . Meaning is context independent
       . A relatively small set of primitive constructs can be combined in a relatively small number of ways
       . Every possible combination is legal
         (모든 combination이 다 된다.)
       . Lack of orthogonality leads to exceptions to rules
       예) int 덧셈이 되면 float, struct도 더해진다.
     . Control statements - if, switch-case
     . Defining data types and structures
     . Syntax considerations
       . Identifier forms - 변수명 정하기
       . Special words - reserved word
       . form and meaning
  . Writerability
  . factors
     . simplicity and orthogonality
     . support for abstraction - function, abstract data type, class, object
     . Expressivity(표현력)
  . Reliability
  . Type checking
  . Exception handling - 코드의 80%는 error handling code
  . aliasing(2개 이상의 이름을 가짐), pointer
     . 한 메모리 공간을 여러방법으로 access해서 바꿀 수 있음.
  . Readability and writability
  . Cost
  . categories
     . training programmers to use language
     . writing programs
     . compiling programs
     . executing programs
     . language implementation system
     . reliability
     . maintaining programs
  . Others : portability, generality, well-definedness

. Influences on Language desing
  . computer architecture : Von Neumann
  . Stored Program Computer
  (Instruction과 data를 함께 다룸)
  . We use imperative languages, at least in part, because we use von Neumann machines. -> assignment statement가 생긴다.
  . Data and programs stored in same memory
  . Memory is seperatef from CPU
  . Instructions and data are piped from memory to CPU
  . Basis for imperative languages
  . Variable model memory cells
  . Assignment statements model piping, sequence가 있다.
  . Iteration is efficient
  . Von neuman bottle neck
  . http://en.wikipedia.org/wiki/Von_Neumann_bottleneck
  . 문제점 : processing element와 memory사이의 traffic을 instruction이 차지한다.

. Von Neumann Architecture가 아닌 것 중 살아남은 것이 없다.
. Optical computer - 2D 계산이 가능
. Bio computer

. Von neumann architecture
  . Memory stores both instructions and data
  . CPU -> memory : Results of operations
  . memory -> CPU : Instructions and data
  . CPU : ALU(Arithmetic and logic unit) + Control Unit

. Influences on Language Design
  . Programming methodologies
  . 1950s and earcly 1960s : Simple applications; worry about machine efficiency
  . Late 1960s : Prople efficiency became important; readability, better control structures
     . structured programming - goto를 안 쓰는 것, if, then, for, case 이용
       . Procedural programming
         . Goto, jump(spaghetti code) 대신 control statement를 쓴다.
         . program을 procedure로 잘 나눠서 copy하지 않고 reuse한다.
  . Top-down design and step-wise refinement
  . Late 1970 : Process-oriented to data-oriented
     . data abstraction
       . concept에 집중하게하고 내부 detail을 가린다.
  . Middle 1980s : Object-oriented proramming(OOP)
  . HIPO : Hierarchical Input Processing Output

. Imperative
  . Central features are variables, assignment statements, and iteration
  . C, Pascal

. Functional
  . Main means of making computations is by applying functions to given parameters
  . 수학에서는 문자의 값이 바뀌지 않음.
  . 모든 name은 1개의 value를 가진다.
  . LISP, Scheme, ML

. Logic(declarative language)
  . http://en.wikipedia.org/wiki/Special:Search?search=declarative+language
  . Rule-based
  . Rules are specified in no special order
  . Prolog, SQL
  . solution define하는 것이 아니라 problem을 describe함.
  . Say 'what'
  . Imperative language says 'how'

. Object-oriented
  . Encapsulate data objects with processing
  . Information hiding, separation of concerns.
  . http://en.wikipedia.org/wiki/Information_hiding
  . http://en.wikipedia.org/wiki/Separation_of_concerns
  . Inheritance and dynamic type binding
  . Grwe out of imperative languages
  . C++, Java

. Language design trade-offs
  . Reliability vs cost of execution
  . 어려 검사를 많이 하면 느려진다.
  . Readability vs writability
  . 읽기 쉬운 것은 쓰는 데 노력이 필요하다.
  . 쉽게 쓰면 읽기 어렵다.
  . Flexibility vs safety
  . 뭐든 다 허용하면 위험하다.
  . 아무것도 안되면 불편하다.

. Language-based organization
  . Algol 60, algol 68, Pascal
  . Modula, Clu, Ada
  . Additional languages grouped by paradigm
  . Lisp/Scheme/ML for functional languages
  . Prolog and Logic Programming
  . C++, Smalltalk and OOP
  . Concurrency via Ada rendez-vous
  . Author's opinion
  . Historical concepts are same across many languages
     . Block strcture, scope, memory management
  . OOP deserves greater emphasis
  . Concep-based organization
  . Use single language like List/Scheme
  . Present PL concepts by showing how to define them
  . Advantage : Uniform syntax, easy to compare features
  . Disadvantage
  . Miss a lot of the culture associated with languages
  . Some features hard to add
     . Type systems, program-structuring mechanisms
     . Approach works best for 'local' features, not global structure
  . Programming in the small
  . Cover traditional algol, pascal constructs in NL
  . Block structure, activation record
     . Activation record
       . http://en.wikipedia.org/wiki/Activation_record
       . execution stack, control stack, function stack
       . local data storage
       . Parameter passing
       . Evaluation stack
       . Other return state
       . stack pointer
       . frame pointer
  . Types and type systems.
  . Lisp/Scheme concepts in ML too
     . Higher order functions and closures, tail recursion
       . tail recursion
         . http://en.wikipedia.org/wiki/Tail_recursion
         . recursion의 special case로 iteration으로 쉽게 바꿀 수 있다.
         . 사용하는 stack space를 줄여서 efficiency를 높힌다.
     . Exceptions, continuations
       . continuations
         . http://en.wikipedia.org/wiki/Continuation
         . representation of the execution state of a program(ex. call stack)
         . save the current execution state into an object
         . and then restore the state from this object at a later point in time(thereby resuming its execution)
         . Scheme : call/cc
         . C : callcc
       . escape continuation
         . escape the current context to a surrounding one.
         . C : setjmp, longjmp
         . tail-call optimization, exception handling에 쓰임.
         . 단점 : Goto statement와 비슷하다. 코드가 따라가기 어려워진다.
  . Programming in the large
  . Modularity and program structure
  . Specific emphasis on OOP
     . Smalltalk vs C++ vs Java
     . Language design and implementation
    
  . Concurrent and distributed programming
  . General issues in concurrent programming
  . Actor languages : an attempt at idealization
  . Concurrent NL
  . Java threads

  . Do we emphasize C?
  . Important, practical language
  . We discuss other languages, compare to C as we go
     . Intro to C for Java programmers?
  . We do cover the ++ par of C++ in some detail

. First half of course
  . Lisp
  . Foundations
  . Lambda calculus
  . Denotational Semantics
  . Functional vs Imperative programming
  . Conventional programing language concepts
  . ML/Algol language summary
  . Types and type inference
  . Block structure and memory management
  . Control constructs
  . Other languages using same basic ideas
  . Scripting languages
  . Domain-specific languages

. Second half of course
  . Modularity, data abstraction, objects
  . Object-oriented languages
  . Smalltalk and Self
  . C++
  . Java
  . Concurrent and distributed programming
  . Interoperability
  . Conclusions and review

. coroutine
  . http://en.wikipedia.org/wiki/Coroutine
  . allow multiple entry points
  . suspending and resuming of execution at certain locations
  . More generic and flexible than subroutine
  . Less widely used in practice
  . return multiple times
  . Simula, Modula-2, C#, Python, stackless Python에서 이용
  . stack대신 continuations을 이용하여 다른 것을 call함.
  . state machine, cooperative multitasking

. lazy evaluation
  . http://en.wikipedia.org/wiki/Lazy_evaluation
  . delay computation of expressions until the results of the computation are known to be needed.
  . delayed evaluation, minimal evaluation
  . unnecessary calculation을 줄여 performance에 도움이 될 수도 있다.
  . 예를 들어 infinite data structures도 만들 수 있다.
  . infinite list = stream
  . call-by-need에 사용된다. ex) Haskell

. Minimal evaluation
  .evaluate until the point where its final value is known.
  ex) if (A & B)에서 A가 거짓이면 B는 evaluation하지 않는 다.

. Eager evaluation(strict evaluation)
. expression을 바로바로 evaluation함.
. 한 번 해두면 다시 하지 않아도 되서 빠를 수 있음.

. Strict programming language
  . strict evaluation을 함.
  . C, C++, Java, Perl 5, Ruby, Common Lisp, Scheme, ML

. Nonstrict programming language
  . lazy evaluation을 함.
  . 거의 반드시 functional language 이어야 한다.
  . Haskell, Miranda, clean

댓글 없음:

댓글 쓰기