Hacker Newsnew | past | comments | ask | show | jobs | submit | haolez's commentslogin

On a side note, _in the context of workstations_, I wonder if a hypothetical OS that reimplements the Windows APIs (like ReactOS, but with perfect modern hardware support) would be better for end users than a Linux distro with a modern DE.

In the past, this hypothetical OS would be a revolution. But I feel that, in recent years, this gap is not as big anymore and Linux supports way more apps than in the past. Such an OS might even not be relevant anymore, even if it exists.

Do I have a blind spot on this? Is there value in having a "working ReactOS" as of 2026 _for workstations_?


> Is there value in having a "working ReactOS" as of 2026 _for workstations_?

The ideas behind the NT kernels are much deeper than what many Linux fans think of it. Just to give some examples:

- the NT kernel is build around supporting multiple subsystems, even though currently only "1.5" are in active use: the Windows subsystem and WSL1 (the latter has for many purposes been replaced by WSL2)

- the NT kernel is not built around "everything is a file" (a very leaky and very incompletely implemented abstraction that is used in GNU/Linux); instead the central concept is the handle

- the I/O in NT kernel is built around the idea that the API is "completion-oriented" instead of being "readiness-oriented" as in Linux. This manifests in concepts like I/O Completion Ports (IOCPs), Overlapped I/O, ... Since this is a deeply technical topic, I refer to https://speakerdeck.com/trent/parallelism-and-concurrency-wi... (the most important information is in the backup slides (slides 43-54)).


For a better implementation of everything being a file, Plan 9 and inferno come pretty close to literally everything being a file.

- the NT kernel is not built around "everything is a file" ... instead the central concept is the handle

File descriptor, handle. Potayto, potahto.


> File descriptor, handle. Potayto, potahto.

Under Windows, a lot more concepts are handles than just files, directories, symbolic links, pipes, mail slots, ..., e.g.

- processes, threads

- synchronization objects (mutex, semaphore)

- events (CreateEventEx)

- I/O Completion Ports

