% $OpenXM: OpenXM/doc/issac2000/openxm-stackmachines.tex,v 1.3 2000/01/03 04:27:52 takayama Exp $

\section{OpenXM Stackmachines}   (Tamura)

In OpenXM specification, all servers are stackmachines.
These are called OX stachmachines.
When a server ox\_xyz gets an OX data message,
it translates the data into its own object and push the object
on the stack.
The translation scheme together with definitions of 
mathematical operations
of the system ox\_xyz is called the {\it phrase dictionary} of
ox\_xyz following the OpenMath specification.

Any OX command message starts with the int32 tag OX\_COMMAND.
The body is OX stackmachine operation code expressed by int32.
The codes are listed below.
\begin{verbatim}
#define SM_popSerializedLocalObject               258
#define SM_popCMO                                 262
#define SM_popString                              263
#define SM_mathcap                                264
#define SM_pops                                   265
#define SM_setName                                266
#define SM_evalName                               267
#define SM_executeStringByLocalParser             268
#define SM_executeFunction                        269
#define SM_beginBlock                             270
#define SM_endBlock                               271
#define SM_shutdown                               272
#define SM_setMathCap                             273
#define SM_executeStringByLocalParserInBatchMode  274
#define SM_getsp                                  275
#define SM_dupErrors                              276
#define SM_DUMMY_sendcmo                          280
#define SM_sync_ball                              281
#define SM_control_kill                          1024
#define SM_control_to_debug_mode                 1025
#define SM_control_exit_debug_mode               1026
#define SM_control_reset_connection              1030
\end{verbatim}

OpenXM does not have a standard for mathematical operation sets
while it is a work in progress in \cite{gap}.
Each OpenXM server has its own mathematical operation set.
Mathematical operations are performed as follows.
Mathematical operator name, such as fctr (asir factorization command),
is pushed as a string,
the stackmachine command
SM\_executeFunction (269) pops the operator name, the number of arguments
and arguments, and
the OX stackmachine evaluates the operator, and pushes the result on the stack.
For example, the following code factorizes $x^{100}-1$ by calling
ox\_asir from asir.
\begin{verbatim}
P = ox_launch(); 
ox_push_cmo(P,x^100-1); ox_push_cmo(P,ox_int32(1));
ox_push_cmd(P,269); 
Ans = ox_pop_cmo(P);
\end{verbatim}

When an error has occurred on an OpenXM server,
an error object is pushed to the stack instead of a result of the computation.
The error object consists of the serial number of the OX message
which caused the error, and an error message.
\begin{verbatim}
[341] ox_rpc(0,"fctr",1.2*x)$
[342] ox_pop_cmo(0);
error([8,fctr : invalid argument])
\end{verbatim}

Errors are not sent to the client except a SM\_pop* command is received.
OX stackmachines works in the asynchronous mode which is similar 
to X servers.
For servers for graphic applications, it is an advantageous feature.
It is also easy to emulate RPC and a web server for MCP \cite{iamc} 
on our asynchronous OX stackmachines.





