Sunday, April 22, 2007

Contributing source files

When working on new examples for Cohatoe, I noticed that it is still somewhat tedious to go through the usual cycle: write some code, compile and run it, make some changes, compile and run again ... One thing that makes it tedious is the need to compile the Haskell code into object files all the time.

In order to make this nicer, I have extended Cohatoe to run Haskell code from contributed source files. (The actual work of compiling and loading the code is again done by hs-plugins.) You can now just put a Haskell source file into your plugin project, and declare it similarly to how you would have declared an object file.

There a few rather minor details connected to that change I'm a little unhappy about. One is that I had to change the format of a Cohatoe extension in the plugin.xml once more. Instead of a (mandatory) objectFile attribute, the haskellFunction has now a codeFile attribute (which says nothing anymore about the content of the file). Whether we treat the file as a source code file or an object file is determined from the file extension. Currently recognized are .o as extension for object files and .hs and .lhs for source files. The alternative would have been to keep the old objectFile attribute and introduce a new one called sourceFile. But that would have meant to make them both optional, and the only way to validate that exactly one of them was specified is then in the Java code that reads the extension. The current way has also the advantage that it can be easily extended to other types of contributed Haskell code (I'm in particular thinking of Haskell code that is compiled to JVM bytcode, e.g. via LambdaVM).

On the downside, of course, that's one more API change which is annoying to any early adopters out there :-( Still I think it's better to make such changes now, that is, early in the cycle.

Another less-than-optimal thing is that the .o and .hi files that hs-plugins generates before loading them end up in the same folder in which the original source file is. There is a number of situations where this could be a problem, including running from a jarred plugin, running from a write-protected folder, and so on. Cohatoe can handle a number of these situations transparently already, but very likely I have still overlooked one or the other. Therefore I regard this as a somewhat unfinished detail.

Of course, the additional compilation step has an effect on the time needed when first accessing the function; in production mode you would probably still prefer a pre-compiled object file to contributing a source file.

Looking at the bright side, this new possibility to run contributed Haskell code as source code will help to make life easier during development, and also make it easier to provide platform-independent functionality (always assuming that the code itself doesn't make any assumptions about the OS it runs on, in which case there is no way around keeping platform-specific code in one manner or the other).

6 comments:

Philipp said...

Hallo Leif!

Ich benutze eine Abwandlung des Cohatoe-Servers. Er funktioniert auch gut, bis auf eine Kleinigkeit: Ich übergebe meinem Programm ein Haskell Source Datei, für diese Datei wird ein Haskell Plugin generiert. Beide Dateien übergebe ich dann dem Cohatoe Server. Als Fehlermeldung erhalte ich dann z.B.: "Could not find module `Addition': use -v to see a list of the files searched for". Wenn ich die zu importierenden Modules voher kompilieren lasse, funktioniert es aber.
Ich wollte es dich nur wissen lassen - vielleicht mache ich auch irgendwo einen Fehler.

Ansonsten echt gutes Tool :) Weiter so!

Leif Frenzel said...

Hallo Philipp,

danke :-)

Im Moment gibt es noch eine Einschränkung für den Contributing-Source-Files-Modus - es geht nur mit einer einzelnen Datei, mehrere Sourcefiles zusammen werden noch nicht korrekt von hs-plugins compiliert. Ich nehme an, daß hs-plugins noch mehr Pfad-Info übergeben werden muß. Da hab ich noch ein TODO dran stehen ;-) Das war eigentlich auch der einzige Grund, der mich noch von einem 0.4 abgehalten hatte :-(

Ist das bei Dir der Fall, i.e. hast Du mehrere Sourcefiles? Falls ja, bleib dran, ich behebe mal dieses Problem asap. Falls nicht, wäre ich an mehr Info interessiert :-)

Danke && ciao,
Leif

Leif Frenzel said...

Uaargh, mir fällt gerade auf, daß ja nirgendwo eine Email-Adresse von mir steht. Hab absichtlich, aus Spam-Vermeidungs-Gründen, hier auf diesem Blog keine, aber ich dachte, ich hätte eine auf der eigentlichen Projektseite :-( Sorry, das korrigiere ich sofort.

Danke && ciao,
Leif

Philipp said...

Wow, die Antwort kam schneller als gedacht :)

Oha, hatte auch keine Email in meinem Blog-Profil angegeben ;)
Und ja, ich habe mehrere Sourcefiles übergeben.

Grüße
-Philipp

Leif Frenzel said...

Hi again, im Darcs-repo ist jetzt ein Stand, der mit mehreren Sourcefiles umgehen können müßte :-)

Danke && ciao,
Leif

Philipp said...

Hab's soeben ausprobiert. Funktioniert :) Well done!

Danke + Grüße
-Philipp