Compiler - Introduce

This Lecture require something :
  - Programming Languages,  C ,Data Structure, Unix Skill(vi,make...)

Chapter 1 :  to Compiling

Simply stated,  Compiler is a program that reads a program written in one  the source language) and translates it into an equivalent program in  language( the target language).      

         Source         ---------> Compiler  ---------->   Target
        program                              ↓                          program
       (High level)                       Error                    (Machine Level) 
                                            messages                                

            cf. Interpreters : Shell,BASIC,APL,Batch file....

- The Context of a Compiler ( A  Language Processing  )

          Skeletal Source Program
                      ↓
              Preprocessor : cpp
                      ↓
             source program
                      ↓
             compiler : gcc      ->       Assembly Code
     
                  ↓                                       ↓
        relocatable machine code   <-       assembler
                      ↓
           loader/link-editor : library load
                      ↓
           absolute machine code        

  
 - The parse  a compiler : Long 6 step but Short 3 step.
              Lexical Analyzer  
                             e.g)  id1 := id2 + id3  60
                         ↓
             Syntax analyzer 
                             e.g)       := 
                                       /   \
                                             +
                                                /  \    
                                            id2       *
                                                     /  \
                                                   id3    60
                        ↓  
               Semantic analyzer
                             e.g)       := 
                                       /   \
                                    id1         +
                                                /  \    
                                           id2       *
                                                     /  \
                                                     id3    60.0
                          ↓
              Intermediate Code generator
                               temp1 := int to real(60)
                                    temp2 := id3 * temp1
                                    temp3 := id2 + temp2
                                    temp4 := temp3
                        ↓
               Code  
                              e.g) temp1 := id3 *  
                                     id1 :=  + temp1
                          ↓
              Code generator
                                MOV id3, R2
                                       MUL #60.0, R2
                                       MOV id2, R1
                                       ADD  R2, R1
                                       MOV R1, id1 
 
  6 step : lexical analyzer -> syntax analyzer -> semantic analyzer -> intermediate code generator-> 
              code optimizer -> code generator
  3 step : lexical analyzer -> syntax analyzer, semantic analyzer 
               -> intermediate code generator, code optimizer, code generator

'프로그래밍' 카테고리의 다른 글

