2006년 4월 25일 화요일

라디오(Radio)

라디오 청취층은 몇 종류가 있다.
밤에 듣는 사람들 - 주로 학생들이 많다.
출퇴근 때 듣는 사람들 - 운전자들
낮에 듣는 사람들 - 주부 or 자영업 하는 사람들.

나도 중학교 때까지는 라디오를 많이 들었던 것 같다.
밤에 들었던 적은 거의 없는 것 같고 항상 버스를 탈 때마다 매일 같은 시간타고 다니다보니 라디오를 많이 들을 수 있었다.

주로 듣는 프로는 점심에 하는 "강석, 김혜영의 싱글벙글쇼"라든지,
오후 3~4시 쯤에 하는 "지금은 라디오 시대" 였던 것 같다.
초등학교 등하교나 학원 시간과 잘 맞는 다.

사실 초등학생 독자층을 노린 프로들이 아니라서
어른들 세상 사는 이야기가 주로 나왔다.
그리고 사무직보다는 자영업자라든지, 배달부, 청소부 등..
아무래도 육체 노동을 하는 사람들이 이야기가 더 많았다.
정신 노동을 하는 사람들은 청각을 다른 곳에 쏟을 수 없지만
육체 노동을 하는 사람들은 단순한 작업을 반복하거나
오랜 기다림의 시간동안 무료함을 달래야 하기 때문에 라디오나 음악은 필수다.
역시 라디오는 다른 어떤 것보다도 서민적인 매체인가보다.

작년에 한창 "배철수의 고우영 삼국지"도 들었는 데, 재미있더군.
라디오에서 하는 극들의 특징은 매우 연극같다.
연극처럼 사람들이 다들 과장되게 말한다.
TV처럼 녹화가 가능한 매체지만 라디오 프로들은 녹화가 거의 없다.
생방송으로 하는 경우가 대부분이라 편집도 없어서 연극의 특성을 잘 보존하고
시각적으로 전달이 안되기 때문에 연극보다 더 과장적이기도 하다.

라디오 뉴스를 들어도 TV뉴스 앵커들보다 말을 더 또박또박하고 억양을 더 과장되게 집어 넣는 것 같다.
내가 아는 VOK(KAIST 교내 방송 - 스피커로 라디오처럼 진행)의 한 앵커도 그런 말투를 가지고 있어서 참 재미있었다.

2006년 4월 24일 월요일

수업교재

교수님들도 각자 수업하는 방식이 다르다.
어떤 교수님은 책과 맞춰서 수업을 하시는 데,
이 경우는 고등학교 때처럼 공부하면 된다.
책만 읽고 들어가면 되니까.

다른 경우는 TP만 보고 하는 경우, 보통 책과 비슷할 수도 있지만 TP는 내용이 부족하다.
그럴 때는 다른 학교들의 TP나 책 저자의 TP를 보면 좋다.
학교마다 curriculum이 거의 비슷하니까.
다른 학교 TP를 copy해서 만드는 경우도 많다.

Stanford, Berkeley 등을 구글에서 찾아보면 Lecture Note들이 잘 되있다. 찾아서 보면 된다.

PL은 교수님이 Stanford TP를 보고 만들었다고 말씀하셨고
CG는 학부 CG껄 보려고 했는 데, 학부 CG가 Maryland TP로 수업을 한단다.
(Maryland CG TP가 꽤 좋은 것 같다. 설명도 친절하고 좋다.)

이런 좋은 걸 왜 예전에는 몰랐을 까?
1. 정보 검색능력이 부족해서.
2. 영어 독해가 안되서 (교과서 읽을 시간도 없는 데, 외국 site에 갈리가 없지.)
3. 검색 엔진이 구려서 그런 거 잘 못 찾았다.(Post-구글 이후 가능해진거다.)
4. 아무도 이런 방법을 말해주지 않았다. (주입식 교육의 폐해)
5. 우물안의 개구리였다. (울 학교와 비슷하거나 더 나은 학교는 국내에는 거의 없지만 세상에는 많다.)

앞으로는 수업들을 때 족보 뿐만 아니라 다른 학교것들도 잘 찾아봐야 겠다.
하지만 벌써 학부 생활이 거의 끝나가는 마당이라 아쉽군.


[소설]어머니 - 서머셋 모옴

라카치라는 살인을 저지르고 7년간 옥살이를 치르고 나온 여인이다.
주위의 따가운 시선을 피해 새로운 동네로 이사를 왔다.
비뚤어진 성격으로 어떤 이웃과도 친해지지 못한다.
심술만 피우고 이웃들을 보고도 안 채도 하지 않는 다.

