[[!meta title="Turbo Bindat"]] [[!meta copyright="Copyright © 2021 Stefan Monnier"]] [[!inline pages="internal(2021/info/bindat-nav)" raw="yes"]] # Turbo Bindat Stefan Monnier [[!inline pages="internal(2021/info/bindat-schedule)" raw="yes"]] # Table of Contents Bindat is an ELisp library to help manipulate binary data. This is a niche library that is used by packages such as Websocket, EMMS, and cpio-mode. Its implementation was repeatedly caught harassing hapless kitten while at the same time providing poor service slowly. For Emacs-28, Bindat was rewritten so as to make it more efficient and flexible while respecting the kitten. In this presentation I intent to show how we saved those. Not recommended for birds. # Discussion - Q1: bindat seems very similar to GNU Poke (except that GNU Poke is a superset, and then some, with a different syntax). I'm wondering if it might be good to add a bindat variant that translates to/from Poke if need be (using libpoke), for sheer insane blazing native-code JITted speed. (And, later, maybe letting bindat gain some of the insanely expressive capabilities GNU Poke has got). Its use of eval blocked this in times past. but now... - A:GNU Poke is indeed the natural evolution, and is much more powerful.  Given the fairly little use of BinDat so far, I'm not sure there will be enough motivation to give access to GNU Poke from Emacs, tho.  One of the main benefits of using GNU Poke would probably be that lots of formats are already available for GNU Poke, so you could directly re-use them. - Q2: Is your dog's name something Lisp or PL related...? :) - A:Winnie?  I don't think so, no (we didn't choose the name, in any case) - Q3: This looks amazing!  Is it merged into mainline Emacs, a patch, an external library? - A: It's in Emacs-28 - Q4: Are there benchmarks of this vs. the older bindat? - A:There is a benchmark for it in the `elisp-benchmarks` - Q5: Do you know of any CL or Scheme libs similar to bindat.el? - A: No, but I'd be interested to hear about it if someone else does. - Q7:  You are a hero of kittens everywhere.  Do you have any feline pets as well?  :) - A: Not yet.  If you're near Montreal and you have a kitten for me, I'm interested - I *hope* cl-loop is more efficient than building a bunch of intermediate lists when you chain map/filter/reduce operations. - Curious: how is gnu poke more flexible? - What hobbies/interests do you have besides Emacs (and PL)? :) - do you have any thoughts about how to make EmacsConf even better next year? - I was surprised to see that a whole new DSL was developed for poke from scratch. Do you think would have been better to develop/improve a library like bindat on top of an existing language instead? - What are some of your favorite talks from this conf so far? - what kind of dog is Winnie? - comment: I hadn't heard of that breed before - How do you see more control over types (type hints/decl through type specifiers etc) (SBCL like programming model) coming into Elisp? - Do you plan to add bit-level support? Other comments: - I can imagine using bindat to improve Emacs's music player packages - yes last year the Q&A periods were much longer - last year some of the presentations were live though - I've asked this question to them during LPC 2020 but infact haven't got a very satisfactory answer :) - If you ever write a library for window management in Emacs, you could call it winnie.el :) - hints in unoptimized code should be assertions - we probably need both ways of compiling: safe and less safe :) - I think this is classic problem that is almost impossible to accomplish. many libraries try to do that but in the end the only working ones are relaying on C compilers. - also you have the problem of size of objects. like how big is a long? this is not specified and is arch dependent - parsing a generic .h file is way more difficult but is another subject. - yep, the automatic translation is more for libraries trying to write automatically C bindings [[!inline pages="internal(2021/captions/bindat)" raw="yes"]] [[!inline pages="internal(2021/info/bindat-nav)" raw="yes"]]