[Agda] Epic compiler backend.
Andreas Abel
andreas.abel at ifi.lmu.de
Tue Dec 14 21:59:11 CET 2010
Hi Daniel and Olle,
this is great, thanks!
Can you help me install epic such that I can continue to compile Agda?
cabal install epic
...
Linking dist/build/epic/epic ...
gcc -Wall -O3 -DUSE_BOEHM -c -o closure.o closure.c
In file included from closure.h:4,
from closure.c:1:
gc_header.h:10:19: error: gc/gc.h: No such file or directory
In file included from closure.c:1:
closure.h:7:17: error: gmp.h: No such file or directory
In file included from closure.c:1:
closure.h:261: error: syntax error before ‘*’ token
...
I am using Mac OS X 10.5 and macports.
Cheers,
Andreas
On 12/14/10 9:28 PM, Daniel Gustafsson wrote:
> Hello all,
>
> A new backend for Agda to compile to Epic has been created. Epic is a language
> used by Idris and Epigram made by Edwin Brady. Almost all of Agda should work
> when using this backend, but it needs more testing.
>
> It should be noted that this is very much EXPERIMENTAL code.
>
> There is a new pragma for giving the Epic code for postulated definitions.
> The Epic code given can then contain the definition itself, or use a foreign
> call to call a C function. The pragma is {-# COMPILED_EPIC def code #-} and
> works similar to the COMPILED pragma but instead of expecting Haskell code,
> it expects Epic code. The code includes function arguments, return
> type and the function body. Note that def is the name of an Agda definition,
> which will be translated to a valid Epic name automatically.
>
> The Epic backend supports Agda's primitive pragma for primitive functions that
> are defined (with the same name) in the AgdaPrelude.e
> (Agda/src/data/EpicInclude/) file.
>
> Usage:
>> agda --epic --includeC=<C-FILE> --compile-dir=<DIR> <FILE>.agda
>
> A new directory, Epic, will be created in the compile-dir (default: the
> project root), containing the file main.e with the Epic source code. The
> compiler will also do a system call running the Epic compiler on that file.
>
> The compilation requires a definition of main, which should be of type IO Unit.
> Currently IO A actions are represented in Epic as functions from Unit to A.
> Because of this the main function is applied a single unit.
>
> Here follows how to define the IO monad:
> postulate
> IO : Set → Set
> return : ∀ {A} → A → IO A
> _>>=_ : ∀ {A B} → IO A → (A → IO B) → IO B
>
> {-# COMPILED_EPIC return (u1 : Unit, a : Any) -> Any = ioreturn(a) #-}
> {-# COMPILED_EPIC _>>=_ (u1 : Unit, u2 : Unit, x : Any, f : Any) ->
> Any = iobind(x,f) #-}
>
> ioreturn and iobind are Epic functions defined in AgdaPrelude.e which is
> always included. This is how IO is defined in the standard library
> (IO.Primitive). We only need to add the new COMPILED_EPIC pragmas.
>
> The backend supports the {-# BUILTIN #-} pragma, which can be used e.g. to get
> Natural numbers and their operations to be represented more efficiently as
> BigInts and operations on them in Epic.
>
> Currently, the backend will remove forced constructor arguments. Consider:
>
> data Fin : Nat -> Set where
> fz : {n : Nat} -> Fin (suc n)
> fs : {n : Nat} -> Fin n -> Fin (suc n)
>
> f : (n : Nat) -> Fin n -> Bool
> f .(suc zero) (fz {zero}) = true
> f .(suc (suc n)) (fs {suc n} i) = false
>
> here we don't need to store the Nat in the constructors since we can always
> rewrite the pattern matching on them. Note that we currently DO NOT do this
> and therefore functions like f above will give a runtime error. This can be
> disabled by using the flag --no-forcing.
>
> All types that looks like Nats after forced constructor arguments have been
> removed - i.e. if they have two constructors: one with no arguments and one
> with a single recursive argument - will be represented as BigInts. This applies
> to the standard Fin type as defined above.
>
> Compilation using Epic requires a few libraries. Particularly gcc, the Boehm
> garbage collector and the GNU MP library. For more information, check out
> Epic's homepage: http://www.cs.st-andrews.ac.uk/~eb/epic.php
>
> Some differences compared to MAlonzo:
> - Does not have support for calling Haskell functions.
> - Recompiles all modules during compilation.
> + Types that are like Natural numbers will always be represented as BigInts:
> No conversion between BigInt and Constructor representation.
> + Epic has no fancy type system that we need to convince (no coercions).
>
> Daniel Gustafsson
> Olle Fredriksson
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>
--
Andreas Abel <>< Du bist der geliebte Mensch.
Theoretical Computer Science, University of Munich
Oettingenstr. 67, D-80538 Munich, GERMANY
andreas.abel at ifi.lmu.de
http://www2.tcs.ifi.lmu.de/~abel/
More information about the Agda
mailing list