- Sections (ZwCreateSection) and Partitions (https://www.geoffchappell.com/studies/windows/km/ntoskrnl/ap... ) for memory

- waitable timers

- GUI components (HWND)


And you can also argue that that's overengineered (the original NT design docs were posted on here a while ago), that the UNIX model (while much more primitive and simplified) has proven more successful in the real world, and that the original "clean, overengineered" NT design has been buried under a progressively bigger truckload of crap year upon year and is no longer as clean as it once was.

> the original "clean, overengineered" NT design has been buried under a progressively bigger truckload of crap year upon year and is no longer as clean as it once was.

The original UNIX model has (considering the current state of GNU/Linux) similarly buried under a progressively bigger truckload of crap year upon year and is no longer as clean as it once was.

A central difference is: the NT kernel stayed rather clean (the crapload rather happened in the Windows subsystem).


Once you've taken most all of the other subsystems out of NT (which they pretty much have), all you're left with is is the crapload in the Windows subsystem.

I should have mentioned that I am speaking from a Plan 9 point of view where some of the common mechanisms are provided via the kernel file servers such as /proc.

pidfd, eventfd, AF_NETLINK, epoll, memfd, timerfd?

You may be interested in https://loss32.org/

This is pretty damn cool.

IMHO with a couple of fixes which allow Linux+Wine to better simulate some specific lowlevel Windows behaviours (like this one recently in the news: https://www.xda-developers.com/wine-11-rewrites-linux-runs-w...)... a Linux distro with a 'Windows personality' (e.g. running Windows Explorer as desktop) should be pretty much indistinguishable from native Windows.

In the end it's all about driver diversity and quality though...


> should be pretty much indistinguishable from native Windows

PRO: less telemetry

CON: less battery life


Wouldn't that just be Linux with Wine? It would be less effort to implement further APIs/fix incompatibilities on Wine rather than reimplement a new OS from scratch.

SteamOS but for more than just games, perhaps?

Option 1 is a PM.


Can anyone give some hints on what made Civ 1 special compared to other classic entries in the franchise? Despite the nostalgia factor, of course.


In my opinion, Civ1 was fundamentally simpler than any other Civ game. It is like the difference between playing DOOM and Halo. Civ 1 has very few units, very few civ types, very few anything really. That means that it is easy to keep the whole game in your head at once. For me, its a totally different experience.


It's simple (both in terms of gameplay and graphics) and it's the fastest Civ game to complete a full playthrough. Later releases made the game slower and more complex.


I played a lot of Civ1, Colonization and Civ 2. First time I tried Civ 3 I lost some city due to some culture or religious influence and ragequit (I was also working my first job at that point so didn't have as much time to spare).

Played a bit of Civ 4 and 5(or 6?) but never was really as hooked on them.


1. It was the first civ.

2. The Settler unit was a big eared bat


> The Settler unit was a big eared bat

You validate my feelings. I always knew that at heart.


Honestly it feels to me that Civ1 - Civ2 is the most direct upgrade in the series. Civ 2 was mostly just a better civ 1. From civ4 onwards, the series was a lot more willing to shake things up in its gameplay.


Civ 2 was without doubt a much uglier civ 1, though. Isometric graphics in win 3.11 wasn't a good bet.

Civ 1 had good pixel art (look at those mountains! Not to mention the intro), good colors (and more of them!) and clean iconography. For me the look was part of the magic, so I never got into Civ 2.


I considered Alpha Centauri as the sequel, both in the continuation of Civ 1s final goal and the expanded gameplay.


Civ 3 already started to shake things up.


I don't have a stake on AI, but more and more I see the following patterns:

- people that give in to AI do so because the technical merits suddenly became too big to ignore (even for seasoned developers that were previously against it) - people who avoid AI center their arguments on principles and personal discomfort

Just from that, you can kind of see where this is going.


Most arguments against it are built on some moral principle and not on objective reality of usefulness.

Crypto used to be the thing to hate but that made sense as the objective usefulness of crypto was meek. AI models were always crazy useful but prohibitively expensive. Youd need an entire team to build your models. Now you dont.


Yeah, things get more and more terrible over time. Your point?


Kinda off-topic, but I wonder if a hypothetical OS that reimplements the Windows APIs (like ReactOS[0], but with perfect modern hardware support) would be better for end users than a Linux distro with a modern DE.

In the past, this hypothetical OS would be a revolution. But I feel that, in recent years, this gap is not as big anymore and Linux supports way more apps than in the past. Such an OS might even not be relevant anymore, even if it exists.

Do I have a blind spot on this? Is there value in having a "working ReactOS" as of 2026?

[0] https://reactos.org/


That's an interesting topic. Please, elaborate.


Western surveillance tech is superior because it gives you the option to choose your gender on a fluid scale when they're vacuuming your private data, whereas backwards eastern tech limits you to only male or female.


What about not asking for gender when gender is completely irrelevant to the thing that the user is trying to do?


But how would the government know who's writing mean comments against them online without detailed surveillance?


I was pretty surprised when I learned recently that the Java alternative for green threads doesn't use colored functions. It put Java in a higher place in my perception.


It doesn't completely solve function coloring though. Causing carrier threads to get pinned is still not good, similarly as calling blocking function from async function is not good in colored systems.


There are not a lot of cases left that still cause pinning. FFI is the main one.


What are colored functions?


Any time you have a barrier between one function being able to call another. The original article on this called them red functions and green functions. A green function can call a red function but a red function can't call a green function.

In terms of async, it's when you have to have a function with "async" attached to it and making it so that only other async functions can call async functions.

It ends up creating a weird circumstance where you can end up with a lot of duplicated APIs, particularly in libraries, because you are providing both async and non-async versions of functions.


The coloring is a property of concurrency safety and whether the language enforces it.

For instance, if you resolve a future in the wrong context you'll still have problems - the coloring is just a compile time error that you are doing things wrong, rather than a runtime deadlock.


Right, and a lot of people would rather avoid that issue altogether by using a different concurrency model.


The term comes from an old blog post [0] about different kinds of effect systems. Every function has a color, and every colored function can only call functions that are compatible with it, usually of the same color. The net result is that you end up either duplicating a lot of your common code so you have compatible interfaces for all the different colors (let's call that "separate but equal" if we're feeling spicy), or you end up shoving round pegs into the square holes of your dominant function color.

[0] https://journal.stuffwithstuff.com/2015/02/01/what-color-is-...


https://journal.stuffwithstuff.com/2015/02/01/what-color-is-...

The terminology is used to talk about languages that have async and sync functions where you declare (or color) the function as either async or sync.

In these languages it's pretty common for the language to enforce a constraint that async functions can only call other async functions. Javascript / Typescript, Python are popular examples of languages with colored functions.


https://journal.stuffwithstuff.com/2015/02/01/what-color-is-...

In this context: functions anotated with async


[flagged]


Please don't fulminate on HN. The guidelines make it clear we're trying for something better here. https://news.ycombinator.com/newsguidelines.html


[flagged]


No, it refers to a function that has constraints on how it can be called and composed. A classic example is functions tagged `async` in languages like Javascript or Rust.

(Technically, that's the symptom - the underlying cause is that it's a function that involves some effect, like asynchronicity, or, in some functional languages, IO.)


No.


Are you perhaps confusing green threads with stackless async models, like async/await? Green threads don't imply colored functions.


They said "Java alternative for green threads" so they're talking about not green threads.


What alternative would they be referring to? Green threads were only (re-)introduced to Java in version 21 in 2023.

I think what they're trying to say is that Java's green thread implementation has special support for async I/O. Threads that block on I/O aren't polled for completion by the runtime, instead they use OS async features under the hood.

This allows Java's green threads to compete performance-wise with async/await solutions, but with cleaner code that doesn't need colored functions.

In older green thread implementations in other languages, I/O can actually cause significant CPU overhead due to polling threads that are blocked by I/O requests.


No need of colored functions because that Java green thread returns a Future<Value> not Value like colored functions


That sounds just like promises in JS which most definitely are a function color.


"green threads" is generally how I see these systems identify as "non-colored but with async-like performance" fwiw. or "fibers". otherwise it's "async" or "coroutines".


There are different types of coroutines. The C++ type are sometimes called "stackless coroutines". With stackless coroutines you can't yield from a nested function call. Stackless coroutines are basically generators where you can pass arguments through resume, and async/await is effectively a form of stackless coroutines with yield/resume semantics that aren't fully generalized as coroutines, but oriented toward some bespoke notion of concurrency rather than as an abstract control flow operator.

"Stackful coroutines" allow yielding from any arbitrary point. They're basically fibers, except with the explicit control transfer and value passing yield and resume operators; there's no hidden or implicit control transfer like with green threads. Though, some people would argue allowing any function to yield without announcing this in their type signature is tantamount to hidden control transfer. Personally, I don't see how that's different than allowing any function to call other functions, or to loop, but in any event languages are free to layer on additional typing constraints--constraints that can be tailored to the desired typing semantics, rather than dictated by implementation details.

Stackless coroutines are typically implemented as a special kind of function whose state is allocated and instantiated by the caller. In contrast, stackful coroutines are typically implemented by reifying the stack, similar to threads. The "stack" may or not be the same as the system's ABI stack.

In stackful coroutines, unless there are additional typing constraints imposed by the language for hygiene reasons, any function can typically be called as a coroutine or use yield and resume. There's no need to compile functions into special alternative forms as call frame management works the same whether invoked from a coroutine context or not.


This might be a buy for me once it is fully supported by Linux. Hopefully, the muscle memory of Ctrl, Super and Alt won't get in my way.


If SPTM is active on the chip, we are not going to be getting Linux at all.


Feels like writing tests before writing code, but with LLMs :)


Not at all. AWS IAM policy is a complex maze, but incredibly powerful. It solves this exact problem very well.


Do you honestly believe that they made the effort of setting the appropriate roles and policies, though?


you tell your clanker to do it obviously


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: