<div dir="ltr">Simon,<div><br></div><div>I'd like to hear how we can support what IHaskell does with remote GHCi. </div><div><br></div><div>One core functionality that we use dynCompileExpr for (not quite dynCompileExpr, but similar) is getting the standard output of code that is being run. Any time code is run, we</div><div><br></div><div>1. Create a unix pipe.</div><div>2. Set stdout to point to that pipe using dupTo.</div><div>3. Use hscStmt with unsafeCoerce to get the other end of the pipe in the compiled context.</div><div>4. Run the statement in the interpreted context in a separate thread; meanwhile, read from the pipe to get the stdout of the code running in the interpreted context. </div><div>5. When it is done running, move stdout back to point to the read stdout and close the unix pipe file handle.</div><div>6. Send the stdout (both intermediate values and the final value) to the frontend to display to the user.</div><div><br></div><div>The key here is that we can access directly the file handle created by the interpreted code. If the interpreted code is remote, we clearly cannot read from a pipe it creates. In your remote GHCi, how could we solve this problem?</div><div><br></div><div>In general, how would stdin and stdout work? Would there be a clean way to feed the remote process its stdin and receive its stdout and stderr? That would effectively mean stdin/stdout/stderr are configurable which would be a godsend for IHaskell. </div><div><br></div><div>-- Andrew</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 18, 2015 at 1:45 AM, Simon Marlow <span dir="ltr"><<a href="mailto:marlowsd@gmail.com" target="_blank">marlowsd@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 18/11/2015 01:41, Manuel M T Chakravarty wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Simon,<br>
<br>
While this is an interesting proposal, Haskell for Mac strongly<br>
relies on running interpreted code in the same process. I’m using<br>
’dynCompileExpr’ as well as ’hscStmtWithLocation’ and some other<br>
stuff.<br>
</blockquote>
<br></span>
Let me say first of all that I'm not going to remove anything, so there's no need to worry.  But I'd like to explore exactly what you need, so that we can see whether there's a way to accommodate it with a separate-process implementation.<br>
<br>
hscStmtWithLocation is part of the core GHCi functionality, it is definitely supported.  It has a slightly different signature:<br>
<br>
hscStmtWithLocation :: HscEnv<br>
                    -> String -- ^ The statement<br>
                    -> String -- ^ The source<br>
                    -> Int    -- ^ Starting line<br>
                    -> IO ( Maybe ([Id]<br>
                          , RemoteHValue {- IO [HValue] -}<br>
                          , FixityEnv))<br>
<br>
RemoteHValue is a reference to a value in the interpreter's context. These have to be evaluated via an explicit API, rather than just unsafeCoercing HValue as we do now.  (this is not strictly speaking part of the GHC API, so a separate but interesting question is: why did you need to use this directly, and what should we add to the GHC API?)<br>
<br>
I believe that many uses of dynCompileExpr can be changed so that the code using the resulting value is moved into the interpreter's context, and then there's no problem.<span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This is quite crucial for some of the interactive<br>
functionality. Imagine a game where the game engine is in Swift<br>
linked into the main application and the game logic is in<br>
*interpreted* Haskell code. The engine calls into the Haskell code<br>
multiple times per frame of the animation and for all<br>
keyboard/mouse/etc input (using StablePtr and ForeignPtr to construct<br>
the scene graph across the Swift and Haskell heap).<br>
</blockquote>
<br></span>
So my question is, why wouldn't you run the whole game engine in the interpreter's context?  That's what would happen if you were to load the program into GHCi and run it.  Directly calling back and forth between the client of the GHC API and the program being interpreted is arguably a strange thing to do, and it's kind of accidental that we allow it.<span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I actually also might have a use for the architecture that you are<br>
proposing. However, I really would like to keep the ability to, at<br>
least, optionally run interpreted code in the same process (without<br>
profiling etc). Do you think we could have both?<br>
</blockquote>
<br></span>
We can certainly have both, it's straightforward to implement, but I don't get to throw away some of the hacks we have to support same-process execution, which would be a shame.  We just add more code rather than<div class="HOEnZb"><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Cheers,<br>
Manuel<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Simon Marlow <<a href="mailto:marlowsd@gmail.com" target="_blank">marlowsd@gmail.com</a>>:<br>
<br>
Hi folks - I've been thinking about changing the way we run interpreted code so that it would be run in a separate process.  It turns out this has quite a few benefits, and would let us kill some of the really awkward hacks we have in GHC to work around problems that arise because we're running interpreted code and the compiler on the same runtime.<br>
<br>
I summarised the idea here: <a href="https://ghc.haskell.org/trac/ghc/wiki/RemoteGHCi" rel="noreferrer" target="_blank">https://ghc.haskell.org/trac/ghc/wiki/RemoteGHCi</a><br>
<br>
I'd be interested to hear if anyone has any thoughts around this, particularly if doing this would make your life difficult in some way. Are people relying on dynCompileExpr for anything?<br>
<br>
Cheers,<br>
Simon<br>
_______________________________________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
</blockquote>
<br>
</blockquote>
_______________________________________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
</div></div></blockquote></div><br></div>