-----Original Message----- From: Eric King [mailto:rex@smallandmighty.com] Sent: Tuesday, June 02, 1998 6:21 AM To: squeak@cs.uiuc.edu Subject: Re: floatarray primitives
:I am looking for floatarray which are implemented in primitives for speed. :I want to use them for intensive vector and matrix type calculations.
I'm also interested in some capabilities like this, but I don't think it's very high on the Squeak team's to-do list, and I haven't found any third parties who've attempted this yet. There's also the question as to how much such a library would bloat the Squeak VM. Personally, I think a high-speed & portable math library would be a wonderful addition to Squeak and go a long way towards increasing its performance. I am willing to help out on such a project but how should such a library be structured? Matrix routines seem like a good place to start, but what sorts of matrix routines? You mention a floatarray class, should it be strictly one dimensional for simplicity, or n-dimensional for generality? (I'm a voxel person, so I have an interest in seeing fast support for 3D arrays ;))
Have any of you looked at ST/X. I'm not suggesting you use ST/X necessarily, I recognize that the goal is to do this in Squeak. But it is interesting how ST/X solves this. ST/X does have FloatArray. In fact, it has a TypedArray classes for each kind of base C number type. The difference in ST/X is there inline-C. I'm not a VM/C hacker, otherwise I'd love to see something like this benefit the Squeak community.
ST/X has a processing program called STC, that takes Smalltalk source and turns it into ANSI (maybe K&R actually) source. This is similiar in principle to the C translation capabilities of Squeak. IMO, STC has the edge, because it does not require you to write your Smalltalk in a C like way, or restrict use of certain Smalltalk constructs. You can do blocks, and all of the other cool Smalltalk stuff that we love. What this means is that you can also embedd fragments of code in your Smalltalk code, that are not meant to be translated, because they are written in C already. When the parser/compiler sees a method that has the embedded C tokens in it, it automatically converts the entire method to C and compiles it using your favorite C compiler, right there while you watch. Rather than interpreted, or JIT'ed, it's force compiled.
I have found this to be extremely cool as I have played with it. A long time ago, since we do alot of numerical processing where I work, we taught collections how to add, multiply, subtract, divide, etc, ala numeric vectors. Adding this behavior, as primitives, was so easy, it made me laugh. In VW, to do this, we had to code up a DLL, an ExternalInterface, blah, blah, blah. I looked at doing the same thing in Squeak. STP even posted a good description of how to write your own primitives. But that required rebooting the image, recompiling the VM, picking a prim number, c'mon.... In ST/X I just typed in the simple C loop to add the argument to the recievers elements, and return the new array as an object, hit the accept button, and was off and running.
Ultimately, I would love to see this kind of approach to the Smalltalk-C bridge in Squeak. The down side, is that you leave the developer open to write C code in methods. It's fair to argue that this is just as portable as the current philosophy, since the Squeak CTranslator converts things to C anyway. The upside, is that you can change (at least some of) the VM on the fly. For grins one day, I changed the basicNew C code to add 2 bytes of fluff to each object, and print out the memory address of the new object to STDOUT. I hit accept, and tada, STDOUT started scrolling tons of numbers. I didn't have to reboot the VM, decide that this was esoteric primitive number 666. It was an extremely vindicating feeling. I could not have done this in Squeak.
Anyway, if you want to do FloatArray primitives, that IMO is the way to do it.
-- Travis Griggs Key Technology, Inc. tgriggs@keyww.com To Smalltalk! - and Beyond!