aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2019-09-09 01:08:34 +0200
committerdec05eba <dec05eba@protonmail.com>2020-07-25 14:36:46 +0200
commit16aaaa19a3ef4220726007d3e644ced0c9e06513 (patch)
tree6a7c2fc91bc362559b079afbb10dc247d7bcbae0 /README.md
parentde48503aef098d855754ab6f85558402130188d7 (diff)
Allow referencing code in imported file (right now for function calls, allow calling a function in another file)
Diffstat (limited to 'README.md')
-rw-r--r--README.md47
1 files changed, 30 insertions, 17 deletions
diff --git a/README.md b/README.md
index 2760c93..2668852 100644
--- a/README.md
+++ b/README.md
@@ -9,32 +9,45 @@ Files have to be in utf-8 format and can optionally have utf-8 BOM.
## Important
Amalgam is not ready to be used yet.
# Fast compilation
-Every stage of the compiler is multithreaded and data copy is kept to a minimal, for example tokenization
+Every stage of the compiler runs concurrently, each compiling different files. Memory copying is kept to a minimal, for example tokenization
is done without storing tokens in a list. Almost all allocation is done using an arena allocator that
is only cleaned up once (when the compiler is finished), and the data is allocated sequentially.
+Locks are only used in one place in the whole compilation stage, during @import statements.
# Dependencies
Right now only the C standard library (C89) is required for a release build. In the future dependency on the C standard library might be removed
and then amalgam would have 0 dependencies.\
python2 is needed for tests to run additional code analyzis.
+# Limits
+Amalgam places limits on code for performance reasons. These are the limits:
+
+* One file can't have more than 254 imports, have more than 2^16 functions or use more than 2^16 functions.
+* Every function can only use up to 2^16 registers and parameters (combined).
+* Every function can only have up to 128 parameters and 128 return values.
+* Exported and external function can only have 0 or 1 return values, as that is what C supports.
+
# TODO
-Build with -nostdlib and replace use of libc with syscalls (on linux).\
-Don't parse files unless the variable they are assigned to (with @import) is used. This is useful when only using small parts of a library.
+* Build with -nostdlib and replace use of libc with syscalls (on linux).
+* Don't parse files unless the variable they are assigned to (with @import) is used. This is useful when only using small parts of a library.
This could be done checking if an AST expression is referenced before evaluating it. There would then need to be a compile option
that compiles everything even if not referenced, since another user of the program/library may use the functions that are not used in your program
-and they might have compile-issues.\
-Align machine code to word boundary for the start of functions. No need to pad with NOP, as functions return before the padding.\
-Use const to cleanup ANSI C style variable declarations, since const allows you to declare and assign variables on the same line.\
-Make the bytecode work with big endian. On a big endian machine, the bytecode should be converted to little endian
-to make work on little endian as little as possible, meaning it would be a small penality to use big endian.\
-Verify all members of an extern struct are extern as well. Verify all parameters are of extern types for extern functions.\
-Verify all code execution paths in a function return a value, if the function excepts return values.\
-Show compile error if the result of a function call is ignored.\
-Show compile error if function result type and assigned to variable have different types.\
-Show compile error if variables are assigned to but not used.\
-Push arguments in reverse order (right-to-left, cdecl) (in program.c, since on windows we will need to support stdcall which is left-to-right).\
-After tokenizing files, unload file data to disk if possible.\
-Parallelize program decoding, if there is an advantage to doing it.\
-Logical AND binop should skip expressions the moment the result becomes false.
+and they might have compile-issues.
+* Align machine code to word boundary for the start of functions. No need to pad with NOP, as functions return before the padding.
+* Use const to cleanup ANSI C style variable declarations, since const allows you to declare and assign variables on the same line.
+* Make the bytecode work with big endian. On a big endian machine, the bytecode should be converted to little endian
+to make work on little endian as little as possible, meaning it would be a small penality to use big endian.
+* Verify all members of an extern struct are extern as well. Verify all parameters are of extern types for extern functions.
+* Verify all code execution paths in a function return a value, if the function excepts return values.
+* Show compile error if the result of a function call is ignored.
+* Show compile error if variables are assigned to but not used.
+* Push arguments in reverse order (right-to-left, cdecl) (in program.c, since on windows we will need to support stdcall which is left-to-right).
+* After tokenizing files, unload file data to disk if possible.
+* Parallelize program decoding, if there is an advantage to doing it.
+* Logical AND binop should skip expressions the moment the result becomes false.
+* Reorder functions and imports by how they are used. Functions and imports that are used in some files
+should be in the bytecode before the files that they are used from, to reduce deferred function calls.
+* Document all limits.
+* To remove some overhead that external variables have on LhsExpr, make a ExternLhsExpr type.
+* Make function calls work for functions that return no value or returns multiple values.
# Documents
Documents are located under doc. The file doc/Documentation.md is generated from source files by running doc/doc_extract.py
but there is no need to run this script unless you are modifying documentation in the source.