2021.06.04

웹어셈블리를 활용한 유망한 프로그래밍 언어 프로젝트 10가지

Paul Krill | InfoWorld
현재의 웹 애플리케이션은 속도와 응답성 측면에서 네이티브 데스크톱 애플리케이션에 비할 바는 아니다. 하지만 대등해진다면 어떨까? 그게 웹어셈블리(WebAssembly)의 약속이다.
 
웹어셈블리는 어셈블리와 비슷한 저수준 언어로, 웹 브라우저에서 네이티브에 근접한 성능으로 실행되는 간소한 바이너리 형식을 갖고 있다. 또한 웹어셈블리는 C/C++, 러스트, 고, 코틀린, 스위프트 및 기타 프로그래밍 언어에 대한 이식 가능한 컴파일 타겟도 제공한다.
 
웹어셈블리는 웹 애플리케이션 성능을 높이고 브라우저 앱 개발에서 자바스크립트 이외의 언어를 사용할 수 있게 해준다는 두 가지 측면에서 기대를 모으고 있으며 구글, 모질라, 애플, 마이크로소프트의 지지를 받고 있다. 4개 조직 모두 각자의 브라우저 엔진에서 웹어셈블리 기술을 지원한다.
 
웹어셈블리는 그 성능을 활용하는 완전히 새로운 프로그래밍 언어를 포함한 여러 신기술 개발로 이어졌다. 다음은 웹어셈블리에 '올라탄' 10개 언어 프로젝트다.
 

바이너리엔(Binaryen)

바이너리엔은 웹어셈블리를 위한 컴파일러 툴체인 인프라 라이브러리다. C++로 작성됐고 웹어셈블리 컴파일을 쉽고 효과적으로, 빠르게 하도록 고안됐다. 단일 헤더에 C API가 있으며 자바스크립트에서 사용할 수 있다. 입력은 웹어셈블리와 비슷한 형식으로 받지만 제어 그래프를 선호하는 컴파일러에 대해서는 일반 제어 그래프도 받는다.
 
바이너리엔의 내부 IR(Intermediate Representation)은 컴팩트한 데이터 구조를 사용하며 병렬 코드 생성과 최적화를 위해 모든 CPU 코어를 활용한다. IR도 기본적으로 웹어셈블리의 하위 집합이므로 손쉽게 웹어셈블리로 컴파일된다. 웹어셈블리를 위한 최적화는 코드 크기와 속도를 모두 개선하므로 바이너리엔은 그 자체로 컴파일러 백엔드로 유용하다.
 
깃허브에서 다운로드할 수 있다.
 

블레이저 웹어셈블리(Blazor WebAssembly)

블레이저 웹어셈블리는 닷넷을 사용해 인터랙티브한 클라이언트 측 단일 페이지 웹을 구축하고 이러한 앱을 웹어셈블리 기반 닷넷 런타임에서 현대 웹 브라우저(모바일 브라우저 포함)에 호스팅하기 위한 프레임워크다. 플러그인 또는 다른 언어로의 코드 재컴파일이 필요 없다. 런타임은 닷넷 코드가 웹어셈블리의 자바스크립트 API를 통해 브라우저 기능에 액세스할 수 있게 해준다.
 
블레이저 웹어셈블리 앱이 브라우저에서 실행되면 C# 코드 파일과 레이저(Razor) 파일이 닷넷 어셈블리로 컴파일되고, 이 어셈블리가 닷넷 런타임과 함께 브라우저로 다운로드된다. 닷넷 코드는 브라우저 자바스크립트 샌드박스의 웹어셈블리에서 실행되므로 클라이언트 기기에서 일어나는 악의적 작업으로부터 보호된다. 블레이저 웹어셈블리 앱은 독립적으로 배포할 수도 있고 서버 측 지원과 함께 배포할 수 있다.
 
블레이저 시작을 위한 안내는 dotnet.microsoft.com에서 볼 수 있다.
 

치어프(Cheerp)

