standard library, search path

refactor fs and notify into single interface

no trailing newline in parser test, requires changes to expr stmt

parse tree/ast testing? - expected AST as result from parse/check instead of
    merely getting a result

mapping between progs and logs to reduce wasted processing- issue #35

bytecode like
[{push 1} {push 0} {cmp 1} {jm 6} {push 0} {jmp 7} {push 1} {jnm 13}
    {setmatched false} {mload 0} {dload 0} {inc <nil>} {setmatched true}]
can be expressed as
[{push 1} {push 0} {cmp 1} {jm 9} {setmatched false} {mload 0} {dload 0} {inc
    <nil>} {setmatched true}]
but jnm 13 is from the condExpr and the previous is from a comparison binary
    expr; an optimizer is needed to collapse the bytecode to undersand that
    cmp, jm, push, jump, push, jnm in sequence like so is the same as a cmp, jm
and we need to worry about the jump table too
  reversed casts: s2i,i2s pairs as well


count stack size and preallocate stack
-> counts of push/pop per instruction
-> test to keep p/p counts updated
: seems like a lot of work for not much return


Run and upload benchmarks to https://perfdata.golang.org/ from circleci

# Won't do

X Use capture group references to feed back to declaring regular expression,
X     noting unused caprefs,
X     possibly flipping back to noncapturing (and renumbering the caprefs?)
        X -> unlikely to implement, probably won't impact regexp speed

When using a const by itself as a match condition, then we get warnings about
    the capture group names not existing.
    const A /(?<a>.*)/
    A {
      x[$a]++
    }
    ... => $a not defined in scope.


Can't define string constants, like const STRPTIME_FORMAT "Jan _2"

Multline const can't startwith a newline, must be const FOO // +\n...

Can't chain two matches in same expresison like getfilename() =~ 'name' &&
    EXPR_RE because $0 is redefined


Can't set the timestamp when processing one log line and reuse it in another; must use the
    caching state metric pattern, hidden gauge time.

Get a list of non-stdlib deps
go list -f "{{if not .Standard}}{{.ImportPath}}{{end}}" $(go list -f '{{join .Deps "\n"}}' ./...)


Request joining (request coalescing) for the log-watcher when sending updates about files, in case
one's already in the queue.  Maybe helps with fsnotify overflow, and the
    duplicate notify problem from poll-only mode?
    Can we do this with a one-element channel per file, and a select on send to abort if the send blocks?

Programs may not use mtail_ as a metric prefix.

Theory: Implicitly cast Int shouldn't get the S2i conversion applied to them.  Do we need to name Implicit Int separate from Int and then not create s2i or other conversions for implicits.  (and we need to keep the runtime conversions?)


=~ isn't documented in the language or programming guide docs


if you comment out the MATCH_NETWORK clase in dhcpd.mtail it gets 30x faster... because the regexp no longer backtracks... why...


Avoid byte to string conversions in the tailer and vm FindStringSubmatch > https://dave.cheney.net/high-performance-go-workshop/dotgo-paris.html#strings_and_bytes

Use FindSubmatchIndex to avoid copies?


Move the non-program examples to the vm integration test.

Why is strings.Builder slower than bytes.Buffer when the latter's docstring recommends the former?

file-test.go relies on the ReadDeadline timeouts in file.go and socket.go.  Remove to make tests faster.
