javascript Deep Dive

JavaScript 웹사이트 사용 장/단점

이경찬 :) 2023. 12. 20. 15:45

JavaScript는 웹사이트에서 사용되는 언어이다.

다른 언어도 많은데 왜 Javascript인지 알아보겠다.

JavaScript의 장점.

속도가 빠르다

자바스크립트는 인터프리터 언어이기 때문에 자바와같이 컴파일이 필요한 다른 언어에 비해 시간이 적게 소모된다.

또한 자바스크립트는 클라이언트 스크립트이기 때문에 서버 연결에 드는 시간을 절약할 수 있어서 프로그램 실행 시간을 높인다.

  • 자바스크립트는 기본적으로 인터프리터 언어이다. 인터프리터 언어는 프로그래밍 언어를 컴파일하여 기계 언어로 바꾸지 않고, 프로그래밍 언어로 되어 있는 코드를 한줄씩 읽으며 실행한다.
  • 그러나, 인터프리터 방식은 한가지 단점이 있다. 가령 매번 똑같은 결과를 반환하는 함수를 5번 호출한다고 치자. 인터프리터 방식은 해당 함수 호출을 만날 때마다 함수를 매번 하여 총 5번 함수를 실행한다. 반면, 컴파일 언어에서는 처음 함수를 만났을 때 그 결과를 기억하고 있다가, 다음 함수 호출을 만나면 함수를 다시 실행하지 않고, 기억하고 있는 결과값을 반환한다. 따라서 함수를 5번 호출해도 실행은 처음 호출한 1번만 한다.
  • 이러한 인터프리터 언어의 한계를 극복하기 위해 V8 인터프리터에 컴파일을 결합하였다. 일단 기본적으로는 인터프리터가 코드를 읽으며 실행한다. 그리고 이 과정에서 프로파일러(Profiler)가 코드 수행을 지켜보다가, 최적화 할 수 있는 코드는 컴파일러에게 전달해준다. (여기서 최적화 할 수 있는 코드란 여러번 호출되는 함수 등을 의미한다.) 그리고 원래 코드와 최적화된 코드를 바꿔준다.
  • 이렇게 인터프리터 방식으로 실행하다가 필요할 때 컴파일 하는 방식을 JIT(Just-In-Time) 컴파일러라고 한다. V8 외에도 Rhino, SpiderMonkey 등도 JIT 컴파일러를 채택하였다.

요약하자면

JavaScript는 인터프리터언어 -> 컴파일하는 시간을 줄임

단, 전에 입력되었던 함수가 또 입력되었을때 또 다시 함수를 매번하는 단점이 존재.

V8은 이러한 인터프리터 언어의 한계를 극복하기 위해 인터프리터에 컴파일을 결합.

인터프리터가 코드를 실행 -> 프로파일러가 코드 수행을 지켜보다가 최적화 할 수 있는 코드 발견

-> 프로파일러가 컴파일러에 함수를 전달 -> 컴파일러가 원래 코드를 최적화된 코드로 변경.

 

위에서 말한 V8엔진의 작동원리를 알아보았다.

JSConf EU 2017에서 발표한 Franziska Hinkelmann님의 자료

v8은 우리의 소스 코드를 가져와서 가장 먼저 파서(Parser)에게 넘긴다. 파서는 소스 코드를 분석한 후 AST, 추상 구문 트리로 변환하게 된다. 그 다음에 이 AST를 그림에 나와있는 Ignition에게 넘기는데 Ignition은 자바스크립트를 바이트 코드로 변환하는 인터프리터이다. 원본 소스 코드보다 컴퓨터가 해석하기 쉬운 바이트 코드로 변환함으로써 원본 코드를 다시 파싱 해야하는 수고를 덜고 코드의 양도 줄이면서 코드 실행 때 차지하는 메모리 공간을 아끼려는 것이다.

 

이후 이 바이트 코드를 실행함으로써 우리의 소스 코드가 실제로 작동하게 되고,그 중 자주 사용되는 코드는 TurboFan 이라는 컴파일러로 보내져서 최적화된 코드로 다시 컴파일 된다. 그러다가 사용이 덜 된다 싶으면 Deoptimizing하기도 한다.

 

단점

클라이언트 보안

자바스크립트 코드는 유저에게 보이기 떄문에, 누군가가 악의적인 의도로 자바스크립트 코드를 사용할 수도 있다. 인정없이 소스 코드를 사용하는 것이 해당한다.

 

느린 비트 함수

자바스크립트는 64비트 부동소수점 숫자로 숫자를 저장하고, 연산자는 32비트 연산자에서 동작한다. 따라서, 자바스크립트는 숫자를 32-bit signed integer로 변환하고, 그걸 기반으로 연산을 수행하고, 그 결과를 다시 자바스크립트 숫자(64bit)로 변환한다. 이러한 연속적인 변환은 시간을 많이 소요하기 때문에 스크립트를 실행하는 데 드는 시간을 늘리고, 스피드는 줄이게 된다.

 

다른 OOP 언어와의 차이점 1 - 은닉화의 한계

JavaTypeScript에는 클래스 내부에서만 쓰이는 속성과 메서드를 구별하는 private이라는 키워드가 존재한다. 따라서 클래스에 정의된 속성이나 메서드에 private 딱지가 붙어있으면, 클래스 외부에서 접근할 수 없다.

javascript에서는 private가 존재하기는 하지만, 지원하는 브라우저가 별로 없다.

클로저 모듈 패턴을 이용해 private를 간접적으로 구현하기도 한다.

 

다른 OOP 언어와의 차이점 2 - 추상화 기능 부재

OOP의 추상화는 속성과 메서드의 이름만 노출시켜 사용을 단순화함을 의미한다. 다시말해, 인터페이스를 단순화함을 의미한다. JavaTypeScript에서는 인터페이스 기능이 구현되어 있다.

인터페이스를 명시적으로 작성해놓음으로써, 이 클래스가 메서드 이름이 의도한 대로 작동할 것임을 드러낸다. 또한 실징적인 구현은 공개하지 않고 사용법만 노출시킬 수 있다.