| پارادایم‌های برنامه‌نویسی |
| --- |
| * زبان عملی
* عامل گرا
* آرایه‌گرا
* مبتنی بر اتوماتا
* رایانش همزمان
	+ نسبیت گرایی
* داده‌محور
* اعلانی (تضاد: دستوری)
	+ تابعی
		- منطق تابعی
		- تابعی خالص
	+ منطقی
		- منطقی قیاسی
		- مجموعه جواب
		- منطق همزمان
		- منطق تابعی
		- منطق استقرایی
	+ محدودیتی
		- منطق محدودیتی
			* منطق محدودیت همزمان
	+ جریان داده
		- مبتنی بر جریان
		- واکنشی
	+ هستی‌شناسی
* تشخیص پذیر
* پویا/اجرانامه‌نویسی
* رویدادمحور
* سطح تابع (تضاد: سطح مقدار)
	+ سبک بدون آرگومان
		- الحاقی
* همگانی
* دستوری (تضاد: اعلانی)
	+ رویه‌ای
	+ شیءگرا (OOP)
		- کد چندریخت
* تصمیم گرا
* زبان گرا
	+ خاص دامنه
* ادیبانه
* برنامه‌نویسی زبان طبیعی
* فرا برنامه‌نویسی
	+ خودکار
		- استقرایی
	+ پژواکی
		- صفت گرا
	+ مبتنی بر کلان‌دستور (ماکرو)
	+ خودآرا
* غیر ساخت‌یافته (تضاد: ساخت‌یافته)
	+ آرایه‌ای (برداری)
* غیرقطعی
* رایانش موازی
	+ فرایند گرا
* احتمالی
* کوانتمی
* نظریه مجموعه‌ها
* مبتنی بر پشته
* ساخت‌یافته (تضاد: غیر ساخت‌یافته)
	+ بلوک ساختاری
		- ساخت‌یافته همزمان
	+ شیءگرا (OOP)
		- مبتنی بر بازیگر
		- مبتنی بر کلاس
		- همزمان
		- بر پایه پیش‌نمونه
		- با تفکیک دغدغه‌ها:
			* جنبه‌گرا
			* نقش گرا
			* موضوع گرا
	+ بازگشتی
* نمادین
* سطح مقدار (تضاد: سطح تابع)
 |
| * ن
* ب
* و
 |

**رایانش هم‌رو** یا **رایانش همزمان** (به انگلیسی: concurrent computing) نوعی رایانش است که در آن چندین محاسبه به صورت همروند (یعنی در بازه‌های زمانی مشترک و روی‌هم) اجرا می‌شود - به جای آنکه پشت‌سرهم باشند (که در این حالت قبل از شروع دومی، اولی باید تمام شود).

محاسبات همزمان نوعی محاسبات است که در آن چندین محاسبه همزمان – در طول مدت زمانی با هم تداخل دارند - به جای اینکه به‌طور متوالی، با یک تکمیل قبل از شروع بعدی انجام می‌شود.

این خاصیت یک سیستم است - چه برنامه ای، رایانه‌ای یا شبکه ای - که در آن یک نقطه اجرای جداگانه یا «موضوع کنترل» مجزا برای هر فرایند وجود دارد. سیستم همزمان یک سیستم است که در آن محاسبات می‌تواند پیشرفت کند بدون اینکه منتظر بماند تمام محاسبات دیگر انجام شود. محاسبات همزمان نوعی برنامه‌نویسی مدولار است. در الگوی خود، یک محاسبه کلی به زیرمجموعه‌ها تبدیل شده‌است که ممکن است همزمان انجام شود. پیشگامان در زمینه محاسبات همزمان شامل هموار می‌شود.

مقدمه
-----

