My two cents
Adam Wilson
flyboynw at gmail.com
Tue Oct 24 06:05:11 UTC 2017
On 10/23/17 22:40, Dmitry Olshansky wrote:
> On Tuesday, 24 October 2017 at 04:26:42 UTC, Adam Wilson wrote:
>> On 10/23/17 17:27, flamencofantasy wrote:
>>> On Monday, 23 October 2017 at 22:22:55 UTC, Adam Wilson wrote:
>>>> On 10/23/17 08:21, Kagamin wrote:
>>>>> [...]
>>>>
>>>> Actually I think it fits perfectly with D, not for reason of
>>>> performance, but for reason of flexibility. D is a polyglot language,
>>>> with by far the most number of methodologies supported in a single
>>>> language that I've ever encountered.
>>>>
>>>> [...]
>>>
>>> There is a lot of misunderstanding about async/await. It has nothing to
>>> do with "conservation of thread resources" or trading "raw performance
>>> for an ability
>>>> to handle a truly massive number of simultaneous tasks". Async/await
>>>> is just 'syntactic sugar' where the compiler re-writes your code into
>>>> a state machine around APM (Asynchronous programming model which was
>>>> introduced in .NET 2.0 sometime around 2002 I believe). That's all
>>>> there is to it, it makes your asynchronous code look and feel
>>>> synchronous.
>>
>>
>> The only parts of Async/Await that have anything to do with APM are
>> the interop stubs. C#'s Async/Await is built around the Task
>> Asynchronous Programming model (e.g. Task and Task<T>) the compiler
>> lowers to those, not APM. A common misunderstanding is that
>> Task/Task<T> is based on APM, it's not, Task uses fundamentally
>> different code underneath. On Linux/macOS it actually uses libuv (at
>> the end of the day all of these programming models are callback based).
>>
>
> I’ll throw in my 2 rubbles.
>
> I actually worked on a VM that has async/await feature built-in (Dart
> language).
> It is a plain syntax sugar for Future/Promise explicit asynchrony where
> async automatically return Future[T] or Observable[T] (the latter is
> async stream).
>
> Async function with awaits is then re-written as a single call-back with
> a basic state machine, each state corresponds to the line where you did
> await.
>
> Example:
>
> async double calculateTax(){
> double taxRate = await getTaxRates();
> double income = await getIncome();
> return taxRate * income;
> }
>
> Becomes roughly this (a bit more mechanical though):
>
> Future!double calculateTax(){
> int state = 0;
> Promise!double __ret;
> double taxRate;
> double income;
> void cb() {
> if(state == 0) {
> state = 1;
> getTaxRates().andThen((double ret){
> taxRate = ret;
> cb();
> });
> }
> else if (state == 1) {
> state = 2;
> getIncome().andThen((double ret){
> income = ret;
> cb();
> });
> else if (state == 2){
> __ret.resolve(taxRate*income);
> }
> }
> cb();
> }
>
> It doesn’t matter what mechanics you use to complete promises - be it IO
> scheduler a-la libuv or something else. Async/await is agnostic to that.
>
That was actually my point. Windows and Linux/macOS .NET core do
different things. It doesn't matter to the dev. You did a better job of
illuminating it. :)
> Still there is a fair amount of machinery to hide the rewrite from the
> user and in particular print stack trace as if it was normal sequential
> code.
>
And that is the difficulty we face in D. :)
>
>> Yes, C#'s async design does make code look and feel synchronous, and
>> it was intentionally designed that way, but that is not *why* they did
>> Async. That misunderstanding arises from an interview that Anders did
>> in which he was asked why they held Async back for three years after
>> announcing it at PDC08. In that same talk Anders specifically says
>> that the purpose of the Async is to free up threads to continue
>> execution, his example is a Windows Desktop Message Pump and fetching
>> pictures from the internet (long-wait IO), but the principal applies
>> to any thread. They held back async for three years because they
>> needed to refine the language syntax to something that people could
>> learn and apply in a reasonable amount of time. IIRC there is a
>> Channel9 video where Anders explains the evolution of Async Await.
>
> In other words - explicit asynchrony where a thread immediately returns
> with Future[T] and moves on to the next task. It’s just hidden by
> Async/Await.
>
Yup.
--
Adam Wilson
IRC: LightBender
import quiet.dlang.dev;
More information about the Digitalmars-d
mailing list