Til Home

2020-08-05-TIL

Fact

  • 7일차!

Feelings

  • 피곤하다 ㅠㅠ

Findings

tokenizer 역할과 책임

  • 문자열이 들어오면 의미 있는 단위로 쪼개서 반환을 해준다.
  const input = "[123, 45, 'hello']"
  const output = tokenizer(input); // [[ '123', '45', 'hello' ]]

lexer 역할과 책임

  • tokenizer로 얻은 유의미한 값에다가 의미를 부여한다.
  const tokens = [[ '123', '45', 'hello' ]];
  const lexer = lexerize(tokens); 
 // [[{type: 'number', value: 123},
 //{type: 'number', value: 45},
 //{type: 'string', value: 'hello'}]]

parser 역할과 책임

  • lexer로 얻은 값을 원하는 형태로 바꾸는 작업.
  const lexer = [[{type: 'number', value: 123},
 {type: 'number', value: 45},
 {type: 'string', value: 'hello'}]];

 const parsed = parser(lexer);
 //{ type: 'array',
  // child:
  //  [ { type: 'number', value: 123, child: [] },
  //    { type: 'number', value: 45, child: [] },
  //  { type: 'string', value: 'hello', child: [] }
  //]
 //}

무한 구조의 재귀 함수 장 단점

  • 장점

    • 가독성이 좋다. 표현이 자연스러울 때가 있다
    • 변수 사용이 줄어든다.(mutable state를 줄인다)
    • 이로 인하여 오류가 생길 확률이 줄어든다. side-effect 발생할 확률이 줄어든다.
    • 짜기 쉽다
    • 코드가 간결해진다
  • 단점

    • 반복문 보다 느리다
    • stack 이란 메모리 구조를 쓴다
    • 자기 자신을 부르면서 그것들을 stack에 계속 쌓게 된다. 그래서 성능/메모리적으로 좋지 않다

      • 순서대로 쌓은 스택들을 하나씩 처리할 때 문맥 변경이 일어나면서 반복문 보다 수행 시간이 걸리게 된다.
      • stack의 크기가 한정되어 있어서 크기를 벗어나면 강제 종료된다.

프로그램 입력값이나 에러 처리를 위한 다양한 흐름 제어 방식

  • try … catch…로 에러가 발생하더라도 흐름을 끊지 않는다. 스크립트가 끊기지 않고 계속 실행된다.
  • try 안에서 에러가 발생하면 catch 블록 안에 있는 게 실행된다. 그게 아니라면 catch는 건너 띄가 된다.
try {
  if(true) {
    //do something
  }
  throw new Error("error!!")
  
} catch (err) {
  console.log(err)
}

Future Action

  • 뭐가 맞는지 헷갈릴 때가 많다. 급하게 실행하지 말고 고민을 조금 더 해보고 실행하자.