리닝 테크놀로지스(Leaning Technologies)의 치어프(Cheerp)는 웹을 위한 엔터프라이즈급 C/C++ 컴파일러로, C와 C++(C++ 17까지)를 웹어셈블리, 자바스크립트 또는 이 둘의 조합으로 컴파일한다. 치어프는 LLVM/클랭(Clang) 인프라에 통합되며 맞춤형 최적화는 성능을 개선하고 컴파일된 출력의 크기를 최소화한다. 주로 기존 C/C++ 라이브러리와 애플리케이션을 HTML5로 이식하는 데 사용되지만 웹 애플리케이션과 웹어셈블리 구성요소를 작성하는 데도 사용할 수 있다. 치어프는 오픈소스와 상용 라이선스로 제공된다.
 
leaningtech.com에서 다운로드할 수 있다.
 

치어프J(CheerpJ)

“웹용 자바 컴파일러”를 표방하는 LLVM 기반 컴파일러로, 자바 클라이언트 애플리케이션을 웹어셈블리, 자바스크립트, HTML로 변환해 자바 클라이언트 애플리케이션이 현대 브라우저에서 실행되도록 한다. 치어프J는 AOT(Ahead-Of-Time) 컴파일러, 웹어셈블리와 자바스크립트의 런타임, 그리고 자바스크립트 DOM 상호운용성 API의 세 가지 구성요소를 사용해서 자바에서 DOM에 액세스한다. 치어프J를 사용하면 AOT 컴파일러로 JAR 아카이브를 컴파일할 수 있다. 치어프J는 서버 측 지원은 필요 없다.

치어프와 마찬가지로 치어프J도 리닝 테크놀로지스에서 제공하며 leaningtech.com에서 다운로드할 수 있다.
 

엠스크립튼(Emscripten)

오픈소스 컴파일러 툴체인이며 C와 C++ 또는 LLVM 컴파일러 기술을 사용하는 기타 언어를 웹어셈블리로 컴파일해서 웹, Node.js 또는 Wasmer와 같은 Wasm 런타임에 배포할 수 있게 해준다. (엠스크립튼 컴파일러인 emcc는 컴파일된 코드에 대한 API 지원을 제공하는 자바스크립트도 출력한다.) 엠스크립튼은 언리얼 엔진(Unreal Engine) 4 게임 엔진 및 유니티(Unity) 3D 플랫폼과 같은 상용 코드베이스를 포함한 다양한 코드베이스를 웹어셈블리로 변환하는 데 사용됐다. C 및 C++ 표준 라이브러리, C++ 예외, 오픈GL/웹GL 그래픽 명령을 지원한다. 엠스크립튼 툴체인(emcc, LLVM 등)을 설치하는 데 사용되는 엠스크립튼 SDK는 리눅스, 맥OS 및 윈도우에서 사용 가능하다.

emscripten.org에서 다운로드할 수 있다.
 

포리스트(Forest)

포리스트는 웹어셈블리로 컴파일되는 함수형 프로그래밍 언어다. 포리스트의 목표에 대해 포리스트 개발자 닉 존스톤은 복잡하고 인터랙티브한 함수형 웹 앱을 기존의 오버헤드 없이 더 쉽게 만들 수 있도록 하는 데 있다고 말했다.
 
포리스트는 현재 “프리-알파, 실험, 개념 연구 단계의 소프트웨어”이며 정적 형식 지정, 패턴 일치, 불변성 데이터 구조, 복수 구문, 자동 코드 서식 지정을 특징으로 한다. 개발 중인 첫번째 구문은 엘름(Elm)과 하스켈(Haskell)의 영향을 받았다.
 
포리스트 언어의 설계 원칙에는 협업의 용이함, 최대한 간편한 테스트, 구문에 대한 의견 불일치를 인정하는 구조 및 의미 체계에 대한 합의 등이 포함된다. 존스톤은 복잡한 게임을 빌드할 수 있을 만큼 포리스트의 속도를 높여 일반적인 웹 앱은 “엄청나게 빠르게” 실행되도록 하는 데 목표를 두고 있다.
 
깃허브에서 다운로드할 수 있다.
 

그레인(Grain)

