-
Notifications
You must be signed in to change notification settings - Fork 57
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make
compile
targets a subcommand instead of a flag (#2700)
# Changes The main goal of this pr is to remove the `--target` flag for `juvix compile` and use subcommands instead. The targets that are relevant to normal users are found in `juvix compile --help`. Targets that are relevant only to developers are found in `juvix dev compile --help`. Below I list some of the changes in more detail. ## Compile targets for user-facing languages - `juvix compile native` - `juvix compile wasi`. I wasn't sure how to call this: `wasm`, `wasm32-wasi`, etc. In the end I thought `wasi` was short and accurate, but we can change it. - `juvix compile vampir` - `juvix compile anoma` - `juvix compile cairo` ## *New* compile targets for internal languages See `juvix dev compile --help`. 1. `dev compile core` has the same behaviour as `dev core from-concrete`. The `dev core from-concrete` is redundant at the moment. 2. `dev compile tree` compiles to Tree and prints the InfoTable to the output file wihout any additional checks. 3. `dev compile reg` compiles to Reg and prints the InfoTable to the output file wihout any additional checks. 4. `dev compile asm` compiles to Asm and prints the InfoTable to the output file wihout any additional checks. 5. 4. `dev compile casm` compiles to Asm and prints the Result to the output file wihout any additional checks. TODO: should the Result be printed or something else? At the moment the Result lacks a pretty instance. 6. ## Optional input file 1. The input file for commands that expect a .juvix file as input is now optional. If the argument is ommited, he main file given in the package.yaml will be used. This applies to the following commands: 1. `juvix compile [native|wasi|geb|vampir|anoma|cairo]` 8. `juvix dev compile [core|reg|tree|casm|asm]` 1. `juvix html` 3. `juvix markdown`. 4. `juvix dev internal [typecheck|pretty]`. 5. `juvix dev [parse|scope]` 7. `juvix compile [native|wasi|geb|vampir|anoma|cairo]` 9. note that `juvix format` has not changed its behaviour. ## Refactor some C-like compiler flags Both `juvix compile native` and `juvix compile wasi` support `--only-c` (`-C`), `--only-preprocess` (`-E`), `--only-assemble` (`-S`). I propose to deviate from the `gcc` style and instead use a flag with a single argument: - `--cstage [source|preprocess|assembly|exec(default)]`. I'm open to suggestions. For now, I've kept the legacy flags but marked them as deprecated in the help message. ## Remove code duplication I've tried to reduce code duplication. This is sometimes in tension with code readability so I've tried to find a good balance. I've tried to make it so we don't have to jump to many different files to understand what a single command is doing. I'm sure there is still room for improvement. ## Other refactors I've implemented other small refactors that I considered improved the quality of the code. ## TODO/Future work We should refactor commands (under `compile dev`) which still use `module Commands.Extra.Compile` and remove it.
- Loading branch information
1 parent
651875e
commit 2d36a65
Showing
92 changed files
with
1,896 additions
and
502 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,43 +1,23 @@ | ||
module Commands.Compile where | ||
module Commands.Compile | ||
( module Commands.Compile, | ||
module Commands.Compile.Options, | ||
) | ||
where | ||
|
||
import Commands.Base | ||
import Commands.Compile.Anoma qualified as Anoma | ||
import Commands.Compile.Cairo qualified as Cairo | ||
import Commands.Compile.Geb qualified as Geb | ||
import Commands.Compile.Native qualified as Native | ||
import Commands.Compile.Options | ||
import Commands.Dev.Core.Compile.Base qualified as Compile | ||
import Commands.Extra.Compile qualified as Compile | ||
import Juvix.Compiler.Core qualified as Core | ||
import Juvix.Compiler.Core.Pretty qualified as Core | ||
import Juvix.Compiler.Core.Transformation.DisambiguateNames qualified as Core | ||
import Commands.Compile.Vampir qualified as Vampir | ||
import Commands.Compile.Wasi qualified as Wasi | ||
|
||
runCommand :: (Members '[EmbedIO, App, TaggedLock] r) => CompileOptions -> Sem r () | ||
runCommand opts@CompileOptions {..} = do | ||
inputFile <- getMainFile _compileInputFile | ||
Core.CoreResult {..} <- runPipeline (AppPath (preFileFromAbs inputFile) True) upToCore | ||
let arg = | ||
Compile.PipelineArg | ||
{ _pipelineArgFile = inputFile, | ||
_pipelineArgOptions = opts, | ||
_pipelineArgModule = _coreResultModule | ||
} | ||
case _compileTarget of | ||
TargetNative64 -> Compile.runCPipeline arg | ||
TargetWasm32Wasi -> Compile.runCPipeline arg | ||
TargetGeb -> Compile.runGebPipeline arg | ||
TargetVampIR -> Compile.runVampIRPipeline arg | ||
TargetCore -> writeCoreFile arg | ||
TargetTree -> Compile.runTreePipeline arg | ||
TargetAsm -> Compile.runAsmPipeline arg | ||
TargetReg -> Compile.runRegPipeline arg | ||
TargetAnoma -> Compile.runAnomaPipeline arg | ||
TargetCasm -> Compile.runCasmPipeline arg | ||
TargetCairo -> Compile.runCairoPipeline arg | ||
|
||
writeCoreFile :: (Members '[EmbedIO, App, TaggedLock] r) => Compile.PipelineArg -> Sem r () | ||
writeCoreFile pa@Compile.PipelineArg {..} = do | ||
entryPoint <- Compile.getEntry pa | ||
coreFile <- Compile.outputFile _pipelineArgOptions _pipelineArgFile | ||
r <- runReader entryPoint . runError @JuvixError $ Core.toStored _pipelineArgModule | ||
case r of | ||
Left e -> exitJuvixError e | ||
Right md -> do | ||
let txt = show (Core.ppOutDefault (Core.disambiguateNames md ^. Core.moduleInfoTable)) | ||
writeFileEnsureLn coreFile txt | ||
runCommand :: (Members '[EmbedIO, App, TaggedLock] r) => CompileCommand -> Sem r () | ||
runCommand = \case | ||
Native opts -> Native.runCommand opts | ||
Wasi opts -> Wasi.runCommand opts | ||
Geb opts -> Geb.runCommand opts | ||
Anoma opts -> Anoma.runCommand opts | ||
Cairo opts -> Cairo.runCommand opts | ||
Vampir opts -> Vampir.runCommand opts |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
module Commands.Compile.Anoma where | ||
|
||
import Commands.Base | ||
import Commands.Compile.Anoma.Options | ||
import Commands.Extra.NewCompile | ||
import Juvix.Compiler.Backend | ||
import Juvix.Compiler.Nockma.Pretty qualified as Nockma | ||
import Juvix.Compiler.Nockma.Translation.FromTree qualified as Nockma | ||
|
||
runCommand :: (Members '[App, EmbedIO, TaggedLock] r) => AnomaOptions -> Sem r () | ||
runCommand opts = do | ||
let opts' = opts ^. anomaCompileCommonOptions | ||
inputFile = opts' ^. compileInputFile | ||
moutputFile = opts' ^. compileOutputFile | ||
coreRes <- fromCompileCommonOptionsMain opts' >>= compileToCore | ||
entryPoint <- | ||
set entryPointTarget (Just TargetAnoma) | ||
. applyCompileCommonOptions opts' | ||
<$> getEntryPoint (opts' ^. compileInputFile) | ||
nockmaFile :: Path Abs File <- getOutputFile FileExtNockma inputFile moutputFile | ||
r <- | ||
runReader entryPoint | ||
. runError @JuvixError | ||
. coreToAnoma | ||
$ coreRes ^. coreResultModule | ||
res <- getRight r | ||
outputAnomaResult nockmaFile res | ||
|
||
outputAnomaResult :: (Members '[EmbedIO, App] r) => Path Abs File -> Nockma.AnomaResult -> Sem r () | ||
outputAnomaResult nockmaFile Nockma.AnomaResult {..} = do | ||
let code = Nockma.ppSerialize _anomaClosure | ||
prettyNockmaFile = replaceExtensions' [".pretty", ".nockma"] nockmaFile | ||
writeFileEnsureLn nockmaFile code | ||
writeFileEnsureLn prettyNockmaFile (Nockma.ppPrint _anomaClosure) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
module Commands.Compile.Anoma.Options | ||
( module Commands.Compile.Anoma.Options, | ||
module Commands.Compile.CommonOptions, | ||
) | ||
where | ||
|
||
import Commands.Compile.CommonOptions | ||
import CommonOptions | ||
|
||
data AnomaOptions = AnomaOptions | ||
{ _anomaCompileCommonOptions :: CompileCommonOptionsMain | ||
} | ||
deriving stock (Data) | ||
|
||
makeLenses ''AnomaOptions | ||
|
||
parseAnoma :: Parser AnomaOptions | ||
parseAnoma = do | ||
_anomaCompileCommonOptions <- parseCompileCommonOptionsMain | ||
pure AnomaOptions {..} |
Oops, something went wrong.