C# - Property  (0) 2009.12.24
Python - Beautiful Soup  (2) 2009.12.24
SCJP 5.0 관련 자료 모음  (0) 2009.12.24
[C#] 소수구하기  (0) 2009.12.24
코딩도장(CodingDojo)  (0) 2009.12.24

[C#] 소수구하기

C#으로 소수구하기 연습을 해보았다. 문제 자체는 간단한데 코딩도장으로 하는데 왜 어리버리 되었는지..
회사에서 연습으로 풀어본 문제이고, 그때는 어리버리해서 마무리 못하였고, 집에와서 끄적대보았다.
문법만 c# 스럽게 되었을뿐, 코드 자체는 수정할 것도 보이고, c++스러운것도 보이고.. 휴...ㅠ.ㅠ
using System;
using System.Collections;

namespace c_sharp_problem_prime_number
{
    class PrimeNumber
    {
        static void Main(string[] args)
        {
            PrimeNumberSolve primeNumbers = new PrimeNumberSolve();

            primeNumbers.SetNumber(1, 50);
            primeNumbers.CalculatePrimeNumbers();
            primeNumbers.PrintPrimeNumbers();
        }
    }

    class PrimeNumberSolve
    {
        public PrimeNumberSolve()
        {
            _startNumber = 0;
            _endNumber = 0;

            _resultPrimeNumberList = new ArrayList();
            _primeNumberList = new ArrayList();
        }

        public void SetNumber( int numA, int numB )
        {
            _startNumber = Math.Min(numA, numB);
            _endNumber = Math.Max(numA, numB);         
        }

        public bool IsPrimeNumber( int number )
        {
            if (number < 2)
            {
                return false;
            }

            for (int i = 2; i < number; i++)
            {
                if (number % i == 0)
                {
                    return false;
                }
            }

            return true;
        }

        public void CalculatePrimeNumbers()
        {
            PreCalculatePrimeNumbers();

            for (int num = _startNumber; num <= _endNumber; num++)
            {
                bool isPrimeNum = true;
                if (_primeNumberList.Count > 0 )
                {
                    foreach (int i in _primeNumberList)
                    {
                        if (num % i == 0)
                        {
                            isPrimeNum = false;
                        }
                    }                                 
                }
                else
                {
                    isPrimeNum = IsPrimeNumber(num);                    
                }

                if (isPrimeNum == true)
                {
                    _primeNumberList.Add(num);
                    _resultPrimeNumberList.Add(num);
                } 
            }
        }

        public void PreCalculatePrimeNumbers()
        {
            for( int i = 2; i < _startNumber; i++ )
            {
                bool isPrimeNumber = IsPrimeNumber(i);
                if( isPrimeNumber == true )
                {
                    _primeNumberList.Add(i);
                }
            }
        }

        public void PrintPrimeNumbers()
        {
            foreach( int number in _resultPrimeNumberList )
            {
                Console.WriteLine( number );
            }
        }

        private ArrayList _resultPrimeNumberList;
        private ArrayList _primeNumberList;
        private int _startNumber;
        private int _endNumber;
    }    
}

'프로그래밍' 카테고리의 다른 글

C# - Property  (0) 2009.12.24
Python - Beautiful Soup  (2) 2009.12.24
SCJP 5.0 관련 자료 모음  (0) 2009.12.24
Compiler - Introduce  (0) 2009.12.24
코딩도장(CodingDojo)  (0) 2009.12.24

코딩도장(CodingDojo)

코딩도장이란?

코딩도장은 2005년에 더 적절한 방법으로, 기술의 깊이와  존중하면서, 

프로그래밍을 가르치고 배우는 방식을 발견하기 위한  시작하였습니다.

'도장'의 원래 아이디어는 미리 준비한 해결 과정의 시연을  주어진 문제에 대한 해결 방법을 개발하는 

과정을  것입니다. 코딩 도장은 결과가 아니라 과정을 시연, 의논, 개선합니다.


예를 들어, 피보나치 수열을 만드는 코드를 작성하는데, 

 페어들은 "무"에서 피보나치 수열 코드로 이르는 다양한 루트를 예컨대 TDD로  한번 해보고, 

이번에는 좀 더 개선하고 세련되게  다시 해보고(DoItAgainToLearn)... 

하나의 행위예술이 된다. 정말  없다고 생각될 때까지 해본다.

그 시연 자체를 보고(결과 코드뿐만  "아름답다"고 느낄 수 있게. 그런 것들을 함께 시연하고 의논한다.

만약 내가 유도를 배우길 원한다면, 난 가장 가까운 도장에 등록하고, 

다음 2년간 매주 1시간씩 출석을 해야 할 것이다.

그 기간이 지나고 나면, 난 아마도 기술을 발전시키기 위해 부지런히  과정을 선택할 것이다.

몇년간 더 훈련을 하면, 검은띠를 딸  있을 것이고, 

그것은 단지 내가 다른 배움의  도달했다는 표시에 불과한 것이다.


어떤 사범도  것을 중단할 수 없다.

만약 내가 OO프로그래밍을 배우길 원한다면,  고용주는 나를 큰 훈련 기관의 올해 프로그램 

 고른, 3일 단기 자바 코스에 넣을 것이다. 그것은 참 바보같은  

코딩 스킬을 얻는것은  일시적인 만족감의 프로세스가 아니다.

이 워크샵은 더 적절한 방법으로, 기술의 깊이와 정묘함을 존중하면서, 

프로그래밍을 가르치고 배우는 방식을 발견하기 위한 것이다.

[출처] Coding Dojo(코딩 도장 - 태권도장 처럼...)|

 특징

  • 코드 없이 토론하지 않는다

    책을 보고 토론하거나 하는 모임은 이미 많이 있다 (몸으로 수행하라)

  • 만든 결과물만 갖고 이야기하지 않고 만드는 과정을  체험한다

    각자 만들어 온 코드만 갖고 토론하거나 하기보다  코드를 만든 과정을 통해 많은 것을 배운다

  • 같은 문제(카타)를 여러번 풀어본다

    정보올림피아드 같은 ProgrammingContest  아니다. 
    단순한 문제풀이 스터디와 다르다. DoItAgainToLearn

  • 한가지 언어에 국한되어 있지 않다

    여러 언어를  것에서 더 많은 학습의 기회가 있다고 믿는다.

     코딩도장에서 사용했던 언어는 C, C++, Python, Java, Io, Haskell, Ruby, 등

  • 가능하면 모든 코드는 테스트 코드를  한다

    꼭 구현 과정이 TDD일 필요는 없으나 최소한의  코드는 있는 것이 좋다

  • 카타는 평균적인  처음 풀었을 때 TDD를 사용해서 최대 1시간 내에 
    여유있게  수 있어야 한다
  • 어려운 문제를 하나 푸는  그 시간에 쉬운 문제를 여러번 푸는 것을 장려한다.

코드도장 방법 / 사례

처음의 코딩도장( 2005년 11월)

여기 나열한  워크샾 일정은 초안이며 이전의 세션에서 얻은 경험을 바탕으로 변경될 수 

  • 코딩 도전 과제는 사전에 공지된다.
  • 비디오 스크린에 연결된 컴퓨터가 1대 있는 방이 있다.
  • 시연자는 코딩 도전 과제를 설명하고, 란도리를 청중에서 고른 2명으로 
  • 매 5분마나 2명중 1명을 교체한다.
  • 키보드를 잡고 있는 2명은 그들이 무엇을 하고 있는지를 계속 설명해야 
  • 키보드를 잡고 있는 2명은 청중중 누군가가 방향을  경우 하던 작업을 중단해야 한다.
    그가 다시 진행중인 사항을 이해하게  경우에만, 다시 작업을 재개한다.
  • 작업을 하는 2명은  개발)을 사용한다.
  • 작성된 모든 코드는 아파치 라이센스  사용해 대중에게 오픈된다.
  • 사용될 프로그래밍 언어는 세션  전에 공지된다.
  • 참석할 수 있는 인원은 15명  제한한다.

Xper - 한국 eXtreme  사용자 모임

짝으로 프로그래밍하며 앞에서 프로젝터를  보여줄 때에는 자신이 문제를 풀어나갔던 과정을 
그대로 보여준다. 수련생들은  보며 시연자들이 어떤 키배열을 쓰는지, 
어떤 텍스트 편집기를 쓰는지,  순서로 프로그래밍 하는 지 등을 "고대로" 관찰할 수 있다.
참가자들이  것은: 노트북 컴퓨터(필요시 두 사람에 한 대 꼴로만 있으면 가능),

프로그래밍할 준비, 문제를 풀어보려고 노력해 봤을 것.
"관장"은  코딩도장 운영(및 사전 준비와 예약 등)을 맡는다.

 30분)
  • 코딩도장 소개 및 개인 소개 
  • 오늘의 문제 소개 및 몸풀기 15m
  • 한 짝이 문제를 해결하는 과정을 보여준다 30m
  • 휴식 20m
  • 각자 짝을 지어 문제의 남은  해결한다 20m
  • 최초의 짝이 문제를 마저 해결하거나  새로운 해법을 제시한다 30m
  • 토론(다음 코딩도장 때는  할까)과 한담(최근의 깨달음과 고민, 자신의 수련 이야기 등) 20m
  • 버퍼 5m

필통 코딩도장

  • 현재 운영되고 있는 코딩도장으로 매주 목요일  오프라인 모임으로 진행
  • 운영 방법
    • 문제를 3-4일전에 홈페이지에 공고 코딩도장 인원 모집
      • 문제조차 안 읽은 경우도 많다.
      • 2명당 1개정도 노트북으로 페어프로그래밍을 할 수 있도록 준비한다. 
         노트북을 가져온다 )
    • 풀이는  짝 프로그래밍으로 합니다. 짝 프로그래밍을 하지 않는다면 굳이 모임을 가질  없다고 봅니다.
    • 모임 시간은 장소의  있고 해서 2시간입니다. 
      대략 1시간 정도를 문제 풀이에 사용합니다.
      • 그렇게 난이도 있는 걸 다루지 않는다.
    • TDD는 강제하지 않지만, 대부분  풉니다.
    • 프로그래밍 언어나 프레임웍은 알아서  풉니다.
    • "코딩 수련"을 한다면 일부러  사용하지 않는 언어를 택할 것을 권한다.
      • 일부러 다른 언어를 택하는 건 언어는 사고에 강력한 영향을 주기
  • 회고
    • 소감
    • 배운 점
    •  점
    • 개선 점

