ReScript in Korean

소개

원문

ReScript

리스크립트는 자바스크립트에 비판적인 거리를 두고 있지만 자바스크립트의 중요성을 인정하는 사람들을 위한 언어입니다.

리스크립트는 자바스크립트처럼 보이고 자바스크립트처럼 동작하며, 자바스크립트와 함께 사용할 수 있으며, 브라우저와 Node.js에서 직접 실행할 수 있는 품질 좋고 성능이 뛰어난 자바스크립트 코드로 컴파일됩니다.

타입스크립트와 차이점

리스크립트 팀은 타입스크립트를 존중합니다. 또한 타입스크립트는 자바스크립트 생태계에 긍정적인 영향을 끼친다고 생각합니다. 그러나 리스크립트는 타입스크립트와 동일한 목표 일부를 공유하지만 몇 가지 중요한 부분은 관점이 다릅니다.

  • 타입스크립트의 목표는 전체 자바스크립트 기능을 포함하는 것입니다. 타입스크립트는 자바스크립트의 수퍼셋이기 때문에 시간이 지남에 따라 크기는 더 커질 것입니다. 그러나 리스크립트는 자바스크립트의 기능 중 특별히 선별된 기능만 다룹니다. 예를 들어, 우리는 클래스보다 플레인 데이터 + 함수를 사용하고, 주의해서 다뤄야하는 if문과 가상 디스패치보다 깔끔한 패턴 매칭을 사용합니다. 또한 문자열 오남용 대신 적절한 데이터 모델링(배리언트)을 선호합니다. *

  • 타입스크립트의 타입 시스템은 필연적으로 복잡하고 피해가야 할 함정이 많습니다. 잠재적으로 타입에 대한 조정이 필요하고 컴파일은 느립니다. 설명서처럼 쓰인 어노테이션이 코드 가독성을 해칩니다. 또한 어노테이션 이상의 주석이나 문서가 필요하기도 합니다.

  • 반면, 리스크립트의 타입시스템은

    • 간단한 서브셋만 선정해서 대부분의 사람이 사용하기 더 쉽습니다.
    • 타입 함정이 없습니다, 이른바 "사운드"1한 타입 시스템입니다. (타입은 항상 정확합니다.) 예를 들어 어떠한 값이 nullable이 아니라면, 그 값은 거짓말을 하지 않고 undefined 값은 통과시킵니다. 리스크립트 코드에선 null/undefined 에러가 없습니다.
    • 타입은 모두에게 동일합니다. 주렁주렁 달린 타입 조정 장치나 억지로 타입을 맞추기 위한 타입 서커스, 그리고 불필요한 타입정의는 필요 없습니다.
    • 큐레이션 된 단순성 덕분에 매우 정확하고 엄청나게 빠르게 동작합니다. 리스크립트는 자바스크립트 개발을 위한 가장 빠른 컴파일러 및 빌드 시스템 중 하나입니다.
    • 타입 어노테이션이 필요 없습니다. 원한다면 많은 어노테이션을 작성하거나 적게 작성해도 됩니다. 리스크립트에 의해 타입은 올바르게 추론되고 정확성이 보장됩니다.
  • 타입스크립트의 마이그레이션은 "넓이-우선"으로 수행되는 반면 리스크립트는 "깊이-우선" 방식으로 이뤄집니다. 타입스크립트는 모든 파일에 대해 "설정"하고 여기저기 타입 어노테이션을 추가해 자바스크립트 코드를 타입스크립트 환경으로 변환할 수 있습니다. 그러나 이 행위로 개발자가 얼마만큼의 타입 안정성을 얻을 수 있을까요? 그리고 어떻게 측정할까요? 타입 오류는 여전히 코드 속을 비집고 들어올 수 있습니다. 리스크립트는 인터롭 기능으로 명확하게 서로의 바운더리를 만듭니다. 순수한 리스크립트 코드와 자바스크립트 인터롭 코드가 있습니다. 변환 된 리스크립트 코드 모든 부분은 100% 깨끗합니다. 리스크립트는 컴파일을 통해 파일별로 자바스크립트로 변환하고 각 변환은 타입 안정성을 향상시킵니다.

* 개발자가 완전한 자바스크립트 코드를 작성해야하거나 상호 운용해야하는 경우 이스케이프 해치를 제공합니다.

다른 장점들

앞서 언급한 간단하고 강력하고 빠른 타입 시스템 외에도 리스크립트는 몇가지 장점이 더 있습니다.

자바스크립트보다 빠릅니다

