Next: Run-Time Compiler Back-End, Previous: Parser, Up: Compiler
The code generation back-end is provided by the (rpc compiler)
module. Given an XDR/RPC description, it returns a list of
S-expressions, each of which is a top-level Scheme expression
implementing an element of the input description. These expressions are
meant to be dumped to a Scheme file; this is what the command-line
interface of the compiler does (see grpc-compile).
Here is an example XDR/RPC description and the resulting client code, as obtained, e.g., with grpc-compile --xdr --constants --client:
const max = 010;
struct foo
{
int x;
float y<max>;
};
=>
(define max 8)
(define foo
(make-xdr-struct-type
(list xdr-integer
(make-xdr-vector-type xdr-float max))))
As can be seen here, the generated code uses the run-time support routines described earlier (see Implementation of XDR); an optimization would consist in generating specialized code that does not depend on the run-time support, but it is not implemented yet.
This front-end consists of two procedures:
These procedures return a list of top-level Scheme expressions implementing input for an RPC client or, respectively, a server.
input can be either an input port, a string, or an AST as returned by
rpc-language->sexp(see Parser). If type-defs? is#t, then type definition code is produced; if constant-defs? is#t, then constant definition code is produced.Both procedures can raise error conditions having a sub-type of
&compiler-error.