<div dir="ltr">Thanks again for the detailed reply Ben.<div><br></div><div>I guess the other dream of mine is to give GHC a .NET backend. For my problem it would be the ideal solution, but it looks like other attempts in this regard (e.g. Eta, GHCJS etc) seem to have difficulty keeping up with updates to GHC. So I'm sure it's not trivial.</div><div><br></div><div>It would be quite lovely though if I could generate .NET + Java + even Python bytecode from GHC. </div><div><br></div><div>Whilst not solving my immediate problem, perhaps my efforts are best spent in giving GHC a plugin architecture for backends (or if one already exists?) trying to make a .NET backend.</div><div><br></div><div>I believe "Csaba Hruska" is working in this space with GRIN, yes?</div><div><br></div><div>I read SPJs paper on <a href="https://www.microsoft.com/en-us/research/publication/implementing-lazy-functional-languages-on-stock-hardware-the-spineless-tagless-g-machine/">Implementing Lazy Functional Languages on Stock Hardware: The Spineless Tagless G-machine</a> which implemented STG in C and whilst it wasn't trivial, it didn't seem stupendously complex (even I managed to roughly follow it). I thought to myself also, implementing this in .NET would be even easier because I can hand off garbage collection to the .NET runtime so there's one less thing to worry about. I also, initially, don't care _too_ much about performance. </div><div><br></div><div>Of course, there's probably a whole bunch of nuance. One actually needs to, for example, represent all the complexities of GADTs into object orientated classes, maybe converting sum types to inheritance hierarchies with Visitor Patterns. And also you'd actually have to make sure to do one's best to ensure exposed Haskell functions look like something sensible. <br><br>So I guess, given I have a bit of an interest here, what would be the best approach if I wanted to help GHC develop more backends and into an architecture where people can add backends without forking GHC? Where could I start helping that effort? Should I contact "Csaba Hruska" and get involved in GRIN? Or is there something that I can start working on in GHC proper?<br><br>Considering that I've been playing around with Haskell since 2002, and I'd like to actually get paid to write it at some point in my career, and I have an interest in this area, perhaps this is a good place to start, and actually helping to develop a pluggable backend architecture for GHC may be more useful for more people over the long term than trying to hack up an existing GHC to support 32 bit Windows XP, a battle I suspect will have to be refought every time a new GHC version is released given the current structure of GHC. </div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 26, 2021 at 1:34 PM Ben Gamari <<a href="mailto:ben@well-typed.com">ben@well-typed.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Clinton Mead <<a href="mailto:clintonmead@gmail.com" target="_blank">clintonmead@gmail.com</a>> writes:<br>
<br>
> Thanks all for your replies. Just going through what Ben has said step by<br>
> step:<br>
><br>
> My sense is that if you don't need the threaded runtime system it would<br>
>> probably be easiest to just try to make a modern GHC run on Windows XP.<br>
>><br>
><br>
> Happy to run non-threaded runtime. A good chunk of these machines will be<br>
> single or dual core anyway.<br>
><br>
That indeed somewhat simplifies things.<br>
<br>
>> As Tamar suggested, it likely not easy, but also not impossible. WinIO<br>
>> is indeed problematic, but thankfully the old MIO IO manager is still<br>
>> around (and will be in 9.2).<br>
>><br>
><br>
> "Is still around"? As in it's in the code base and just dead code, or can I<br>
> trigger GHC to use the old IO manager with a GHC option?<br>
><br>
> The possible reasons for Windows XP incompatibility that I can think of<br>
>> off the top of my head are:<br>
>><br>
>>  * Timers (we now use QueryPerformanceCounter)<br>
>><br>
><br>
> This page suggests that QueryPerformanceCounter<br>
> <<a href="https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter" rel="noreferrer" target="_blank">https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter</a>><br>
> should<br>
> run on XP. Is this incorrect?<br>
><br>
It's supported, but there are caveats [1] that make it unreliable as a timesource.<br>
<br>
[1] <a href="https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps#windowsxp-and-windows2000" rel="noreferrer" target="_blank">https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps#windowsxp-and-windows2000</a><br>
><br>
>>  * Big-PE support, which is very much necessary for profiled builds<br>
>><br>
><br>
> I don't really need profiled builds<br>
><br>
<br>
Alright, then you *probably* won't be affected by PE's symbol limit.<br>
<br>
>>  * Long file path support (mostly a build-time consideration as Haskell<br>
>>    build systems tend to produce very long paths)<br>
>><br>
>><br>
> I don't need to build on Windows XP either. I just need to run on Windows<br>
> XP so hopefully this won't be an issue. Although if GHC was modified for<br>
> long file path support so it could build itself with long file path support<br>
> presumably it will affect everything else it builds also.<br>
><br>
If you don't need to build on XP then I suspect this won't affect you.<br>
<br>
><br>
>> There may be others, but I would start looking there. I am happy to<br>
>> answer any questions that might arise.<br>
>><br>
> I'm guessing the way forward here might be a patch with two options:<br>
><br>
> 1. -no-long-path-support/-long-path-support (default -long-path-support)<br>
> 2. -winxp<br>
><br>
> The winxp option shall:<br>
><br>
> - Require -no-long-path-support<br>
> - Conflicts with -threaded<br>
> - Conflicts with profiled builds<br>
> - Uses the old IO manager (I'm not sure if this is an option or how this is<br>
> done).<br>
><br>
The old IO manager is still the default, although this will likely<br>
change in 9.2.<br>
<br>
> What do you think (roughly speaking)?<br>
<br>
Yes, that is essentially correct. I would probably start by trying to<br>
run a 32-bit GHC build on Windows XP under gdb and see where<br>
things fall over.<br>
<br>
Cheers,<br>
<br>
- Ben<br>
</blockquote></div>