Hi Igor,

I have commited the refactoring that you have suggested. Namely, using the
indirect loader as a wrapper of another loader. I have renamed the class to
NBSTIndirectArgument (I think it better reflects its purpose)....

I would appreciate though if you can have a look at the "bound checking"
 that I have implemented for the #emitLoad: since I'm not really an expert
user of nativeboost ;).

Cheers,
Ciprian

On Thu, Oct 25, 2012 at 4:15 AM, Igor Stasenko <siguc...@gmail.com> wrote:

> On 24 October 2012 21:55, Ciprian Teodorov <ciprian.teodo...@gmail.com>
> wrote:
> > Hi Igor,
> >
> > I finally managed to commit the stuff.
> > Now I looked a little bit into the idea of generalizing it to work with
> any
> > loader, which seems to work pretty much. Now I have two questions:
> > First of all, what about #argName:type:arity? Should we remove it and
> > replace it everywhere with #argName:indirectIndex:type:arity ? Or we
> should
> > keep it? I don't quite grasp the impact such a change will have on the
> whole
> > machinery (Ex. NBNativeFunctionGen, and NativeArgument).
> >
> This is a contract between parser and its requestor. Since we changing
> contract,
> all requestors should use new protocol.
> NBNativeFunctionGen can simply ignore that, because they don't handle
> smalltalk objects.
> NativeArgument is encapsulation of parsed argument. But since index
> transformed into different loader,
> there no need to change anything for it.
>
> > Secondly, i was thinking about ways to check the indirect bounds... and
> I'm
> > quite dry of ideas... Is there any generic way to check the bounds of an
> > object, or we should do that on a case by case basis? Typically I would
> > think that we need something that gives us the size of an object in
> bytes,
> > however I'm not sure that all our objects are contiguous in memory (or if
> > they are that they will be like that forever), moreover what about
> > smallintegers? Should we restrict the approach to Arrays only?
> >
> Look at InterpreterProxy, it has such functionality. And sure thing
> smallints should no be allowed.
> But if you find it hard to implement, just leave 'self halt' there,
> and meanwhile use callouts with option to check bounds turned off. I
> will implement that later.
>
> > well that's it for now
> > Cheers,
> > Ciprian
> >
> >
> > On Wed, Oct 24, 2012 at 8:47 PM, Stéphane Ducasse
> > <stephane.duca...@inria.fr> wrote:
> >>
> >> May be we should ask dave mason because he wrote a C header parser or
> >> something like that.
> >>
> >> On Oct 23, 2012, at 7:35 PM, Ciprian Teodorov wrote:
> >>
> >> > Hi Igor,
> >> >
> >> > There seems to be an issue with the squeaksource repo... I don't see
> >> > myself listed amongst the developers nor can I commit
> >> >
> >> > I'm using this connection string:
> >> > MCHttpRepository
> >> >     location: 'http://www.squeaksource.com/NativeBoost'
> >> >
> >> >
> >> >     user: 'cip.t'
> >> >
> >> >     password: '*******'
> >> >
> >> > Cheers
> >> > Ciprian
> >> >
> >> > On Tue, Oct 23, 2012 at 10:20 AM, Igor Stasenko <siguc...@gmail.com>
> >> > wrote:
> >> > HI, Ciprian.
> >> > I added you to developers.
> >> >
> >> > Just single comment about auto-generated wrapper(s)/bindings:
> >> > You need to do it only once. Then it will not be needed.
> >> >
> >> > Yes, you can do it automated or manually (automated is preferred), but
> >> > since you do it only once, even if manually, this is not going to be
> >> > too big bottleneck.
> >> > Sure things, having a tool(s) which can automate that would be nice.
> >> > But according to my experience, you can automate it only partially,
> >> > but not fully.
> >> > There , of course, exceptions like OpenGL library which API design
> >> > allows to automate wrapping.
> >> >
> >> > And sure thing it would be nice to have some code generators to import
> >> > from C header(s).
> >> >
> >> >
> >> > On 22 October 2012 19:52, Ciprian Teodorov <
> ciprian.teodo...@gmail.com>
> >> > wrote:
> >> > > Hi guys,
> >> > >
> >> > > First of all sorry for not saying anything the whole day ... but I
> >> > > don't
> >> > > have internet connection at work. I hope I'll be excused though ;)
> >> > >
> >> > > Now it will be a difficult for me to address all the issues raised
> ...
> >> > > however I will try
> >> > >
> >> > > First of all, IMHO any FFI should facilitate the task of the person
> >> > > writing
> >> > > the library wrapper.
> >> > > This comes the issue of (hopefully automatically) parsing C headers
> >> > > and
> >> > > generating the calls.
> >> > > Why?... well because if I take for instance the BLAS/LAPACK case
> >> > > (which was
> >> > > cited today) have over 1000 functions exported.
> >> > > Even if it is not 1000 lets say that you have a smaller library from
> >> > > which
> >> > > you want to use only one function X but in order to use that precise
> >> > > function you will maybe have to initialize some C context data, or a
> >> > > specific data structure.
> >> > > Of course you can do that by hand, but what if you really want to
> >> > > benefit
> >> > > from the library without diving into the details... well in that
> case
> >> > > you
> >> > > are a little bit stuck, either you write by hand a bunch of wrappers
> >> > > or you
> >> > > quit.
> >> > >
> >> > > The problem is that nice libraries that you want to use they usually
> >> > > have
> >> > > horrible data structures behind that you cannot set up easily. This
> >> > > happened
> >> > > to me several times in the future while trying to use different
> >> > > external
> >> > > library calls (graphviz, metis, abc, vpr to name a few) in Pharo
> (with
> >> > > FFI,
> >> > > with Alien, etc). In almost all cases I ended up generating text
> files
> >> > > and
> >> > > calling some bloody c program using these files as input. The
> problem
> >> > > is
> >> > > that has a huge impact on performances...
> >> > >
> >> > > Now with nativeboost I found it pretty easy to automatically
> generate
> >> > > some
> >> > > usable binding... I parsed the C headers with srcml, the I have
> parsed
> >> > > the
> >> > > XML looking for function definitions... For these definitions I've
> >> > > generated
> >> > > the wrappers. Only that for over 15 argument functions that did not
> >> > > work.
> >> > >
> >> > > Now, I do not like the idea of hacking the compiler, or even
> >> > > subclassing it
> >> > > like Nicolas did for Smallapack. And luckily we do not need to do
> that
> >> > > with
> >> > > the arguments in an array trick... Moreover, I completely agree with
> >> > > Igor on
> >> > > the fact that 15 arguments are to many, however Pharo really needs
> to
> >> > > have
> >> > > an automatable FFI generation.
> >> > >
> >> > > Igor, I have seen that you have mentioned some work-arounds using
> >> > > instance
> >> > > variables, and/or NBExternalStructures. Both these ideas are great,
> >> > > especially the use of the NBExternalStructure, however in my opinion
> >> > > if you
> >> > > want to generate them automatically you've got yourself an even
> bigger
> >> > > problem.
> >> > > Will you generate a new class for each function call that you have?
> >> > > What about the FFI being a wormhole to an ugly and mean world?
> >> > > I think we should try to reduce the size of that hole ;)
> >> > > Though, you have a point with using named arguments, and I think
> that
> >> > > is a
> >> > > cool solution too. That is why I was speaking about directly
> accessing
> >> > > the
> >> > > instance variables by name.
> >> > > I simply didn't know enough about the hidden powers of
> >> > > NBExternalStructure.
> >> > > ;)
> >> > >
> >> > > As for extending the nativeboost signatures and accessing object
> >> > > fields by
> >> > > name, I completely agree with you that it is not a good idea.
> >> > >
> >> > > However, using the indices of arrays I think is only a small
> addition
> >> > > that
> >> > > can have a huge impact on the way people use NativeBoost FFI without
> >> > > adding
> >> > > to much extra-overhead.
> >> > > By the way, I think we definitely have to do the bound-checking
> trick
> >> > > by
> >> > > default.
> >> > > Moreover, having the NBSTInObjectArgument as a wrapper over another
> >> > > loader
> >> > > is a great idea, giving us another degree of "controlled" freedom.
> ;)
> >> > >
> >> > > Thanks Henrik for the good joke (I didn't see it coming :)), It
> makes
> >> > > me
> >> > > hate this idea now. :P
> >> > >
> >> > > self callFn: {x . y}
> >> > > Looks kinda familiar doesnt it? (hint: swap { for ( and . for , )
> >> > > I for one welcome our new syntactic overlords!
> >> > >
> >> > > As for supporting or not more than 15 arguments for typical method
> >> > > calls...
> >> > > I don't know... maybe is good maybe is bad, but I think there are
> >> > > other
> >> > > things that need to be done before making a fuss about it. By the
> way
> >> > > is it
> >> > > an arbitrary limit, or it is imposed by the use of 4 bytes for
> storing
> >> > > the
> >> > > number of arguments?
> >> > >
> >> > > Now let me come back to practical issues. My squeaksource id is
> cip.t
> >> > > (you
> >> > > can find me searching "ciprian" in the members list).
> >> > >
> >> > > Cheers,
> >> > > Ciprian Teodorov
> >> > >
> >> > >
> >> > >
> >> > >
> >> > >
> >> > > On Mon, Oct 22, 2012 at 1:09 PM, Igor Stasenko <siguc...@gmail.com>
> >> > > wrote:
> >> > >>
> >> > >> On 22 October 2012 12:00, Henrik Sperre Johansen
> >> > >> <henrik.s.johan...@veloxit.no> wrote:
> >> > >> > On 22.10.2012 02:37, Igor Stasenko wrote:
> >> > >> >>
> >> > >> >> On 22 October 2012 01:59, Nicolas Cellier
> >> > >> >> <nicolas.cellier.aka.n...@gmail.com> wrote:
> >> > >> >>>
> >> > >> >>> 2012/10/22 Igor Stasenko <siguc...@gmail.com>:
> >> > >> >>>>
> >> > >> >>>> On 22 October 2012 01:20, Nicolas Cellier
> >> > >> >>>> <nicolas.cellier.aka.n...@gmail.com> wrote:
> >> > >> >>>>>
> >> > >> >>>>> 5 parameters???? Igor, you're a dictator ;)
> >> > >> >>>>> Those theories are nice, but unhelpfull when applied to FFI
> >> > >> >>>>> Pragmatically there's not any chance I rewrite LAPACK+BLAS
> for
> >> > >> >>>>> the
> >> > >> >>>>> sake of purity.
> >> > >> >>>>>
> >> > >> >>>>> And your workaround (creating a class) is very poor, because
> >> > >> >>>>> maybe
> >> > >> >>>>> classes themselves should not have more than 5 instance
> >> > >> >>>>> variables ;)
> >> > >> >>>>>
> >> > >> >>>> Hehe.
> >> > >> >>>> This is same thing like increasing number of literals for
> >> > >> >>>> methods
> >> > >> >>>> (and
> >> > >> >>>> max distances between jumps).
> >> > >> >>>> It just makes sense where you deal with external chaotic
> world.
> >> > >> >>>> My ideology is simple: prevent that chaos from entering our
> >> > >> >>>> little
> >> > >> >>>> peaceful bay.
> >> > >> >>>>
> >> > >> >>> That's not exactly the philosophy behind FFI.
> >> > >> >>> FFI is here to let the user manage the external chaotic world.
> >> > >> >>> OK, external peels of the onion should have 5 parameters or
> less.
> >> > >> >>> Near the sprout, you can't raise such barriers, or there is no
> >> > >> >>> onion
> >> > >> >>> at
> >> > >> >>> all.
> >> > >> >>>
> >> > >> >> Well, that's part of developer's responsibility, how to prevent
> >> > >> >> chaos.
> >> > >> >> Needless to say, nobody wants to deal with so many arguments at
> >> > >> >> once
> >> > >> >> (too much space for mistakes).
> >> > >> >> As for my workaround: this mainly, how you tame the complexity
> in
> >> > >> >> case
> >> > >> >> it is inevitable?
> >> > >> >> Look how code to call that function will look like:
> >> > >> >>
> >> > >> >> 1. passing as array
> >> > >> >>
> >> > >> >> args := Array new: 100.
> >> > >> >> args at:1 put: x;
> >> > >> >> at:2 put: y;
> >> > >> >>   ...
> >> > >> >> at: 100 put: zork
> >> > >> >>
> >> > >> >> self callFn: args.
> >> > >> >
> >> > >> > self callFn: {x . y}
> >> > >> > Looks kinda familiar doesnt it? (hint: swap { for ( and . for , )
> >> > >> > I for one welcome our new syntactic overlords!
> >> > >> >
> >> > >>
> >> > >> Yes, it looks familiar, but cannot tell where i seen it.
> >> > >> Gah.. how i could forget about it?
> >> > >>
> >> > >>
> >> > >> >>
> >> > >> >> 2. passing as instance of class, or external structure:
> >> > >> >>
> >> > >> >> args := MyFunctionArgs new.
> >> > >> >> args
> >> > >> >>   firstArgumentName: x;
> >> > >> >>   secondArgumentName: y;
> >> > >> >>   ...
> >> > >> >>   hundrethArgumentName: zork.
> >> > >> >> self callFn: args.
> >> > >> >>
> >> > >> >> admit that dealing with names instead of numbers leaves much
> less
> >> > >> >> space for mistakes
> >> > >> >> and serves for better clarity at same time.
> >> > >> >> So, even if it is more cumbersome because requires defining
> extra
> >> > >> >> class, at the end you win much more.
> >> > >> >>
> >> > >> >> Anyways, if people think it is worth adding indirect argument
> >> > >> >> loader (
> >> > >> >> in form of param@<index>, but not param@ivar), we can introduce
> >> > >> >> that.
> >> > >> >>
> >> > >> > While I often find this a good idea for maintainability, it sorta
> >> > >> > flies
> >> > >> > in
> >> > >> > the face of another of ST's strengths, iterative/exporatory
> >> > >> > programming.
> >> > >> > If you are forced to think up front about which parameter classes
> >> > >> > you
> >> > >> > need
> >> > >> > due to a small limit, rather than introduce them ad-hoc when the
> >> > >> > code
> >> > >> > really
> >> > >> > needs the refactoring to remain legible, it slows you down.
> >> > >> >
> >> > >> > Not thinking of FFI specifically, but I have seen lots of evolved
> >> > >> > mathematical models where a 5-parameter limit upfront would
> >> > >> > probably
> >> > >> > lead to
> >> > >> > either:
> >> > >> > a) *Really* bad code, ie. making the calculation object stateful
> by
> >> > >> > storing
> >> > >> > in instvars instead. (and in the process, make it really hard to
> >> > >> > know
> >> > >> > which
> >> > >> > instvars are actually part of object state and not temp vars of
> >> > >> > some
> >> > >> > calculation)
> >> > >> > b) Switching to another programming language out of frustration.
> >> > >> >
> >> > >>
> >> > >> keyword message syntax is bad for many arguments..
> >> > >> for such cases i find a positional argument notation more appeal
> >> > >> because it is more compact.
> >> > >> In any case, a complex math formulas smell equally bad in any
> >> > >> programming language
> >> > >> (sometime even if written by hand on paper using math notation(s)
> ;)
> >> > >>
> >> > >> > Cheers,
> >> > >> > Henry
> >> > >> >
> >> > >>
> >> > >>
> >> > >>
> >> > >> --
> >> > >> Best regards,
> >> > >> Igor Stasenko.
> >> > >>
> >> > >
> >> > >
> >> > >
> >> > > --
> >> > > Dr. Ciprian TEODOROV
> >> > > Ingénieur Développement CAO
> >> > >
> >> > > tél : 06 08 54 73 48
> >> > > mail : ciprian.teodo...@gmail.com
> >> > > www.teodorov.ro
> >> >
> >> >
> >> >
> >> > --
> >> > Best regards,
> >> > Igor Stasenko.
> >> >
> >> >
> >> >
> >> >
> >> > --
> >> > Dr. Ciprian TEODOROV
> >> > Ingénieur Développement CAO
> >> >
> >> > tél : 06 08 54 73 48
> >> > mail : ciprian.teodo...@gmail.com
> >> > www.teodorov.ro
> >>
> >>
> >
> >
> >
> > --
> > Dr. Ciprian TEODOROV
> > Ingénieur Développement CAO
> >
> > tél : 06 08 54 73 48
> > mail : ciprian.teodo...@gmail.com
> > www.teodorov.ro
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
>


-- 
Dr. Ciprian TEODOROV
Ingénieur Développement CAO

tél : 06 08 54 73 48
mail : ciprian.teodo...@gmail.com
www.teodorov.ro

Reply via email to