مفهوم محاسبات همزمان اغلب با مفهوم مرتبط اما متمایز محاسبات موازی اشتباه گرفته می‌شود ، [۲] [۳] اگرچه هر دو را می‌توان به عنوان «چندین فرآیند در همان مدت زمان اجرا» توصیف کرد. در محاسبات موازی، اجرای در همان لحظه فیزیکی اتفاق می‌افتد: به عنوان مثال: در پردازنده‌های جداگانه یک ماشین چند پردازنده، با هدف سرعت بخشیدن به محاسبات –– محاسبات موازی بر روی یک پردازنده تک (یک هسته‌ای) غیرممکن است، زیرا فقط یک محاسبه در هر لحظه ممکن است رخ دهد (در طول هر چرخه ساعت واحد). در مقابل، محاسبات همزمان شامل طول عمر فرایند است که با هم همپوشانی دارد، اما اجرای آن نباید در همان لحظه اتفاق بیفتد. هدف در اینجا الگوبرداری از فرایندهای موجود در دنیای خارج است که همزمان اتفاق می‌افتد، مانند چندین مشتری که به‌طور همزمان به یک سرور دسترسی دارند. ساختار سیستم‌های نرم‌افزاری که از چندین قطعه همزمان تشکیل شده‌اند، می‌توانند برای مقابله با پیچیدگی، صرف‌نظر از اینکه قطعات به صورت موازی اجرا شوند می‌تواند مفید باشد. {۴}:۱

ببه عنوان مثال، فرآیندهای همزمان با یکپارچه کردن مراحل اجرای هر فرایند از طریق برش‌های به اشتراک گذاری زمان می‌توانند بر روی یک هسته انجام شوند: فقط یک فرایند در یک زمان اجرا می‌شود، و اگر در طول برش زمانی خود کامل نشود، متوقف می‌شود، فرایند دیگری متوقف می‌شود. شروع یا از سر گرفته می‌شود و بعداً مراحل اصلی از سر گرفته می‌شود. به این ترتیب، چندین فرایند به صورت جزئی در یک لحظه اجرا می‌شوند، اما فقط یک فرایند در آن لحظه اجرا می‌شود. (نیاز به استناد).

محاسبات همزمان ممکن است به صورت موازی انجام شود ، [۲] [۵] برای مثال، با اختصاص هر فرایند به یک هسته پردازنده یا هسته پردازنده جداگانه، یا توزیع یک محاسبه در یک شبکه. اما به‌طور کلی، زبانها، ابزارها و تکنیک‌های برنامه‌نویسی موازی ممکن است برای برنامه‌نویسی همزمان مناسب نباشد و بالعکس. (نیاز به استناد)

