In OpenXM specification, all servers are stack machines.When a server ox_xyz gets an OX data message, it translates the data into a local object of ox_xyz and pushes the object onto the stack. The translation scheme is called the PhraseBook of ox_xyz (cf. OpenMath ). For example, the Asir command ox_push_cmo(P,1) (push integer onto the server ) sends an OX data message (OX_DATA,(CMO_ZZ,1)) to the server . Here, OX_DATA stands for OX_DATA header and (CMO_ZZ,1) is a body standing for expressed by the CMO. The server translates (CMO_ZZ, 1) to its internal object of the integer and pushes the object onto the stack.
If the server gets an OX command message, then the server executes the command. Any OX command message starts with the int32 tag OX_COMMAND. The body is a stack machine operation code expressed by int32. The codes are listed below .
#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_control_kill 1024 #define SM_control_to_debug_mode 1025 #define SM_control_exit_debug_mode 1026 #define SM_control_reset_connection 1030
OpenXM does not have a standard for mathematical operation sets while it is a work in progress in the GAP group . Each OpenXM server has its own set of mathematical operations, which are performed as follows. First, arguments for a mathematical operation and the number of the arguments are pushed. Second, the mathematical operator name, such as fctr (the factorization command of Asir), is pushed as a string. Finally, the stack machine command SM_executeFunction (269) evaluates the operator and pushes the result onto the stack after poping the operator name, the number of arguments and arguments. For example, the following code factorizes by calling ox_asir from Asir.
P = ox_launch(); ox_push_cmo(P,x^100-1); ox_push_cmo(P,ntoint32(1)); ox_push_cmo(P,"fctr"); ox_push_cmd(P,269); Ans = ox_pop_cmo(P);
When an error has occurred on an OpenXM server, an error object is pushed onto 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.
 P = ox_launch()$  ox_rpc(P,"fctr",1.2*x)$  ox_pop_cmo(P); error([8,fctr : invalid argument])
OpenXM server won't send error messages to the client except when it receives a SM_pop* command. OX stack machines work in the asynchronous mode which is similar to X servers. For servers of graphic and sound applications, it may be an advantageous feature. It is also possible to emulate RPC and a web server for MCP  on our asynchronous OX stack machines.
Nobuki Takayama 2017-03-30