คอมไพเลอร์เพื่อสร้างรหัส JavaScript จาก Haskell
มันยังมีเว็บไซต์และรายชื่อผู้รับจดหมาย
คุณมีสามตัวเลือกสำหรับการรีบร้อน: การติดตั้งจากการแฮ็กจาก GitHub หรือจากหนึ่งในแพ็คเกจไบนารีที่สร้างไว้ล่วงหน้า ในสองกรณีแรกคุณต้องเพิ่มไดเรกทอรี Bin ของ Add Cabal โดยปกติ ~/.cabal/bin ไปยัง $PATH ของคุณหากคุณยังไม่ได้ทำ เมื่อติดตั้งจาก Mac, Windows แบบพกพาหรือแพ็คเกจ Linux ทั่วไปคุณอาจต้องการเพิ่ม path/to/haste-compiler/bin ไปยัง $PATH ของคุณ แพ็คเกจ Debian รวมถึง Windows Installer และสคริปต์ติดตั้งเสริมที่รวมอยู่ในแพ็คเกจ Linux ทั่วไปดูแลสิ่งนี้โดยอัตโนมัติ
หรือคุณสามารถติดตั้งเวอร์ชันที่เสถียรล่าสุดจาก Hackage:
$ cabal install haste-compiler
$ haste-boot
การสร้างจากแหล่งกำเนิด GitHub นั้นง่ายพอ ๆ กัน หลังจากตรวจสอบแหล่งที่มาแล้ว cd ไปยังแผนผังต้นทางและเรียกใช้:
$ cabal install
$ haste-boot --force --local
หรือคุณอาจสร้างจากแหล่ง 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 เช่น: JS=other-js-interpreter ./runtests.sh ล่าม JavaScript อื่น ๆ อาจใช้งานได้หรือไม่ runtests.sh ไม่ได้ดาวน์โหลดเมื่อติดตั้งจาก Hackage คุณจะต้องดาวน์โหลดจาก GitHub
ในการสร้างคอมไพเลอร์ปิดการแก้ไขที่ใช้เมื่อรวบรวมโดยใช้ --opt-minify รับแหล่งปิดให้ใช้ patches/closure-argument-removal.patch Patch และสร้างตามปกติ อย่างไรก็ตามสิ่งนี้ไม่จำเป็นเนื่องจาก haste-boot จะดึงไบนารีปิดที่คอมไพล์ไว้ล่วงหน้าเมื่อวิ่ง
สำหรับคำแนะนำการสร้างโดยละเอียดเพิ่มเติมดู doc/building.md
Haste ได้รับการทดสอบเพื่อทำงานบนแพลตฟอร์ม Windows และ OSX แต่ได้รับการพัฒนาเป็นหลักใน GNU/Linux ดังนั้นการรันบนแพลตฟอร์ม GNU/Linux จะทำให้คุณมีข้อบกพร่องน้อยลง
ในการรวบรวมโปรแกรม Haskell ของคุณไปยัง JavaScript Blob พร้อมที่จะรวมอยู่ในเอกสาร HTML หรือรันโดยใช้ล่ามบรรทัดคำสั่ง:
$ hastec myprog.hs
สิ่งนี้เทียบเท่ากับการเรียก GHC -ทำ myprog.hs; Main.main จะถูกเรียกทันทีที่ JS Blob โหลดเสร็จแล้ว
คุณสามารถส่งธงเดียวกันไปยัง Hastec ได้ตามปกติคุณจะผ่านไปยัง GHC:
$ hastec -O2 -fglasgow-exts myprog.hs
Haste ยังมีชุดข้อโต้แย้งบรรทัดคำสั่งของตัวเอง เรียกใช้มันด้วย --help เพื่ออ่านเพิ่มเติมเกี่ยวกับพวกเขา โดยเฉพาะอย่างยิ่ง --opt-all - --opt-minify , --start และ --with-js น่าสนใจพอสมควร
หากคุณต้องการให้แพ็คเกจของคุณรวบรวมด้วยความรีบเร่งและพูดว่า GHC คุณอาจต้องการใช้ส่วนขยาย CPP สำหรับการรวบรวมแบบมีเงื่อนไข Haste กำหนดสัญลักษณ์ preprocessor __HASTE__ ในโมดูลทั้งหมดที่รวบรวม สัญลักษณ์นี้อาจใช้เพื่อแยกความแตกต่างระหว่างรุ่นเร่งด่วนเนื่องจากมันถูกกำหนดให้เป็นตัวแทนจำนวนเต็มของรุ่นเร่งด่วนปัจจุบัน รูปแบบของมันคือ MAJOR*10 000 + MINOR*100 + MICRO เวอร์ชัน 1.2.3 จะแสดงเป็น 10203 และ 0.4.3 เป็น 403
Haste ยังมาพร้อมกับ wrappers สำหรับ Cabal และ GHC-PKG ชื่อ Haste-Cabal และ Haste-PKG ตามลำดับ คุณสามารถใช้เพื่อติดตั้งแพ็คเกจเช่นเดียวกับที่คุณทำกับวานิลลา GHC และ Cabal:
$ haste-cabal install mtl
ในที่สุดคุณสามารถโต้ตอบกับรหัส JavaScript โดยใช้โมดูล Haste.Foreign ในไลบรารี haste-lib ที่รวม ดู doc/js-externals.txt สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนั้น ไลบรารีนี้ยังมีฟังก์ชั่นทุกประเภทสำหรับการจัดการ DOM การจัดการเหตุการณ์การทำงานหลายอย่าง preemptive กราฟิกผืนผ้าใบการจัดการสตริง JS ดั้งเดิม ฯลฯ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานอย่างเร่งรีบดูรายงานความรีบเร่งแม้ว่าระวังว่าบางส่วนของความรีบเร่งอาจเปลี่ยนแปลงได้เล็กน้อย
คุณควรดูเอกสารและ/หรือซอร์สโค้ดสำหรับ haste-lib ซึ่งอยู่ในไดเรกทอรี libraries/haste-lib และโปรแกรมขนาดเล็กในไดเรกทอรี examples เพื่อเริ่มต้น
เมื่อเขียนโปรแกรมคุณอาจต้องการใช้ JavaScript ดั้งเดิมในโปรแกรมของคุณ ยกตัวอย่างเช่นการผูกกับไลบรารีพื้นเมือง วิธีที่ต้องการในการทำเช่นนี้คือโมดูล Haste.Foreign :
{-# LANGUAGE OverloadedStrings #-}
import Haste.Foreign
addTwo :: Int -> Int -> IO Int
addTwo = ffi "(function(x, y) {return x + y;})"
ฟังก์ชั่น ffi นั้นปลอดภัยกว่า GHC FFI เล็กน้อยซึ่งจะบังคับใช้ค่าคงที่บางประเภทเกี่ยวกับค่าที่ส่งคืนจาก JS และสะดวกกว่า ประสิทธิภาพที่ชาญฉลาดมันเร็วเท่ากับ 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 จะส่งออกฟังก์ชั่น fun เมื่อฟังก์ชั่น main ทำงาน เห็นได้ชัดว่าจาวาสคริปต์ของเราต้องทำงานหลังจากนั้นดังนั้นเราจึงสร้างฟังก์ชั่นหลัก "จริง" ของเราใน legacy.js ในที่สุดเราก็บอกให้คอมไพเลอร์เริ่มโปรแกรมโดยใช้ฟังก์ชัน main ของ Haste ครั้งแรก ( $HASTE_MAIN ได้รับการแทนที่ด้วยชื่อใดก็ตามที่คอมไพเลอร์เลือกสำหรับความรีบเร่ง main ) จากนั้นดำเนินการ mymain ของเราเอง
กลไกของ Haste.Foreign อธิบายรายละเอียดในบทความนี้
การใช้เฟรมเวิร์กจากลำดับชั้นของโมดูล Haste.App คุณสามารถเขียนเว็บแอปพลิเคชันที่สื่อสารกับเซิร์ฟเวอร์ได้อย่างง่ายดายโดยไม่ต้องเขียน AJAX/WebSockets/อะไรก็ตาม ดีที่สุดของทั้งหมด: มันปลอดภัยอย่างสมบูรณ์
ในสาระสำคัญคุณเขียนเว็บแอปพลิเคชันของคุณเป็นโปรแกรมเดียว - ไม่มีการแยกไคลเอนต์และรหัสเซิร์ฟเวอร์ของคุณอีกต่อไป จากนั้นคุณรวบรวมโปรแกรมของคุณเมื่อใช้ Haste และเมื่อใช้ GHC และคอมไพเลอร์ทั้งสองจะสร้างไคลเอนต์และรหัสเซิร์ฟเวอร์อย่างน่าอัศจรรย์ตามลำดับ
คุณจะต้องติดตั้งไลบรารีเดียวกันกับทั้ง Haste และ Vanilla GHC (เว้นแต่คุณจะใช้การรวบรวมแบบมีเงื่อนไขเพื่อให้ได้สิ่งนี้) haste-compiler มาพร้อมกับ haste-lib ทั้งหมดดังนั้นคุณต้องกังวลกับสิ่งนี้หากคุณใช้ห้องสมุดบุคคลที่สาม คุณจะต้องใช้เว็บเซิร์ฟเวอร์เพื่อให้บริการไฟล์ HTML และ JS ของคุณ ไบนารีที่สร้างขึ้นโดยการรวบรวม Native เท่านั้นที่สื่อสารกับส่วนไคลเอนต์โดยใช้ WebSockets และไม่ได้ให้บริการไฟล์ใด ๆ ด้วยตัวเอง
ตัวอย่างของ Haste.app ในการดำเนินการมีอยู่ใน examples/haste-app และ examples/chatbox
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานให้ดูบทความนี้
คุณสามารถสร้างชุดเอกสารของคุณเองสำหรับ Haste-Lib โดยใช้ cabal haddock ในไดเรกทอรีฐาน Haste เช่นเดียวกับแพ็คเกจอื่น ๆ
หรือคุณสามารถดูเอกสารออนไลน์ได้
Haste สามารถใช้ไลบรารี Haskell มาตรฐานได้ อย่างไรก็ตามการดำเนินการดั้งเดิมบางอย่างยังไม่ได้ดำเนินการซึ่งหมายความว่าการใช้รหัสใด ๆ ที่ใช้ประโยชน์จากพวกเขาจะให้คำเตือนคอมไพเลอร์จากนั้นตายเมื่อเวลาผ่านไปด้วยข้อผิดพลาดที่โกรธแค้น ไลบรารีบางแห่งขึ้นอยู่กับรหัส C ภายนอก -หากคุณต้องการใช้ไลบรารีดังกล่าวคุณจะต้องพอร์ตบิต C ไปยัง JavaScript ด้วยตัวเอง (อาจใช้ emscripten) และเชื่อมโยงเข้ากับโปรแกรมของคุณโดยใช้ --with-js
ไม่ได้มีการใช้งาน GHC primops ทั้งหมด หากคุณพบ primop ที่ไม่ได้ใช้งานโปรดรายงานพร้อมกับกรณีทดสอบขนาดเล็กที่แสดงให้เห็นถึงปัญหา
เทมเพลต Haskell ยังคงเสีย
รหัสที่สร้างขึ้นนั้นไม่สามารถใช้งานได้กับ Vanilla Close Compiler's ADVANCED_OPTIMIZATIONS เนื่องจากไม่รับประกันว่าจะรักษา Function.length ความยาว haste-boot Bundles การปิดการติดตั้งเข้ากันได้ซึ่งจะรักษาคุณสมบัตินี้ไว้ การเรียกใช้ hastec ด้วยตัวเลือก --opt-minify จะใช้เวอร์ชันที่ได้รับการแก้ไขนี้เพื่อลดรหัสที่สร้างขึ้นด้วยการปรับให้เหมาะสมขั้นสูง