-
Notifications
You must be signed in to change notification settings - Fork 5
Home
Welcome to the HNC wiki!
HNC stands for HN compiler. HN is a tool to facilitate writing C programs. It is a macro language for C. It is not embedded in C but uses a new syntax and a new type system to express C programs. It can be used by humans to prototype programs or separate functions in C or as an intermediate language for C generators.
We hope that an advanced type system of HN and an ability to create reusable polymorphic control abstractions will improve productivity of C developers. The language design allows generation of quality human-readable programs so in some scenarios developers will be able to pretend that they don't use HNC but write their C code directly.
If HN proves useful, we plan to write several tools on top of it:
- a compiler for a concurrent language for massively parallel supercomputers, in the spirit of SISAL;
- ports of HN to languages other than C, e.g. PHP and Javascript;
- further improvements of the language, e.g. quasi-quotation, regions, pi-sigma type system.
When it's is ready,
fold f x0 l =
x = x0
p = l
while *p != NULL
x := f x *p
p := p->next
x
x = fold (\x y -> x + y + 1) 0 l
will get expanded into
int x = 0;
list_int *p = l;
while (*p != NULL)
{
x += y + 1;
p = p->next;
}
A key point is that control abstractions such as the one provided by the fold
macro
above, though ubiqutous in code, cannot be abstracted away in C. Also note less
punctuation, a full polymorphic type inference and genuine C memory model.
HN0 is the first version of HN language, having the very minimal set of constructs: a primitive macros working as always inlined higher order functions, an assignment, effectful statements, imperative control structures (while
and if
).
SPL stands for "Stream Programming Language" and is another syntax for a functional subset of HN0, inspired by J language. SPL and HN0 will share the same optimizer and back-end.
HNI stands for "HN Interface" and describes external C functions and constants used in HN programs.
C++ is an evil language used at early stages of HNC development. Before the inliner and monomorphizer are ready, we use C++ classes, templates and libraries to express scopes, parametric polymorphism and lexical closures respectively. In the future, the output will be old good ISO C99. A few evil features (namely, a limited template polymorphism and RAII) will be optionally available to the poor people writing in C++9x instead of C99.
This is a guideline for contributors to start working on the project. Note that most issues in our tracker don't require a deep understanding of the Haskell type system extensions, HOOPL, UUAGC or Parsec.