Kto pierwszy async / czekał?

21

Python dodał konstrukcje async / await w wersji 3.5 w 2015 roku. Społeczność Javascript robiła kroki w tym kierunku przez bazzillion lat i wreszcie dodała bardzo podobną implementację do wersji roboczej ES8 wydanej w 2017 roku (z mojego zrozumienia). Maszynopis dodał także metody asynchroniczne w 2015 r. W wersji 1.7, które dla niewprawnego oka wyglądają dokładnie tak, jak metody asynchroniczne js.

C # Dodano metody asynchroniczne w 2012 roku, które wyglądają jak wszystkie inne implementacje async / czekają i były oparte na podobnie zachowujących się F #, ale różniących się wyglądających asynchronicznych przepływach pracy, które zostały wprowadzone w wersji F # 2.0 w 2010 roku. Jest to najwcześniejszy przykład, jaki znam język wbudowany w programowanie asynchroniczne - C # z parą async / Oczekiwanie i F # z przepływami asynchronicznymi.

Czy istnieją wcześniejsze przykłady słów kluczowych używanych w tym kontekście jako konstrukcje językowe (lub biblioteki)? Z moich ograniczonych informacji wynika, że ​​każdy naśladował dobre części implementacji C #, ale czy C # skopiował to od kogoś innego?

Ziv
źródło
3
Jeśli szukasz tylko użycia słów async awaitw języku programowania, to dość niedawno. Ale asynchroniczne programowanie w rodzaju praktykowanym przez async awaitistnieje już od dawna.
Robert Harvey

Odpowiedzi:

27

Przyznaję się do wywiadu Andersa Hejlsberga dla Channel 9 na temat programowania asynchronicznego async/await w C #, który czerpie inspirację z asynchronicznych przepływów w F #.

Jeśli nie wiesz, Anders Hejlsberg jest głównym architektem C #, a także pracował w innych językach, w tym TypeScript.

Według Dona Syme'a na jego blogu przepływy pracy asynchronicznych F # czerpią inspirację z implementacji asynchronicznej monady dla haskell. W szczególności papieru Peng Li i „biedny człowiek jest współbieżności Monad” papier Koen Claessen użytkownika .

Jeśli nie wiesz, Don Syme jest między innymi głównym architektem F #.

Artykuł Koena Claessena to starsza implementacja operacji z wynikiem i kontynuacjami, które mogę znaleźć, datowana na rok 1999. Implementuje współbieżność poprzez zdefiniowanie operacji atomowych, kontynuacji i harmonogramu rundy. Podejście monaidów byłoby motywacją do przejścia od przekazywania wiadomości do oczekujących wyników.

Wcześniejsze prace nad współbieżnością w Haskell wykorzystywały jakąś formę kanałów lub przekazywanie wiadomości do komunikacji.


Mówiąc o wcześniejszych pracach, muszę wspomnieć o Współbieżnym Haskellu, dla którego „Monada współbieżności biednego człowieka” jest alternatywą ...

Oraz artykuł „Programowanie równoległe niejawne i jawne w Haskell” autorstwa Marka P. Jonesa i Paula Hudaka. Ten dokument położył podwaliny pod artykuł Koena Claessena.

W artykule „Implicit and Explicit Parallel Programming in Haskell” Mark i Paul analizują między innymi właściwości „rozwidlenia” i problem skutków ubocznych w współbieżności. Odwołują się do artykułu „Semantyka dla prymitywów współbieżności ML”, który wybiera zestaw współbieżnych prymitywów opartych na współbieżnym ML i stanowi dowód, że zachowują właściwości wykonywania sekwencyjnego.

Theraot
źródło
To jest naprawdę dobra odpowiedź. Cieszę się, że wspomniałeś o Haskell i ML (z których oba F # czerpie inspirację). Ja wiem usłyszysz Haskell ludzie mówią o „kontynuacji stylu”. async / await to po prostu kompilator cukru / magii składniowej.
RubberDuck
1

Wierzę, że Microsoft nie weźmie już istniejące słowa, więc słowa asynci awaitmoże być przypisana do czasów, którego dotyczą. Jednak pomysły Coroutines i spółdzielni wielozadaniowości są bardzo stare.

max630
źródło
2
Nie sądzę, aby porównywanie coroutines i programowania asynchronicznego było poprawne - oferują one zupełnie inny rodzaj abstrakcji.
wondra
3
„Wierzę, że Microsoft nie wziąłby już istniejących słów” - Czy masz podstawy do tego przekonania? Projektanci popularnych języków są zazwyczaj bardziej pragmatyczni.
Sebastian Redl