Install Haskell Platform then run:
cabal update cabal install --only-dependencies configure build dist\build\spl-hnc\spl-hnc hn_tests\euler6.hn
Install GHC or Haskell Platform and run:
cabal update cabal install happy PATH=$PATH:~/.cabal/bin cabal install --only-dependencies cabal configure cabal build ./dist/build/spl-hnc/spl-hnc ./hn_tests/euler6.hn
- read wiki
- run our main test suite (
--dump-optoption to see our first attempts at optimization
- follow instructions below to feed generated
.cppfiles to a C++ compiler and linker either directly or by using our extension to Boost.Build.
You'll need MSVC/GCC, Boost and Boost.
Under the hood
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. The codebase is tiny: less than 4 KLOC, in the spirit of VPRI Ometa.
State of affairs
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
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.
What is done
- 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
- A rudimentary and buggy optimizer of the IR using HOOPL
- Compiler of closures into C++ functors using UUAG (almost)
- C++ pretty printer (almost)
- A Boost.Build plugin to integrate .hn files into C++ projects
What is not done
- Proper error reporting
- Loops and assignments
- The inliner is buggy for HOFs
- 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
- Our Boost-based implementation of a generalization of
std::bind1stonly works under MSVC
- SPL support is almost missing
- Polymorphic constants like “empty list” are not supported
Setting up MSVC and Boost
- Install free Visual C++ Express or non-free Visual Studio
- Download Boost library from boost.org.
boostsubfolder from the distribution. It's the folder containing header files for all libraries.
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.
hn_tests folder. You should see
tmp-*.cpp files being generated
.hn sources and compiled into
Setting up GCC
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.
deref1.cpp test manually with GCC, run
gcc -c -I../cpplib/include deref1.cpp
hn_tests folder if Boost headers are installed globally to
gcc -c -I../cpplib/include -Ifolder-containing-boost-subfolder deref1.cpp
if Boost headers are manually unpacked locally.
Distributed under GNU Lesser General Public Licence Version 3.