diff --git a/Grammar.pdf b/Grammar.pdf deleted file mode 100644 index f7f7a70..0000000 Binary files a/Grammar.pdf and /dev/null differ diff --git a/Justfile b/Justfile index 96be864..16be91b 100644 --- a/Justfile +++ b/Justfile @@ -6,7 +6,7 @@ build: # clean the generated directories clean: rm -r src/Grammar - rm language + rm churf rm -r dist-newstyle/ # run all tests @@ -14,46 +14,46 @@ test: cabal test debug FILE: - cabal run language -- -d {{FILE}} + cabal run churf -- -d {{FILE}} hm FILE: - cabal run language -- -t hm {{FILE}} + cabal run churf -- -t hm {{FILE}} bi FILE: - cabal run language -- -t bi {{FILE}} + cabal run churf -- -t bi {{FILE}} hml FILE: - cabal run language -- -l -t hm {{FILE}} + cabal run churf -- -l -t hm {{FILE}} bil FILE: - cabal run language -- -l -t bi {{FILE}} + cabal run churf -- -l -t bi {{FILE}} hmd FILE: - cabal run language -- -d -t hm {{FILE}} + cabal run churf -- -d -t hm {{FILE}} bid FILE: - cabal run language -- -d -t bi {{FILE}} + cabal run churf -- -d -t bi {{FILE}} hmdm FILE: - cabal run language -- -d -t hm -m {{FILE}} + cabal run churf -- -d -t hm -m {{FILE}} bidm FILE: - cabal run language -- -d -t bi -m {{FILE}} + cabal run churf -- -d -t bi -m {{FILE}} hmp FILE: - cabal run language -- -t hm -p {{FILE}} + cabal run churf -- -t hm -p {{FILE}} bip FILE: - cabal run language -- -t bi -p {{FILE}} + cabal run churf -- -t bi -p {{FILE}} hmdp FILE: - cabal run language -- -t hm -d -p {{FILE}} + cabal run churf -- -t hm -d -p {{FILE}} bidp FILE: - cabal run language -- -t bi -d -p {{FILE}} + cabal run churf -- -t bi -d -p {{FILE}} quicksort: - cabal run language -- -t bi sample-programs/working/quicksort.crf + cabal run churf -- -t bi sample-programs/working/quicksort.crf lc: - cabal run language -- -t bi sample-programs/working/lambda_calculus-2.crf + cabal run churf -- -t bi sample-programs/working/lambda_calculus-2.crf diff --git a/Makefile b/Makefile index 6c1ebde..e48386b 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ pdf : Grammar.pdf clean : rm -r src/Grammar - rm language + rm churf rm -rf dist-newstyles rm Grammar.aux Grammar.fdb_latexmk Grammar.fls Grammar.log Grammar.synctex.gz Grammar.tex diff --git a/benchmark.py b/benchmark.py deleted file mode 100755 index 40f0a15..0000000 --- a/benchmark.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/env/python3 - -import sys -import os -import time - -if __name__ == "__main__": - args = sys.argv - if len(args) == 1: - print ("first arg is number of loops second is exe") - else: - total = 0 - iter = int(args[1]) - for i in range(iter): - time_pre = time.time() - os.system("./" + args[2] + "> /dev/null") - time_post = time.time() - calc = time_post - time_pre - total += calc - - print ("File: " + args[2] + ", " + str(iter) + " runs gave average: " + str(total / iter) + "s") diff --git a/benchmark.txt b/benchmark.txt deleted file mode 100644 index c12461e..0000000 --- a/benchmark.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Full optimization Churf -File: output/hello_world, 100 runs gave average: 0.025261127948760988s - -# O2 Haskell -File: ./Bench, 100 runs gave average: 0.05629507303237915s - -# 03 Haskell -File: ./Bench, 100 runs gave average: 0.05490849256515503s -File: ./Bench, 100 runs gave average: 0.05323728561401367s diff --git a/churf b/churf new file mode 120000 index 0000000..b5800eb --- /dev/null +++ b/churf @@ -0,0 +1 @@ +/home/sebastian/.cabal/store/ghc-9.4.4/churf-0.1.0.0-e-churf-6264c247f03a157a1144a9887dd5a43d0d1c799ad268c2cb352a8a1a6c014e8e/bin/churf \ No newline at end of file diff --git a/language.cabal b/churf.cabal similarity index 96% rename from language.cabal rename to churf.cabal index fa7841a..27496ce 100644 --- a/language.cabal +++ b/churf.cabal @@ -1,6 +1,6 @@ cabal-version: 3.4 -name: language +name: churf version: 0.1.0.0 license: MIT @@ -18,7 +18,7 @@ extra-source-files: common warnings ghc-options: -w -executable language +executable churf import: warnings main-is: Main.hs @@ -72,10 +72,11 @@ executable language , QuickCheck , directory , process + , filepath default-language: GHC2021 -Test-suite language-testsuite +Test-suite churf-testsuite type: exitcode-stdio-1.0 main-is: Main.hs diff --git a/fourmolu.yaml b/fourmolu.yaml deleted file mode 100644 index 8b96b58..0000000 --- a/fourmolu.yaml +++ /dev/null @@ -1 +0,0 @@ -indent-wheres: false diff --git a/pipeline.txt b/pipeline.txt deleted file mode 100644 index 1872562..0000000 --- a/pipeline.txt +++ /dev/null @@ -1,27 +0,0 @@ - - Parser - | - ReportForall Report unnecessary foralls. Hm: report rank>2 foralls - | - AnnotateForall Annotate all unbound type variables with foralls - | - Renamer Rename type variables and term variables - | - / \ - / \ - TypeCheckHm TypeCheckBi - \ / - \ / - | - ReportTEVar Report type existential variables and change type AST - | - RemoveForall RemoveForall and change type AST - | - Monomorpher - | - Desugar - | - CodeGen - - - diff --git a/spec.txt b/spec.txt deleted file mode 100644 index 2273846..0000000 --- a/spec.txt +++ /dev/null @@ -1,121 +0,0 @@ ---------------------------------------------------------------------------- --- * Parser ---------------------------------------------------------------------------- - -data Program = Program [Def] - -data Def = DSig Ident Type | DBind Bind - -data Bind = Bind Ident [Ident] Exp - -data Exp - = EId Ident - | ELit Lit - | EAnn Exp Type - | ELet Ident Exp Exp - | EApp Exp Exp - | EAdd Exp Exp - | EAbs Ident Exp - -data Lit = LInt Integer - | LChar Character - -data Type - = TLit Ident -- τ - | TVar TVar -- α - | TFun Type Type -- A → A - | TAll TVar Type -- ∀α. A - | TEVar TEVar -- ά (internal) - -data TVar = MkTVar Ident -data TEVar = MkTEVar Ident - ---------------------------------------------------------------------------- --- * Type checker ---------------------------------------------------------------------------- - --- • Def and DSig are removed in favor on just Bind --- • Typed expressions --- • TEVar is removed (NOT IMPLEMENTED) - -newtype Program = Program [Bind] - -data Bind = Bind Id [Id] ExpT - -data Exp - = EId Ident - | ELit Lit - | ELet Bind ExpT - | EApp ExpT ExpT - | EAdd ExpT ExpT - | EAbs Ident ExpT - -type Id = (Ident, Type) -type ExpT = (Exp, Type) - - -data Lit = LInt Integer - | LChar Character - -data Type - = TLit Ident -- τ - | TVar TVar -- α - | TFun Type Type -- A → A - | TAll TVar Type -- ∀α. A - -data TVar = MkTVar Ident - ---------------------------------------------------------------------------- --- * Lambda lifter ---------------------------------------------------------------------------- --- • EAbs are removed (NOT IMPLEMENTED) --- • ELet only allow constant expressions (NOT IMPLEMENTED) - -newtype Program = Program [Bind] - -data Bind = Bind Id [Id] ExpT - -data Exp - = EId Ident - | ELit Lit - | ELet Ident ExpT ExpT - | EApp ExpT ExpT - | EAdd ExpT ExpT - -type Id = (Ident, Type) -type ExpT = (Exp, Type) - -data Lit = LInt Integer - | LChar Character - -data Type - = TLit Ident -- τ - | TVar TVar -- α - | TFun Type Type -- A → A - | TAll TVar Type -- ∀α. A - -data TVar = MkTVar Ident - ---------------------------------------------------------------------------- --- * Monomorpher ---------------------------------------------------------------------------- --- • Polymorphic types are removed (NOT IMPLEMENTED) - -newtype Program = Program [Bind] - -data Bind = Bind Id [Id] ExpT - -data Exp - = EId Ident - | ELit Lit - | ELet Ident ExpT ExpT - | EApp ExpT ExpT - | EAdd ExpT ExpT - -type Id = (Ident, Type) -type ExpT = (Exp, Type) - -data Lit = LInt Integer - | LChar Character - -data Type = Type Ident diff --git a/src/Compiler.hs b/src/Compiler.hs index 6f7fb24..4abe422 100644 --- a/src/Compiler.hs +++ b/src/Compiler.hs @@ -7,8 +7,8 @@ import System.Process.Extra (readCreateProcess, shell) optimize :: String -> IO String optimize = readCreateProcess (shell "opt --O3 --tailcallopt -S") -compileClang :: Bool -> String -> IO String -compileClang False = +compileClang :: String -> Bool -> String -> IO String +compileClang name False = readCreateProcess . shell $ unwords [ "clang++" -- , "-Lsrc/GC/lib/", "-l:libgcoll.a" @@ -16,10 +16,10 @@ compileClang False = , "-x" , "ir" -- , "-Lsrc/GC/lib -l:gcoll.a" , "-o" - , "output/hello_world" + , "output/" <> name , "-" ] -compileClang True = +compileClang name True = readCreateProcess . shell $ unwords [ "clang++" -- , "-Lsrc/GC/lib/", "-l:libgcoll.a" @@ -36,9 +36,9 @@ compileClang True = , "-x" , "ir" -- , "-Lsrc/GC/lib -l:gcoll.a" , "-o" - , "output/hello_world" + , "output/" <> name , "-" ] -compile :: String -> Bool -> IO String -compile s addGc = optimize s >>= compileClang addGc +compile :: String -> String -> Bool -> IO String +compile name s addGc = optimize s >>= compileClang name addGc diff --git a/src/Main.hs b/src/Main.hs index 98900b8..4864901 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -8,6 +8,7 @@ import Compiler (compile) import Control.Monad (when, (<=<)) import Data.List.Extra (isSuffixOf) import Data.Maybe (fromJust, isNothing) +import Data.Tuple.Extra (uncurry3) import Desugar.Desugar (desugar) -- import Expander (expand) import GHC.IO.Handle.Text (hPutStrLn) @@ -32,27 +33,30 @@ import System.Environment (getArgs) import System.Exit (ExitCode (ExitFailure), exitFailure, exitSuccess, exitWith) +import System.FilePath.Posix (takeFileName, dropExtensions) import System.IO (stderr) import System.Process (spawnCommand, waitForProcess) import TypeChecker.TypeChecker (TypeChecker (Bi, Hm), typecheck) main :: IO () -main = getArgs >>= parseArgs >>= uncurry main' +main = getArgs >>= parseArgs >>= uncurry3 main' -parseArgs :: [String] -> IO (Options, String) +parseArgs :: [String] -> IO (Options, String, String) parseArgs argv = case getOpt RequireOrder flags argv of - (os, f : _, []) + (os, f : xs, []) | opts.help || isNothing opts.typechecker -> do hPutStrLn stderr (usageInfo header flags) exitSuccess - | otherwise -> pure (opts, f) + | otherwise -> do + let name = dropExtensions $ takeFileName f + pure (opts, name, f) where opts = foldr ($) initOpts os (_, _, errs) -> do hPutStrLn stderr (concat errs ++ usageInfo header flags) exitWith (ExitFailure 1) where - header = "Usage: language [--help] [-l|--log-intermediate] [-d|--debug] [-m|--disable-gc] [-t|--type-checker bi/hm] [-p|--disable-prelude] \n" + header = "Usage: churf [--help] [-l|--log-intermediate] [-d|--debug] [-m|--disable-gc] [-t|--type-checker bi/hm] [-p|--disable-prelude] \n" flags :: [OptDescr (Options -> Options)] flags = @@ -108,8 +112,8 @@ data Options = Options , logIL :: Bool } -main' :: Options -> String -> IO () -main' opts s = +main' :: Options -> String -> String -> IO () +main' opts name s = let log :: (Print a, Show a) => a -> IO () log = printToErr . if opts.debug then show else printTree @@ -149,7 +153,6 @@ main' opts s = generatedCode <- fromErr $ generateCode monomorphized (gc opts) - -- generatedCode <- fromErr $ generateCode monomorphized False check <- doesPathExist "output" when check (removeDirectoryRecursive "output") @@ -159,13 +162,11 @@ main' opts s = when opts.debug $ do printToErr "\n -- Compiler --" writeFile "output/llvm.ll" generatedCode - --debugDotViz - compile generatedCode (gc opts) - -- compile generatedCode False + compile name generatedCode (gc opts) printToErr "Compilation done!" printToErr "\n-- Program output --" - print =<< spawnWait "./output/hello_world" + print =<< spawnWait ("./output/" <> name) exitSuccess diff --git a/test.crf b/test.crf new file mode 100644 index 0000000..5c53a61 --- /dev/null +++ b/test.crf @@ -0,0 +1 @@ +main = 5 diff --git a/test_program.crf b/test_program.crf deleted file mode 100644 index ac089a3..0000000 --- a/test_program.crf +++ /dev/null @@ -1 +0,0 @@ -main = let f x = x in f 123