그레인 언어 프로젝트 웹사이트에 따르면 그레인은 학계 및 함수형 언어의 특징을 21세기에 맞게 구현한다. 바이너리엔 툴체인과 컴파일러 인프라를 통해 웹어셈블리로 컴파일되며 브라우저와 서버에서 실행되지만 잠재적으로 어디에서나 실행이 가능하다. 런타임 형식 오류가 없고 형식 주석이 필요 없다. 그레인 툴체인에는 CLI, 컴파일러, 런타임, 표준 라이브러리가 있으며 하나의 바이너리로 제공된다. 개발자가 소스에서 그레인을 빌드하려면 Node.js와 얀(Yarn)이 필요하다. 바이너리는 리눅스, 맥OS, 윈도우용으로 제공된다.
 
그레인 시작을 위한 안내는 grain-lang.org에서 찾아볼 수 있다.
 

J웹어셈블리(JWebAssembly)

아이-넷 소프트웨어(I-Net Software)의 J웹어셈블리는 웹어셈블리에 대한 자바 바이트코드로, 자바 클래스 파일을 입력으로 받아 웹어셈블리 바이너리 형식(.wasm 파일) 또는 텍스트 형식(.wat 파일)을 출력으로 생성한다. 목표는 웹어셈블리로 브라우저에서 네이티브로 실행되는 것이다. 이론적으로 J웹어셈블리는 클로저(Clojure), 그루비(Groovy), J루비(JRuby), 코틀린(Kotlin), 스칼라(Scala, 테스트 예정) 등 자바 바이트코드로 컴파일되는 모든 언어를 컴파일할 수 있다.

J웹어셈블리는 아직 프로덕션용은 아니다. J웹어셈블리 1.0 릴리스를 위해 필요한 모든 요소는 이미 구현되었지만 여전히 테스트 과정이 진행 중이다. 버전 1.0 로드맵을 위해서는 자바 바이트코드 파서, 테스트 프레임워크, 그레이들(Gradle) 플러그인 등의 기능이 필요하다. 아이-넷 소프트웨어는 올해 J웹어셈블리 1.0을 출하한다는 계획이다. 
 
깃허브에서 다운로드할 수 있다.
 

파이오다이드(Pyodide)

최근 모질라에서 나와 독립 프로젝트로 출범한 파이오다이드 프로젝트는 파이썬 및 파이썬 과학 스택을 웹어셈블리로 컴파일에서 파이썬 3.8 런타임, 넘파이(NumPy), 사이파이(SciPy), 매트플롯라이브러리(Matplotlib), 사이킷-런(Scikit-learn)과 기타 십여 가지의 패키지를 브라우저에 제공한다. 파이오다이드는 자바스크립트와 파이썬 간에 투명한 객체 변환을 제공하며 파이썬에서 웹 API에 액세스할 수 있게 해준다. 파이오다이드는 2018년에 아이오다이드(lodide) 프로젝트의 일부분으로, 브라우저에서의 데이터 과학 작업을 위해 시작됐다. 브라우저의 REPL에서 파이오다이드를 사용해볼 수 있다.
 
파이오다이드 다운로드 및 사용 방법에 관한 안내는 pyodide.org에서 볼 수 있다.
 

티VM(TeaVM)

자바 바이트코드를 위한 AOT 컴파일러인 티VM은 브라우저에서 실행되는 웹어셈블리와 자바스크립트를 출력한다. 단, 웹어셈블리 지원은 현재 실험 단계다. 사촌격인 GWT(구글 웹 툴킷)와 마찬가지로 티VM은 개발자가 자바로 애플리케이션을 작성하고 자바스크립트로 배포할 수 있게 해준다. GWT와 달리 소스 코드가 아닌 컴파일된 클래스 파일을 사용한다. 또한 티VM은 javac, kotlinc, scalac와 같은 기존 컴파일러에 의존하므로 자바 외에 코틀린과 스칼라 코드도 컴파일할 수 있다. 티VM은 기본적으로 웹 개발 툴이다. 즉, 자바 또는 코틀린으로 된 대규모 코드베이스를 가져와 자바스크립트를 생성하는 용도로 설계된 것이 아니다. 티VM 하위 프로젝트인 플레이버(Flavour)는 단일 페이지 웹 애플리케이션을 작성하기 위한 프레임워크 역할을 한다.

깃허브에서 다운로드와 관련 안내를 받을 수 있다. editor@itworld.co.kr


