Value Types for Java

Kenneth Russell Kenneth.Russell at Sun.COM
Wed Jun 18 09:08:37 PDT 2008


It's possible to do what you want with the existing NIO Buffer classes 
and a helper tool. GlueGen (http://gluegen.dev.java.net/) generates Java 
classes to access C data structures. These accessor classes wrap 
ByteBuffers and provide setter / getter methods for accessing the fields 
of the structs. It maintains parallel ByteBuffer, IntBuffer, etc. views 
of the same memory to avoid multiple memory fetches for multi-byte 
primitive values. It supports arrays of C structures by providing a Java 
array of objects, each of which refers to a slice of the underlying C 
storage.

It's not efficient. The need to dereference through the NIO Buffers 
means that each memory fetch gets expanded into something like three or 
four, assuming the HotSpot compiler can't common up some of those 
fetches for multiple accesses to the same object.

When talking to the graphics card via an API like OpenGL there is less 
need to view the data in the form of structures. 
http://jogl.dev.java.net/ and http://jogl-demos.dev.java.net/ have links 
to various demos and JavaOne presentations. For several years we have 
consistently been able to achieve at least 90% of C speed in 3D 
graphical applications written in Java.

Still, value types would be very useful for exactly the cases you 
describe. I would be concerned about the semantic change of 
pass-by-value and what that would mean for the easy readability and 
understanding of Java source code.

-Ken

Ben Hutchison wrote:
> Miles Sabin wrote:
>> On Wed, Jun 18, 2008 at 6:15 AM, Ben Hutchison <benh at ibsglobalweb.com> wrote:
>>   
>>> Also, in terms of what it doesn't do:
>>>
>>> 1. Hard to see any way to extend to interpret a ByteBuffer region as an
>>> array of some value type, a feature ultimately needed for bulk interop
>>> with external IO/processes, I feel.
>>>     
>> What do you mean here? That a ByteBuffer be viewable as an array of
>> (value) objects? 
> Yes. Viewable and updatable.
> 
>  The example case I have in mind is an interaction between a Java 
> process and a 3D graphics driver. Eg a Java process would be 
> writing/updating triangle data in the buffer, and the graphics driver 
> rendering it. (I admit it might be difficult to get this to work even 
> with value type support, given that Java's philosophy says precise 
> memory level representation is undefined by spec)
> 
>> Again, I'm really not sure what it is that you want
>> to do that you can't already.
>>   
> Your earlier idea seemed to be that heterogeneous value types would 
> translate into multiple side-by-side arrays accessed in unison. Most 
> external processes you might want to interact with aren't going to 
> "think" that way. They would typically expect to find fields of a 
> related struct next to each other.
> 
> (Granted you did mention a  single array encoding for homogenous types, 
> but I am concerned thats too fragile in practice - the moment it becomes 
> heterogenous, the encoding scheme totally changes.)
> 
> So, you could have one encoding of a given value type to/from 
> ByteBuffer, and another otherwise, but that seems messy.
> 
> You surely agree that your proposal represents a (worthy) workaround to 
> work in current JVM architectures, and not the ideal solution?
> 
> -Ben
> 




More information about the mlvm-dev mailing list