Steve Lawrence and I would like to bring another topic from my runtime2 pull 
request to the dev list for wider discussion.  The question is how would you 
expect to use and trigger different Daffodil backends?  We believe these 
requirements hold:

   - Daffodil's Scala runtime/backend/whatchacallit will support the entire 
DFDL 1.0 specification
   - A new Daffodil backend will generate C code for a minimally viable subset 
of the DFDL 1.0 specification for small footprint devices
   - Daffodil will support running TDML tests against both backends (C code 
generation, C code compilation, and invoking of compiled code all transparent 
to the user)
   - Daffodil may add more backends in the future (maybe runtime3 might 
generate VHDL files for chips)

In addition, the following requirements may hold too:

    - We may want to use the same TDML "snap compilation/execution" mechanism 
to have "daffodil parse" and "daffodil unparse" CLI commands that work alike 
across the backends, but a counter argument is that there's little benefit to 
be gained when the C code could be executed directly using its own similar 
"daffodil parse" and "daffodil unparse" CLI syntax, and a VHDL simulator is 
needed to "snap compile/execute" VHDL files anyway.

    - The C generator should generate an ".a" or ".so" C-callable library and 
matching ".h" include files that implement C APIs for parsing and unparsing 
binary data corresponding to the given DFDL schema.  This generated code 
library would be distinct from the C runtime2 library which contains common 
low-level parsing/unparsing functions implemented in C.  Actually, all 
generated and runtime2 ".c" source files should be written to an output 
directory in case both libraries have to be compiled on another platform.

Creating the generated library feels like what the CLI should do when using the 
runtime2 backend.  There is an analogy here to what invoking the "daffodil 
save-parser" subcommand does (it creates a saved parser file which speeds up a 
future parse).  Likewise, it makes sense to generate & compile the C code 
first, then run the C-code executable directly using its own "daffodil parse" 
and "daffodil unparse" CLI syntax.  Or generate the VHDL files first and then 
load them into a VHDL simulator.

Steve, Mike, and I have discussed different CLI commands for creating the 
generated library:

    daffodil runtime2 -s schema.dfdl.xsd -o schema.bin
    daffodil save-parser -s schema.dfdl.xsd -Truntime=runtime2 outfile
    daffodil generate C -s schema.dfdl.xsd outdir/

Each has pros and cons.  Using "daffodil <runtime>" means each runtime/backend 
can use its own CLI options more easily.  The outfile passed to "daffodil 
save-parser" is a filename but the C generator needs a directory name since it 
has to write multiple files into it.  We can run different backends with 
"daffodil generate C" or "daffodil generate VHDL" and if different backends 
need different CLI options maybe the Daffodil Scala CLI can ask the different 
backends for their CLI options.

What do devs think?  Keep the Daffodil Scala CLI focused on Daffodil's Scala 
runtime and make new runtimes use a separate CLI tool with a unique name and 
its unique CLI syntax?  Or shoehorn some additional functionality into the 
Daffodil Scala CLI syntax?

Reply via email to