2021.06.04

웹어셈블리를 활용한 유망한 프로그래밍 언어 프로젝트 10가지

Paul Krill | InfoWorld
현재의 웹 애플리케이션은 속도와 응답성 측면에서 네이티브 데스크톱 애플리케이션에 비할 바는 아니다. 하지만 대등해진다면 어떨까? 그게 웹어셈블리(WebAssembly)의 약속이다.
 
웹어셈블리는 어셈블리와 비슷한 저수준 언어로, 웹 브라우저에서 네이티브에 근접한 성능으로 실행되는 간소한 바이너리 형식을 갖고 있다. 또한 웹어셈블리는 C/C++, 러스트, 고, 코틀린, 스위프트 및 기타 프로그래밍 언어에 대한 이식 가능한 컴파일 타겟도 제공한다.
 
웹어셈블리는 웹 애플리케이션 성능을 높이고 브라우저 앱 개발에서 자바스크립트 이외의 언어를 사용할 수 있게 해준다는 두 가지 측면에서 기대를 모으고 있으며 구글, 모질라, 애플, 마이크로소프트의 지지를 받고 있다. 4개 조직 모두 각자의 브라우저 엔진에서 웹어셈블리 기술을 지원한다.
 
웹어셈블리는 그 성능을 활용하는 완전히 새로운 프로그래밍 언어를 포함한 여러 신기술 개발로 이어졌다. 다음은 웹어셈블리에 '올라탄' 10개 언어 프로젝트다.
 

바이너리엔(Binaryen)

바이너리엔은 웹어셈블리를 위한 컴파일러 툴체인 인프라 라이브러리다. C++로 작성됐고 웹어셈블리 컴파일을 쉽고 효과적으로, 빠르게 하도록 고안됐다. 단일 헤더에 C API가 있으며 자바스크립트에서 사용할 수 있다. 입력은 웹어셈블리와 비슷한 형식으로 받지만 제어 그래프를 선호하는 컴파일러에 대해서는 일반 제어 그래프도 받는다.
 
바이너리엔의 내부 IR(Intermediate Representation)은 컴팩트한 데이터 구조를 사용하며 병렬 코드 생성과 최적화를 위해 모든 CPU 코어를 활용한다. IR도 기본적으로 웹어셈블리의 하위 집합이므로 손쉽게 웹어셈블리로 컴파일된다. 웹어셈블리를 위한 최적화는 코드 크기와 속도를 모두 개선하므로 바이너리엔은 그 자체로 컴파일러 백엔드로 유용하다.
 
깃허브에서 다운로드할 수 있다.
 

블레이저 웹어셈블리(Blazor WebAssembly)

블레이저 웹어셈블리는 닷넷을 사용해 인터랙티브한 클라이언트 측 단일 페이지 웹을 구축하고 이러한 앱을 웹어셈블리 기반 닷넷 런타임에서 현대 웹 브라우저(모바일 브라우저 포함)에 호스팅하기 위한 프레임워크다. 플러그인 또는 다른 언어로의 코드 재컴파일이 필요 없다. 런타임은 닷넷 코드가 웹어셈블리의 자바스크립트 API를 통해 브라우저 기능에 액세스할 수 있게 해준다.
 
블레이저 웹어셈블리 앱이 브라우저에서 실행되면 C# 코드 파일과 레이저(Razor) 파일이 닷넷 어셈블리로 컴파일되고, 이 어셈블리가 닷넷 런타임과 함께 브라우저로 다운로드된다. 닷넷 코드는 브라우저 자바스크립트 샌드박스의 웹어셈블리에서 실행되므로 클라이언트 기기에서 일어나는 악의적 작업으로부터 보호된다. 블레이저 웹어셈블리 앱은 독립적으로 배포할 수도 있고 서버 측 지원과 함께 배포할 수 있다.
 
블레이저 시작을 위한 안내는 dotnet.microsoft.com에서 볼 수 있다.
 

치어프(Cheerp)

