Haskell에서 JavaScript 코드를 생성하는 컴파일러.
웹 사이트와 메일 링리스트도 있습니다.
HASTE를위한 세 가지 옵션이 있습니다 : Hackage, GitHub 또는 사전 제작 된 이진 패키지 중 하나에서 설치하십시오. 처음 두 경우에는 아직 수행하지 않은 경우 Cabal의 빈 디렉토리 (일반적 $PATH ~/.cabal/bin )를 추가해야합니다. Mac, 휴대용 Windows 또는 일반 Linux 패키지에서 설치할 때는 path/to/haste-compiler/bin $PATH 에 추가 할 수 있습니다. Debian 패키지와 Windows 설치 프로그램 및 일반 Linux 패키지에 포함 된 옵션 설치 스크립트는이를 자동으로 처리합니다.
또는 Hackage에서 최신 안정 버전을 설치할 수 있습니다.
$ cabal install haste-compiler
$ haste-boot
Github 소스에서 건물은 똑같이 쉽습니다. 소스를 확인한 후 소스 트리에 cd 넣고 실행합니다.
$ cabal install
$ haste-boot --force --local
또는 Stack을 사용하여 Github 소스에서 빌드 할 수도 있습니다.
$ stack install
$ haste-boot --force --local
다양한 플랫폼의 빌드 요구 사항 및 절차에 대한 자세한 내용은 doc/building.md 참조하십시오.
haste-cabal 벌에 문제가있는 경우, haste-boot 에 의해 설치된 경우, 처음부터 처음부터 구축 한 다음 --no-haste-cabal 플래그를 haste-boot 으로 전달할 수 있습니다.
$ git clone https://github.com/valderman/cabal.git
$ cd cabal && git checkout haste-cabal
$ cd Cabal && cabal install
$ cd ../cabal-install && cabal install
GitHub에서 서두를 설치할 때는 먼저 테스트 스위트를 실행하여 모든 것이 작동하는지 확인해야합니다. 그렇게하려면 서둘러 루트 디렉토리에서 ./runtests.sh 실행하십시오. ./runtests.sh NameOfTest 실행하여 특정 테스트 만 실행할 수도 있습니다. 테스트 스위트는 기본적으로 nodejs 인터프리터를 사용하지만 JS=other-js-interpreter ./runtests.sh 함께 JS 환경 변수를 설정하여 수정 될 수 있습니다. 다른 JavaScript 통역사는 작동하거나 작동하지 않을 수도 있습니다. runtests.sh Hackage에서 설치할 때 다운로드되지 않습니다. Github에서 다운로드해야합니다.
--opt-minify 사용하여 컴파일 할 때 사용되는 패치 클로저 컴파일러를 구축하려면 폐쇄 소스를 가져 와서 patches/closure-argument-removal.patch 적용하고 평소대로 빌드하십시오. 그러나 haste-boot 실행될 때 사전 컴파일 된 클로저 바이너리를 가져 오기 때문에 일반적으로 필요하지 않습니다.
자세한 내용 건축 지침은 doc/building.md 참조하십시오.
서둘러는 Windows 및 OSX 플랫폼에서 작업하도록 테스트되었지만 주로 GNU/Linux에서 개발되었습니다. 따라서 GNU/Linux 플랫폼에서 실행하면 버그가 줄어 듭니다.
HASKELL 프로그램을 HTML 문서에 포함 시키거나 명령 줄 통역사를 사용하여 실행할 준비가 된 JavaScript Blob에 Haskell 프로그램을 컴파일하려면 :
$ hastec myprog.hs
이는 GHC를 호출하는 것과 같습니다. JS Blob이로드를 마치 자마자 Main.Main이 호출됩니다.
일반적으로 GHC로 전달하는 것처럼 동일한 깃발을 Hastec으로 전달할 수 있습니다.
$ hastec -O2 -fglasgow-exts myprog.hs
서둘러에는 고유 한 명령 줄 인수 세트가 있습니다. 그들에 대해 더 많이 읽으려면 --help 로 그것을 호출하십시오. 특히 --opt-all , --opt-minify , --start 및 --with-js 상당히 흥미로워 야합니다.
패키지가 서두르고 GHC를 모두 컴파일하려면 조건부 컴파일에 CPP 확장을 사용하려는 경우. Haste는 전처리 기호 __HASTE__ 모든 모듈에서 정의합니다. 이 기호는 또한 현재 서두름 버전의 정수 표현으로 정의되기 때문에 서둘러 버전을 구별하는 데 사용될 수 있습니다. 그 형식은 MAJOR*10 000 + MINOR*100 + MICRO 입니다. 따라서 버전 1.2.3은 10203으로, 0.4.3으로 403으로 표시됩니다.
Haste에는 또한 Cabal 및 GHC-PKG 용 포장지가 각각 Haste-Cabal 및 Haste-PKG라고합니다. Vanilla GHC 및 Cabal과 마찬가지로 패키지를 설치하는 데 사용할 수 있습니다.
$ haste-cabal install mtl
마지막으로, 번들로드 haste-lib 라이브러리의 Haste.Foreign 모듈을 사용하여 JavaScript 코드와 상호 작용할 수 있습니다. 자세한 내용은 doc/js-externals.txt 참조하십시오. 이 라이브러리는 또한 DOM 조작, 이벤트 처리, 선제적인 멀티 태스킹, 캔버스 그래픽, 기본 JS 문자열 조작 등에 대한 모든 종류의 기능도 포함되어 있습니다.
서둘러가 어떻게 작동하는지에 대한 자세한 내용은 서둘러 보고서를 참조하십시오.
또한 libraries/haste-lib 디렉토리에 존재하는 haste-lib 의 문서 및/또는 소스 코드와 examples 디렉토리의 작은 프로그램을 살펴보고 시작해야합니다.
프로그램을 작성할 때 프로그램에서 Native JavaScript를 사용하고 싶을 것입니다. 예를 들어 기본 라이브러리에 바인딩. 이 작업을 수행하는 선호하는 방법은 Haste.Foreign 입니다.
{-# LANGUAGE OverloadedStrings #-}
import Haste.Foreign
addTwo :: Int -> Int -> IO Int
addTwo = ffi "(function(x, y) {return x + y;})"
ffi 함수는 JS에서 반환 된 값에 대한 일부 유형 불변량을 시행하고 더 편리하다는 점에서 GHC FFI보다 약간 안전합니다. 성능 측면에서는 복잡한 유형 (목록, 레코드 등)을 제외하고는 GHC FFI만큼 빠릅니다.
전체 레거시 JavaScript 코드베이스를 버리는 것이 편하지 않으면 서두름 프로그램에서 선택한 기능을 내보내고 JavaScript에서 호출 할 수 있습니다.
fun.hs :
{-# LANGUAGE OverloadedStrings #-}
import Haste.Foreign
import Haste.Prim (toJSStr)
fun :: Int -> String -> IO String
fun n s = return $ "The number is " ++ show n ++ " and the string is " ++ s
main = do
export "fun" fun
Legacy.js :
function mymain() {
console.log(Haste.fun(42, "hello"));
}
... 그런 다음 컴파일 :
$ hastec '--start=$HASTE_MAIN(); mymain();' --with-js=legacy.js fun.hs
fun.hs main 기능이 실행될 때 기능을 fun 내 보냅니다. JavaScript는 분명히 그 후에 실행해야하므로 legacy.js 에서 "실제"기본 기능을 만듭니다. 마지막으로, 우리는 먼저 Haste의 main 함수를 실행하여 컴파일러에게 프로그램을 시작하도록 지시합니다 ( $HASTE_MAIN 컴파일러가 Haste main 위해 선택하는 이름으로 대체 된 다음 mymain 실행합니다.
Haste.Foreign 의 역학은이 백서에서 자세히 설명되어 있습니다.
Haste.App 모듈 계층의 프레임 워크를 사용하여 Ajax/Websockets/uthern 라인을 작성하지 않고도 서버와 통신하는 웹 응용 프로그램을 쉽게 작성할 수 있습니다. 무엇보다도 : 완전히 안전합니다.
본질적으로, 귀하는 웹 애플리케이션을 단일 프로그램으로 작성합니다. 클라이언트 및 서버 코드를 더 이상 강제로 분리하지 마십시오. 그런 다음 서두를 사용하고 GHC를 사용한 한 번은 프로그램을 컴파일하면 두 컴파일러는 각각 클라이언트 및 서버 코드를 마술처럼 생성합니다.
서둘러와 바닐라 GHC와 함께 동일한 라이브러리를 설치해야합니다 (조건부 편집을 사용하여이를 해결하지 않는 한). haste-compiler haste-lib 와 함께 번들로 제공되므로 타사 라이브러리를 사용하는 경우에만 관심을 가질 만하면됩니다. 또한 HTML 및 JS 파일을 제공하려면 웹 서버가 필요합니다. 기본 컴파일 패스에 의해 생성 된 이진은 WebSockets를 사용하여 클라이언트 부품과 통신하며 자체적으로 파일을 제공하지 않습니다.
Haste.app의 예제는 examples/haste-app 및 examples/chatbox 에서 제공됩니다.
이것이 정확히 어떻게 작동하는지에 대한 자세한 내용은이 논문을 참조하십시오.
다른 패키지와 마찬가지로 Haste Base Directory에서 cabal haddock 실행하여 Haste-Lib 용 Docs 세트를 구축 할 수 있습니다.
또는 온라인 문서를 볼 수도 있습니다.
Haste는 표준 Haskell 라이브러리를 사용할 수 있습니다. 그러나 일부 원시 작업은 여전히 구현되지 않으므로 코드를 사용하는 코드를 사용하면 컴파일러 경고를 한 다음 런타임에 화난 오류가 발생합니다. 일부 라이브러리는 외부 C 코드에 따라 다릅니다. 그러한 라이브러리를 사용하려면 C 비트를 JavaScript (아마도 emscripten을 사용)로 포팅하고 --with-js 사용하여 프로그램에 연결해야합니다.
모든 GHC Primops가 구현되는 것은 아닙니다. 구현되지 않은 Primop을 만나면 문제를 보여주는 작은 테스트 사례와 함께보고하십시오.
템플릿 Haskell은 여전히 깨졌습니다.
생성 된 코드는 Vanilla Closure Compiler의 ADVANCED_OPTIMIZATIONS Function.length 호환되지 않습니다. haste-boot 이 속성을 보존하는 호환 패치 버전의 폐쇄 버전을 묶습니다. --opt-minify 옵션으로 hastec 호출하면이 패치 된 버전을 사용하여 고급 최적화로 생성 된 코드를 조정합니다.