하지만 그녀에게는 매우 멋진 아들이 있다.
그 아들을 본 이웃들은 그녀와는 전혀 닮지 않는 아들을 보고 놀란다.

사실 그녀가 그런 성격을 가지게 된 것은 아들에 대한 병적인 사랑때문이다.
영화 '올가미'처럼 그녀는 자식을 너무 사랑해서 집착, 질투하게 된다.
사실 그녀가 살인을 저지른 이유도 자식을 괴롭히는 남편을 죽인 것이다.
그래서 세상 어떤 젊은 여자도 자기 아들에게 접근하지 못하게 한다.
그녀에게 접근하는 여자를 보면 괴물처럼 소리를 지르고 인상을 찌푸린다.

결국 아들을 사랑하는 여인을 칼로 찔러 죽이게 된다.
그리고 잡혀가면서도 그녀의 죽음을 확인하고는 "하느님 감사합니다."라고 오히려 좋아한다.
아들을 위해 결국 남편과 젊은 여자를 죽인다.
단순히 어머니라기보다는 자신을 아들의 연인이라고 생각하는 것 같다.

토마스 하디의 '아내'라는 작품과 비슷한 주인공의 집착인 것 같다.
좀 더 잔인하고 과격한 방법으로 말이다.
(오이디푸스 컴플렉스와 반대 방향이네.)

-------
이런 작품들은 중학생이 이해하기는 좀 어려움이 있는 것 같다.
나같은 사람이라면 고등학생이라든지, 성인들이 읽어야 이해할만한 내용인듯.

[PL]2006 봄학기 중간고사 문제 정리

생각나는 대로 적어봤음.

시험시간 : 2시간 (1시간이면 충분한 내용이었음.)
자리배치 : 학번 마지막 자리로 hash해서 두 숫자씩 한 공간을 정해줌.
시험인원 : 대략 90명
분량 : 7장, 6문제 - 시험지에 바로 답을 적어서 냄.

. 용어 설명하기(3줄 이내) - 족보와 거의 일치했음.
  type error
  type system
  polymorphism
  Overloading
  type check를 하면 어떤 이득이 있나?

. CFG보고 parse tree 그리기, ambiguous 판별하기
  . ambiguous 함

. Compile과정 적기
  . source code
  . lexical anaylsis
  . parse tree
  . Abstract syntax tree
  . intermediate code
  . optimization
  . machine code

