examples/bench.lisp @ 72bbdd515725

Rewrite the compiler

A few days ago I found a bug in the compiler that I decided merited basically an
entire rewrite of it.

This was long overdue.  The compiler kind of grew organically and unhealthily
over time as I wrapped my head around how the whole WAM is structured, and now
that I understand a lot more I can do things right.

This new implementation is a lot "flatter" than the old one.  It makes use of
CLOS classes and generic methods to un-nest a lot of the crap that was
previously happening in bigass `labels` blocks.  This is a lot easier to read
and understand because you can take things a piece at a time.

Unfortunately, it's currently a lot slower than the old one.  But at least it's
*correct*, and now I can start taking a look at optimizing the performance with
a cleaner base to start from.

Notes/ideas for the near future:

* Switch to structs instead of CLOS classes for all the bits and bobs in the
  compilation process.
* Inline hot functions in the compilation process.
* Type hint the fucking compiler already.  I've put this off for far too long.
* Move the compiler to its own package for easier profiling and to maintain my
  shreds of sanity.
* Look into that generic-function-inlining library thing I saw on Reddit...
* Remove the last vestiges of `match` and kill the dependency on optima.
author Steve Losh <steve@stevelosh.com>
date Tue, 07 Jun 2016 14:49:20 +0000
parents e244881864f7
children 970e21fa14b0
(ql:quickload 'bones)
(ql:quickload 'paiprolog)

(load "examples/ggp-paip-compiled.lisp")
(load "examples/ggp-paip-interpreted.lisp")
(load "examples/ggp-wam.lisp")

(in-package :bones)

(defun reload ()
  (let ((*standard-output* (make-broadcast-stream))
        (*debug-io* (make-broadcast-stream))
        (*terminal-io* (make-broadcast-stream))
        (*error-output* (make-broadcast-stream)))
    (asdf:load-system 'bones :force t)
    (asdf:load-system 'paiprolog :force t)
    (load "examples/ggp-paip-compiled.lisp")
    (load "examples/ggp-paip-interpreted.lisp")
    (load "examples/ggp-wam.lisp")))

(defun run-test% ()
  (format t "PAIP (Compiled) --------------------~%")
  (time (paiprolog-test::dfs-exhaust))

  (format t "PAIP (Interpreted) -----------------~%")
  (time (bones.paip::dfs-exhaust))

  (format t "WAM --------------------------------~%")
  (time (bones.wam::dfs-exhaust)))

(defmacro run-test (&rest settings)
  `(progn
    (declaim (optimize ,@settings))
    (format t "~%~%========================================================~%")
    (format t "~S~%" ',settings)
    (format t "--------------------------------------------------------~%")
    (reload)
    (run-test%)))

; (run-test (speed 3) (safety 1) (debug 1))
(run-test (speed 3) (safety 0) (debug 0))