Last updated at 5:06 pm UTC on 16 January 2006
Why to Think Twice before Using FFI
The following explanation is from a mail message written by Andreas Raab:
In a nutshell: FFI is dangerous ;-)
In another nutshell: FFI allows you to call functions written in other
languages (mostly C), so one can call (for instance) OS functions directly from Squeak. Have a look at the examples, they all use functions that are not in Squeak but live somewhere in the outside world. This of course implies that you have to play by the rules of the outside (C) world - or in other words, if you make a mistake you'll not drop into the debugger but Squeak will just crash. That's what the first explanation means.
The FFI stuff is in a way related to pluggable primitives since it's using several of the mechanisms pluggable primitives use. But there are major differences:
- The FFI is for interfacing existing libraries only. If you don't have an existing library that does what you want you'll have to write it - and that's basically what the pluggable primitives are intended for.
- While it is possible to write a set of pluggable primitives that interface existing libraries (such as the AppleScript plugin) you don't have to do it any longer. The FFI does all the necessary conversions for you. The AppleScript stuff could be written using the FFI without the need to have a separate plugin for it.
- The FFI is slow compared to pluggable primitives. Since there are many generic conversions necessary the overhead of calling C functions directly is very high. That doesn't matter as long as you're calling functions that actually do quite a bit of work but if you're concerned about the speed (e.g., when you call these functions a zillion times per second) you are much better off using pluggable primitives.
- The FFI is very platform dependent. Pluggable primitives give you a way of defining abstract interfaces (e.g., primitives) to the provided functionality. When using the FFI you talk to the underlying system directly.
- If you crash Squeak when it is running the garbage collector, then you know your FFI code is leaking bits into object memory.
Page major history:
09 April 2002 – info moved to this new page by Martin McClure