Gå til innhold

Remote Foreign Function Interface (RFFI) \o/


Anbefalte innlegg

okei, jeg er lei av AJAX .. seriøst; buggete browsere ødlegger _alt_

 

likevel synes jeg idéen med et fjernstyrt GUI er genial og har mange fordeler - og tenkte derfor å forsøke en litt annen løsning .. etter en kjapp titt på man-siden til `dlsym' burde det være mulig å laste, kalle og lese av data og funksjoner i biblioteker 100% dynamisk @ runtime:

 

...
 // Ok, we do an indirect call to `strlen' (pretend this is collected from a socket).
 {vector<string> arg_types;
   vector<string> arg_values;
   arg_types.push_back("pointer"); // works as char const*
   arg_values.push_back("Hello World!");

   cout << "strlen(\"" << arg_values.back() << "\"): "
        << callFun("unsigned int", getAddr("", "strlen", ""), arg_types, arg_values) << endl;}
...

 

under kjøring skriver denne ut: strlen("Hello World!"): 12

 

dette er portabelt til flere platformer; jeg vet dette skal fungere under Linux og Win32 (MinGW), og jeg tror det er portabelt til de fleste platformer som GCC er portet til ..

 

måten jeg tenkte å gjøre dette på (tilbake til dette med "AJAX") var å sette opp denne siden som en klient og kjøre kall som `gtk_button_new' o.l. over tråden (dytte fra server-side) - og på den måten få til et fjernstyrt GUI som er portabelt til alle platformer som GCC og GTK kjører på (ganske mange)

 

edit: jeg snakker hele tiden om GUI og GTK, men dette kan altså brukes mot Win32, Linux og 100-vis av andre C-biblioteker

 

mellom serversiden og denne klienten så tenkte jeg å ha en enkel protokoll for kommunikasjon; lasting av biblioteker, lesing av verdier og kalling av funksjoner .. og man kan dermed skrive serveren i hvilket som helst språk som har støtte for sockets (noe som vil si omtrent alle språk)

 

"remote ffi" har visse fordeler fremfor tradisjonell FFI; da man slipper at prosessen som styrer ikke krasjer når prosessen/koden/biblioteket som blir styrt SIGSEGVer eller lignende .. det er irriterende å sitte igjen med et vraket Lisp-image når GTK borker på en eller annen pointer-feil, det slipper jeg altså her

 

okei, vel - jeg har troen på dette, og et søk på "remote gui" eller "remote ffi" @ google tilsier at dette er noe unikt; hva synes dere? er det unikt fordi det er dumt? .. hm, eller er det noen som vil bidra med noe? :)

 

her er kildekoden/"hjemmesiden":

http://nostdal.org/~lars/programming/lisp/rffi/rffi.html

Endret av lnostdal
Lenke til kommentar
Videoannonse
Annonse

(veldig fort skrevet dette; jeg må ut en tur - på .. vei ut .. døra nå .. kommer kanskje tilbake litt siden når jeg har fundert litt mer på dette)

 

jo, kanskje .. men jeg er ikke så sugen på å måtte mekke wrappere (corba-style) og slikt på "klientsiden" (?) .. det hadde vært artig å bare kunne hatt en bitteliten ting folk kunne lastet ned, skrevet inn host, brukernavn og passord - for så å fått frem et gui/program

 

jeg tittet litt på dette med reflection i Java, men jeg kjenner litt for lite til Java til å få noe særlig ut av det .. f.eks. vet jeg ikke åssen jeg laster inn biblioteker (`import' ser ut til å være en kompile-time -sak) ..

 

en annen ting jeg har lurt på etter å tittet på reflection-apiet er hvordan jeg skal referere til objekter på en unik måte .. i C har man jo pekere som altid vil være unike; disse kan jeg lagre på serversiden og ha full kontroll over .. om det ikke finnes en løsning her må jeg mekke wrappere rundt alle konstruktører (tror jeg), og det ønsker jeg å unngå (edit2: eller, øh .. jeg kan jo så klart mekke en wrapper for konstruering generellt antar jeg; altså uansett type/klasse)

 

..jeg kjenner litt for lite til både java og .net; og det er vel der problemet sitter :)

 

edit:

..og .NET er ikke portabelt -- bortsett fra Mono, som mangler en del (spesiellt på dokumentasjonsbiten)

 

ang. xml-rpc så mangler den muligheten til å laste biblioteker og "oppdage nye funksjoner" @ runtime, men jeg kunne så klart brukt den som en protokoll for kommunikasjon .. xml-rpc er også kun request-> response; jeg ønsker full 2-veis kommunikasjon; både klient og server skal kunne ta initiativ ... så den biten av xml-rpc går ikke; men jeg kunne som sagt satt opp protokollen til å bruke samme gramatikk (ellerwhateverdetheter) som xml-rpc (dog hadde noe basert på sexps vært mer snaznt, for ikke å si mindre verbost :))

Endret av lnostdal
Lenke til kommentar

Begynner sånn delvis å fungere nå. Jeg kaller dette på server-siden, det er klienten som utfører kallene og returnerer verdiene:

 

RFFi> (callSFun "strlen" "unsigned int" "cstring" "Hello World!")
"12"
nil
RFFi> (callSFun "puts" "signed int" "cstring" "Hello World!")
"13"
nil
RFFi> (getAddr "" "strlen" "")
"0xb7cff270"
nil

 

edit:

..om alt går bra så har jeg et GTK-vindu oppe om noen dager.. lurer dog på dette med callbacks..

Endret av lnostdal
Lenke til kommentar

"signals and slots" _er_ jo callbacks .. heh :}

 

edit: heh, eller "bygget på toppen av" callbacks

 

jeg må ha en mulighet til å passe en "peker" til en funksjon (lisp-funksjon ellerwhatever) på serversiden som et argument til en `signal_connect'-ting .. pekere til funksjoner i denne sammenhengen er callbacks

 

dette går så klart ikke, så jeg må løse det ved å bruke en felles funksjon på klientsiden for alle callbacks som på ett eller annet vis, v.h.a. et argument som blir satt under opprettelse av forbindelsen av signalet, sender en melding til serveren med det spesielle argumentet ... noe uklart forklart dette, for jeg sliter litt med hvordan jeg skal få til dette på en generell måte; tror jeg må bruke litt `va_arg' og sånnt (man 3 stdarg)

Endret av lnostdal
Lenke til kommentar

*yawn* du skjønner ikke hva jeg mener ...... callbacks/signals/whatever er basert på funksjonspekere; og det er det jeg er ute etter .. okei, si det slik da; jeg ønsker å kunne angi pekere til funksjoner på serveren, på samme vis som jeg angir pekere til funksjoner lokalt

 

så jeg benytter ikke et system fremfor et annet; men prøver å få til det som ligger til grunn for alle slike systemer (signal, event, callback --> function pointers) (edit2: det går vel å implementere på andre måter også; v.h.a. en wait-condition, men det er mye mindre aktuellt (og allerede mulig som koden er nå))

 

edit:

uansett, jau - får se om dette går

Endret av lnostdal
Lenke til kommentar
  • 4 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...