리닝 테크놀로지스(Leaning Technologies)의 치어프(Cheerp)는 웹을 위한 엔터프라이즈급 C/C++ 컴파일러로, C와 C++(C++ 17까지)를 웹어셈블리, 자바스크립트 또는 이 둘의 조합으로 컴파일한다. 치어프는 LLVM/클랭(Clang) 인프라에 통합되며 맞춤형 최적화는 성능을 개선하고 컴파일된 출력의 크기를 최소화한다. 주로 기존 C/C++ 라이브러리와 애플리케이션을 HTML5로 이식하는 데 사용되지만 웹 애플리케이션과 웹어셈블리 구성요소를 작성하는 데도 사용할 수 있다. 치어프는 오픈소스와 상용 라이선스로 제공된다.
 
leaningtech.com에서 다운로드할 수 있다.
 

치어프J(CheerpJ)

“웹용 자바 컴파일러”를 표방하는 LLVM 기반 컴파일러로, 자바 클라이언트 애플리케이션을 웹어셈블리, 자바스크립트, HTML로 변환해 자바 클라이언트 애플리케이션이 현대 브라우저에서 실행되도록 한다. 치어프J는 AOT(Ahead-Of-Time) 컴파일러, 웹어셈블리와 자바스크립트의 런타임, 그리고 자바스크립트 DOM 상호운용성 API의 세 가지 구성요소를 사용해서 자바에서 DOM에 액세스한다. 치어프J를 사용하면 AOT 컴파일러로 JAR 아카이브를 컴파일할 수 있다. 치어프J는 서버 측 지원은 필요 없다.

치어프와 마찬가지로 치어프J도 리닝 테크놀로지스에서 제공하며 leaningtech.com에서 다운로드할 수 있다.
 

엠스크립튼(Emscripten)

오픈소스 컴파일러 툴체인이며 C와 C++ 또는 LLVM 컴파일러 기술을 사용하는 기타 언어를 웹어셈블리로 컴파일해서 웹, Node.js 또는 Wasmer와 같은 Wasm 런타임에 배포할 수 있게 해준다. (엠스크립튼 컴파일러인 emcc는 컴파일된 코드에 대한 API 지원을 제공하는 자바스크립트도 출력한다.) 엠스크립튼은 언리얼 엔진(Unreal Engine) 4 게임 엔진 및 유니티(Unity) 3D 플랫폼과 같은 상용 코드베이스를 포함한 다양한 코드베이스를 웹어셈블리로 변환하는 데 사용됐다. C 및 C++ 표준 라이브러리, C++ 예외, 오픈GL/웹GL 그래픽 명령을 지원한다. 엠스크립튼 툴체인(emcc, LLVM 등)을 설치하는 데 사용되는 엠스크립튼 SDK는 리눅스, 맥OS 및 윈도우에서 사용 가능하다.

emscripten.org에서 다운로드할 수 있다.
 

포리스트(Forest)

포리스트는 웹어셈블리로 컴파일되는 함수형 프로그래밍 언어다. 포리스트의 목표에 대해 포리스트 개발자 닉 존스톤은 복잡하고 인터랙티브한 함수형 웹 앱을 기존의 오버헤드 없이 더 쉽게 만들 수 있도록 하는 데 있다고 말했다.
 
포리스트는 현재 “프리-알파, 실험, 개념 연구 단계의 소프트웨어”이며 정적 형식 지정, 패턴 일치, 불변성 데이터 구조, 복수 구문, 자동 코드 서식 지정을 특징으로 한다. 개발 중인 첫번째 구문은 엘름(Elm)과 하스켈(Haskell)의 영향을 받았다.
 
포리스트 언어의 설계 원칙에는 협업의 용이함, 최대한 간편한 테스트, 구문에 대한 의견 불일치를 인정하는 구조 및 의미 체계에 대한 합의 등이 포함된다. 존스톤은 복잡한 게임을 빌드할 수 있을 만큼 포리스트의 속도를 높여 일반적인 웹 앱은 “엄청나게 빠르게” 실행되도록 하는 데 목표를 두고 있다.
 
깃허브에서 다운로드할 수 있다.
 

그레인(Grain)

