Today, I Learned

  • About prototype & prototype chaining
    정리 링크 : 1, 2
  • About Object.create(프로토타입을 응용한 객체 상속)
  • About OOP(Object Oriented Programming)
  • About How to do OOP in JS(PseudoClassical)
    About How to do OOP in JS(ES6)
  • 기계어(010101) => 어셈블리어 => 고급언어(C, C++, JAVA) : 이러한 변화 및 발전 과정은 결국 컴퓨터가 쓰는 기계어에서 인간이 쓰는 언어로의 발전이라고 볼 수 있다. 본래 이진수만 이해할 수 있는 (0, 1) 컴퓨터의 '입맛(?)'에 맞게 과거의 천공 카드처럼 프로그래밍을 했었다면, 시대가 변하면서, 어셈블리어를 거치고, 결국 고급언어까지 오면서 사람의 언어와 닮는 방향으로 발전을 해왔다. 그러나, 그러한 편리성을 얻은 변화 과정 속에서 결론적으로, 기계어와 멀어지는 선택을 했기 때문에 어셈블러(어셈블리어=> 기계어), 컴파일러(고급언어=>기계어) 등의 사용이 필수적으로 요구되었고, 그에 따라 속도가 이전에 비해 느려지는 등의 포기하는 부분도 있게 되었다. 그러나, 이에 반해, 코드 flexibility, 사람의 언어(그중에서도 영어)와 닮아 편해진 프로그래밍 등의 장점이 있다.
  • compiler vs interpreter : 위에서 말했듯이, 고급언어에서는 컴파일러를 통해 source program을 object language로 번역하여 컴퓨터가 이해하고, 실행할 수 있도록 한다. 컴파일러는 단어의 의미 그대로 인간의 언어를 이해 못하는 컴퓨터에게 통역 혹은 번역을 해주는 프로그램이라고 생각하면 될 것 같다. 그렇다면, interpreter는 무엇일까?. 분명히 같은 번역 프로그램인 것은 알겠는데, 컴파일러가 있는데, 인터프리터는 왜나왔을까를 둘의 차이를 통해 설명해보고자 한다. 먼저, 컴파일러는 간단히 말해보면, 번역을 모두 마친 다음에 실행을 한다. 그래서 실행을 할 때는 이미 번역이 마친 상태이므로, 실행 속도가 빠르다. 그러나, 모든 코드를 한번에 다 번역하려하기 때문에 혹은 단위가 소스코드 전체이기 때문에 디버깅을 하기가 어렵다. 또한, 컴파일러는 바로 기계어로 번역하는 것이 아니라 중간 언어를 거쳐서 기계어로 번역된다. 예를 들어, JAVA를 쓸 때, .java(작성한 소스코드 파일)을 실행하면, 자동으로, .class 파일이 생성되는데, 이는 bytecode로 된 파일로 앞서 말한 컴파일러가 중간에 거쳐가는 중간 코드(intermediate code)이다. 이러한 작업을 거치기 때문에 메모리 사용량이 상대적으로 더 높다. 이에 반해, 인터프리터(파이썬, 루비 등의 언어에서 사용)는 실행을 하는 데에 있어서 컴파일러와 달리 코드 전체를 한번에 번역하지 않고, 한 문장, 한 문장씩 번역하면서 실행한다. 비유해보면, 컴파일러가 설명서 전체를 읽고, 한번에 레고를 조립하는 타입이라면, 인터프리터는 설명서의 1번을 읽고 그 부분을 실제로 조립하고, 2번을 읽고 조립하고... 하는 식이다. 따라서, 한줄 한줄씩 실행을 하기 때문에 디버깅이 쉽다. 레고를 조립할 때 한번에 설명서를 읽고, 조립하면 틀린 부분을 찾으려면 이미 완성된 상태에서 건드려야하기 때문에 디버깅이 쉽지 않다. 그러나, 한 부분, 한 부분씩 조립하면, 에러가 발생했을 때 쉽게 고칠 수 있다. 그러나, 이렇게 하나하나 읽고, 실행하는 인터프리터는 컴파일러에 비해 속도가 느리다. 또한, 인터프리터는 중간 코드를 거치지 않고, 바로 번역하고 실행한다. 따라서, 컴파일 언어에 비해 상대적으로 메모리 사용량이 적다.(참고 사이트)
  • 그렇다면, 자바스크립트는 인터프리터 언어인가 컴파일 언어인가? : 사실 당연히 자바스크립트는 인터프리터 언어인줄 알았다. 그러나, 생각해보니 제대로 알아보지도 않은채 단지 파이썬, 루비와 같이 그렇게 엄격하지 않은 언어라는 단순한 공통점에 따라 같이 묶어버린 것 같다. 결론적으로, 자바스크립트는 컴파일 언어에 '가까운' 언어라고 할 수 있을 것 같다. 이에 대한 근거는 함수 호이스팅(Hoisting)에서도 생각해볼 수 있는데, 함수 호이스팅은 선언식으로 함수를 선언했을 때, 그 선언문 이전에도 그 함수를 호출할 수 있는, 말그대로 함수를 호이스팅(끌어올리다)하는 것이였다. 이를 보면, 자바스크립트가 코드를 top to bottom으로 한문장씩 해석하고 실행하는 것이 아닌 코드 전체를 쭉 훑고, 해석하고, 실행하는 것처럼 보인다. 그러나, 자바스크립트를 딱 잘라서 컴파일 언어라고 하지 않은 이유는 자바스크립트의 특징들을 나열해보면 인터프리터 언어의 특징도 부분 가지고 있기 때문인데, 이러한 내용은 링크를 통해 공부해보았다.

Planning to Study

  • 객체지향 프로그래밍 관련 특징 및 장단점 등 정리
  • JavaScript에서 Object를 생성하는 여러가지 방법들 포스팅
profile
완벽함 보다는 최선의 결과를 위해 끊임없이 노력하는 개발자

0개의 댓글