본문 바로가기

Backend/Javascript

[Javascript] - Transpiling

Transpiling (트랜스파일링)

 

트랜스파일링, 트랜스파일러에 그간 거의 관심이 없었지만, 책에 나온 김에 쓸만한 부분이 있을지 보도록 하겠습니다.

 

- 트랜스파일링은 하나의 프로그래밍 언어를 다른 언어로 컴파일하는 특별한 형태입니다.

 

트랜스파일링에 자바스크립트가 많이 이용됩니다.

자바스크립트를 이식 가능하고 실행 가능한 형식으로 쓰는 것 + 자바스크립트의 범용성과 안정성을 이용하는 것입니다.

 

- 자바스크립트는 이식성이 뛰어나고 최소화된 형태의 소스를 충분히 빠른 속도로 토큰화하고 파싱할 수 있습니다.

 

- 트랜스파일러가 만들어지는 이유

 

‣ 실험적인 용도

 

실험적인 언어와 기능을 만들고 테스트하는데 트랜스파일러는 이상적인 방법입니다.

 

‣ 특수화

 

트랜스파일러는 특별한 목적으로 만들어진 언어를 구현하기 위해 사용되기도 하며, 이러한 언어들은 관련 일에 소요되는 작업량을 줄여줍니다.

 

‣ 유산

 

유명하지 않은 언어들을 자바스크립트로 변환함으로써 오래된 프로그램이 동작할 수 있게끔 그러한 언어들을 보호하는 수단으로 사용되기도 합니다.

 

‣ 유행

 

유행을 타는 개발자들에 의해 사용될 수도 있습니다.

 

‣ 얼리 액세스 (early access)

 

트랜스파일링을 통해 다음 버전 자바스크립트의 새로운 기능을 현재 버전 자바스크립트로 변환함으로써 즉시 사용해 볼 수 있습니다.

 

‣ 보안

 

자바스크립트가 가진 고유한 보안 최약점을 트랜스파일러가 제거하고 잘못된 동작의 점검 등 보안 취약점을 완화시킬 수 있습니다.

 

‣ 성능

 

ASM.js 나 웹 어셈블리를 이용한 개발은 자바스크립트에서 사용하지 않는 기능들을 전부 제거함으로써 실행 성능상의 이득을 얻습니다.

 

- 트랜스파일러는 상용 생산 단계에서는 사용해서는 안 됩니다.

 

- Neo

 

Neo 는 트랜스파일 언어입니다. 이 책에서는 Neo 가 토큰화, 파싱, 코드 생성, 실행 환경 단계로 어떻게 구현되어있는지 얘기하고 있지만,

전 거기까지 포스팅에 담지는 않을 예정입니다. 다만 Neo 가 무엇인지 궁금하니 살짝만 훑고 특징들만 정리해 보도록 하겠습니다.

 

 Neo 는 교육적인 목적의 언어입니다.

 

자바스크립트의 가장 큰 실수들을 바로잡고 예전 패러다임에 강하게 얽매여 있는 기능들을 제거함으로써 다음 세대 언어로 전환하는 데 도움을 주고자 만들어진 언어입니다.

 

‣ 예약어가 없습니다.

 

‣ 이름에 띄어쓰기를 포함할 수 있으며, 물음표로 끝날 수 있습니다.

 

이렇게만 봐선 오히려 개발자들이 더 헷갈릴 것 같네요.

 

‣ 주석을 # 으로 시작하고, 주석은 해당 줄의 끝에서 끝납니다.

 

‣ Neo 는 의미 있는 공백 문자를 쓰기 때문에 세미콜론이 필요 없습니다.

 

세미콜론을 안써도 되는 부분은 자바스크립트도 동일하네요.

 

‣ null 은 자바스크립트의 null, undefined, NaN 을 하나로 묶은 단일 객체이자 불변 객체입니다.

 

‣ Neo 는 큰 10진수라는 하나의 숫자형만 가집니다.

 

그래서 10진법 연산이 정확하고, 숫자가 크기 때문에 MIN_VALUE, MAX_SAFE_INTEGER, Infinity 같은 값은 필요 없습니다.

 

‣ 자바스크립트의 객체와 weakmap 을 합친 레코드라는 자료형을 가집니다.

 

언어에 있는 모든 형태의 것을 객체라고 부를 수 있습니다. 레코드는 필드의 집합체이며 필드는 key, value 로 이루어져 있습니다.

타입스크립트에서 사용하는 레코드 (Record) 와 비슷해 보입니다.

 

‣ 더하기 (+) 연산자는 더하기만 할 뿐 연결을 하지 않습니다.

 

연결은 ~ 연산자가 합니다.

 

‣ typeof 연산자가 다음과 같이 대체되었습니다.

 

array? / boolean? / function? / number? / record? / text?

 

‣ def 문은 const 문을 대체합니다.

 

‣ 블록이 없기 때문에 블록 스코프가 없고 함수 스코프가 있습니다.

 

‣ loop 문은 do, for, while 문을 대체합니다.

 

‣ 예외는 failure 로 대체되고, try 는 없습니다.

 

 Neo 코드 예제

 

def reduce reverse: f array, callback function, initial value {
  var element nr: length(array)
  var reduction: initial value
  if reduction = null
    let element nr: element nr - 1
    let reduction: array[element nr]

  return reduction
}

 

- Neo 는 완전한 언어도 아니고 중요한 많은 기능이 빠져있습니다.

 

JSON 을 지원하지도 않고, 텍스처 패턴 매칭 기능도 빠져있습니다.

특별한 목적에 사용하는 트랜스파일링 언어이며, 전 아직 트랜스파일러를 적절히 사용할 만한 부분을 못 찾았기 때문에

이정도로만 파악하고 끝내도록 하겠습니다.

 

출처 : 자바스크립트는 왜 그 모양일까?

 

 

'Backend > Javascript' 카테고리의 다른 글

JavaScript - 프로토타입 (Prototype) 에 대해  (2) 2021.06.26
[Javascript] - Weakness  (0) 2021.02.20
[Javascript] - Optimization  (0) 2021.02.06
[Javascript] - Testing  (0) 2021.01.30
[Javascript] - JSON  (0) 2021.01.23