그레인 언어 프로젝트 웹사이트에 따르면 그레인은 학계 및 함수형 언어의 특징을 21세기에 맞게 구현한다. 바이너리엔 툴체인과 컴파일러 인프라를 통해 웹어셈블리로 컴파일되며 브라우저와 서버에서 실행되지만 잠재적으로 어디에서나 실행이 가능하다. 런타임 형식 오류가 없고 형식 주석이 필요 없다. 그레인 툴체인에는 CLI, 컴파일러, 런타임, 표준 라이브러리가 있으며 하나의 바이너리로 제공된다. 개발자가 소스에서 그레인을 빌드하려면 Node.js와 얀(Yarn)이 필요하다. 바이너리는 리눅스, 맥OS, 윈도우용으로 제공된다.
 
그레인 시작을 위한 안내는 grain-lang.org에서 찾아볼 수 있다.
 

J웹어셈블리(JWebAssembly)

아이-넷 소프트웨어(I-Net Software)의 J웹어셈블리는 웹어셈블리에 대한 자바 바이트코드로, 자바 클래스 파일을 입력으로 받아 웹어셈블리 바이너리 형식(.wasm 파일) 또는 텍스트 형식(.wat 파일)을 출력으로 생성한다. 목표는 웹어셈블리로 브라우저에서 네이티브로 실행되는 것이다. 이론적으로 J웹어셈블리는 클로저(Clojure), 그루비(Groovy), J루비(JRuby), 코틀린(Kotlin), 스칼라(Scala, 테스트 예정) 등 자바 바이트코드로 컴파일되는 모든 언어를 컴파일할 수 있다.

J웹어셈블리는 아직 프로덕션용은 아니다. J웹어셈블리 1.0 릴리스를 위해 필요한 모든 요소는 이미 구현되었지만 여전히 테스트 과정이 진행 중이다. 버전 1.0 로드맵을 위해서는 자바 바이트코드 파서, 테스트 프레임워크, 그레이들(Gradle) 플러그인 등의 기능이 필요하다. 아이-넷 소프트웨어는 올해 J웹어셈블리 1.0을 출하한다는 계획이다. 
 
깃허브에서 다운로드할 수 있다.
 

파이오다이드(Pyodide)

최근 모질라에서 나와 독립 프로젝트로 출범한 파이오다이드 프로젝트는 파이썬 및 파이썬 과학 스택을 웹어셈블리로 컴파일에서 파이썬 3.8 런타임, 넘파이(NumPy), 사이파이(SciPy), 매트플롯라이브러리(Matplotlib), 사이킷-런(Scikit-learn)과 기타 십여 가지의 패키지를 브라우저에 제공한다. 파이오다이드는 자바스크립트와 파이썬 간에 투명한 객체 변환을 제공하며 파이썬에서 웹 API에 액세스할 수 있게 해준다. 파이오다이드는 2018년에 아이오다이드(lodide) 프로젝트의 일부분으로, 브라우저에서의 데이터 과학 작업을 위해 시작됐다. 브라우저의 REPL에서 파이오다이드를 사용해볼 수 있다.
 
파이오다이드 다운로드 및 사용 방법에 관한 안내는 pyodide.org에서 볼 수 있다.
 

티VM(TeaVM)

자바 바이트코드를 위한 AOT 컴파일러인 티VM은 브라우저에서 실행되는 웹어셈블리와 자바스크립트를 출력한다. 단, 웹어셈블리 지원은 현재 실험 단계다. 사촌격인 GWT(구글 웹 툴킷)와 마찬가지로 티VM은 개발자가 자바로 애플리케이션을 작성하고 자바스크립트로 배포할 수 있게 해준다. GWT와 달리 소스 코드가 아닌 컴파일된 클래스 파일을 사용한다. 또한 티VM은 javac, kotlinc, scalac와 같은 기존 컴파일러에 의존하므로 자바 외에 코틀린과 스칼라 코드도 컴파일할 수 있다. 티VM은 기본적으로 웹 개발 툴이다. 즉, 자바 또는 코틀린으로 된 대규모 코드베이스를 가져와 자바스크립트를 생성하는 용도로 설계된 것이 아니다. 티VM 하위 프로젝트인 플레이버(Flavour)는 단일 페이지 웹 애플리케이션을 작성하기 위한 프레임워크 역할을 한다.

깃허브에서 다운로드와 관련 안내를 받을 수 있다. editor@itworld.co.kr


X