The zkl FAQ
Q: How do I create and run a
non trivial program?
A1: Use your favorite text editor to write your
program source code.
The preferred extension is ".zkl" but that is your choice.
From the command line: zkl myprogram
A2: Create your program.
Compile it: zkl -C myprogram -o . // write to myprogram.zsc
Run it: zkl myprogram // .zsc is matched first or use the
extension to force
Q: That is still only one file.
A3: OK, OK. Consider Frame-O-Matic: Eight source
files (over 3,000 lines), four images (GIFs) and a text file
packaged into one wad (zsc). Import statements (in the source)
hook all the pieces together to make a "tree", starting from a
"main" file (ie main imports some things, which import other
things (or recursively import already imported things), etc). The
program can then be run any of three ways: source (slow as each
file is compiled at runtime), a collection of compiled files (or a
mix of source and compiled), or as one package (created via the
--package compiler option, which traces the tree, starting at the
main file, and does a whole program compilation/link).
Q: How do I debug my program?
An IDE?
A: With print statements or using the _debug_
keyword. It sucks but the debugger isn't a source level debugger
so it isn't much use to anyone.
No IDE or Eclipse/etc plug in.
Q: What does this run on?
A: Windows 10 and Unix. Tested on 64 bit Windows
10 (VMWare), Unix compiled with clang (Ubuntu native and FreeBSD,
PC-BSD running under VMWare).
A: A port requires good preemptive thread support
(eg native Windows threads or pThreads), some atomic operation
support (atomically testing/exchange/setting/increment ints) and a
good C compiler. Minix3 has most of that but the pthreads library
is poor so the port fails.
Q: What CPU?
A:
Intel/AMD.
Q:
What is a good box?
A: I use a Intel I7 with 4 cores/4 threads and 16g of RAM
running Linux Mint. Very nice. I run Windows 10, PC-BSD &
FreeBSD in VMWare 4 core/4g VMs. The VM are very much slower
(for reasons I don't understand).
Q: Can zkl be used for CGI
scripts?
A: Yes (I use it with Apache). If you compile
your CGI scripts with
zkl --#! C:/Bin/zkl.exe -c ...
the .zsc file will have a "#!" line in it that the Apache server
will look at. Otherwise, you need to make sure the server path
includes zkl.exe. Of course, you also use .zkl files. If you use a
"shebang" line in your source, you can compile it with
zkl --#! . -c ...
which tells the compiler to look for the shebang line in the first
two lines of the source code (so emacs users can still use
-*-c-*-).
There is no mod_zkl.
Q: How stable is zkl?
A: Pretty good (depending on the day, I'm still
making lots of changes). There are very likely still race
conditions in the VM and maybe a dead lock in the garbage
collector.
Q: What is memory usage like?
A: It is a pig, even with the garbage collector
screwed down tight. GC costs about 20% in speed. A typical memory
footprint seems to be around 10meg (32 bit windows).
Q: Unicode?
A: Very, extremely limited. Strings are 8 bit
clean (but not binary clean; zero is special), supports "\uXXXX"
to convert Unicode to UTF-8, can verify that a string is valid
UTF-8 and calculate the length of a UTF-8 string (Unicode
characters vs bytes). But the none of the string support methods
are UTF-8 aware.
Q: Talk about threads.
A: zkl uses OS/preemptive threads. Not green, not
cooperative, not light weight; just heavy metal OS threads (if you
like cooperative threads, fibers are available). The VM is thread
safe, GC is a thread, the compiler is threaded, there is no
“global interpreter lock”, and many objects (such as lists,
dictionaries and strings) are thread safe. Things are not all
roses however, class variables are not thread safe and require
manual locking. Objects are provided for this (locks, pipes, etc).
Any class, function or method can become a thread; just call the
“launch" or "future" method (see the manual) and a thread is
created. No drama, no trauma, it just happens. As an example, the
“test suite overlord” threads the tests (using one pipe, one
atomic integer, and an atomic waiter in a "boss thread runs a
bunch of worker threads" model); it uses 150+ threads. Swamps all
cores on my 8 way machine.
Does it scale? Yes, but the OS can be a real party pooper and the
overhead of OS thread management means lots of little threads
makes things slower. I have seen near linear speed ups with long
lived [compute] threads [that don't exceed the number of cores].
|