MAIET STORY( 건즈 개발팀 )

  • 월요일 점심시간에 운영
  • 운영 방법
    • 문제 하나당 2주일 소요(매주 월요일 점심 시간에 모임을 갖는다.)
    • 첫 날은 문제를 각자 미리 풀어와서 해법과 코드를  설명한다.
    • 토론을 통해 그 문제의 최적 알고리즘을  후, 각자 작성한 코드 중에서 
      해당 문제에 대한 최고의  함께 만들기 위해 리팩토링할 코드 대상을 선정한다. 
      (의견을 모아  결정. 최고의 코드가 선택될 수도 있고, 
      최악의 코드가 선택될  있다.)
    • 두번째 날, 선택된 코드를 리팩토링할 사람을  선택한다.그 사람이 
      주도권을 쥐고 리팩토링하되, 다른 사람들은  리팩토링에 대한 의견을 낸다.
    • 한사람당 20분 정도씩  정해서 다함께 페어로 돌아가면서 리팩토링한다.
      다음에 리팩토링할 사람도 물론 랜덤으로 
    • 리팩토링시 몇가지 규칙
      • 키보드를  있는 사람이 주도권, 컨벤션 등은 초기 코드 작성자에 맞춰준다.

효과/경험

  • 거울 효과
    동료 개발자들의 공개 코딩을 실시간으로 관찰하면서 자신의 모습을 
  • 파트너와 효과적으로 의사소통하는 방법
    •  옮기기 전 간단히 의견을 정리하고 합의하는 과정에서는 
      설계스케치가 효과적일  다만, 설계스케치가 장황한 설계로 이어지면
      불필요한 토론으로 시간을 잡아먹는 경우가 많으니 동그라미, 화살표, 
      키워드 정도만으로 설계를 표현해보는 연습이 
    • 함수 등을 새로 정의할 때는 가급적이면 어떻게  것인가 보다는 어떻게 사용할 것인가에 초점을 맞추면 좋습니다
      이미 쓰임새가  표현되어 있기때문에 단순히 말로써 이러이러한 함수를 작성하자고 할때보다 훨씬 명확하고  용이합니다

