HNC is buildable by both cabal sandbox
and stack
, on Windows, Linux and MacOS, in 64 or 32 bits.
stack update
stack setup
stack install
$(stack path --local-bin)/spl-hnc -O hn_tests/euler6.hn
cabal update
cabal sandbox init
cabal install
.cabal-sandbox/bin/spl-hnc -O hn_tests/euler6.hn
On Arch you can shorten build time by using prebuilt libraries from ArchHaskell project.
Add 2 ArchHaskell binary repositories (haskell-core
and haskell-web
) to pacman.conf
. Install
the following prebuilt packages from there to avoid building them. GHC comes
as a dependency.
sudo pacman -S cabal-install haskell-{adjunctions,haskell-src-exts,hunit,logict,parsec,quickcheck,safe}
Proceed to the general compilation steps for Cabal sandbox described above
- run tests (
spl-test-hunit-exe
is the primary suite) - read wiki
- talk to me at https://gitter.im/nponeccop/HNC
- run our main test suite (
dist/build/spl-test-hunit-exe/spl-test-hunit-exe
) - run
hnc
with either-O
or--dump-opt
option to see our first attempts at optimization - follow instructions below to feed generated
.cpp
files to a C++ compiler and linker either directly or by using our extension to Boost.Build.
You'll need MSVC/GCC, Boost and Boost.Build.
HNC is an open-source cross-platform compiler based on modern technologies: Glasgow Haskell Platform, UUAGC attribute grammar preprocessor, Parsec parsing library, HOOPL graph optimization library, unification-fd structural unification library. The codebase is tiny: less than 4 KLOC, in the spirit of VPRI Ometa.
Many HN programs can already be compiled into an ugly functional subset of C++ and
then into executables and run (see hn_tests
folder for .hn
sources and .cpp
targets).
A UDP echo server and a few Project Euler problems are the only useful programs so far,
but mostly because we are too lazy to write more examples.
- Parser
- Type inference using UUAG, including injection of explicit template parameters when C++ doesn't infer them
- Identifier- and scope-preserving translation from AST into graph IR and back using HOOPL dominator analysis
- An optimizer of the IR using HOOPL (almost; only inlining and dead code elimination)
- Compiler of closures into C++ functors using UUAG (almost)
- C++ pretty printer (almost)
- A Boost.Build plugin to integrate .hn files into C++ projects
- Split Parser and Unifier into separate self-contained components
- Joined efforts with https://groupoid.space and https://github.com/ptol/oczor projects
- Working on extracting other components to make HNC a sort of toy compiler construction framework
- Working on loop generation
- Fixed almost all optimizer bugs
- Proper error reporting
- Assignments
- The instantiator of polymorphic code into monomorphic is not implemented
- Module system, namespace support, HNI implementation and C++ integration in general are rudimentary or missing
- Priorities of C++ infix operators are broken
- RAII should be used with care
- SPL support is almost missing
- Polymorphic constants like “empty list” are not supported
- Install free Visual C++ Express or non-free Visual Studio
- Download Boost library from boost.org.
- Extract
boost
subfolder from the distribution. It's the folder containing header files for all libraries.
Create config.cmd
one level above HNC folder, so it's not under source control:
@set INCLUDE=folder-containing-boost-subfolder
@call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat"
VS100COMNTOOLS
is environment variable name set by VC 10.0 installer. Use set | findstr COMN
to find
out which version(s) of Visual C you have installed and change the .cmd
file accordingly.
run testAll.cmd
from hn_tests
folder. You should see tmp-*.cpp
files being generated
from .hn
sources and compiled into .obj
files.
The generated code is not specific to MSVC or Windows, so any other Boost-compatible C++ compiler and platform should work too. However, the scripts to run test suite are not there yet.
To run deref1.cpp
test manually with GCC, run
gcc -I../cpplib/include test.cpp ../cpplib/lib.cpp -lstdc++ --std=c++0x
from hn_tests
folder if Boost headers are installed globally to /usr/include
, or
gcc -I../cpplib/include -Ifolder-containing-boost-subfolder test.cpp ../cpplib/lib.cpp -lstdc++ --std=c++0x
if Boost headers are manually unpacked locally.
Distributed under GNU Lesser General Public Licence Version 3.