. Denomational semantic가 주어지고 해석하기
  . binary, xor(#), and(@)
  우리말로 적기
  Binary의 마지막 한 자리만 봄

. Lambda calculus 풀기 2개
  . c h h 3 = c(h(h(3))) => (3+3)+(3+3)
  . 길지않았으나 헷갈림.

. Type inference tree 분석하기
  . type inference tree가 이미 주어져 있었음.
  . equation을 새우고 풀면 됨.

알면 다 풀고 모르면 못 푸는 그런 시험이었음.
lambda calculus 외에 머리 복잡한 계산, 정리 하나도 없었음.
실수를 안했으면 거의 85~95점 나오리라고 봄.

낙서

사람들이 요즘은 화장실 낙서를 덜하는 것 같다.
예전에는 화장실에 가면 유치한 낙서들이 있어서
일단 심심하지는 않았다.

물론 2~3번쯤 가면 모든 낙서를 읽어버려서 다시 지루해지기는 했지만
그럴 때는 이용하는 칸을 바꿔가면 그래도 지루함을 덜 수 있었다.
(화장실 낙서의 절정은 최불암 시리즈와 덩달이 시리즈)

세상이 발달해서 그런게 아닐까 싶다.
우리 학교 화장실도 항상 무슨 자보라든지, 책자가 붙어있어서
그것을 읽느라 심심함을 덜 수 있게 되어있으니까.

모 종교들의 책자라든지(가을의 개벽이나 그분이 오신다 등..),
마케팅, 경영 동아리의 자보,
총학생회와 반운동권, 운동권의 대립,
공연 동아리의 공연 소식 등..

그리고 이제는 벽 말고도 낙서할 공간이 너무 많아졌다.
화장실처럼 가끔 이용하고 적은 내용으로 낙서를 하는 것보다
인터넷에서 마음껏 하면 되니까.
시리즈로 적어가면서 놀 수도 있고
실시간으로 답변도 올라오고 여러명이서 싸울 수도 있다.
수천명이 수만개의 답글을 달며 성지 순례를 할 수도 있다.

로마 시대의 낙서문화가 민주주의 시스템으로 발전하고
결국 문서, 시보, 회의록, 추천서 같은 정형화되고 고도화된 형식이 된것처럼
우리의 화장실 낙서문화도 인터넷 댓글로 발전한 것 같다.

시험 당일

어제까지만 해도 시험 기간 같지 않더니,
당일이 된 긴장되면서 시험 같은 기분이 드는 구나.
(고등학교 때는 시험 1주일 전부터 이런 기분으로 살았는 데.)

한 과목 보고 오면 다른 과목들은 전투 모드로 변신해서
순식간에 지나갈 것 같다.

시험 기간 같은 기분은 뭐라고 표현해야 할까나.
스팀팩 맞은 marine이라든지, 아드레날린 저글링.

확실히 아드레날린 분비가 늘어난 기분이 든다.
심장도 빨리 뛴다. 반면에 어깨와 목, 손은 무거워진다.
샤프심이 계속 부러져 나가고 글씨체가 어지러워진다.

권투 시합처럼 종이 땡하고 치면~
그 때부터는 집중력도 올라가고 뭐든 해낼 수 있을 것처럼 변한다.
그리고 시험이 끝나면 까마득하게 모두 잊어버린다.
뭘 했는 지 하나도 기억나지 않는 다.

그래도 이번 시험 기간은 다른 시험기간들과는 달리
뭔가 새로운 아이디어가 떠오르거나 재미없던 모든 사소한 일들이
재미있어지거나 하지는 않는 구나.

별로 새롭지도 않는 데, 뭔가 영감이 떠오르는 것만 같고
성냥쌓기, 테트리스, 카드게임, 가위바위보마저 재미있어 지는 게
시험기간 아니던가.


2006년 4월 23일 일요일

[PL]중간고사 족보

. 2005년 중간고사 족보

3. 다음 용어를 설명하라.
1. Imperative programming language
  statement(instruction)들이 줄지어 있어서 어떤 일을 할 지 sequential하게 적는 다.
  assignment statement가 있다. (side-effect가 있다.)
  Von neumann architecture에서 기본적으로 나온다.

2. Binding and binding time
  binding : value와 identifier를 연결한다.

  binding time에는 static(early, compile time)과
  dynamic(late, virtual, run-time)이 있다.
  binding을 언제 결정할지 정하는 것.

3. Parse tree
  formal grammar에 따라 string을 sytatic structure를 가진 tree로 나타낸 것.
  parser에 의해 generate된다.

4. Derivation
  parse tree로 나타낼 수 있는 방법의 한 종류,
  left-derivation과 right-derivation이 있다.
  left-derivation에서는 항상 left child쪽으로 derivation을 하고
  right-derivation에서는 항상 right child쪽으로 derivation을 한다.

5. LR(k)
  LR parser : CFG의 bottom-up parser의 일종
  left에서 right로 읽어 right-derivation을 한다.
  k는 unconsumed look ahead input symbol의 갯수

6. ambiguity of grammars(ambiguous grammar)
  parse tree를 한 가지 이상의 방법으로 generate할 수 있을 때
  어떤 방식을 선택할 지 ambiguity가 발생한다.
  해결을 위해서는 grammar를 ambiguity없이 다시 쓰거나
  precedency나 associativity를 정해 준다.

7. dynamic scope
  runtime에 bing이 결정됨.
  함수 call 순서의 영향을 받음.
  perl, common lisp등에서 사용.

8. virtual machine
  http://en.wikipedia.org/wiki/Java_virtual_machine
  언어와 실제 machine의 중간 쯤 되는 가상적인 것.
  중간코드와 실제 machine사이에서 돈다.
  Portability 등을 위해 사용되기도 한다.
  Java virtual machine 같은 예가 있다.

9. Overloading
  함수나 operator의 argument(input, operand) type에 따라
  각자에 맞는 알고리즘(다른 알고리즘)을 적용하여 계산한다.
  같은 name을 가졌지만 type에 따라 다른 일을 한다.

10. aliasing
  memory 장소(값)을 하나 이상의 변수로 가리키는 것

11. value model of variabls
  http://en.wikipedia.org/wiki/Variable

12. referentially transparent (referential transparency)
  subexpression을 의미의 변화없이 value로 substitute할 수 있음.

13. polymorphism
  여러 type에 대해 동일한 algorithm을 적용해서 각 input type과 관련된 output을 줄 수 있음.

14. Short-circuiting
  필요하지 않은 것은 evaluation하지 않음.
  boolean or : e1이 true이면 e2는 eval하지 않고 true를 return함 e2가 undefined라도 상관없음.

15. side effect
  어떤 function이 return value외에 다른 값을 바꿀 때.
  assigment statement가 있으면 side effect가 발생한다.
  일반적으로 imperative programming language는 side effect가 있고
  functional language는 side effect를 최소화하려고 한다.
  Pure lisp의 경우 side effect가 없다.

16. tail recursion
  recursion을 iteration으로 쉽게 바꿀 수 있는 special case
  stack에 값을 누적하지 않으므로 spack space를 줄일 수 있다.

17. type system
  type check를 하는 system
  type간의 관계를 정의하고 각 변수, input, output type을 검사한다.
  type inference, casting, coercion을 할 수도 있다.

  http://en.wikipedia.org/wiki/Type_checking
  value와 variable을 type으로 classify한다.
  각 type들을 어떻게 manipulate하고 그들이 어떻게 interact하는 지 정의한다.

18. strong typing
  conservative하게 type을 check함(sound)
  이것을 통과한 것에 대해서는 항상 type-safe하다고 할 수 있다.
  영원이 돌거나 의도한 결과를 준다.

19. coercion vs casting
  http://en.wikipedia.org/wiki/Type_casting
  coercion : implicit type conversion
  compiler가 automatic하게 바꾼다.

  casting : expilcit type conversion
  checked : type을 바꾸기전에 가능한 것인지 확인한다.
  unchecked : check를 안한다.
  bit pattern : bit representation이 그냥 복사된다.

20. control flow statement 중 selection statement의 종류를 나열하라.
  . control flow statement
  http://en.wikipedia.org/wiki/Control_flow
  sequential order에 변화를 줄 수 있는 statement
  labels, goto, subroutines, if then else, loop, conditions, exception, nonlocal goto
  . selection statement
  if then, if then else, else if, switch-case, computed goto, arithmetic if,

21. subroutine closure
  http://en.wikipedia.org/wiki/Closure_%28computer_science%29
  . a subroutine bundled together with a referencing environment
  . a closure is a function that refers to free variables in its lexicla context.

22. applicative-order evaluation
  http://en.wikipedia.org/wiki/Applicative-order_evaluation
  evaluation strategy의 하나.
  function의 argument가 left to right 순의 post-order traversal로 reduce됨.
  function bod에서 가능한한 많은 evaluation을 reduce함.


23. Name equivalence of type checking
  name이 같을 때 같은 type으로 본다.
  C의 record, ada, modula-2

  structural equivalence : structure가 같으면 같은 type으로 본다.

24. derived type vs subtype in ADA

25. Module type


. 2004년 중간고사 족보
1. 다음 용어를 설명하라.
  1. type inference
    strongly statically typed programing lagnuages의 특성
    값에 type이 annotation되어 있지 않아도 자동으로 값의 type을 추론해냄.
    각 값의 관계에 따라 type에 관한 equation을 만드록
    그 equation을 풀면 된다.    

  2. coercion
  3. virtual machine  
    http://en.wikipedia.org/wiki/Virtual_machine
    User와 platform 환경 사이를 virtualize함.

  4. type compatibility by name
  5. overloaded operator (operator ad-hoc polymorphism)
    http://en.wikipedia.org/wiki/Operator_overloading
    operator의 argument의 type에 따라 다른 implementation을 사용하는 것

  6. dangling pointer
    http://en.wikipedia.org/wiki/Dangling_pointer
    적절한 type의 object를 가리키고 있지 못하는 pointer,
    잘못된 공간을 가리키고 있는 pointer
    unpredictable한 결과를 초래할 수 있다.

  7. axiomatic semantics
    수학 logic을 이용하여 computer program의 correctness을 prove하는 것

  8. interpreter
    http://en.wikipedia.org/wiki/Interpreter_%28computing%29
    a computer program that executes other programs.
    source code를 바로 실행시킴.
    반면에 compiler는 translate만 하고 execution은 안함.
    prototyping이나 test시에 간편하게 쓰임.

  9. aliasing
    하나의 값을 2개 이상의 변수가 가리키는 것.

  10. stack-dynamic array
     http://www2.hawaii.edu/~cheungca/ICS313/hw6/2031.txt
     Stack-dynamic array have dynamically bound subscript ranges and dynamic storage allocation at run time and have greater flexibility not requiring array size until used.
     Fixed heap-dynamic array have dynamically bound subscript ranges and dynamic storage allocation, but are static after storage allocation on a heap, rather than stack, and are bound when at user-program request.  Heap-dynamic array have dynamic binding of subscript ranges and storage allocation, can change, if flexible, and can adapt to the size required.

  11. orthogonality in programming language
     어떤 조합이든 valid하게 정의되어 사용될 수 있는 것,
     record의 array, int array, float array, array의 record 등이 모두 가능.
     primitive type과 combination, operator와 operand 등.

  12. enumeration type (enumerated type)
     http://en.wikipedia.org/wiki/Enumerated_type
     programmer가 a finite list로 data type의 value를 정의한 것.
     C언어에서는 enum으로 정의가능.

  13. reference count for memory management
     각 memory cell이 자신을 가리키고 있는 reference(pointer)의 갯수를
     가지고 있음. reference count가 0이 되면 garbage collect됨.

  14. grammar가 ambiguous하다.
     http://en.wikipedia.org/wiki/Ambiguous_grammar
     어떤 string이 여러가지 방법으로 parse tree가 생성될 수 있다.

2. subtype and derived type
  http://en.wikipedia.org/wiki/Subtype
  supertype에 관련되어 만들어진 type.
 
  derived type
  original type과 구조적으로 같지만 다른 type으로 정의된 것.
  의도적으로 두 개를 별개의 type으로 보기 위해 이름을 다르게 붙인 것.

  subtype과 derived type의 공통점 : 원래 type으로 부터 나온다.
  원래 type의 구조를 포함하고 있다.

  차이점 : derived type은 원래 type과 구조가 같지만
  subtype은 원래 type에 일부 구조를 더 할 수 있다.

3. 각 binding time에 일어나는 binding을 여러분이 아는 language에서 예를 하나씩 들어라.
  1. language design time


  2. language impelmentation time


  3. compile time by translator(compiler)


  4. runtime on entry of subprogram


  5. runtime at arbitrary point of execution

4. static array int A[LB1:UB1, LB2:UB2]가 있을 때
  어떤 array element A[i,j]를 access하는 공식을 i, j의 함수로 나타내라.
  필요한 상수는 정의하여 사용하고 그 값을 구하는 방법을 명기하라.
  (row-major로 나열하라.)

  row-major order
  http://en.wikipedia.org/wiki/Row_major

  NUMROWS = LB1 - UB1 + 1
  NUMCOLS = LB2 - UB2 + 1

  A[i, j]

  row-major일 때
  offset = (i - LB1) * NUMCOLS + (j - LB2)

  column-major일 때
  offset = (j - LB2) * NUMROWS + (i - LB1)

5. BNF로 정의된 grammar에 대하여 답하라.
  <S> -> a <S> a | b <S> b | c
  (1) parse tree 그리기

  (2) grammar로 정의된 L를 우리말로 쓰기

  (3)
  . denotational semantics
  M('c') = 0
  M(a <S> a) = 2 * M(<S>)
  M(b <S> b) = 2 * M(<S>) + 1

  'babcbad'의 의미는 무엇인가?
  2 * (2 * (2 * (0) + 1)) + 1 = 5
  0을 2배해서 1 더하고 그것을 2배하고 다시 2배해서 1을 더한다.
  => 5

  (4) <S> -> (a|b)<s>(a|b) | c
  이 grammar는 원래 grammar와 같은 가?
  다르다.
  'bca'라는 string의 경우 원래 grammar에서는 안되지만
  이 grammar에서는 된다.
  증명) 원래 grammar에서는 a,b가 항상 짝수개만 올 수 있다.

6.
  (1) union이란 무엇인가?
     http://en.wikipedia.org/wiki/Union_%28computer_science%29
     여러 종류의 type을 하나의 장소에 넣을 수 있다.
 

  (2) 다음과 같은 program segment가 있을 때, 이 언어는 왜 compile time에
     type compatibility를 check 할 수 있는 지/없는 지 이유를 말하라.

     union (real, int) chameleon;
     int intvar;
     real reavar;
     chameleon = intvar;
     ............
     realvar = chameleon;

     프로그램을 직접 수행하지 않고는 언제 chameleon이 int나 real로 되는 지
     예측할 수 없다.

  (3) 이러한 union type의 변수가 포함된 statement에서 type이 일치하는 지를
     runtime에는 check할 수 있게 하는 방안을 설명하라.
     union type의 변수에 tag를 달아서 현재 어떤 type의 값을 저장했는 지 기록한다.
     assign시마다 assign하는 값의 type을 적어둔다.