출처링크

'프로그래밍' 카테고리의 다른 글

C# - Property  (0) 2009.12.24
Python - Beautiful Soup  (2) 2009.12.24
SCJP 5.0 관련 자료 모음  (0) 2009.12.24
Compiler - Introduce  (0) 2009.12.24
[C#] 소수구하기  (0) 2009.12.24

패턴 그리고 객체지향적 코딩의 법칙

깨끗한 코드의 선순환
깨끗한 코드는 가독성이 높고 구조적으로 이해하기 쉬운 코드를 의미한다.
깨끗한 소스는 요구사항이나 버그에 의한 소스 수정이 이루어질 때 수정할 부분을 빨리 찾을 수 있으므로 쉽게 수정할 수 있다.  또 소스가 지저분하지 않으므로 이 소스를 수정할 개발자들은 기존 원칙을 지키고 싶어한다.

만약 새로운 요구사항이 기존의 깨끗한 소스로도 수용이 안되는 경우는 리팩토링을 통해서 새로운 구조의 소스를 만들고 작업을 하면 된다. 깨끗한 소스는 리팩토링을 더욱 쉽게 가능케 하는 장점이 있다.

깨끗한 코드를 작성하기 위해서 아래의 원칙을 지키도록 한다.
 - 다른 개발자들에게 API를 제공한다는 마음으로 개발하라.
 - 남이 봐도 쉬운 코드를 만들어라.
 - '역사적'인 이유를 만들지 말아라.
 - 자신의 코드만 보지 말아라.
 - 기존의 코드와 통일성 있는 코드를 작성하라.
 - 커뮤니케이션 하라.
 - 항상 '1년 뒤에 이 소스를 본다면?'이라고 생각하라.
 - 리팩토링 하라.
 
항상 개발은 내가 아닌 팀이 같이 만들어 나가는 것이고 내가 만든 코드는 언제든지 다른 개발자들에 의해 사용될 수 있다는 점을 명심하자. 나의 '역사적'인 코드는 다른 개발자들에겐 그냥 추하게(Ugly) 작성된 코드로 밖에 보이지 않는다는 점을 알아야 한다. 이 모듈은 내꺼니까 나만 잘 볼 수 있으면 된다라는 마음가짐은 위험하다.  - p.68
 
정리할 시간이 없다.
기존의 구조를 바꾸어야만 새 요구사항을 적용할 수 잇는 상황을 가정해 보자. 당장 편하기 위해 지저분한 코드를 만들기보다는 기존 구조를 변경시키는 시간까지 합쳐진 개발 계획을 잡고 업무를 진행해야 한다. 지저분한 코드는 또 다른 지저분한 코드를 부르기 때문이다. - p.72
 
객체 지향의 원칙
 - 클래스가 꼭 필요한 변수와 함수만을 가지고 있는가?
 - 클래스 사이의 연관성이 너무 높지 않은가?
 - 중복된 코드가 너무 많지 않은가?
 - 클래스가 너무 크지 않은가?
 - 코드를 이해하기 쉬운가?
 - 변하는 부분과 변하지 않는 부분은 무엇인가?

코드의 쉬운 이해가 중요한 이유는 코드를 변경해야 할 시점에 기존의 구조를 빠르게 이해하고 변경 작업을 쉽게 하려는 의도가 가장 크다.
개발을 하다 보면 개발자의 편의 혹은 귀차니즘에 의해 '이건 그냥 대충 이렇게 하지'라며 눈감아 주는 코드들이 있다. 대체로 이런 코드는 쉽게 이해하기 힘들다. 왜냐하면 일반적인 경우에 해당하는 코드가 아니라 특정 상황을 전체에 적용시키기 어렵기 때문에 슬쩍 예외 처리하는 경우에 주로 이런 '눈감아 주기'코드가 나타나기 때문이다.
이런 코드는 어쩌면 그 순간에 굉장히 효과적일 수도 있다.
관련된 코드를 모두 수정하는 비용보다는 이런 식으로 눈감아 주는 방법이 더 경제적일 수 있기 때문이다. 이렇게 작성된 코드를 나중에 변경할 때 눈감아 주었던 부분들을 쉽게 기억할 수 있다면 모르겠지만 은근슬쩍 묻힐 가능성이 크다.  

순간 눈감고 작성한 코드는 영역 눈감고 있을 가능성이 높다는 점을 알아야 한다.
그래서 되도록 일반적인 룰로 코드를 작성해야 하고 다시 보는 것을 대비해 코드는 쉽게 작성해야 한다.  - p.90
 
 구현 퍼포먼스를 높이기 위한 방법
  - 코딩 중에는 마우스를 최대한 만지지 마라.
  - 자신이 사용하는 툴의 모든 단축키를 외워라.
  - 디버깅하기 쉽도록 코드를 작성하라.
  - 반복되는 작업을 편하게 해줄 도구를 찾아라.
  - 목적지로 가는 가장 빠른 길을 탐색하라.
  - 구현 중에는 흐름을 끊지 말아라.
 
상속을 이용해서 기능을 확장하는 방법은 기능 확장 방법 중에서도 가장 무거운 방법에 속한다.
보다 나은 구조를 찾기 위해 문제를 일반화 시킨다. 문제를 일반화하는 가장 좋은 방법은 공통점을 찾아내는 것이다. - p.340

'읽은거' 카테고리의 다른 글

모리차장의 비밀과외  (0) 2011.01.10
1만 시간 법칙  (0) 2009.12.24
왜 나는 너를 사랑하는가  (0) 2009.12.24
스크럼(Scrum)과 XP  (0) 2009.12.24
소프트웨어 산책 - 프로그래머의 문제 풀이  (0) 2009.12.24

왜 나는 너를 사랑하는가

알랭 드 보통이 25살에 쓴책이라고 하는데..
나는 25살에 무엇을 했었지라는 생각이 먼저 들었다.
조금만 더 진지하게 생각하면서 시간을 보냈더라면
지금보다 조금은 좋은 모습이지 않을까 하면서..

책이 나온 시간이 오래 되었기 때문에 책 소개 / 훌륭한 감상평들이 인터넷에 많이 있다.
나는 그냥 책을 읽다가 지금의 내가 마음에 들어하는 부분을 적어 놓고 싶었다.

사랑은 사랑하는 사람의 본질적인 평범함을 인정하지 않음으로써 그 광기를 드러낸다.

그래서 방관자 자리에 선 사람들에게는 사랑에 빠진 사람들이 지겹다. 방관자들은 묻는다.
저 사람들은 사랑하는 사람에게서 한 인간 외에 무엇을 보는 걸까?  - p.121

눈에 보이는 것은 몸 뿐이기 때문에 사랑하는 사람에게 홀린 연인은

영혼 역시 그 껍질과 똑같기를 바라게 된다.
몸이 거기에 어울리는 영혼을 가지고 있기를,
살갗이 표현하는 것이 속에 든 본질이기를 바라게 된다.
나는 몸 때문에 클로이를 사랑한 것이 아니라,
그녀의 본질에 희망을 품게 해주었기 때문에 그 몸을 사랑했다.

그것은 매우 가슴 설레는 희망이었다.   - p.124


어떤 사람을 사랑한다는 것은 그 사람에게 깊은 관심을 가진다는 것이며,

그 관심으로 그 사람이 무엇을 하고
무슨 말을 하는지 스스로 더 풍부하게 느끼게 해준다는 것이다. - p.144

나는 클로이를 사랑할지 모르지만, 그녀를 알기 때문에 그녀를 갈망하지 않는다.

갈망은 우리가 알고 있는 사람들을 향할 때에는 무한정 뻗어나갈 수가 없다.
그들의 특질은 이미 도표로 정리되어 있고 따라서 갈망에 대한 신비가 없기 때문이다.
반면 몇분 동안 또는 몇 시간 동안 보았다가 영원히 사라져버리는 얼굴은
정리할 수 없는 꿈, 규정할 수도 없고 꺼버릴 수도 없는 욕망에 필수적인 촉매가 된다. - p.162

내가 전 애인들에 대해서 클로이와 이야기하기를 싫어한 것도 변심에 대한 두려움에서 나왔다.

그녀들은 내가 과거 어느 시점에서 영원하리라고 생각했던 상황이 그렇게 되지 않았음을 일깨워주었다. 관계의 내부에서 볼때 과거의 사랑들에 대한 무관심에는 극히 잔인한 면이 있었다. p.172

 내가 클로이를 사랑하면서 생기는 불안은 부분적으로는

내 행복의 원인이 쉽게 사라질 수 있는 상황에서 오는 불안이었다.
클로이는 갑자기 나에게 흥미를 잃을 수도 있었고, 죽을 수도 있었고, 다른 남자와 결혼할 수도 있었다.
그래서 사랑이 절정에 이르렀을 때 관계를 일찌감치 끝내고 싶은 유혹이 생겼다.
다른 사람이나 습관이나 익숙함이 관계를 끝내는 꼴을 보니니,
차라리 클로이나 나 둘중의 하나가 끝을 내버리자는 것이었다.
우리는 가끔 연애가 자연스러운 종말에 이르기 전에 끝내버리고 싶은 충동을 느꼈다.
증오에서 나온 살인이 아니라 지나친 사랑에서 나온,
아니 지나친 사랑이 초래할 수도 있는 두려움에서 나온 살인이었다.
연인들은 단지 그들의 행복의 실험에 수반되는 불확실성과 위험을
견딜수 없다는 이유로 사랑의 이야기를 끝내버릴 수도 있다. p.185

사랑을 할 때 중요한 것은 시간의 길이가 아니야.

느끼는 것과 하는일이 모두 강렬해진다는 것이 중요한거지 -p.220

아.... 빌려서 읽어본 책인데.. 천천히 한번더 읽어 보고 싶다는 생각이 들었다.
공감되는 부분들이 있어서 인가, 사랑에 대해서 알고싶어하는 본능적 욕구때문인가..

'읽은거' 카테고리의 다른 글

1만 시간 법칙  (0) 2009.12.24
패턴 그리고 객체지향적 코딩의 법칙  (0) 2009.12.24
스크럼(Scrum)과 XP  (0) 2009.12.24
소프트웨어 산책 - 프로그래머의 문제 풀이  (0) 2009.12.24
휴리스틱(Heuristic)  (0) 2009.12.24