زمان‌بندی دقیق اجرای وظایف در یک سیستم همزمان بستگی به زمانبندی دارد و وظایف همیشه نباید همزمان انجام شوند. به عنوان مثال، با توجه به دو وظیفهT1 و) :T2نیاز به استناد(

T1ممکن است قبل از T2اجرا یا به پایان برسد یا برعکس (سریال و متوالی)

T1و T2 ممکن است به‌صورت متناوب اجرا شوند (سریال و همزمان(

T1 و T2 ممکن است همزمان در همان لحظه از زمان اجرا شوند (موازی و همزمان)

* 

کلمه «دنباله» به عنوان یک متضاد برای «همزمان» و «موازی» استفاده می‌شود. هنگامی که اینها به‌طور مشخص می‌شوند، همزمان / دنباله ای و موازی / سریال به عنوان جفت‌های مخالف استفاده می‌شوند. [۶] برنامه ای که در آن وظایف یک بار اجرا شود (یک سریال و بدون موازی) بدون در هم آمیختن (پی در پی، بدون همزمانی: هیچ کاری شروع نمی‌شود تا اینکه کار قبلی تمام شود) به یک برنامه سریال گفته می‌شود. مجموعه ای از کارهایی که می‌توانند به صورت سریال برنامه‌ریزی شوند، سریال هستند که کنترل همزمانی را ساده می‌کند. (نیاز به استناد).

### هماهنگی دسترسی به منابع مشترک

اصلی‌ترین چالش در طراحی برنامه‌های همزمان ، کنترل همزمان است: حصول اطمینان از توالی صحیح تعامل یا ارتباطات بین اجراهای مختلف

محاسباتی، و هماهنگی دسترسی به منابعی که در بین اجراها مشترک هستند(۵) مشکلات بالقوه شامل شرایط مسابقه، بن‌بست و گرسنگی منابع است. به عنوان مثال، الگوریتم زیر را در نظر بگیرید تا برداشت‌ها را از یک حساب تأیید نشان داده شده توسط مانده منابع مشترک:

1. بول برداشت (برداشت داخلی)
2. اگر (تعادل> = برداشت
3. تعادل = برداشت
4. (بازگشت درست است)
5. برگشت خطا

فرض کنید تعادل = ۵۰۰، و دو موضوع همزمان باعث می‌شود تماسها گرفته(۳۰۰) و خارج شوند (۳۵۰). اگر خط ۳ در هر دو عملیات قبل از خط ۵ اجرا شود، هر دو عملیات می‌یابند که تعادل> = برداشت به صورت صحیح ارزیابی می‌شود و اجرای آن به کم کردن مقدار برداشت ادامه

می‌یابد. با این حال، از آنجا که هر دو فرایند برداشت‌های خود را انجام می‌دهند، در کل مبلغ برداشت شده بیشتر از مانده اصلی خواهد بود. این نوع مشکلات با منابع مشترک از استفاده از کنترل همزمان استفاده می‌کند یا الگوریتم‌های غیر مسدود کننده.

### مزایا

مزایای محاسبات همزمان شامل موارد زیر است:

* افزایش توان عملیاتی برنامه **execution** اجرای موازی یک برنامه همزمان اجازه می‌دهد تعداد وظایف انجام شده در یک زمان معین متناسب با تعداد پردازنده‌ها مطابق قانون گوستافسون افزایش یابد. پاسخگویی بالا برای برنامه‌های ورودی / خروجی — ورودی / خروجی فشرده بیشتر برای انجام عملیات ورودی یا خروجی صبر می‌کنند. برنامه‌نویسی همزمان اجازه می‌دهد تا زمان صرف شده برای انتظار برای یک کار دیگر استفاده شود. ساختار برنامه مناسب تر برخی از مشکلات و دامنه‌های مشکل از مناسب برای نمایش به عنوان وظایف یا فرآیندهای همزمان مناسب هستند. (نیاز به استناد).

مدل‌ها برای درک و تجزیه و تحلیل سیستم‌های محاسبات همزمان شامل موارد زیر است:

* مدل بازیگر
	+ مدل قابلیت شی برای امنیت
* خودکار / ورودی
* حافظه کاربردی نرم‌افزار (STM)
* پتری
* محاسبات فرایند مانند
	+ حساب محیطی
	+ حساب سیستمهای ارتباطی (CCS)
	+ ارتباط فرایندهای متوالی (CSP)
	+ پیوستن به حساب
	+ π- حساب

پیاده‌سازی
----------

ببرای اجرای برنامه‌های همزمان می‌توان از چندین روش مختلف استفاده کرد، مانند اجرای هر یک از اجرای محاسباتی به عنوان یک فرایند سیستم عامل یا اجرای فرایندهای محاسباتی به عنوان مجموعه موضوعات در یک فرایند سیستم عامل واحد.

### تعامل و ارتباطات

در برخی از سیستم‌های محاسبات همزمان، ارتباط بین اجزای همزمان از برنامه‌نویس پنهان است (به عنوان مثال، با استفاده از آینده)، در حالی که در برخی دیگر باید صریحاً اداره شود. ارتباطات صریح را می‌توان به دو طبقه تقسیم کرد:

ارتباطات حافظه مشترک
مؤلفه‌های همزمان با تغییر محتوای مکان‌های حافظه مشترک (نمونه‌هایی از جاوا و سی شارپ) ارتباط برقرار میکنند این سبک از برنامه‌نویسی همزمان معمولاً برای هماهنگی بین موضوعات نیاز به استفاده از نوعی از قفل کردن (به عنوان مثال، صدا زدن، سمفورها یا مانیتورها) دارد. گفته می‌شود، برنامه ای که به‌طور صحیح هر یک از این موارد را پیاده‌سازی می‌کند، بدون خطر است.
ارتباط عبور پیام
مؤلفه‌های همزمان با تبادل پیام‌ها ارتباط برقرار می‌کنند (نمونه‌هایی ازMPI , GO, Scala Erlang و(occam. تبادل پیام ممکن است به صورت غیر همزمان انجام شود یا ممکن است از یک سبک «همزمان» همزمان استفاده شود که در آن فرستنده تا زمان دریافت پیام مسدود می‌شود. ارسال پیام ناهمزمان ممکن است قابل اعتماد یا غیرقابل اعتماد باشد (که گاهی به آن «ارسال و دعا» نیز گفته می‌شود). استدلال همگام سازی پیام بسیار آسان‌تر از استدلال در حافظه مشترک است، و به‌طور معمول یک شکل قوی تر از برنامه‌نویسی همزمان تلقی می‌شود. [نیاز به استناد] طیف گسترده‌ای از تئوری‌های ریاضی برای درک و تحلیل سیستم‌های ارسال پیام در دسترس است. از جمله مدل بازیگر و حسابگرهای مختلف انتقال پیام می‌تواند از طریق پردازش متقارن متقارن، با یا بدون انسجام حافظه پنهان حافظه مشترک، به‌طور مؤثر اجرا شود. حافظه مشترک و همزمانی ارسال پیام ویژگی‌های عملکرد متفاوتی دارند. به‌طور معمول (اگرچه نه همیشه)، سربار حافظه در هر فرایند و سربار تغییر وظیفه در سیستم ارسال پیام کمتر است، اما سربار انتقال پیام از تماس مکالمه بیشتر است. این اختلافات غالباً تحت تأثیر عوامل دیگر عملکرد قرار دارد.

تاریخچه
-------

محاسبات همزمان از سالهای ۱۹ و اوایل قرن ۲۰ از کارهای قبلی در مورد راه‌آهن و تلگراف ایجاد شده‌است و برخی از اصطلاحات به این دوره مانند سمفورها مربوط است. اینها برای پاسخ به این سؤال است که چگونه می‌توان چندین قطار را در همان سیستم راه‌آهن اداره کرد (جلوگیری از برخورد و حداکثر بهره‌وری) و چگونگی اداره انتقال چندگانه بر روی یک مجموعه مشخص از سیم (بهبود کارایی) از جمله از طریق تقسیم زمان چند برابر (۱۸۷۰).

مطالعه آکادمیک الگوریتم‌های همزمان در دهه ۱۹۶۰ آغاز شد و دیجکسترا (۱۹۶۵) به عنوان اولین مقاله در این زمینه شناخته شد و محرومیت متقابل را شناسایی و حل کرد. (۷)

شیوع
----

همزمانی در محاسبات گسترده‌است، از سخت‌افزار سطح پایین در یک تراشه به شبکه‌های جهانی رخ می‌دهد. نمونه‌های زیر:

* کانال
* کوروتین
* آینده و وعده‌ها

در سطح سیستم عامل:

* وظیفه رایانه، اعم از وظیفه مشترک چند وظیفه ای و پیشگیرانه تقسیم
	+ زمانیکه پردازش دسته ای متوالی مشاغل را با استفاده همزمان از یک سیستم جایگزین می‌کند.
* روند
* نخ

در سطح شبکه، سیستم‌های شبکه به‌طور کلی با ماهیت خود همزمان هستند، زیرا از دستگاه‌های جداگانه تشکیل شده‌اند.

زبانهایی که از برنامه‌نویسی همزمان پشتیبانی می‌کنند
---------------------------------------------------

زبانهای برنامه‌نویسی همزمان زبان‌های برنامه‌نویسی هستند که از سازه‌های زبانی برای همزمانی استفاده می‌کنند. این سازه‌ها ممکن است شامل چند رشته، پشتیبانی از محاسبات توزیع شده ، انتقال پیام، منابع مشترک (از جمله حافظه مشترک) یا آینده و وعده‌ها باشد. چنین زبانهایی گاهی به عنوان زبانهای همگرا محور یا زبانهای برنامه‌نویسی همزمان محور توصیف می‌شود.

امروزه متداول‌ترین زبان‌های برنامه‌نویسی که دارای سازه‌های خاص برای همزمانی هستند Java و C # هستند. هر دوی این زبانها اساساً از یک مدل همزمانی حافظه مشترک استفاده می‌کنند، و از قفل ارائه شده توسط مانیتورها استفاده می‌شود (اگرچه مدل‌های ارسال پیام در بالای مدل حافظه مشترک مشترک وجود دارد). از بین زبانهایی که از الگوی همگام سازی پیام انتقال استفاده می‌کنند احتمالاً ارلانگ امروزه بیشترین کاربرد را در صنعت دارد. نیاز به استناد.

بسیاری از زبانهای برنامه‌نویسی همزمان بیشتر به عنوان زبان‌های تحقیقاتی (به عنوان مثال Picو نه به عنوان زبان‌هایی برای استفاده در تولید، توسعه یافته‌اند) با این حال زبانهایی مانند ارلانگ، لیمبو و اوکام در ۲۰ سال گذشته در زمانهای مختلف شاهد استفاده صنعتی بوده‌اند. زبانهایی که همزمانی نقش مهمی را ایفا می‌کنند عبارتند از:

هدف کلی Ada با پشتیبانی بومی برای ارسال پیام و همزمانی مبتنی بر نظارت بر آنها هست.

Alefهمزمان با ارسال موضوعات و پیام برای برنامه‌نویسی سیستم در نسخه‌های اولیه برنامه ۹ از آزمایشگاه‌های بل انجام می‌گیرد.

یادداشت
-------

* این تخفیف موازی داخلی یک هسته پردازنده، مانند خطوط لوله یا دستورالعمل‌های بردار شده‌است. یک ماشین تک هسته ای یک هسته ای ممکن است قادر به موازی بودن مانند پردازنده پردازنده باشد، اما پردازنده به تنهایی چنین نیست.

منابع
-----

۱-پترسون و هنسی ۲۰۱۳، ص. ۵۰۳

*"Making reliable distributed systems in the presence of software errors"(PDF)*

برنامه‌نویسی همزمان و موازی در جولیا

https://juliacon.talkfunnel.com/2015/21-concurrent-and-parallel-programming-in-julia

پترسون، دیوید ا. هنسی، جان ال (۲۰۱۳). سازمان و طراحی رایانه: رابط سخت‌افزار / نرم‌افزار. مجموعه مورگان کافمن در معماری و طراحی رایانه (چاپ ۵). مورگان کافمن شابک ۹۷۸-۰-۱۲۴۰۷۸۸۶-۴ رسانه‌های مربوط به برنامه‌نویسی همزمان در Wikimedia Commons

کتابخانه مجازی سیستمهای همزمان می‌باشد.

1. ↑  «*هم‌رو*» [*رایانه و فنّاوری اطلاعات*] هم‌ارزِ «*concurrent*»؛ منبع: گروه واژه‌گزینی. جواد میرشکاری، ویراستار. *دفتر ششم*. فرهنگ واژه‌های مصوب فرهنگستان. تهران: انتشارات فرهنگستان زبان و ادب فارسی. شابک ۹۷۸-۹۶۴-۷۵۳۱-۸۵-۶ (ذیل سرواژهٔ *هم‌رو*)

پیوند به بیرون
--------------

* پرونده‌های رسانه‌ای مربوط به Concurrent programming در ویکی‌انبار
* Concurrent Systems Virtual Library

| * ن
* ب
* و
ادسخر دیکسترا |
| --- |
| ادسخر دیکسترا | 
* *A Primer of ALGOL 60 Programming* (book)
* *Structured Programming* (book)
* *A Discipline of Programming* (book)
* *A Method of Programming* (book)
* *Predicate Calculus and Program Semantics* (book)
* *Selected Writings on Computing: A Personal Perspective* (book)
* ادسخر دیکسترا
* ادسخر دیکسترا
* *A Note on Two Problems in Connexion with Graphs*
* *Cooperating Sequential Processes*
* *Solution of a Problem in Concurrent Programming Control*
* *The Structure of the 'THE'-Multiprogramming System*
* *Goto*
* *Notes on Structured Programming*
* *The Humble Programmer*
* *Programming Considered as a Human Activity*
* *How Do We Tell Truths That Might Hurt?*
* *On the Role of Scientific Thought*
* *Self-stabilizing Systems in Spite of Distributed Control*
* *On the Cruelty of Really Teaching Computer Science*

 |
| علوم رایانه | 
* علوم نظری رایانه
* مهندسی نرم‌افزار
* علوم سامانه‌ها
* الگوریتم
* رایانش همزمان
* رایانش توزیع‌شده
* روش‌های صوری
* فرایند توسعه نرم‌افزار
* نظریه زبان‌های برنامه‌نویسی
* طراحی نرم‌افزار and توسعه نرم‌افزار
* معماری نرم‌افزار
* فلسفه علوم رایانه

 |
| ادسخر دیکسترا | 

|  |  |
| --- | --- |
| ادسخر دیکسترا | 
* الگول ۶۰ implementation
* پشته فراخوانی
* هم‌روندی
* رایانش همزمان
* Cooperating sequential processes
* بخش بحرانی
* بن‌بست (علوم رایانه) (بن‌بست (علوم رایانه))
* مسئله غذا خوردن فیلسوف‌ها
* Dutch national flag problem
* تاب‌آوری خطا
* برنامه‌نویسی ساخت‌یافته
* Guarded Command Language
* لایه انتزاع in معماری نرم‌افزار
* لایه انتزاع
* ریسه (رایانه)
* انحصار متقابل (قفل (رایانه))
* مسئله تولیدکننده-مصرف‌کننده (مسئله تولیدکننده-مصرف‌کننده)
* خط تولید نرم افزار
* Predicate transformer semantics
* همگام‌سازی (علوم رایانه)
* Self-stabilizing distributed system
* سمافور
* تفکیک دغدغه‌ها
* مسئله آرایشگر خواب‌آلود
* Software crisis
* تحلیل ساختمند
* برنامه‌نویسی ساخت‌یافته
* THE multiprogramming system
* Unbounded nondeterminism
* Weakest precondition calculus

 |
| ادسخر دیکسترا | 
* الگوریتم بانکدار
* الگوریتم دکسترا
* الگوریتم پریم (الگوریتم پریم)
* الگوریتم دایکسترا – شولتن
* الگوریتم دکر (generalization)
* مرتب‌سازی روان
* الگوریتم محوطه تعویض خط
* Tri-color marking algorithm
* رایانش همزمان
* Distributed algorithms
* الگوریتم‌های جلوگیری از بن‌بست
* انحصار متقابل
* Self-stabilizing algorithms

 |

 |
| Related people | 
* Shlomi Dolev
* پر برینچ هنسن
* تونی هور
* اوله-یوهان دال
* لزلی لمپورت
* دیوید پارناس
* Adriaan van Wijngaarden
* نیکلاوس ویرت

 |
| Other topics | 
* Dijkstra Prize (Edsger W. Dijkstra Prize in Distributed Computing)
* Centrum Wiskunde & Informatica
* E.W. Dijkstra Archive (دانشگاه تگزاس در آستین)
* List of pioneers in computer science
* List of important publications in computer science
* List of important publications in theoretical computer science
* List of important publications in concurrent, parallel, and distributed computing
* International Symposium on Stabilization, Safety, and Security of Distributed Systems

 |
| 
* **Wikiquote**

 |

| * ن
* ب
* و
گونه‌های زبان‌های برنامه‌نویسی |
| --- |
| 
* Actor-based
* Array
* جنبه‌گرا
* مبتنی بر کلاس
* Concatenative
* محاسبات همزمان
* Data-structured
* Dataflow
* اعلانی
* خاص دامنه
* پویا
* محرمانه
* رویدادمحور
* Extensible
* تابعی
* دستوری
* منطقی
* ماکرو
* فرا برنامه‌نویسی
* چندالگویی
* مبتنی بر شئ
* شیءگرا
* خط لوله
* رویه‌ای
* بر پایه پیش‌نمونه
* پژواکی
* قانون محور
* اسکریپت‌نویسی
* Synchronous
* Templating

 |
| 
* اسمبلی
* ترجمه‌شده
* تفسیری
* ماشین

 |
| 
* سطح پایین
* سطح بالا
* Very high-level

 |
| 
* First generation
* Second generation
* نسل سوم
* نسل چهارم
* زبان برنامه‌نویسی نسل پنجم

 |
| 
* Non-English-based
* تصویری

 |