Siapa yang melakukan async / menunggu dulu?

21

Python menambahkan konstruk async / menunggu di 3,5 pada 2015. Komunitas Javascript membuat langkah-langkah ke arahnya selama jutaan tahun dan akhirnya menambahkan implementasi yang sangat mirip dengan konsep dalam ES8 yang dirilis pada 2017 (Dari pemahaman saya). Typescript juga menambahkan metode async pada 2015 di versi 1.7 yang pada mata yang tidak terlatih terlihat persis seperti metode js async.

C # Menambahkan metode async pada tahun 2012 yang terlihat seperti semua implementasi async / menunggu lainnya dan didasarkan pada F # yang berperilaku sama tetapi alur kerja asinkron yang tampak berbeda yang diperkenalkan pada F # 2.0 pada tahun 2010. Ini adalah contoh paling awal yang saya ketahui tentang bahasa yang dibangun pada pemrograman asinkron. - C # dengan pasangan async / await dan F # dengan aliran async.

Apakah ada contoh kata kunci sebelumnya yang digunakan dalam konteks ini sebagai konstruksi bahasa (atau pustaka)? Dari informasi saya yang terbatas, sepertinya semua orang meniru bagian baik dari implementasi C #, tetapi apakah C # menyalinnya dari orang lain?

Ziv
sumber
3
Jika Anda hanya mencari penggunaan kata-kata async awaitdalam bahasa pemrograman, itu cukup baru. Tetapi pemrograman asinkron seperti yang dipraktekkan async awaittelah ada sejak lama.
Robert Harvey

Jawaban:

27

Mengakui wawancara Anders Hejlsberg untuk Channel 9 tentang Pemrograman Asynchronous async/await dalam C # mengambil inspirasi pada async worflows di F #.

Jika Anda tidak tahu, Anders Hejlsberg adalah arsitek utama C #, dan juga telah bekerja dalam bahasa lain termasuk TypeScript.

Menurut Don Syme, di blognya , alur kerja F # async mengambil inspirasi dari implementasi asynchronous monad untuk haskell. Terutama kertas Peng Li dan kertas Koen Claessen "A Poor Man's Concurrency Monad" .

Jika Anda tidak tahu, Don Syme adalah arsitek utama F #, antara lain.

Makalah Koen Claessen adalah implementasi operasi yang lebih tua dengan hasil dan kelanjutan yang dapat saya temukan, berasal dari tahun 1999. Makalah ini mengimplementasikan konkurensi dengan mendefinisikan operasi atom, kelanjutan, dan penjadwal bundar. Pendekatan monaid akan menjadi motivasi untuk beralih dari pesan lewat ke hasil menunggu.

Pekerjaan sebelumnya untuk konkurensi di Haskell menggunakan beberapa bentuk saluran atau pesan yang lewat untuk komunikasi.


Berbicara tentang pekerjaan sebelumnya, saya harus menyebutkan Concurrent Haskell, dimana "A Poor Man's Concurrency Monad" adalah alternatif ...

Dan makalah "Pemrograman Paralel Implisit dan Eksplisit di Haskell" oleh Mark P. Jones dan Paul Hudak. Makalah ini meletakkan dasar bagi kertas Koen Claessen.

Dalam makalah "Pemrograman Paralel Implisit dan Eksplisit di Haskell" Mark dan Paul menganalisis sifat-sifat "garpu" dan masalah efek samping dalam konkurensi, antara lain. Mereka merujuk pada makalah "A semantik untuk primitif konkurensi ML" yang mengambil satu set primitif konkuren berdasarkan pada Concurrent ML dan memberikan bukti bahwa mereka mempertahankan properti eksekusi berurutan.

Theraot
sumber
Ini jawaban yang sangat bagus. Saya senang Anda menyebut Haskell & ML (keduanya merupakan sumber inspirasi # F). Saya tahu Anda akan mendengar orang-orang Haskell berbicara tentang "gaya kelanjutan". async / await hanyalah sihir kompiler / sintaksis di atas konsep itu.
RubberDuck
1

Saya percaya bahwa Microsoft tidak akan mengambil kata-kata yang sudah ada, jadi kata-kata asyncdan awaitdapat dikaitkan dengan waktu yang Anda rujuk. Namun, ide-ide Coroutines dan Cooperative multitasking sudah sangat tua.

max630
sumber
2
Saya tidak berpikir itu benar untuk membandingkan coroutine dan pemrograman asinkron - mereka menawarkan jenis abstraksi yang sangat berbeda.
wondra
3
"Saya percaya bahwa Microsoft tidak akan mengambil kata-kata yang sudah ada" - Apakah Anda memiliki dasar untuk kepercayaan itu? Desainer bahasa yang sukses biasanya lebih pragmatis dari itu.
Sebastian Redl