Q: Is there a compiler/language/magic registry?
Timothy S. Nelson
wayland at wayland.id.au
Fri Jul 3 05:16:56 UTC 2009
I'm completely unqualified to comment, but I'll throw some ideas
around anyway.
On Wed, 1 Jul 2009, Stephen Weeks wrote:
> On Wed, 2009-07-01 at 11:19 -0400, Austin Hastings wrote:
>> Should there be one? Tene's foreign-code-loader assumes that the
>> developer knows the language of origin for each foreign module:
>>
>> use Foo::Bar:from<Tcl>;
>>
>> But that's a non-starter in the long term, since knowing the language of
>> implementation totally violates encapsulation.
>
> I'm only indirectly addressing your main point, but I'm pretty sure I
> disagree with this. The language of implementation is just part of the
> name of the library, and the language implementation is just a
> dependency of the library. If you want that to be encapsulated, write a
> native library named the same and have it try loading whichever other
> versions you'd like to try, like Perl 5's YAML::Any on CPAN. I expect
> you'll often want to do that anyway, to provide language-native idioms
> that aren't present in the other language.
I know you've seen pmichaud's message by now, but let me quote it:
: Currently this is what Rakudo does -- it has a :load sub that
: loads the Rakudo runtime environment into the interpreter if not
: already present.
If everyone were to do it this way, that would solve at least part of
the problem; then the only problem would be getting the library into the path
:). I know Larry Wall said somewhere that, for Perl 6, he wants to have the
path-interpreting code be more intelligent, so that shorter paths could be
specified. For example, my PERLLIB currently says:
..../usr/lib/perl5/site_perl/5.005:/usr/lib/perl5/site_perl/5.005/i386-linux/
Larry's idea is that we'd just be able to say:
PERLLIB=/usr/lib/perl6
...and the Perl 6 specification would say how to go about finding the
appropriate library from there.
I know that Parrot isn't Perl 6, but I'm wondering if the general idea
can't be used. If the code for each library was marked somehow (maybe by
putting it in a subdirectory) that said what language it was, then the
library-finding code could know the language from this marking.
> Restating, as far as I'm able to see (admittedly, I have far too little
> experience with this), the only solution that makes any sense at all is
> to just ask the foreign compiler to load the library for you and give it
> to you. Other solutions get into N×M complexity, exclude languages with
> slightly different paradigms, require languages to bend too much to
> Parrot's way of doing things, etc.
Am I correct in guessing that this is answered somewhat above?
> You can't have a central repository, afaict, because different existing
> languages already store their libraries in different places, and
> requiring the Parrot version to store them in a parrot-specific location
> will greatly cripple the Parrot version.
Softlinks/Windows Shortcuts?
> Having languages add to the
> search path introduces the problems of requiring you to explicitly load
> all languages you want to have considered (and what if some module you
> use adds an additional language?), as well as search path ordering, and
> what if multiple languages register the same file extension?
Different paths for different implementations. eg. Rakudo would use
the Rakudo search path, which would put all Rakudo stuff ahead of anything in
other implementations, but fall back on other things (eg. Cardinal). If your
Perl 6 program calls a Ruby library, and the Ruby program calls a library
called "IO" which exists with different APIs for both Perl 6 and Ruby, then
the Perl 6 program would find the Ruby library only after searching through
the Rakudo ones, but the Ruby code would find the Ruby IO library because it
would search the Cardinal path before the Rakudo path.
I'd happily agree that file extension is a bad way to figure out the
language something is in.
> Also, you discuss encapsulation. Are you going to dictate that all
> libraries must have identical APIs in all languages? What about
> existing identically-named libraries in different languages? What about
> differences between languages?
I hope these are covered by the multiple paths idea I mentioned above.
> Are you going to say that no libraries in any language can use named
> parameters in exported functions, because some languages can't use named
> parameters?
I don't know the answer to that, but I think it's solveable, although
possibly at a standard + implementation level rather than a parrot code level.
> It's an impossible mess to work out, as far as I can tell. I would really
> love someone else to help work out these issues, though.
That one that I didn't know the answer to, I could throw some ideas
around, but mostly I'd just be displaying my ignorance. If this is the only
problem standing in the way, though, I'd be happy to throw the ideas.
> Again, I'll restate my position that the language a library was
> implemented from *really* should count as part of the name of the
> library. Functions in that language will return objects of types from
> that language, will use the calling conventions of that language, etc.
> (Unless you want to get into the horrible mess of trying to map core
> classes from one language to another automatically... which I really
> really think you don't. I'm willing to be persuaded, but I'm pretty
> sure it's not the right thing at all for Parrot to be trying to do in
> general.)
Hmm. Can I suggest that, unless we can figure out a better idea, that
the way to do it might be to have a "Parrot Interlanguage Communication
Standard", which defines how these things work together? Possibly it could
even be optional; I'm unsure whether that's the best way to go, and will leave
that question to others :).
> I really don't mean this as an attack. If you can work out solutions to
> these problems (and others), I'd love to implement them. My main answer
> to your initial question is "Nobody so far can think of any good way to
> do what you're asking for, and it looks like it invites far more
> problems than it would solve, but we're open to being convinced."
Hmm. Well, the problems I didn't solve were:
- Calling conventions (named parameters, etc)
- Data types auto-conversion
I think these are solveable, but as above, I don't think I have the
requisite knowledge of Parrot to be able to suggest sensible solutions other
than the Parrot Interlanguage Communication Standard that I suggested above.
HTH,
---------------------------------------------------------------------
| Name: Tim Nelson | Because the Creator is, |
| E-mail: wayland at wayland.id.au | I am |
---------------------------------------------------------------------
----BEGIN GEEK CODE BLOCK----
Version 3.12
GCS d+++ s+: a- C++$ U+++$ P+++$ L+++ E- W+ N+ w--- V-
PE(+) Y+>++ PGP->+++ R(+) !tv b++ DI++++ D G+ e++>++++ h! y-
-----END GEEK CODE BLOCK-----
More information about the parrot-dev
mailing list