How Actors Work Internally in Swift
swiftrocks.com
swiftrocks.com
Bit of a tangent, I suppose, but I was disappointed to see that the actor implementation continues enlarging the C++ core of the language. I also think that combines with the fact that the project is, in reality, controlled by Apple and not truly open, to create an extraordinarily high bar for contribution.
I think the very narrow needle it's trying to thread between its base case as a GUI applications environment and other types of programs may end up dooming it. You can't please all the people all the time...
It looks like Swift is taking pointers from Rust. Specifically Rust's send/sync traits. There's even other keywords like unsafe in Swifts new `UnsafeSendable` for Sendable types that bypass compile time checks.
[0] https://old.reddit.com/r/rust/comments/7qels2/i_wonder_why_g...
In particular, John tends to get involved in a lot of interesting conversations, so he's great to find more people to follow.
Rust might have brought many interesting concepts into mainstream, however unsafe wasn't one of them.
It is like arguing Rust invented affine types while ignoring the ideas in Cyclone and linear typing, even if they don't map 1:1 to what Rust has.
Concurrent Haskell doesn't use typeclasses to constrain what data can be passed between threads. All data can be in Concurrent Haskell because all data is immutable anyway. It's a fundamentally different concept, not a slightly different subset like affine/linear types.
I miss working with him, but there are lots of folks involved with Swift who think really deeply about this stuff. No complex feature is the work of any one person in isolation.
Sendable is just yet another monadic type, or a ML functor.
http://cml.cs.uchicago.edu/pages/sync-var.html
As for the rest I am on the go to type a proper example.
The purpose of the ST Monad is to prevent you form sharing the object inside it wrapped by an STRef with another thread of execution.
IORef utilizes the uniqueness of the ``IO`` monad and its properties guaranteed by the haskell runtime i.e. only one thread can use it at any given time to prevent more than one thread from having a reference to the object inside the IORef from multiple.
[1]:https://www.microsoft.com/en-us/research/wp-content/uploads/...
Swift has used the “Unsafe” prefix for a very long time to indicate things that break its safety model, see for example the UnsafePointer APIs.
Surely you meant borrowing.
By this token, actors seem to be the language-level implementation of a class where all methods are asynchronous, and also being protected by the same lock.
The novel feature seems to be cooperative scheduling amongst actors.
They also seem to have an m-to-n scheduler (not sure if in user space or kernel), so you can have more actors than “threads”.
Actors in systems like erlang seem to make concurrency simple, and the model seems to be easy to grasp.
On the contrary, a few code samples i've seen on swift forums made my mind twist trying to understand how the code was going to be executed..
This is why `await` is such an important keywords to litter around your code - anything can happen in between when you await and when you come back, including actor message processing. You could have another invocation against your actor instance happen in tandem.
This definitely increases the learning curve, but likely still saves time later when you are fighting various deadlock conditions.
its seems to me having an async public interface with a sync internal implementation is the most straightforward architectural design for actors, but obviously they thought it was too limiting. Do you have any idea why ?
Actor implementations tend to be split on reentrancy. Having multiple paused in-flight invocations of the actor means that you need to have clearly understood suspension points (hence await keywords). Non-reentrant actors like in Erlang can deadlock if two actor instances are calling one another. Because of the deadlock and some inefficiency concerns, some actor systems allow you to decide reentrancy per-actor as well.
Because Swift concurrency is an upgrade on top of decades-old systems, I believe a certain amount of additional complexity was required whether it was built as reentrant or not.
It was a bit harder to find than I expected, but here is a discussion piece around the initial choice of reentrancy by default. https://github.com/ktoso/swift-evolution/commit/d55bbbd6cc1a...
My enduring impression after learning Swift Actors is that a LOT of additional complexity is introduced because of reference types. The data inside an Elixir process is just that: data, but the possibility of the data in a Swift Actor being a reference to a class suddenly makes everything complicated.
Regardless of the technical achievement from a compiler perspective I found that Swift’s Actors didn’t map well to my understanding of them from Elixir/Erlang and that they weren’t a net positive for solving the kinds of problems actors are suited for. I’ll concede this is all very personal and subjective though.
I plan to use actors enums for states in my next major app version release.
Or at least I was, until Apple decided to backdoor the iPhone in the absurd notion that it protects kids. Now I’m trying to figure out how to migrate off their platform entirely.
If you remove syntax colouring from a text, you do expect to still be able to read the text.
Why the difference? Because the wheel is an essential component of a car, while syntax colouring is more akin to the paint job of the car: you change change it, remove it, it won't affect the function of the car.
BTW, if we remove the CSS, the text becomes apparent again. So if we keep going with the same analogy, it becomes even more unsuitable: removing half of the wheels prevents the car from working, but removing all of them now restores a smooth ride. We quickly see how it turns absurd and contradicts.
pre {
background-color: rgb(40, 40, 35);
color: rgb(248, 248, 242);
}Brand new? I thought Carl Hewitt invented Actors https://en.wikipedia.org/wiki/Actor_model
> Although what Swift brings is new to the language, it's not new to tech itself.
I think it's pretty clear that the author meant "brand new to Swift"?