aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: 6dc4086804f78c4ad952d194e9ad7d0f47daf270 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Amalgam
Amalgam is written in c89 C standard to work on as many devices as possible and with many different compilers,
which would allow you to compile amalgam with a compiler that generates smaller (static) binaries than gcc.

Amalgam is not meant to be a replacement for any other language but rather a new unique language for programming
with gpu without writing an external gpu program (glsl/hlsl).

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
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.
# 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.
# 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.
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. Otherwise large programs (as large as chromium) will need gigabytes of ram to compile.
# 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.
# Development
Define `AMAL_MUTEX_DEBUG` in src/thread.c to enable mutex debugging.\
Set `PEDANTIC` environment variable to 1 before compiling to enable pedantic mode.\
Set `SANITIZE_ADDRESS` environment variable to 1 before compiling to run compile with asan.\
Set `SANITIZE_THREAD` environment variable to 1 before compiling to run compile with tsan.\
Set `SCAN_BUILD` environment variable to 1 before compiling to run scan-build on the source files.