This is great, both as an "étude"---a challenge for sharpening your technique---and as an exemplary write-up of the process of building something non-trivial and making it both correct and fast. Nice work.
I'm sure you knew already, but Peter Weinberger (the W in AWK) is on the Go team at Google. On 17 November 2018 at 12:44, Ben Hoyt <benh...@gmail.com> wrote: > I've "finished" my Go AWK interpreter and released v1.0.0 now. I've fixed > several bugs, and also sped up the interpreter significantly, primarily by: > > 1) Resolving variable names to integers at parse time so we can do []value > lookups instead of map[string]value lookups at runtime > 2) Using normal error returns instead of panic/recover internally for > interpreter errors (but oh for the proposed "check" keyword to make this > less verbose!) > 3) Using switch/case to switch on binary operation type instead of looking > up the operation in a map of functions > 4) Avoiding allocations in many instances > > Here's a write-up about GoAWK for those that are interested: > > https://benhoyt.com/writings/goawk/ > > It's pretty much a toy project, not being used for anything real, but it > seems to be in a good shape. Feedback welcome! > > -Ben > > > On Fri, Aug 24, 2018 at 5:13 PM Ben Hoyt <benh...@gmail.com> wrote: > >> I recently wrote an AWK interpreter in Go: https://github.com/benhoyt/ >> goawk >> >> It's a pretty simple implementation: hand-rolled lexer, recursive-descent >> parser, and tree-walk interpreter. It's pretty complete according to the >> POSIX spec, and it passes the AWK ("one true awk") test suite as well as my >> own unit tests. >> >> In some quick tests I ran, I/O speed is on a par or better than AWK but >> the interpreter itself is quite slow -- about 5x slower for a lot of >> things. I hope to add some proper benchmarks soon. I have a pretty good of >> why and how to fix it: variable lookup and assignment is slow, and I'm >> planning to fix by resolving more things at parse time. >> >> One thing that's a bit funky about AWK is its type handling: string >> values can be real strings or "numeric strings" (numbers that came from >> user input). I'm currently passing the "value" struct (see interp/value.go) >> around by value. I still need to test if that's a good idea >> performance-wise or not. >> >> I'd love to hear any comments, bug reports, or -- especially -- code >> reviews. >> >> -Ben >> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "golang-nuts" group. >> To unsubscribe from this topic, visit https://groups.google.com/d/ >> topic/golang-nuts/kYZp3Q1KKfE/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> golang-nuts+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.