Mal – Tạo một Lisp
Mô tả
1. Mal là một trình thông dịch Lisp được thúc đẩy bởi Clojure
2. Mal là một công cụ học tập
Mỗi phiên bản của mal được chia thành 11 bước tăng dần, độc lập, tự đóng gói (và có thể kiểm tra) để thể hiện các khái niệm cốt lõi của Lisp. Bước cuối cùng có khả năng tự phát triển (chạy phiên bản mal của mal). Xem hướng dẫn quy trình tạo Lisp.
Các bước tạo Lisp là:
- step0_repl
- step1_read_print
- step2_eval
- step3_env
- step4_if_fn_do
- step5_tco
- step6_file
- step7_quote
- step8_macros
- step9_try
- stepA_mal
Mỗi bước tạo Lisp có một sơ đồ kiến trúc liên quan. Những yếu tố mới cho bước đó được làm nổi bật bằng màu đỏ. Dưới đây là sơ đồ cuối cùng cho bước A:
Nếu bạn quan tâm đến việc tạo một phiên bản mal (hoặc chỉ quan tâm đến việc sử dụng mal cho điều gì đó), bạn được mời tham gia Discord hoặc tham gia #mal trên libera.chat. Ngoài hướng dẫn quy trình tạo Lisp, còn có một FAQ về mal/make-a-lisp, nơi tôi cố gắng trả lời một số câu hỏi thường gặp.
3. Mal đã được triển khai bằng 87 ngôn ngữ (93 bản triển khai khác nhau và 115 chế độ chạy)
Bài thuyết trình
Cảm ơn bạn!
Lần đầu tiên, Mal được trình bày công khai trong một cuộc thảo luận ngắn tại sự kiện Clojure West 2014 (rất tiếc không có video ghi lại). Xem tệp examples/clojurewest2014.mal để xem bài thuyết trình được trình bày tại hội nghị (đúng, bài thuyết trình đó là một chương trình mal).
Tại sự kiện Midwest.io 2015, Joel Martin trình bày về Mal trong bài thuyết trình mang tên “Đạt được: Một con đường tốt hơn cho việc học ngôn ngữ”. Video, Slides.
Gần đây hơn, Joel đã có một bài thuyết trình mang tên “Tạo Trình thông dịch Lisp riêng trong 10 Bước Tăng dần” tại LambdaConf 2016: Part 1, Part 2, Part 3, Part 4, Slides.
Xây dựng/chạy các phiên bản
Cách đơn giản nhất để chạy một phiên bản cụ thể là sử dụng Docker. Mỗi phiên bản đã được xây dựng trước với các phụ thuộc ngôn ngữ được cài đặt. Bạn có thể khởi chạy REPL bằng cách sử dụng một mục tiêu tiện lợi trong tệp Makefile cấp cao (trong đó IMPL là tên thư mục của phiên bản và stepX là bước để chạy):
make DOCKERIZE=1 "repl^IMPL^stepX"
# OR stepA is the default step:
make DOCKERIZE=1 "repl^IMPL"
Các Phiên bản Bên ngoài
Các phiên bản sau được duy trì như những dự án riêng biệt:
HolyC
Rust
- by Tim Morgan
- by vi – sử dụng ngữ pháp Pest, không sử dụng cơ sở hạ tầng Mal điển hình (các bước được đóng gói bằng cargo và kiểm tra đã được chuyển đổi).
Q
- by Ali Mohammad Pur – Phiên bản Q hoạt động tốt nhưng yêu cầu phải tải xuống tài liệu chủ sở hữu không thể được đóng gói bằng Docker (hoặc tích hợp vào luồng làm việc CI của mal), nên tạm thời nó vẫn là một dự án riêng biệt.
Các Dự án Mal khác
- malc – Trình biên dịch Mal (Make A Lisp). Biên dịch một chương trình Mal thành ngôn ngữ hợp ngữ LLVM, sau đó chuyển thành tệp nhị phân.
- malcc – malcc là một phiên bản biên dịch tăng tiến cho ngôn ngữ Mal. Nó sử dụng Trình biên dịch C nhỏ (Tiny C Compiler) làm phần sau trình biên dịch và hoàn toàn hỗ trợ cho ngôn ngữ Mal, bao gồm cả macros, loại bỏ cuộc gọi đuôi và thậm chí cả việc đánh giá tại thời điểm chạy (run-time eval). Xem “I Built a Lisp Compiler” bài viết về quá trình này.
- frock – PHP với hương vị Clojure. Sử dụng mal/php để chạy các chương trình.
- flk – Một LISP chạy ở bất kỳ nơi nào có Bash
- glisp – Công cụ thiết kế đồ họa tự tự khởi động trên Lisp. Live Demo
Chi tiết Triển khai
Ada
Triển khai Ada được phát triển với GNAT 4.9 trên Debian. Nó cũng có thể được biên dịch trên Windows nếu bạn có phiên bản của Git, GNAT và (tùy chọn) Make cho Windows. Không có sự phụ thuộc ngoại vi nào (readline không được cài đặt).
cd impls/ada
make
./stepX_YYY
Ada.2
Triển khai Ada thứ hai được phát triển với GNAT 8 và liên kết với thư viện GNU readline.
cd impls/ada
make
./stepX_YYY
GNU awk
Triển khai mal sử dụng GNU awk đã được kiểm tra với phiên bản GNU awk 4.1.1.
cd impls/gawk
gawk -O -f stepX_YYY.awk
Bash 4
cd impls/bash
bash stepX_YYY.sh
BASIC (C64 và QBasic)
Triển khai BASIC sử dụng một trình tiền xử lý có thể tạo ra mã BASIC tương thích với cả BASIC của C64 (CBM v2) và QBasic. Chế độ C64 đã được kiểm tra với cbmbasic (phiên bản đã được vá lỗi hiện tại yêu cầu để khắc phục vấn đề về nhập dòng lệnh) và chế độ QBasic đã được kiểm tra với qb64.
Tạo mã C64 và chạy nó bằng cách sử dụng cbmbasic:
cd impls/basic
make stepX_YYY.bas
STEP=stepX_YYY ./run
Tạo mã QBasic và nạp nó vào qb64:
cd impls/basic
make MODE=qbasic stepX_YYY.bas
./qb64 stepX_YYY.bas
Cảm ơn Steven Syrek đã cung cấp cảm hứng ban đầu cho triển khai này.
BBC BASIC V
Cảm ơn bạn!
Bản triển khai BBC BASIC V của BBC có thể chạy trong trình thông dịch Brandy:
cd impls/bbc-basic
brandy -quit stepX_YYY.bbc
Hoặc trong BBC BASIC V dành cho ARM trên RISC OS 3 hoặc phiên bản sau:
*Dir bbc-basic.riscos
*Run setup
*Run stepX_YYY
C
Triển khai C của mal đòi hỏi các thư viện sau (gói lib và header): glib, libffi6, libgc, và hoặc là thư viện libedit hoặc GNU readline.
cd impls/c
make
./stepX_YYY
C.2
Triển khai C thứ hai của mal đòi hỏi các thư viện sau (gói lib và header): libedit, libgc, libdl, và libffi.
cd impls/c.2
make
./stepX_YYY
C++
Triển khai C++ của mal đòi hỏi g++-4.9 hoặc clang++-3.5 và một thư viện tương thích với readline để xây dựng. Xem cpp/README.md
để biết thêm chi tiết:
cd impls/cpp
make
# OR
make CXX=clang++-3.5
./stepX_YYY
C
Triển khai C# của mal đã được kiểm tra trên Linux bằng trình biên dịch Mono C# (mcs) và môi trường thực thi Mono (phiên bản 2.10.8.1). Cả hai đều cần để xây dựng và chạy triển khai C#.
cd impls/cs
make
mono ./stepX_YYY.exe
ChucK
Triển khai ChucK đã được kiểm tra với ChucK 1.3.5.2.
cd impls/chuck
./run
Clojure
Đối với phần lớn, triển khai Clojure đòi hỏi Clojure 1.5, tuy nhiên để vượt qua tất cả các kiểm tra, cần phải có Clojure 1.8.0-RC4.
cd impls/clojure
lein with-profile +stepX trampoline run
CoffeeScript
sudo npm install -g coffee-script
cd impls/coffee
coffee ./stepX_YYY
Common Lisp
Triển khai đã được kiểm tra với SBCL, CCL, CMUCL, GNU CLISP, ECL và Allegro CL trên Ubuntu 16.04 và Ubuntu 12.04, xem README để biết thêm chi tiết. Miễn là bạn đã cài đặt các phụ thuộc được đề cập, hãy thực hiện các bước sau để chạy triển khai
cd impls/common-lisp
make
./run
Crystal
Triển khai Crystal của mal đã được kiểm tra với Crystal 0.26.1.
cd impls/crystal
crystal run ./stepX_YYY.cr
# OR
make # needed to run tests
./stepX_YYY
D
Triển khai D của mal đã được kiểm tra với GDC 4.8. Nó yêu cầu thư viện GNU readline.
cd impls/d
make
./stepX_YYY
Dart
Triển khai Dart đã được kiểm tra với Dart 1.20.
cd impls/dart
dart ./stepX_YYY
Emacs Lisp
Triển khai Emacs Lisp của mal đã được kiểm tra với Emacs 24.3 và 24.5. Mặc dù có chế độ chỉnh sửa readline cơ bản (<backspace>
và C-d
hoạt động, C-c
hủy quá trình), nhưng nên sử dụng rlwrap
để tối ưu.
cd impls/elisp
emacs -Q --batch --load stepX_YYY.el
# with full readline support
rlwrap emacs -Q --batch --load stepX_YYY.el
Elixir
Triển khai Elixir của mal đã được kiểm tra với Elixir 1.0.5.
cd impls/elixir
mix stepX_YYY
# Or with readline/line editing functionality:
iex -S mix stepX_YYY
Elm
Triển khai Elm của mal đã được kiểm tra với Elm 0.18.0
cd impls/elm
make stepX_YYY.js
STEP=stepX_YYY ./run
Erlang
Triển khai Erlang của mal yêu cầu Erlang/OTP R17 và rebar để xây dựng.
cd impls/erlang
make
# OR
MAL_STEP=stepX_YYY rebar compile escriptize # build individual step
./stepX_YYY
ES6 (ECMAScript 2015)
Triển khai ES6 / ECMAScript 2015 sử dụng trình biên dịch babel để tạo ra mã JavaScript tương thích với ES5. Mã đã được kiểm tra với Node 0.12.4.
cd impls/es6
make
node build/stepX_YYY.js
F
Triển khai F# của mal đã được kiểm tra trên Linux bằng trình biên dịch Mono F# (fsharpc) và môi trường thực thi Mono (phiên bản 3.12.1). Trình biên dịch C# của Mono (mcs) cũng cần thiết để biên dịch phụ thuộc readline. Tất cả đều cần để xây dựng và chạy triển khai F#.
cd impls/fsharp
make
mono ./stepX_YYY.exe
Factor
Triển khai Factor của mal đã được kiểm tra với Factor 0.97 (factorcode.org).
cd impls/factor
FACTOR_ROOTS=. factor -run=stepX_YYY
Fantom
Triển khai Fantom của mal đã được kiểm tra với Fantom 1.0.70.
cd impls/fantom
make lib/fan/stepX_YYY.pod
STEP=stepX_YYY ./run
Fennel
Triển khai Fennel của mal đã được kiểm tra với phiên bản Fennel 0.9.1 trên Lua 5.4.
cd impls/fennel
fennel ./stepX_YYY.fnl
Forth
cd impls/forth
gforth stepX_YYY.fs
GNU Guile 2.1+
cd impls/guile
guile -L ./ stepX_YYY.scm
GNU Smalltalk
Triển khai Smalltalk của mal đã được kiểm tra với GNU Smalltalk 3.2.91.
cd impls/gnu-smalltalk
./run
Go
Triển khai Go của mal đòi hỏi go đã được cài đặt trên đường dẫn. Triển khai đã được kiểm tra với Go 1.3.1.
cd impls/go
make
./stepX_YYY
Groovy
Triển khai Groovy của mal đòi hỏi Groovy để chạy và đã được kiểm tra với Groovy 1.8.6.
cd impls/groovy
make
groovy ./stepX_YYY.groovy
Haskell
Triển khai Haskell đòi hỏi trình biên dịch ghc phiên bản 7.10.1 hoặc mới hơn và cũng đòi hỏi các gói Haskell parsec và readline (hoặc editline).
cd impls/haskell
make
./stepX_YYY
Haxe (Neko, Python, C++ and JavaScript)
Triển khai Haxe của mal đòi hỏi phiên bản 3.2 để biên dịch. Bốn mục tiêu Haxe khác nhau được hỗ trợ: Neko, Python, C++, và JavaScript.
cd impls/haxe
# Neko
make all-neko
neko ./stepX_YYY.n
# Python
make all-python
python3 ./stepX_YYY.py
# C++
make all-cpp
./cpp/stepX_YYY
# JavaScript
make all-js
node ./stepX_YYY.js
Hy
Triển khai Hy của mal đã được kiểm tra với Hy 0.13.0.
cd impls/hy
./stepX_YYY.hy
Io
Triển khai Io của mal đã được kiểm tra với Io version 20110905.
cd impls/io
io ./stepX_YYY.io
Janet
Triển khai Janet của mal đã được kiểm tra với Janet version 1.12.2.
cd impls/janet
janet ./stepX_YYY.janet
Java 1.7
Triển khai Java của mal đòi hỏi maven2 để xây dựng.
cd impls/java
mvn compile
mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY
# OR
mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY -Dexec.args="CMDLINE_ARGS"
Java, sử dụng Truffle cho GraalVM
Triển khai Java này sẽ chạy trên OpenJDK, nhưng có thể chạy nhanh hơn tới 30 lần trên GraalVM nhờ khung Truffle. Đã được kiểm tra với OpenJDK 11, GraalVM CE 20.1.0 và GraalVM CE 21.1.0.
cd impls/java-truffle
./gradlew build
STEP=stepX_YYY ./run
JavaScript/Node
cd impls/js
npm install
node stepX_YYY.js
Julia
Triển khai Julia của mal đòi hỏi Julia phiên bản 0.4.
cd impls/julia
julia stepX_YYY.jl
jq
Đã kiểm tra với phiên bản 1.6, với nhiều cách “nhìn trộm” trong phần I/O
cd impls/jq
STEP=stepA_YYY ./run
# with Debug
DEBUG=true STEP=stepA_YYY ./run
Kotlin
Triển khai Kotlin của mal đã được kiểm tra với Kotlin 1.0.
cd impls/kotlin
make
java -jar stepX_YYY.jar
LiveScript
Triển khai LiveScript của mal đã được kiểm tra với LiveScript 1.5.
cd impls/livescript
make
node_modules/.bin/lsc stepX_YYY.ls
Logo
Triển khai Logo của mal đã được kiểm tra với UCBLogo 6.0.
cd impls/logo
logo stepX_YYY.lg
Lua
Triển khai Lua của mal đã được kiểm tra với Lua 5.3.5. Triển khai đòi hỏi phải cài đặt luarocks.
cd impls/lua
make # to build and link linenoise.so and rex_pcre.so
./stepX_YYY.lua
Mal
Chạy triển khai mal của mal liên quan đến việc chạy bước A của một trong các triển khai khác và truyền bước mal để chạy dưới dạng tham số dòng lệnh.
cd impls/IMPL
IMPL_STEPA_CMD ../mal/stepX_YYY.mal
GNU Make 3.81
cd impls/make
make -f stepX_YYY.mk
NASM
Triển khai NASM của mal được viết cho x86-64 Linux, và đã được kiểm tra với Linux 3.16.0-4-amd64 và phiên bản NASM 2.11.05.
cd impls/nasm
make
./stepX_YYY
Nim 1.0.4
Triển khai Nim của mal đã được kiểm tra với Nim 1.0.4.
cd impls/nim
make
# OR
nimble build
./stepX_YYY
Object Pascal
Triển khai Object Pascal của mal đã được xây dựng và kiểm tra trên Linux bằng trình biên dịch Free Pascal phiên bản 2.6.2 và 2.6.4.
cd impls/objpascal
make
./stepX_YYY
Objective C
Triển khai Objective C của mal đã được xây dựng và kiểm tra trên Linux bằng clang/LLVM 3.6. Nó cũng đã được xây dựng và kiểm tra trên OS X bằng XCode 7.
cd impls/objc
make
./stepX_YYY
OCaml 4.01.0
cd impls/ocaml
make
./stepX_YYY
MATLAB (GNU Octave và MATLAB)
Triển khai MatLab đã được kiểm tra với GNU Octave 4.2.1. Nó cũng đã được kiểm tra với phiên bản MATLAB R2014a trên Linux. Lưu ý rằng MATLAB là một sản phẩm thương mại.
cd impls/matlab
./stepX_YYY
octave -q --no-gui --no-history --eval "stepX_YYY();quit;"
matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY();quit;"
# OR with command line arguments
octave -q --no-gui --no-history --eval "stepX_YYY('arg1','arg2');quit;"
matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY('arg1','arg2');quit;"
miniMAL
miniMAL là một trình thông dịch Lisp nhỏ được triển khai trong ít hơn 1024 byte JavaScript. Để chạy triển khai miniMAL của mal, bạn cần tải xuống/cài đặt trình thông dịch miniMAL (cần Node.js).
cd impls/miniMAL
# Download miniMAL and dependencies
npm install
export PATH=`pwd`/node_modules/minimal-lisp/:$PATH
# Now run mal implementation in miniMAL
miniMAL ./stepX_YYY
Perl 5
Triển khai Perl 5 nên hoạt động với perl 5.19.3 và các phiên bản sau.
Để hỗ trợ chỉnh sửa dòng readline, cài đặt Term::ReadLine::Perl hoặc Term::ReadLine::Gnu từ CPAN.
cd impls/perl
perl stepX_YYY.pl
Perl 6
Triển khai Perl 6 đã được kiểm tra trên Rakudo Perl 6 2016.04.
cd impls/perl6
perl6 stepX_YYY.pl
PHP 5.3
Triển khai PHP của mal đòi hỏi giao diện dòng lệnh php để chạy.
cd impls/php
php stepX_YYY.php
Picolisp
Triển khai Picolisp yêu cầu libreadline và Picolisp 3.1.11 hoặc phiên bản sau.
cd impls/picolisp
./run
Pike
Triển khai Pike đã được kiểm tra trên Pike 8.0.
cd impls/pike
pike stepX_YYY.pike
PL/pgSQL (Ngôn ngữ thủ tục SQL PostgreSQL)
Triển khai PL/pgSQL của mal đòi hỏi máy chủ PostgreSQL đang chạy (hình ảnh docker “kanaka/mal-test-plpgsql” tự động khởi động máy chủ PostgreSQL). Triển khai kết nối với máy chủ PostgreSQL và tạo một cơ sở dữ liệu có tên là “mal” để lưu trữ bảng và thủ tục lưu trữ. Kịch bản bao bọc sử dụng lệnh psql để kết nối với máy chủ và mặc định là người dùng “postgres”, nhưng điều này có thể được ghi đè bằng biến môi trường PSQL_USER. Mật khẩu có thể được chỉ định bằng cách sử dụng biến môi trường PGPASSWORD. Triển khai đã được kiểm tra với PostgreSQL 9.4.
cd impls/plpgsql
./wrap.sh stepX_YYY.sql
# OR
PSQL_USER=myuser PGPASSWORD=mypass ./wrap.sh stepX_YYY.sql
PL/SQL (Ngôn ngữ thủ tục SQL Oracle)
Triển khai PL/SQL của mal đòi hỏi máy chủ Oracle DB đang chạy (hình ảnh docker “kanaka/mal-test-plsql” tự động khởi động máy chủ Oracle Express). Triển khai kết nối với máy chủ Oracle để tạo các loại, bảng và thủ tục lưu trữ. Giá trị đăng nhập mặc định của SQLPlus (tên người dùng/mật khẩu@connect_identifier) là “system/oracle”, nhưng điều này có thể được ghi đè bằng biến môi trường ORACLE_LOGON. Triển khai đã được kiểm tra với Oracle Express Edition 11g Release 2. Lưu ý rằng bất kỳ cảnh báo kết nối SQLPlus (mật khẩu người dùng hết hạn, v.v.) sẽ gây xung đột với khả năng của kịch bản bao bọc để giao tiếp với cơ sở dữ liệu.
cd impls/plsql
./wrap.sh stepX_YYY.sql
# OR
ORACLE_LOGON=myuser/mypass@ORCL ./wrap.sh stepX_YYY.sql
PostScript Level 2/3
Triển khai PostScript của mal đòi hỏi Ghostscript để chạy. Nó đã được kiểm tra với Ghostscript 9.10.
cd impls/ps
gs -q -dNODISPLAY -I./ stepX_YYY.ps
PowerShell
Triển khai PowerShell của mal đòi hỏi ngôn ngữ tập lệnh PowerShell. Nó đã được kiểm tra với PowerShell 6.0.0 Alpha 9 trên Linux.
cd impls/powershell
powershell ./stepX_YYY.ps1
Prolog
Triển khai Prolog sử dụng một số cấu trúc cụ thể cho SWI-Prolog, bao gồm hỗ trợ chỉnh sửa readline và đã được kiểm tra trên Debian GNU/Linux với phiên bản 8.2.1.
cd impls/prolog
swipl stepX_YYY
PureScript
Triển khai PureScript đòi hỏi trình biên dịch spago phiên bản 0.20.2.
cd impls/purs
make
node ./stepX_YYY.js
Python (2.X và 3.X)
cd impls/python
python stepX_YYY.py
Python.2 (3.X)
Triển khai Python thứ hai sử dụng chú thích loại rất nhiều và sử dụng thư viện phân tích cú pháp Arpeggio.
# Recommended: do these steps in a Python virtual environment.
pip3 install Arpeggio==1.9.0
python3 stepX_YYY.py
RPython
Bạn phải có rpython trên đường dẫn của bạn (được bao gồm trong pypy).
cd impls/rpython
make # this takes a very long time
./stepX_YYY
R
Triển khai R của mal đòi hỏi R (r-base-core) để chạy.
cd impls/r
make libs # to download and build rdyncall
Rscript stepX_YYY.r
Racket (5.3)
Triển khai Racket của mal đòi hỏi trình biên dịch/trình thông dịch Racket để chạy.
cd impls/racket
./stepX_YYY.rkt
Rexx
Triển khai Rexx của mal đã được kiểm tra với Regina Rexx 3.6.
cd impls/rexx
make
rexx -a ./stepX_YYY.rexxpp
Ruby (1.9+)
cd impls/ruby
ruby stepX_YYY.rb
Ruby #2
Triển khai Ruby thứ hai với những mục tiêu sau đây:
- Không có biến toàn cục
- Không sửa đổi (thêm chức năng) các lớp Ruby core
-
Modularized vào không gian tên
Mal
modulecd impls/ruby.2
ruby stepX_YYY.rb
Rust (1.38+)
Triển khai rust của mal đòi hỏi trình biên dịch rust và công cụ xây dựng (cargo) để xây dựng.
cd impls/rust
cargo run --release --bin stepX_YYY
Scala
Cài đặt scala và sbt (http://www.scala-sbt.org/0.13/tutorial/Installing-sbt-on-Linux.html):
cd impls/scala
sbt 'run-main stepX_YYY'
# OR
sbt compile
scala -classpath target/scala*/classes stepX_YYY
Scheme (R7RS)
Triển khai Scheme của MAL đã được kiểm tra với Chibi-Scheme 0.10, Kawa 3.1.1, Gauche 0.9.6, CHICKEN 5.1.0, Sagittarius 0.9.7, Cyclone 0.32.0 (phiên bản Git) và Foment 0.4 (phiên bản Git). Bạn nên có thể chạy nó trên các triển khai R7RS tuân theo khác sau khi tìm hiểu cách thư viện được tải và điều chỉnh Makefile
và run
script tương ứng.
cd impls/scheme
# chibi
scheme_MODE=chibi ./run
# kawa
make kawa
scheme_MODE=kawa ./run
# gauche
scheme_MODE=gauche ./run
# chicken
make chicken
scheme_MODE=chicken ./run
# sagittarius
scheme_MODE=sagittarius ./run
# cyclone
make cyclone
scheme_MODE=cyclone ./run
# foment
scheme_MODE=foment ./run
Skew
Triển khai Skew của mal đã được kiểm tra với Skew 0.7.42.
cd impls/skew
make
node stepX_YYY.js
Standard ML (Poly/ML, MLton, Moscow ML)
Triển khai Standard ML của mal đòi hỏi một triển khai SML97. Makefile hỗ trợ Poly/ML, MLton, Moscow ML và đã được kiểm tra với Poly/ML 5.8.1, MLton 20210117 và Moscow ML phiên bản 2.10.
cd impls/sml
# Poly/ML
make sml_MODE=polyml
./stepX_YYY
# MLton
make sml_MODE=mlton
./stepX_YYY
# Moscow ML
make sml_MODE=mosml
./stepX_YYY
Swift
Triển khai Swift của mal đòi hỏi trình biên dịch Swift 2.0 (XCode 7.0) để xây dựng. Các phiên bản cũ sẽ không hoạt động do thay đổi trong ngôn ngữ và thư viện tiêu chuẩn.
cd impls/swift
make
./stepX_YYY
Swift 3
Triển khai Swift 3 của mal đòi hỏi trình biên dịch Swift 3.0. Nó đã được kiểm tra với Swift 3 Preview 3.
cd impls/swift3
make
./stepX_YYY
Swift 4
Triển khai Swift 4 của mal đòi hỏi trình biên dịch Swift 4.0. Nó đã được kiểm tra với phiên bản Swift 4.2.3.
cd impls/swift4
make
./stepX_YYY
Swift 5
Triển khai Swift 5 của mal đòi hỏi trình biên dịch Swift 5.0. Nó đã được kiểm tra với phiên bản Swift 5.1.1.
cd impls/swift5
swift run stepX_YYY
Tcl 8.6
Triển khai Tcl của mal đòi hỏi Tcl 8.6 để chạy. Để hỗ trợ chỉnh sửa dòng đọc, cài đặt tclreadline.
cd impls/tcl
tclsh ./stepX_YYY.tcl
TypeScript
Triển khai TypeScript của mal đòi hỏi trình biên dịch TypeScript 2.2. Nó đã được kiểm tra với Node.js v6.
cd impls/ts
make
node ./stepX_YYY.js
Vala
Triển khai Vala của mal đã được kiểm tra với trình biên dịch Vala 0.40.8. Bạn cần cài đặt valac
và libreadline-dev
hoặc tương đương.
cd impls/vala
make
./stepX_YYY
VHDL
Triển khai VHDL của mal đã được kiểm tra với GHDL 0.29.
cd impls/vhdl
make
./run_vhdl.sh ./stepX_YYY
Vimscript
Triển khai Vimscript của mal đòi hỏi Vim 8.0 để chạy.
cd impls/vimscript
./run_vimscript.sh ./stepX_YYY.vim
Visual Basic.NET
Triển khai VB.NET của mal đã được kiểm tra trên Linux bằng trình biên dịch VB Mono (vbnc) và runtime Mono (phiên bản 2.10.8.1). Cả hai đều cần để xây dựng và chạy triển khai VB.NET.
cd impls/vb
make
mono ./stepX_YYY.exe
WebAssembly (wasm)
Triển khai WebAssembly được viết bằng Wam (ngôn ngữ Macro WebAssembly) và chạy trên nhiều lõi nhúng khác nhau (runtimes): node, wasmtime, wasmer, lucet, wax, wace, warpy.
cd impls/wasm
# node
make wasm_MODE=node
./run.js ./stepX_YYY.wasm
# wasmtime
make wasm_MODE=wasmtime
wasmtime --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
# wasmer
make wasm_MODE=wasmer
wasmer run --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
# lucet
make wasm_MODE=lucet
lucet-wasi --dir=./:./ --dir=../:../ --dir=/:/ ./stepX_YYY.so
# wax
make wasm_MODE=wax
wax ./stepX_YYY.wasm
# wace
make wasm_MODE=wace_libc
wace ./stepX_YYY.wasm
# warpy
make wasm_MODE=warpy
warpy --argv --memory-pages 256 ./stepX_YYY.wasm
XSLT
Triển khai XSLT của mal được viết với XSLT 3 và đã được kiểm tra trên Saxon 9.9.1.6 Home Edition.
cd impls/xslt
STEP=stepX_YY ./run
Wren
Triển khai Wren của mal đã được kiểm tra trên Wren 0.2.0.
cd impls/wren
wren ./stepX_YYY.wren
Yorick
Triển khai Yorick của mal đã được kiểm tra trên Yorick 2.2.04.
cd impls/yorick
yorick -batch ./stepX_YYY.i
Zig
Triển khai Zig của mal đã được kiểm tra trên Zig 0.5.
cd impls/zig
zig build stepX_YYY
Running tests
Makefile cấp cao có một số mục tiêu hữu ích để hỗ trợ việc phát triển và kiểm tra triển khai. Mục tiêu help
cung cấp danh sách các mục tiêu và tùy chọn:
make help
Functional tests
Có gần 800 bài kiểm tra chức năng chung (cho tất cả các triển khai) trong thư mục tests/
. Mỗi bước có một tệp kiểm tra tương ứng chứa các bài kiểm tra cụ thể cho bước đó. Bộ kiểm tra runtest.py
khởi động một triển khai bước Mal và sau đó đưa lần lượt các bài kiểm tra cho triển khai và so sánh đầu ra/giá trị trả về với đầu ra/giá trị trả về dự kiến.
-
Để chạy tất cả các bài kiểm tra trên tất cả các triển khai (chuẩn bị sẵn sàng chờ đợi):
make test
-
Để chạy tất cả các bài kiểm tra trên một triển khai duy nhất:
make “test^IMPL”
e.g.
make “test^clojure”
make “test^js” -
Để chạy bài kiểm tra cho một bước cụ thể trên tất cả các triển khai:
make “test^stepX”
e.g.
make “test^step2”
make “test^step7” -
Để chạy bài kiểm tra cho một bước cụ thể trên một triển khai duy nhất:
make “test^IMPL^stepX”
e.g
make “test^ruby^step3”
make “test^ps^step4”
Self-hosted functional tests
-
Để chạy các bài kiểm tra chức năng trong chế độ tự tự cung cấp, bạn chỉ định
mal
như triển khai kiểm tra và sử dụng biến làm (make variable)MAL_IMPL
để thay đổi ngôn ngữ chủ mệnh (default là JavaScript):make MAL_IMPL=IMPL “test^mal^step2”
e.g.
make “test^mal^step2” # js is default
make MAL_IMPL=ruby “test^mal^step2”
make MAL_IMPL=python “test^mal^step2”
Starting the REPL
-
Để bắt đầu REPL của một triển khai trong một bước cụ thể:
make “repl^IMPL^stepX”
e.g
make “repl^ruby^step3”
make “repl^ps^step4” -
Nếu bạn bỏ qua bước, thì
stepA
sẽ được sử dụng:make “repl^IMPL”
e.g
make “repl^ruby”
make “repl^ps” -
Để bắt đầu REPL của triển khai tự tự cung cấp, chỉ định
mal
như triển khai REPL và sử dụng biến làm (make variable)MAL_IMPL
để thay đổi ngôn ngữ chủ mệnh (mặc định là JavaScript):make MAL_IMPL=IMPL “repl^mal^stepX”
e.g.
make “repl^mal^step2” # js is default
make MAL_IMPL=ruby “repl^mal^step2”
make MAL_IMPL=python “repl^mal”
Performance tests
Cảnh báo: Những bài kiểm tra hiệu suất này không phải là hợp lệ thống kế hoạch hoặc toàn diện; hiệu suất thời gian chạy không phải là mục tiêu chính của mal. Nếu bạn rút ra bất kỳ kết luận nghiêm túc nào từ những bài kiểm tra hiệu suất này, vui lòng liên hệ với tôi về một mảnh đất ven biển tuyệt vời ở Kansas tôi sẵn lòng bán cho bạn với giá rẻ.
-
Để chạy các bài kiểm tra hiệu suất trên một triển khai duy nhất:
make “perf^IMPL”
e.g.
make “perf^js”
-
Để chạy các bài kiểm tra hiệu suất trên tất cả các triển khai:
make “perf”
Generating language statistics
-
Để báo cáo thống kê dòng và byte cho một triển khai duy nhất:
make “stats^IMPL”
e.g.
make “stats^js”
Dockerized testing
Mọi thư mục triển khai đều chứa một Dockerfile để tạo một hình ảnh Docker chứa tất cả các phụ thuộc cho triển khai đó. Ngoài ra, Makefile cấp cao còn chứa hỗ trợ để chạy mục tiêu kiểm tra (và perf, stats, repl, vv) trong một bộ chứa Docker cho triển khai đó bằng cách chuyển “DOCKERIZE=1” trên dòng lệnh make. Ví dụ:
make DOCKERIZE=1 "test^js^step3"
Các triển khai hiện có đã có hình ảnh Docker được xây dựng và đẩy lên kho ảnh Docker. Tuy nhiên, nếu bạn muốn xây dựng hoặc xây dựng lại hình ảnh Docker cục bộ, Makefile cấp cao cung cấp quy tắc để xây dựng hình ảnh Docker:
make "docker-build^IMPL"
Ghi chú :
- Hình ảnh Docker được đặt tên là kanaka/mal-test-IMPL
- Các triển khai ngôn ngữ dựa trên JVM (Groovy, Java, Clojure, Scala): bạn có thể cần phải chạy lệnh này một lần thủ công trước
make DOCKERIZE=1 "repl^IMPL"
trước khi bạn có thể chạy các bài kiểm tra vì các phụ thuộc thời gian chạy cần phải được tải xuống để tránh việc bài kiểm tra bị hết thời gian. Những phụ thuộc này được tải xuống vào các tệp dot trong thư mục /mal nên chúng sẽ tồn tại giữa các lần chạy.
Chi tiết Tải về:
Tác giả: kanaka
Mã nguồn: https://github.com/kanaka/mal
Giấy phép: View license