Curious: How does Prolog "Byte code" compare to .NET IL (and some thoughts about enterprise ready systems)

The keyword I use to search the SWI-Prolog source code for where the Prolog predicates are implemented in C is PRED_IMPL

The way I think of the code is that what can be done with Prolog is done in Prolog, the low level actions such as unification are done in C. Then if a predicate needs to be faster it is done with calls straight into C.

Sometimes, as Jan notes, the code is so tricky that it is better to implement in C than Prolog.

That is why I say AFAIK it does not use a Virtual Machine such as WAM or an Intermediate Language such as JVM or CIL.

I know Jan will correct me if this is wrong and then I will have learned something.

Related questions:

How can a foreign language predicate also be a built-in predicate?
“decompiled prolog”

Efficiency of Prolog


Personal Notes

vm_list/1.

?- vm_list(append).
========================================================================
append/2
========================================================================
   0 s_trustme(clause(638140))
----------------------------------------
clause 1 (<clause>(000001707FC6F2F0)):
----------------------------------------
   0 i_enter
   1 b_atom(list)
   3 b_var0
   4 i_call(error:must_be/2)
   6 b_var0
   7 b_var1
   8 i_depart(lists:append_/2)
  10 i_exit
========================================================================
append/3
========================================================================
   0 s_list(clause(735160),clause(641508))
----------------------------------------
clause 1 (<clause>(000001707FCCDEE0)):
----------------------------------------
   0 h_nil
   1 h_void
   2 h_var(1)
   4 i_exitfact
----------------------------------------
clause 2 (<clause>(000001707FC72790)):
----------------------------------------
   0 h_list_ff(3,4)
   3 h_void
   4 h_list
   5 h_var(3)
   7 h_firstvar(5)
   9 h_pop
  10 i_enter
  11 b_var(4)
  13 b_var1
  14 b_var(5)
  16 i_depart(lists:append/3)
  18 i_exit
========================================================================
append/1
========================================================================
   0 i_fopen
   1 i_fcalldetva(-4611686413639185926)
   3 i_fexitdet
true.

Source code:

pl-wam.c
pl-vmi.c
pl-supervisor.c
pl-comp.c
pl-export

From: pl-vmi.c
Virtual machine instruction names. Prefixes:

I_ General instructions
B_ Body specific version
H_ Head specific version
A_ Arithmetic compilation specific
C_ Control (compilation of ;/2, etc.)
S_ Supervisor instructions. See pl-supervisor.c

References:

Logic Programming Implementation - Part I: The WAM
Limits on memory areas - Notes trail stack which is also part of WAM.
Warren’s Abstract Machine - A Tutorial Reconstruction - List the basic instructions of WAM such as put_structure, set variable, unify_value, unify_variable.
An Abstract Prolog Instruction Set

From pl-comp.c

This module (pl-comp.c) forms together with the module ‘pl-wam.c’ the complete
kernel of SWI-Prolog.

Excerpts from: _ Bowen et al. , 1983 D. L. Bowen, L. M. Byrd, and WF. Clocksin. A portable Prolog compiler.

We have opted for the structure-copying method of [Mellish 80] and [Bryunooghe 80], rather than the structure-sharing [Warren 77].

Our storage management strategy is basically that of [Warren 77], i.e. there is a heap containing the program, a “local” stack for control information and variable bindings, a “global” stack for structures, and a "trail stack which keeps track of when variables are bound so that they can be reset to “uninstantiated” at the appropriate time on backtracking. One change is that a reference count is maintained for each clause so that pointers to clauses can safely be included in asserted terms.

As our run-time system is based on previously published work [Warren 77] [warren 80]


EDIT: After responses (1) (2) by Jan W.

References:

SWI-Prolog Implementation history

Bowen et al. , 1983
D. L. Bowen, L. M. Byrd, and WF. Clocksin. A portable Prolog compiler. In L. M. Pereira, editor, Proceedings of the Logic Programming Workshop 1983 , Lisabon, Portugal, 1983. Universidade nova de Lisboa. - Explains low level concepts such as control instructions: enter, call, and exit.

Neumerkel, 1993
Ulrich Neumerkel. The binary WAM, a simplified Prolog engine. Technical report, Technische Universität Wien , 1993 - The binary WAM, a simplified Prolog engine - Notes design concepts of Prolog abstract machines (as opposed to virtual machine VM) at time, including ZIP.

EDIT:

This reminds me of minProlog and specifically the execution engine (solve.ml)
This also reminds me of the MIT open couseware lecture of advanced data structures (videos) . There was one in particular but I can’t remember the exact one.