자바스크립트는 오랜 기간동안 재능있는 엔지니어에 의해 최적화 되었습니다. 하지만 불행하게도 자바스크립트 익스퍼트도 자바스크립트의 성능을 제대로 활용하지 못하는 경우가 있습니다. 리스크립트의 타입 시스템과 컴파일러는 다양한 Just-In-Time 최적화(히든 클래스, 인라인 캐싱 등)를 잘 활용해 기본적으로 좋은 퍼포먼스를 냅니다.

빠른 자바스크립트 코드를 작성하는 널리 퍼진 격언 중 하나는 "타입 시스템이 있는 것처럼 작성하라(자바스크립트 엔진의 우수한 최적화 휴리스틱을 이용할 수 있도록)" 입니다. 리스크립트는 앞에 말한 격언처럼 코드를 작성해 기본적으로 최적화하기 쉬운 코드를 생성합니다.

사용하지 않는 코드를 훌륭하게 제거합니다

자바스크립트 생태계는 패키지 의존성에 매우 민감합니다. 실제로 사용하지 않는 엄청난 양의 코드가 최종 프로덕트 코드 번들에 들어가는 경우가 있습니다. 이렇게 사용하지 않는 코드는 로딩, 구문 분석, 인터프리터 속도에 영향을 끼칩니다. 리스크립트는 사용하지 않는 코드를 제거하는 기능을 아주 강력하게 제공합니다.

  • 잘 설계된 타입 시스템과 분석기를 통해 함수와 모듈 수준의 코드 제거가 이뤄집니다.
  • 리스크립트가 자체적으로 사용하지 않는 코드를 삭제하고 나면, 글로벌 수준에서 Rollup이나 Closure Compiler같은 도구를 사용해 사용하지 않는 코드를 제거하는 것처럼 자연스럽고 친숙한 코드를 생성합니다.
  • 리스크립트 자체로 작성된 리스크립트의 작은 런타임에도 동일하게 적용됩니다.

용량이 작은 자바스크립트 결과물

Hello world 리스크립트 프로그램은 20 바이트 자바스크립트 코드를 생성합니다. 또한, 표준 라이브러리는 정말 사용할때만 코드조각에 포함됩니다.

개발시 빠른 반복 주기

리스크립트 빌드 시간은 자바스크립트 생태계의 다른 정적 타이핑 환경보다 1 ~ 2배빠릅니다. 워치 모드중일 때 파일이 변경되면 다음 빌드는 터미널 탭을 전환하기도 전에 완료됩니다(2자리 밀리초). 이렇게 빠르게 빌드가 완료되고 반영되는 환경은 개발자가 작업에 더 집중할 수 있게 해줍니다.

가독성을 고려한 결과물 & 훌륭한 인터롭(상호운용)

다른 언어에서 컴파일 후 생성된 읽기 힘든 자바스크립트 코드는 다음과 같은 곤란함이 있습니다.

  • 디버그 하기 어렵습니다. (스택 추적이 암호를 해석하는 것처럼 까다롭고, 알 수 없는 변수 이름)
  • 이해하기 어렵습니다. (변환 되기 전, 변환 된 후의 언어가 일직선으로 매칭되지 않음)
  • 퍼포먼스 측정이 어렵습니다. (어떤 런타임 성능 비용이 있는지 불분명)
  • 손으로 작성 된 기존 자바스크립트 코드와 통합하기 어렵습니다.

리스크립트의 자바스크립트 결과물은 굉장히 읽기 편합니다. 이것은 코드가 어떻게 컴파일되는지 이해하고 버그를 줄이기 쉽게 만들어줍니다.

이런 특성 덕분에 완전한 기능을 갖춘 JS 인터롭과 결합하여 거의 눈에 띄지 않게 기존 자바스크립트 코드 베이스에 리스크립트 코드를 삽입할 수 있습니다.

코드 구조 보존

리스크립트는 하나의 소스파일에 하나의 자바스크립트 결과물 파일을 매핑합니다. 이는 번들러와 테스트 러너같은 기존 도구와의 통합을 쉽게 만듭니다. 빌드 설정을 크게 변경하지 않고 단일 파일로 리스크립트를 시작할 수 있습니다. 각 파일의 코드 구조도 모두 보존됩니다.

결론

위 내용이 다른 언어와 리스크립트와의 차별화된 장점을 충분히 설명하고 독자에게 다가갈 수 있길 바랍니다! 그리고 플레이그라운드에서 리스크립트를 사용해볼 수 있습니다.