_______ _______ __ _ ______ |______ | |______ | \ | | ____ | |_____ |______ | \_| |_____|
This software is an implementation of "FLENG", a low level concurrent
logic programming language descended from Prolog. A compiler is
provided to translate programs written in FLENG into assembly
language which can subsequently be compiled and linked into a binary
executable. As FLENG is quite minimal in features, translators
from "Flat Guarded Horn Clauses", "Strand" and "PCN" (other concurrent
logic languages) into FLENG are also available.
Example code:
The "FizzBuzz" program in FGHC/Strand:
% fizzbuzz
-initialization(main).
main :- loop(1).
loop(I) :- loop2([], I).
loop2(_, 101).
loop2([], I) :-
I =< 101 |
fizzbuzz(I, Ok),
I2 is I + 1,
loop2(Ok, I2).
fizzbuzz(X, Ok) :- X \\ 15 =:= 0 | writeln('FizzBuzz', Ok).
fizzbuzz(X, Ok) :- X \\ 3 =:= 0 | writeln('Fizz', Ok).
fizzbuzz(X, Ok) :- X \\ 5 =:= 0 | writeln('Buzz', Ok).
fizzbuzz(X, Ok) :- otherwise | writeln(X, Ok).
and in PCN:
/* fizzbuzz */
main()
{;
i over 1..100 ::
{?
i % 15 == 0 -> writeln("FizzBuzz"),
i % 3 == 0 -> writeln("Fizz"),
i % 5 == 0 -> writeln("Buzz"),
default -> writeln(i)
}
}
FLENG programs allow for massive parallelism at a very fine grained
level - goals are executed concurrently and communicate solely via
single-assignment logic variables. The use of logic variables for
inter-process communication offers an easy to use and convenient
abstraction to implement many common patterns of synchronization
and message passing in a natural manner. This implementation
additionally can distribute pools of parallel processes over native
OS level threads, thus taking advantage of multicore architectures.
Locking overhead should be small, as data is normally not shared
among processes executing on different threads. Automatic management
of memory is provided using a reference-counting scheme of fixed
size cells, which avoid fragmentation, eliminates garbage collection
pauses and keeps the overall memory required to hold live data at
any point of time minimal, while providing relatively good locality.
Interfacing to native code is straightforward and compiled FLENG
code and the run time library support can be linked with other
modules written in C or C++ without problems. The compilation tools
allow cross compilation, provided the architecture is supported.
The compiler generates native code, but does currently not perform
a lot of optimizations, so performance-sensitive code should probably
be written in C or another language. FLENG should be particularly
well suited as a coordination language for providing intercommunication
and synchronization with reasonable overhead while calling out to
C or C++ code for low-level or speed-critical operations.
Suggestions for improvement or patches providing enhancements and
corrections are very welcome, see the User's manual for information
on how to contact the author. Also check out the "#fleng" IRC channel
on https://libera.chat if you have questions or need assistance.
This software was written by Felix L. Winkelmann and has been released
into the public domain. Do with it whatever you like.
SHA1: e49550cef28f48f4dbe88591f5bac30d40c7c788
Release History:
Version 21:
* IMPORTANT - changes incompatible to earlier versions:
* "app" module: "drop/3" returns list starting from first element
where goal fails.
* "array" module: "array:read/4" assigns the number of elements
read to the "DONE" parameter, not the number of bytes.
* "statistics/1" returns a tuple of 6 elements now, including
the peak and average number of heap cells.
* Added the new "flengbundle" tool to link raw data to applications
or libraries.
* Removed a memory leak caused when a variable is repeatedly
suspended in the head of a clause while another clause for the
same goal still commits; this resulted in suspension-records to be
allocated but never freed as long as the suspended variable is not
bound.
* "app" module: added "index/3".
* "array" module: added "list_to_array/3"; "read" and "write" now
accept standard file stream strings ("stdin", ...).
* "base64" module: added "encode/2" and "decode/2"; decoding
incorrectly generated signed byte list.
* "fmt" module: "~q" format only assumes list is character list
when elements are within ASCII range.
* "bb" module: added "dialog/5".
* "list" module: added "index/3".
* "eval" module: fixed implementation of "when/2"; added support
for ":=/2"; "t/{1,2}" reports invalid guard expressions.
* "json" module: eliminated deadlock in "to_string/{2,3}".
* flengmake:
- indirect module dependencies where not linked to programs.
- ixed bug in graph-creation with targets that have no direct
source file.
- handle broken symlinks when traversing directories.
- foreign objects are now deleted in the "clean" operation.
* Fixed several problems in the FGHC FFI (reported by Darren Bane).
* "+LOAD" accepts "-" to read from stdin.
* Dropped an obsolete requirement for "list_to_tuple/2" that forced
the first element of the argument list.
* Use "cc -x assembler" when assembling on OpenBSD 7.4 or later as
binutils don't seem to understand IBT/BTI instructions.
* Assignment to non-var reported incorrect value in error message
if non-immediate.
* Fixed utterly broken internal string-conversion for arrays.
* [PCN] Improved tracking of mutable assignments to avoid nonsensical
warnings when assignments take place in choice-compositions.
* [PCN] "apply/2" is now allowed to be used in expressions.
* [PCN] Fixed compilation of "cpu_time/0" when used as a function.
* [PCN] A separator is now allowed after the last rule in a choice
composition.
* [PCN] Indexing the empty list is now an error.
* [PCN] When an expression is used as a guard it is equivalent to
comparing it to a non-false value; complementary, "!" followed by
a term is equivalent to comparing the term to false.
* [PCN] The dollar sign ("$") is allowed in identifiers.
* [PCN] Functional struct-field update allows giving more than one item.
* [PCN] Guards may now contain function calls and struct field references.
* [PCN] Fixed race-condition for boxing arguments in calls to foreign
C functions with struct-field-references as argument expressions.
* [PCN] Added support for L"..." notation for character list literals.
* [PCN] Definition of a mutable destination produces a more meaningful
error message.
* [PCN] uses of "apply/2" with constant goal and literal argument list
are converted into a direct call, which can be useful in macros that
construct or augment procedure calls.
* [PCN] Fixed bug in FLENG backend causing mutable variables of
type long to terminate the compiler.
* [PCN] module-use in qualified function calls was not recorded.
* [PCN] The source file is properly retained in error messages that have
no associated line-number.
* [PCN] The use of "write_file/3" was incorrectly compiled in sequential
mode, causing deadlock.
* [PCN] Fixed bug in compiler that caused certain warnings to abort.
* [PCN] Changed "let" syntax by removing the "->" and treating it
like any other statement as the scope of the guards encloses the
full program definition anyway. The old syntax "->", including using
"let" as the body of a program definition is deprecated and will be
removed in the future.
Version 20:
* IMPORTANT: the following primitives and library operations
have changed argument order, which is a backwards-incompatible
change, make sure to review all uses of these operations in
existing code!
- "utf_decode/3": changed to "utf_decode(CHAR^, IN?, OUT^)".
- "list" module: changed order of arguments in "trim/3", "trim_left/3"
and "trim_right/3" where the set of trimmed chars is given as first
argument.
- "app" module: the goal called in "foldl/4" takes its first two
arguments in reversed order, to make the applicative easier to
use with argument pairs.
* Added support for interactive debugging of compiled code.
- New "eval" module which allows evaluating a restricted
subset of FGHC.
- Compiler option "-i" to enable use of interactive mode.
- Run-time options "+INTERACTIVE" and "+LOAD <filename>" to
enter interactive mode or evaluate a file instead of running
initialization code.
* Bugfixes in AArch64 backend, bootstrap compiler and code-generation
with profiling information (reported by Darren Bane).
* Bugfix in fl2XXX FFI wrapper code generation that emitted a call
to an obsolete runtime function (reported by Darren Bane).
* Another bugfix in the wrapper code generation that caused the
compiler to abort, also reported by Darren Bane.
* Fixed bug in use of "call/1" with a module-qualified variable term
which was incorrectly compiled.
* Fixed problem in FFI stub generation when a stub for a foreign
function with no output arguments was generated with arity > 3.
* Bugfix in boot/configure, reported by "ctarbide".
* Bugfixes in arm runtimes for struct and array-test primitives.
* Fixed ordering relation for arrays, which was not implemented.
* Primitives that accept a file-descriptor now also allow the use
of the strings "stdin", "stdout" and "stderr", representing the
standard I/O streams.
* Dropped the "spec" library module - its functionality can be more
clearly expressed with code.
* "list" module: added "replace/4".
* "match" module: added "fields/{3,4}".
* "app" module: added "mapappend/4".
* "json" module: "to_string" supports numeric arrays and handles
invalid parse results; parsing and querying allow strings in
some places where char-lists were required before.
* "fmt" module: the "~s" format supports char/int arrays, printing
them as UTF-8 text; "~w"/"~q" print modules.
* "9p" module:
- added "open/{5,6}", "create/6", "remove/4", "stat/5",
"close/3", "fread/{4,6,7}", "fwrite/{5,7,8}", "fstat/4", "fwstat/5"
"readdir/5" and "freaddir/4".
- "write" requests are not sequenced and have the "iounit" argument
dropped.
- "open" and "create" requests may give their mode arguments in
symbolic form.
* Foreign stub files auto-include "fleng-util.h" (again), unless
when compiling PCN code.
* The "fleng" driver script didn't pass the default include path
when preprocessing PCN code.
* Flengmake:
- Fixed numerous bugs.
- Takes implicit command line arguments from environment variable
"FLENGMAKE_FLAGS".
- Drop pre-computed program and module targets when source file
is removed.
- Fixed handling of symlinks; symlinks pointing outside of the
source tree are ignored.
- state files store a version now and are ignored if the version
doesn't match the current one.
- option files may contain references to environment variables.
* Added new primitive "lseek/{3,4}".
* The "error" primitive forces its argument now.
* "scan" module: added "format/4" and "decode/3".
* "array" module:
- dropped "array:size/2" - use "lwngth/2" instead.
- resizing an array to its existing size returns the array unchanged.
- bugfix in "array:search".
- added "array:hex_to_binary/3" and "array:binary_to_hex/3".
* "binfmt" module: "scan" accepts "~<N><F>" format specifiers where
the count is included in the format-string.
* "proc" module: "capture", "submit" and "pipe" read and write byte
streams now, use "utf_encode"/"utf_decode" if you want to convert
from/to character streams.
* [FGHC] Fixed failing compilation of "data/1" guards following
non-"data" guards in compound guard sequences.
* [FGHC] Inlined applicatives did not register the "app" module as
used in fallback mode (when a non-local goal is called).
* [PCN] Added support for ordering guards ("@>", "@<", "@>=" and "@<=").
* [PCN] All formatting library procedures precompiled by the FGHC
front-end are now also by the PCN front-end.
* [PCN] Choice compositions are compiled more eficiently by
removing redundant parameters in the generated FLENG code.
* [PCN] Function-level calls of "global/1" and "getcwd/0" were
not correctly handled.
* [PCN] Composition bodies are more relaxed about stray separators.
* [PCN] Numbers may contain "'" as separators for readability.
* [PCN] "deref/1", "open_file/2" and "list_to_integer/1" can be used
as functions.
* [PCN] Arguments to certain builtin primitives in function call
position did not force their arguments, when required.
* [PCN] Overhauled semantics of the "struct" declaration and added
"." field notation and "<--" statement.
Version 19:
* "9p" module: simplified "read" requests by dropping IO-unit argument
and returning the number of bytes read; reading over multiple requests
must be handled by user code now.
* "find" module: handle symbolic links properly; "leaves/2" takes
a root directory as first argument now, which is deemed more useful.
* [PCN] Term-elements may be arbitrary expressions and are converted
to FGHC-compatible structured terms.
* [PCN] Array dimension specifications may be simple expressions.
* "ezd" module: added "drawings" and "drawing_info" inquiry commands.
* [PCN] Added "tail" primitive function.
* [PCN] "length" is not a reserved keyword anymore.
* Added library module "base64" for basic Base64 encoding and
decoding.
* Added the "comment" declaration.
* flengdoc: Fixed some missing aliases in module descriptions-
* flengmake: doesn't create state file if no targets exist; add
foreign wrappers for modules to linked libraries and executables;
handle relative symbolic links properly when walking directories;
caches scanning results and applies compiler options also during
scanning.
* "path" module: "normalize" preserves absolute paths properly;
added "with_extension/3".
* The "fleng" compiler driver accepts C/C++ source files and
compiles and links them automatically to a generated executable.
* [PCN] Fixed a bug in the compilation of guard expressions that
contained index-references to non-arrays.
* The primitives "file_modification_time/2", "file_type/2" and
"file_size/2" accept file descriptors as first argument.
* Added a detailed PCN tutorial to the documentation
(doc/PCN-tutorial.txt)
Version 18:
* "map" module: swapped 2nd and 3rd arguments of "delete/4" and
3rd and 4th arguments of "replace" for the same reason to
make them easier to use with argument pairs. This is a
backwards-incompatible change, make sure to review all
uses of these operations in existing code!
* Added library module "json" for parsing and printing JSON data.
* "fmt" module: the "~q" format shows character lists in quoted
string representation, if the list only contains valid UNICODE
code points and newline/tab characters.
* Added "with/2" FGHC form and "with" PCN keyword for establishing
dynamic task bindings, together with "binding/{2,3}" and
"call_handler/1" to access bindings and call goals retrieved
from the environment.
* Added "-c++" option to "fleng" driver script to force compilation
of foreign wrappers with C++ compiler.
* Added "-foreign" option to override name of generated C/C++
wrapper and stub file.
* [PCN] Added directives for embedding C/C++ code.
* Dropped support for out-of-tree builds.
* Added "flengmake", a build tool for projects written with FLENG
(the examples are now built using this tool).
* "flengdoc" uses a pager now to display longer sections of
documentation when running inside a terminal.
* Fixed bug in FLENG backend compiler that caused trivial clauses
to be incorrectly executed in predicates that use optimized table
lookups.
* Added new primitives "counter/1", "setenv/{2,3}", "cpu_time/1",
"isatty/2", "string_to_list/2" and "tuple_to_list/2".
* [PCN] Many primitives can now be used as functions inside
expressions.
* Added library module "binfmt" for binary encoding and decoding
of byte strings.
* Added library module "9p" for writing clients for the Plan 9
"9p" protocol.
* Added several bug fixes for the MacOS X runtime system
(contributed by Kon Lovett).
* Renamed "ezbb" module to "bb".
* "lib" module: "write_file/{3,4}" treats the empty list as a list,
not a string.
* "path" module: fixed bug in "join/2", added "normalize/2" and
"with_root/3".
* "fmt" module: all non-printable characters < 32 are now written
as hexadecimal escape codes in quoted (readable) output; exposed
and documented "parse_format", "format_chunked" and
"format_chars_chunked".
* "proc" module: added "shell/1".
* "scan" module: "delimited_with_escape" handles now "\xXX"
sequences.
* The code generation pass of the FLENG-to-assembler compiler stage
has been optimized, which reduces overall compile times
significantly.
* Output of (heap-)statistics is forced once before normal termination.
* [FGHC] Added "rewrite/2" declaration which allows simple
term-rewriting to be performed with user-defined rules.
* [FGHC] Normal (non-pair) access to pair-variable uses current
value, not the one initially set on clause entry.
* [FGHC] "array/1" guard was not recognized.
* Added "short" array type, renamed "byte" array type to "char",
renamed "int" to "long" and added explicit "int" (32 bit) type.
* [PCN] Fixed bug in compilation of "fmt:format/3".
* [PCN] Generalized definition targets to allow multiple indices.
* [PCN] Added "short" mutable variable type, renamed "byte" to "char",
renamed "int" to "long" and added explicit "int" (32 bit) type.
* [PCN] Added "+=", "-=", "*=", "/=", "%=", ">>=", "<<=", "&=", "|="
and "^=" assignment statements for argument pairs.
* [PCN] Reduced redundant forcing of variables used in complex
arithmetic expressions and optimized code for box-references.
* [PCN] Fixed the order of the index incrementation for mutable
quantification variables.
* [PCN] Added "variable pair" notation and "++" operator for more
convenient passing and transforming state and streams.
* [PCN] The PCN translator signals an error now if a definition
expression refers to the defined variable.
* Quoted strings and character lists allow hexadecimally encoded
characters using the \x and \u escape sequences.
* "array:put" didn't handle the empty list as an empty element
sequence.
* "array" module: added "resize/{3,4}", "search/{3,4,5}", "map/{5,6}",
"unmap/{1,2}", "synchronize/{3,4}" and "write_utf/{4,5}"; "copy"
unifies its confirmation argument with the index following the
copied section.
* "list" module: replaced "getprop" with "assoc/{3,4}"; fixed bug in
"join" that caused extra separator at end; added "join/3".
* The system can now be built without OS-thread support, if desired,
by passing "--disable-threads" to the configuration script.
* Added support for BTI/IBT instruction generation on x86_64 and
AArch64 architectures for platforms that enforce this (currently
only enabled for OpenBSD 7.4 or higher).
* Fixed bug in runtime library that would cause a segfault on
platfoms that don't allow read access from the ".text" section.
* Fixed usage of assembler on platforms that require use of internal
clang assembler.
* Examples are installed along with the rest of the documentation,
including makefiles and required assets.
Version 17:
* Fixed bug in building SDL interface from distribution tarball
(thanks to Adrián Arroyo for helping to track this down).
* The "pcn2fl" binary was not properly installed.
* Various bugfixes in RISCV runtime and compiler backend.
Version 16:
* Added an interface to SDL2 for basic graphics programming, a structured
graphics package ("ezd"), including a library for simple UI construction
and many examples demonstrating these new libraries.
* Fixed some problems with the FLENG inline assembler, added inline
assembler support to the PCN compiler.
* Removed primitive "list_to_number/3" and added "list_to_integer/{2,3}".
* List->number conversions assign the string "error" as result
instead of aborting with an error if the list does not contain
valid characters.
* Added new primitive "dbgwrite/{1,2}".
* Added new library module "sec", which provides "unveil" and "pledge"
system calls (if on OpenBSD) and dropping of process privileges.
* "list" module: added "nth/3" and "suffix/3".
* "map" module: "list_to_map/2" now also accepts 2-element tuples in
the input list.
* Added "-a" flag to show intermediate representation of compiled code.
* Logging output now always prints floats with a decimal point.
* "program_name/1" has been changed to assign a string, not a character
list.
* Average cell usage statistic was incorrectly computed.
* Fixed computation typo in definition of TUPLE_LENGTH.
* Fixed ref-counting bug for array slices when forwarded to the
thread that owned the original array.
* Switch to data section for lookup tables has been disabled for x64
on Mac due to problems with generated relocation entries.
* [PCN] Fixed off-by-one error in index check for indexed tuple
references.
* [PCN] Index expressions ("[...]") support lists now.
* [PCN] Added experimental attribute expressions ("<id>.<id>").
* [PCN] Added support for definition statement of indexed tuples or lists.
* [PCN] Assignment to array element did not compile index expression
properly.
* [PCN] Added "``...``" syntax for procedure references.
* [PCN] Added "let" syntactic suger for checked destructuring.
* [PCN] "abs/1" in expressions was not correctly parsed.
* [PCN] Lambda-expressions now are specific to the current module.
* [PCN] Array sizes must now be literal integers or references to
mutable variables, as a size given via an unbound defintional
variable would result in a run-time error.
* [PCN] Quantification end range expressions where not correctly
parsed.
* [PCN] Fixed duplicate variables in task-creation wrappers for sequential
compositions.
* [PCN] Fixed bug in PCN parser that caused module-qualified function
calls to be rejected.
* [PCN] Variable usage tracking for choice compositions wasn't
working properly, resulting in missing or bogus warnings for
singleton variables.
* [PCN] Variable liveness analysis for complex argument expressions
to foreign C function calls was broken and resulted in deadlocks
at execution time, due to unknown and thus unbound variable references.
* [PCN] Fixed further liveness analysis bugs in complex array index
expressions and non-trivial quantification ranges.
* [PCN] Fixed compiler bug that could cause uninitialized environment
slots for singleton arguments.
* [PCN] Added support for the type tests "remote", "module", "known"
and "unknown" in choice clauses.
* [PCN] Added some compiler primitives for generating more efficient
code for PCN programs.
* "array" module: added "pack/4" and "unpack/4". "array:put/4" stores
next untouched index in confirmation argument.
* "io:read_lines_bounded" didn't close the chunk-reading input
stream on EOF, resulting in deadlock.
* Pass linker options to disable BIT/IBT on OpenBSD, if supported.
* Replaced some uses of certain libc functions to avoid patronizing
OpenBSD linker warnings.
* Special thanks to Kon Lovett for detecting several build problems
and bugs in the Mac-specific runtime library.
Version 15:
* [PCN] Fixed a bug in the PCN translator that handled pre-translation
of "fmt:format/3" incorrectly.
* Fixed a bug in the FGHC translator that caused variables to be
clobbered that where introdcued by previous guards in the same
clause.
* "return" in lambda-expressions is handled properly.
* "list" module: added "zip/3" and "search/3".
* Exposed "unify/3" as FGHC and PCN primitives.
* Added "array" type test for FGHC and PCN guards.
* [PCN] fixed missing or broken translation of certain expression
operators.
* [PCN] fixed translation of zero-argument expression operators
("rnd/0").
* [PCN] removed limitation of maximally 5 arguments to C calls.
* [PCN] fixed implicit boxing foreign argument passing for certain
cases.
* [PCN] The "exports" directive is now explicitly disallowed in PCN
code, as it is not suited to the way generated FLENG code is
indirectly called.
* [PCN] Exposed "port", "number" and "real" tests for guards.
* [PCN] Trying to call a foreign function remotely (via "@") is
detected by the compiler now.
* [PCN] Added "nodes()" builtin function.
Version 14:
* Added a translator from "PCN" to FLENG, a language in the
tradition of Strand, but with a more conventional syntax.
PCN (Program Composition Notation) is fully interoperable with
FGHC/Strand code and is equally expressive, but may be easier
to approach for those unfamiliar with Prolog syntax.
* "fmt:format/3" has been changed to take file-descriptor, a
format string and an argument list. This is deemed more useful
but is incompatible to older versions of this library.
* Replaced the "mem" library module with the "array" library,
which provides the support numerical arrays for various
number types and automatic release of unsed memory.
* Increased the maximum number of listeners to 64.
* Added primitive "thread_resource_usage/3", thanks to Kon Lovett
for contributing a MacOS-specific version.
* Added library primitive "file_modification_time/2".
* Added primitive "call_detached/2".
* All heap-traversals only include the currently allocated
chunks, not the full, unused heap.
* Allocation of floats on arm32 could incorrectly signal heap
exhaustion even in the case of still available heap space.
* Fixed various typos and broken examples in the manual
(thanks to "kenaryn" for reporting these).
* Ensure proper flags are passed to C compiler and assembler
on Linux to disable executable stack, which avoids linker
warnings (thanks to "kenaryn").
* Lookup- and jump tables have been moved into the ".data" section
to allow execution in "xonly" environments like newer versions
of OpenBSD.
* Many documentation improvements and additions.
* Fixed bug in "flengdoc" that didn't close files properly for
updated index-entries in the reference docujmentation database.
* Module objects can be sent between threads.
* Specifying an invalid argument mode in "mode" declarations
produces a meaningful error message.
* Dropped the "-n" compiler option.
* Added "-l" option to driver script to force compiling for a
specific source language.
Version 13:
* Added the "flengdoc" tool to create and query a reference
documentation database for all built-in and library predicates.
* New library modules: "match", "path", "find", "ucs" and "spec".
* Inconsistencies with non-latin letters in terms have been removed,
so source code can now contain arbitrary unicode characters.
* Clause indexing is now performed for any of the argument
positions 1 to 4 (or 1 to 3 in predicates with arity > 5),
depending on which position provides the best opportunity for
eliminating matches on argument type.
* Added secondary clause indexing for integers, generating
either a lookup table or a computed branch, increasing dispatch
performance and reducing needless matching.
* Clause selection has been optimized to dispatch first on atomic
arguments before performing normal sequential argument matching.
* Added "trace/{1,2}" to enable logging for specific tasks.
* Sometimes stale entries on the suspension stack could cause
bogus deadlock errors, the stack is now cleared on entry in
a resumed clause.
* On deadlock, the debug info for suspended clauses are shown
in the error message.
* Renamed FFI stub file name generated by driver script to
"<basename>-foreign.o".
* fghc2fl warns if mode declarations refer to non-existent
definitions.
* Fix crash when "arguments/1" declaration is used and additional
runtime-arguments are incomplete.
* Module uses are inferred now from all detectable call goals.
* The compiler produces a warning when multiple "intialization/1"
declarations are present.
* The compiler provides more meaningful error messages when
encountering invalid terms while expanding FGHC code into FLENG.
* "set" module: added "subset/3".
* "list" module: added "characters/{2,3}", "split/3", "trim/3" and
"get_prop/4", fixed broken "trim_right".
* "io" module: exposed "parse_lines/2", fixed invalid 1-character
lookahead after line-terminator in "read_lines/2".
* "app" module: "foreach/{2,3}" executes each goal in a task and
in sequential order.
* Position-independent code is now generated on all platforms.
* I/O error results are represented by a 2-element tuple,
the error number and a string holding the textual representation
of the error.
* The list of free cells is now initialized in chunks, which
reduces startup time and does not touch memory pages until
they are actually used.
* Increased default heap size to 10 MB.
* Statistics output includes peak and average memory usage.
* If the argument to "+LOGFILE" starts with "+", then output
will be appended, otherwise the file will be truncated.
* "@>=/2" and "@=</2" returned wrong result when arguments where
equally ordered, fixed bug in "@=</2" on 32-bit Arm.
* Certain primitives, when given an explicit variable as confirmation
argument expand into simpler code when used with the "&/2"
operator.
* Added the "-check" option to the "fleng" driver script.
* "get_module/2" returns the empty list if a module can not be
found instead of aborting with an error.
* Added new primitives "ticks/1", "fdup/{2,3}", "mkdir/{1,2}",
"nl/{0,1}", "program_name/1" and "directory/{2,3}".
* "app" module: added "filter/4", "maplist/4" and "compose/3".
* Parsing octal and binary number syntax in code used the wrong
numeric base.
* Handling of "otherwise" clauses now delays suspensions in the
clause head to ensure correct semantics.
* Fixed the order in which suspensions were handled, the previous
method could omit matching clauses in certain "deep" matches
of incomplete structured data.
* Fixed the interaction between "global" and "put_global" when
"global" refers to a not yet assigned global variable.
* Fixed bug in "utf_decode/3" when encountering a not completely
bound sequence.
* Fixed deadlock in "fghc2fl" on certain malformed module calls.
* Fixed reaping of child processes on BSD systems.
* Fixed a bug in the compiler that caused registers that hold
temporarily created structures during foreign calls to be
restored in the wrong order.
* Fixed handling of "otherwise" in clause indexing.
* Fixed library order to avoid linker errors when building
the compiler executables (reported to Martin Littlejohn).
* Fixed forcing of arguments in "io:transfer/{3,4}".
* Fixed bug in runtime system where string-length counts
were incorrectly fetched as signed values.
* "fmt" module: fixed bug in printing empty string in quoted
mode.
* Logging and profiling output now includes the module prefix.
Version 12:
* The FGHC front-end and FLENG compiler have been rewritten in
FGHC and the system is now fully self hosted. This means a
Prolog implementation is not required to build and use FLENG,
even though the system can still be bootstrapped from Prolog.
* "get_global/3" takes a default value as 3rd argument for handling
the case that the global is not yet defined. The old meaning
of the 3rd argument has been removed. This is an incompatible
change.
* Argument-pair expansion for conditional expressions was incorrect
when a pair was passed in only one of the branches.
* "sort" module: fixed totally broken "merge", which resulted in
an unusable "sort" operation.
* "parse" module: several bugfixes.
* "lex" module: handle EOF when scanning operator.
* "map" module: removed "replace/6", "replace" uses unification
for old value instead of assignment.
* "fmt" module: several fixes in formatting of expressions
that resulted in un-parsable text, added whitespace for unary
operators to avoid parsing ambiguities.
* Number to string conversion always adds a decimal point for
floating-point numbers, even if the fractional part is zero.
* Increased the suspension stack to 1024 elements.
* "INTERNALS" was missing in the distribution, but referenced
in the makefile (reported by Benedikt Rosenau).
* Ordering for strings didn't take the strings length properly
into account.
* Create test files in current directory instead of /tmp to
make tests work on termux (reported by Alexander Shendi).
* Removed "provide/2" declaration.
* Support for cross-compilation has been removed to simplify
the build system.
* Argument matching for predicates with arity > 4 has been
optimized and produces significantly more efficient code.
* The FGHC frontend and FLENG compiler accept "-" as in- and
output sources.
* Diagnostic compiler output is prefixed with the proper comment
syntax for the target system.
* Thanks to Kon Lovett for pointing out several bugs in the build
system.
Version 11:
* Usage information did not print the program name correctly.
* Added link to publicly available version of the Strand book
to manual (thanks to Alexander Shendi).
* Overhauled Linux signal handling to be more reliable.
* Dropped "--without-threads" configuration option, the system
now always uses the "pthreads" library.
* "map:replace" inserts entry when no previous one existed.
* "map" module: added "map_to_list/{2,3}".
* "app" module: added "take/5".
* "list" module: added "join/4".
* "proc" module: added "submit/3", "capture/3" and "pipe/4".
* "io" module: added "rate_limited_stream/3".
Version 10:
* The system has been ported to MacOS on M1 CPUs.
* Ordering guards ("@>", "@<", "@>=" and "@=<") now suspend on
unbound variables, as in Strand.
* Removed computation types "@<", and "@>" for "compute/4".
* The conditional operator handles conjunctions of guards in the
condition position.
* Calls to the internal matching primitive didn't preserve the
argument registers which could result in a memory leak.
* Fixed a bug in the scheduler related to idle-suspensions, which
could result in an assertion being thrown.
* Argument pair expansion is handled in conditional expressions
properly.
* Added "global/2".
* The "include/1" declaration accepts lists and doesn't require a file
extension.
* Added "arguments/1" declaration which allows defining run-time
command line arguments at compile-time.
* Removed the "threads" declaration, use "-arguments('+THREADS <N>')"
instead.
* Uses saved program states for the FGHC and FLENG compilers when
SWI Prolog is used, which needs fewer files to install and speed
up startup of the compilers.
* Inlining of simple predicates is now done.
* Calls to standard libraries provided by the base system are
now faster by using predefined "entry-point" information.
* Added compiler options "-e" and "-link" to create and use entry-point
information in user code.
* "app" module: added "any/3", "every/3" and "sequence/{4,5}".
* Most higher-order predicates from the "app" module are now
expanded in-line to avoid dynamic goal lookup and invocation.
* Obviously circular variable references in assignments and unifications
generate a compile-time error now.
* "list" module: added "last/2", "delete/3", "prefix/3" and
"reverse/{2,3}".
* "io" module: added "write_lines/3".
* "mem" module: added "copy/{4,5,6}" and "get_blockwise/4".
* "append/{2,3}" and "member/3" have been moved into the "list"
module and must now be invoked with the "list:" module qualifier.
* "kill/3" unifies its last argument with "error(ERRNO)" on failure.
* "&/2" expands into in-line task creation for local calls thus
avoiding dynamic lookup.
* The GHC->FLENG-translation catches redefinitions of certain internal
operators.
* Releasing long variable-chains tries harder to reduce stack-pressure.
* Increased default heap size and goal-buffer to 5MB and 100k,
respectively.
* Fixed bug in "io:transfer/4".
Version 9:
* Added support for Mac OS X (Darwin) on Intel hardware.
* Added the "foreign/1" declaration which automatically generates
C wrapper code for foreign function invocations and foreign struct
accessors.
* Added primitives "halt/0", "statistics/1", "heap_statistics/1",
"write/{1,2}" and "unify_with_occurs_check/3".
* Added guard "remote/1".
* "unify/3" now performs a "safe" unification: bound variables during
recursive unification are undone if the full unification fails.
* Moved result argument in "unify/3" to the end position for consistency
with other primitives.
* Added "->"/2 conditional expression operator.
* Added memory consumption of floats and port objects to heap
statistics log.
* Expansion of extended pair arguments using "+" notation was not
performed correctly in all situations.
* "=:=/2" and "\=:=/2" guards did not force their arguments.
* Fixed two memory leaks in the remote-variable protocol - remotely
accessed variables where not reclaimed after they were resolved
(Thanks to "a88" for test code that triggered these leaks.)
* Fixed bug in ordering-comparison of floating-point numbers.
* Fixed bug in low-level implementation of struct-field accessors
that resulted in a memory leak.
* Fixed stack-handling in the RISCV runtime system.
* Invalid numbers in string-to-number conversion are properly shown
in error messages.
* Fixed bug in float-detection code used in string-to-number conversion.
* Fixed an invalid float-value allocation that could cause misaligned
float values on 32 bit platforms.
* Decoding of UTF input streams performed overly long lookahead.
* Fixed possible stack-misalignment in thread setup.
* Added a workaround for implementations of "kqueue(2)" that do not
detect EOF in input files (NOTE_EOF), which would result in
hangs when repeatedly reading from files.
* Added "module/1" declaration.
* The execution statistics of synthesized predicates generated by
the FGHC/Strand->FLENG translation are now merged with their
parent predicates in profiling reports.
* The documentation for "kill/{2,3}" had PID and signal argument
swapped.
* "proc" module: the exit status of a process terminated by a
signal is reported as a negative exit code.
* "proc" module: renamed "read/2" and "write/2" to "capture/2" and
"submit/2", respectively.
* "list" module: added guards to "cut/5", "take/4" and "drop/3"
that are needed to make them deterministic, added "scan/5",
"search/5", "trim_left/3" and "trim_right/3".
* "map" module: added "lookup/4".
* "io" module: added "transfer/{3,4}".
* "scan" module: added "word/3".
Version 8:
* A git(1) repository of the sources are available now at
https://gitlab.com/b2495/fleng
* Fixed creation of "version.pl" when building with the sources
retrieved from the git repository (reported by "matekai").
* The FGHC front-end now accepts Strand source code, which can be
considered a subset of FGHC.
* Added ":=/2" operator.
* Block comments ("/* ... */") are now officially supported.
* Strand's "machine" and "exports" declarations are accepted.
* Renamed "float/1" guard and expression operator to "real/1",
for concistency with Strand, renamed "float_integer_part/1"
and "float_fractional_part/1" accordingly. The old names are
still valid but deprecated.
* Added "struct" declaration for convenient generation of tuple-field
accessors.
* The "occurs check" to detect circular references when
unifying variables is no by default disabled due to the
signifcant performance impact. It can be enabled at run-time
using the "+OCCURS_CHECK' runtime option.
* Renamed "string_to_float/2" to "string_to_real/2". The old
name is still supported but deprecated.
* Added primitives "real_to_list/2" and "list_to_real/2".
* Added support for module data type: added "module/1" guard.
* Added module-related primitives "get_module/2", "module_name/2",
"module_exports/2" and "all_modules/1".
* Added Strand's "run/2" primitive.
* Added support for KL1 "extended pair" notation.
* Added "chdir/1", "chmod/2", "close_file/2", 'delete_file/2",
"randomize/1", "rmdir/1", "deref/1", "cancel_timer/1",
"restart_timer/2", "signal/2", "kill/2" and "kill/3".
* "signal/2" also accepts an integer instead of a signal name.
* "randomize/2" did not fully derefence the seed argument.
* "list_to_tuple" was not handling tuples of length one correctly.
* Sequencing using the "&/2" operator where the first form is
a primitive with an optional confirmation argument is
compiled in a more efficient manner.
* Sequencing a compound term like "(X, Y) & Z" now does the
correct thing by executing X and Y in parallel (it was previously
treated like "X & Y & Z").
* Invalid expression operators and constant computations now
trigger a more meaningful error.
* Removed requirement for static linkage on Linux systems that
are based on musl libc (e.g. Alpine).
* Fixed handling of addresses in AArch64 assembly (runtime and
geenrated), which could confuse the runtime-linker on Linux.
* Handle "otherwise" guard before any other guards in the same
clause to ensure textually preceding clauses are fully matched.
* Repaired broken handling of profiling information and combined
yield/listen counters into one.
* Fixed nonexistent handling of SIGPROF on Linux.
* Documented "-cflags" and "-libs" options to "fleng" driver
script, also added missing description of "-p" to man page.
* "parse" module: renamed "parse_expression[s]" to "parse_term[s]",
added "parse_term_list/{3,4}", made "vtag" argument optional
(defaults to thread ticks). "parse_terms" also accepts a file
descriptor as input argument, now.
* "app" module: added "foreach/2'.
* "list" module: added "slice/5".
* "set": added "equal/3".
* Added "scan" parser library module.
* Fixed bug in unification of remote-port instances.
* Fixed a bug in the compilation of head-matches that could cause
faulty ref-counts in certain situations.
* Conversion of strings and character-lists in primitives didn't
check argument types thoroughly enough.
Version 7:
* Added a statistical profiler for FGHC/FLENG code, with new
compiler option "-p" and runtime option "+PROFILE".
* Fixed a bug in nested matching of structured terms where inner
data calls could incorrectly succeed in the presence of
suspensions.
* Fixed a bug where signal-handling could cause hanging on Linux.
* Fixed a ref-counting bug in local assignment of remotely
exposed variables.
* Added "rnd/1" computation and expression function.
* The "--" after initial runtime options on the command line of
compiled programs was not correctly skipped.
* Functions for accessing thread-global variables have been
exposed to be usable from foreign code.
* Added "mode" and "provide" declarations.
* Added manual page for runtime options fleng(7).
* "fmt" module: dispatching for "~s" format-spec was ambiguous
at could result in wrong matches.
* "mem" module: most operations got an optional index argument.
Version 6:
* The translation of FGHC guards to FLENG has been fixed to
correctly implement the semantics of clause-resumption in the
presence of multiple complex guards. This both simplifies the
compiler and produces more efficient code.
* RISC-V (RV64IMAFD) is now supported as a target architecture
(experimental).
* Support for "tasks" was added, which allows (possibly nested)
groups of processes to be run with a way of getting information
when all processes in the group have completed execution.
* Process cleanup is now done properly when the last thread
terminates normally.
* When cross compiling by using the "--target" configuration option,
the operating system is inferred from the target triple.
* When cross compiling, no compiler checks are done during
configuration.
* "apply/2" and "call/1" now allow direct invocations of primitive
goals by synthesizing intermediate goals as necessary in most cases.
* Added new primitives "merger/2", "call{2,3}", "environment/1" and
"file_size/2".
* Arithmetic expressions and "compute/{3,4}" have been extended to
support "tan", "log", "exp", "**", "atan", "sign", "abs",
"float_integer_part" and "float_fractional_part" math operators
convering all functions required by ISO Prolog now.
* Added the "&/2" operator to conveniently run goal sequentially
using tasks.
* "file_type/2" unifies the result with an error indicator on
failure.
* Bugfix in ordering relation for tuples with different head.
* Fixed an unhandled corner case when a variable owned by another
thread was locally bound while the read-request is still pending.
* Fixed a bug where event-listeners on Linux could get lost when
another event was triggered.
* The implementation of "idle" guards has been overhauled
to work properly when used with other guards and in combination
with other possibly suspending clauses in the same group.
* Ordering comparison for floats was broken.
* Fixed some bugs in the assembler runtime for ARM.
* The FGHC compiler issues warnings for some cases where goal
head arguments are overlapping and no "otherwise" clause is
used.
* "uses" declarations are not needed anymore when a process is
invoked directly for an external module. "uses" is still
required when dynamic calls are used and the target is a
computed goal.
* "fmt" module: writing the empty list using the "~s" format
specifier writes an empty string.
* "io" module: "io:read_lines/2" handles lines terminated by
CR+LF transparently. Added "io:read_lines_bounded/3".
* "map" module: "map:keys/{2,3}" and "map:values/{2,3}" return
their results in order, sorted by keys.
* "app" module: added "app:take/4" and "app:drop/3".
* "list" module: added "list:iota/{3, 4, 5}".
* "mem" module: added some more predicates.
* "proc" module: added "proc:execute/2" and "proc:shell/2".
* Division by zero on x64 caused segmentation fault instead of
aborting with error.
* Added "-cflags" and "-libs" options to the "fleng" driver script.
* Several performance improvements.
* The use of native threads can be disabled at configuration time.
* Added a new chapter to the manual with some useful programming
tips.
Version 5:
* Changed licensing to public domain.
* Added "-I" option to "fleng" to add include paths.
* Added "thread/1" declaration to hardcode number of threads.
* General tuple syntax ("{...}") is now supported.
* Moved "write_char_stream/2", "write_byte_stream/2",
"read_char_stream/2" and "read_byte_stream/2" into a separate
library ("io"), added "read_lines/2", and "read_byte_stream_chunked/3".
* "signal/3" keeps the signal handler active and delivers a stream
of counts.
* Dropped "get_module/2", it has no real use.
* New primitives "idle_thread/1", "get_global/3", "log/2",
and "restart_timer/3".
* Extended "fleng-utils.h" with some functions to construct
character lists and convert string-like objects to C-strings.
* "app" module: added "mapreduce/4".
* Debug info used for logging is now restricted to modules compiled
with the "-d" option.
* Inline-caches for holding module-resolutions of explicit inter-module
calls are now shared, so the first call will resolve all additional
calls to the same predicate appearing in the current module.
* C runtime is now compiled with "-fwrapv -fno-strict-aliasing" for
correctness.
* Unification using "=/2" is now checked in FLENG as well as in
FGHC.
* Format strings in calls to one of the "fmt:format" predicates
are now precompiled to give better error detection and reduce
the parsing overhead at run time.
* "file_exists/2" did not force the filename argument correctly.
* Fixed totally broken event-processing on Linux.
* "fmt" module: removed variant of "format/3" with the first arg being
a file to make it less ambiguous (required for format-string
precompilation).
* "list" module: added "split/4" and "scan/4".
* "parse" module: renamed "parse_module/4" to "parse_expressions/4",
fixed a bug in "parse_expressions/4" that caused an error on end
of input.
* "sys" module: added an additional parameter to "attach/3", added
"detach/3".
* "proc" module: added "write/2" and "pipe/3", renamed "capture/3" to
"read/2".
* Conversion of numbers using "number_to_list/4" was broken for bases
greater than 10.
* Matching of complex ground literals in clause heads is now more
time and memory efficient.
* "cancel_timer/2" detects now when the timer already expired.
* The default stack size for threads uses a fixed value (500kb) instead
of using the system default.
* The "plot" script did not handle multiple runs correctly, now only
the last run in a log file holding data for separate runs is used
for plotting data.
* Stack usage is somewhat reduced when releasing large data structures
that can be gbarbage collected.
* If forwarded data exceeds the available space for inter-thread
messages a placeholder variable is used to retrieve the rest on
demand.
* "Detached" message port files are cleaned up on termination.
* Fixed processing of signals on Linux when a process sleeps,
waiting for events.
* The error for a missing process definition shows name and arity in
the error message.
* "halt/1" does proper termination clean up.
Version 4:
* Added "+LOGX" runtime option to only log explicit calls to "log/1".
* The values for the runtime options "+HEAP" and "+GOALS" accept
multiplier suffixes.
* In FGHC "=/2" signals an error when unification fails.
* Added the "list" and "app" library modules.
* Added "max/2" and "min/2" expression operators for "is/2" and
"compute/4".
* Added support for periodic timers ("clock/3").
* Added "include/1" declaration (for both FLENG and FGHC).
* The FGHC->FLENG and FLENG->ASM compilers can now be run under
the "YAP" Prolog system.
* The assembler code generated for x86-64 now produces AT&T syntax
and can be assembled with the GNU assembler, so "nasm" is not any
longer needed.
* The "fleng" script allows specifying the linker to be used to
produce the final executable.
* Added the "apply/2" primitive as a more flexible method for
producing calls at run time.
* Allow a variable in goal position as a shortcut for "call/1".
* Added new primitives "compare/3", "append/2", "write_byte_stream/2",
"write_char_stream/2", "delete_file/2", "rmdir/2" and "chmod/2".
* "fleng.h" and "fleng-utils.h" can now be used in C++ code.
* Renamed "write_block" and "read_block" to "write_file" and
"read_file", respectively.
* Fixed several bugs in the "map" library module, added
"list_to_map/{2,3}".
* The "plot" utility scales the X axis to make the output more
readable and also accepts the "-max" option to control the scaling.
* Logging and debugging output cuts off output once it reaches a
certain length.
* Unification performs an occurs-check to avoid creating circular
references.
* Fixed padding bug when interning strings.
* Each thread has its own internal string buffer for temporary
strings, as it should be.
* "open_file/3" now properly opens existing or creates new files.
* Added "keysort/2" to the "sort" library module.
* Added support for exposing a thread's message port to allow
(reasonably) simple inter-process communication (see the "sys"
library module for details).
* Fixed a bug in the scheduler that caused excessive delays when
continuously waiting for input events.
Version 3:
* Added support of AArch64.
* Several bugfixes in Linux event-handling code.
* Corrected detection of "-no-pie" to only apply to x86-64 in
configuration script.
* Fixed installation when used in combination with SWI Prolog.
* Fixed incorrect translation of "otherwise" FGHC guards when combined
with other guards.
* Added primitives "string_to_byte_list/3", "cancel_timer/2", "chdir/2",
"file_exists/2", "getcwd/1", "getenv/2", "file_type/2", "readlink/2",
"get_global/2" and "put_global/3".
* Changed "timer/2" to "timer/3', which produces an additional identfier
result.
* Increased message-port size to 4kb.
* Added support for detached message ports (see "sys.ghc" for more
information).
* Fixed "length/2", which was totally broken for lists (doh).
* Threads could sometimes terminate too early, even with inter-thread
messages still being in flight, a more robust algorithm tries to ensure
that threads never shut down while messages are still pending processing.
* The empty lists is now treated as a empty (null) string, when used
as argument to a primitive that requires a string or character list.
* Character lists were not correctly dereferenced when containing variable
references in primitives that require strings or character lists.
Version 2:
* Typo fix in "configure" script (reported by Mario Goulart).
* Added missing "VERSION" and "fleng.mdoc" files to distribution
archive (reported by "sytse").
* "-no-pie" is added when generating executables on all platforms
if the C compiler supports it (reported by "sytse").
Version 1:
* Initial release