با اکمل اشتباه نشود.

**اوکام** (به انگلیسی: occam) یک زبان برنامه‌نویسی همزمان است و براساس جریان جبری فرایندهای ترتیبی ارتباطی (csp) بناشده و بسیاری از ویژگی‌هایش را به اشتراک می‌گذارد. این زبان برنامه‌نویسی به افتخار فیلسوف ویلیام اوکام شخصی که اصل تیغ اوکام از وی گرفته شده به این اسم نام گذاری شده‌است.

اوکام یک زبان رویه ای امری است (مانند پاسکال). این زبان توسط دیوید می و دیگران در شرکت inmos (با علامت تجاری INMOS) توسعه داده شد؛ توسط تونی هور به عنوان زبان برنامه‌نویسی اختصاصی ریزپردازنده فرستنده خودشان و درعین حال قابل اجرا در باقی سیستم عامل‌های حاضر دیگر رهنمود شد. شناخته شده‌ترین نسخه، اوکام ۲ است که راهنمای برنامه‌نویسی آن توسط اریکسون زینت و دیگران در شرکت inmos نوشته شد.

بررسی اجمالی
------------

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

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

```
 keyboard ? c
```

```
 screen ! c
```

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

```
 SEQ
   x := x + 1
   y := x * x
```

`PAR` لیستی از عبارات که ممکن است به‌طور همزمان معین شوند را شروع می‌کند. مثال:

```
 PAR
   p()
   q()
```

`ALT` لیستی از دستورات قفل شده را مشخص می‌کند. قفل‌ها ترکیبی از حالت بولی و عبارات ورودی هستند؛ هر دو اختیاری. هر قفل برای حالتی که درست است و کانال ورودی ای که آماده است، موفق عمل می‌کند. یکی از گزینه‌های موفق برای اجرا انتخاب می‌شود. مثال:

```
 ALT
   count1 <100 & c1 ? data
     SEQ
       count1 := count1 + 1
       merged ! data
   count2 <100 & c2 ? data
     SEQ
       count2 := count2 + 1
       merged ! data
   status ? request
     SEQ
       out ! count1
       out ! count2
```

داده‌ها را از کانال c1 یا c2 می‌خواند (هرکدام که آماده باشد) و به کانال ادغام شده می‌فرستد. اگر countN به ۱۰۰ برسد، خواندن از کانال متناظر از کار می‌افتند. درخواست حالت کانال از طریق تولید شمارش‌ها به `out` پاسخ داده می‌شود.

بازبینی زبان
------------

**اوکام ۱**

اوکام ۱ (منتشر شده در سال ۱۹۸۳) یک نسخه مقدماتی از این زبان بود که از کار دیوید می بر روی EPL، و CSPهای تونی هور اقتباس شد. این نسخه تنها نوع داده‌های VAR را پشتیبانی می‌کرد که همخوانی نوع انتگرال با طول کلمات اختصاصی معماری هدف بود و همچنین آرایه‌های تک بعدی.

اوکام ۲
-------

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

اوکام ۲٫۱
---------

اوکام ۲٫۱ آخرین توسعه زبان اوکام توسط شرکت inmos بود. در سال ۱۹۹۴ تعریف شد و تحت تأثیر طرح پیشنهادی ای که پیشتر برای زبان اوکام ۳ (همچنین منتسب به "اوکام ۹۱" طی مراحل اولیه‌اش) توسط جف بارت (Geoff Barrett) در شرکت inmos در اوایل دهه ۹۰ میلادی ایجاد شده بود، قرار گرفت. یک کتابچه راهنمای مرجع اصلاح شده در توصیف اوکام ۳ برای نظر جامعه توزیع شد، اما این زبان هرگز به‌طور کامل در یک کامپایلر پیاده‌سازی نشده‌است. اوکام ۲٫۱ چند ویژگی شامل موارد زیر را به اوکام ۲ اضافه کرد:

* نام گذاری انواع داده‌ها (نوع داده y , x است)
* نام گذاری سابقه‌ها
* دسته‌بندی سابقه‌ها
* ترمیم بعضی از قوانین تبدیل نوع
* عملگرهای جدید (مانند BYTESIN)
* تغییر نوع کانال‌ها و آرایه‌های کانال
* توانایی بازگرداندن آرایه با طول مشخص از تابع

برای مشاهده لیست کامل تغییرات ضمیمه p از Inmos occam 2.1 Reference Manual را ببینید.

اوکام π
-------

اوکام π نام رایج نوع اوکام که توسط نسخه‌های بعدی کامپایلر Kent Retargetable occam (KRoC) توسعه داده می‌شود است. اضافه کردن سمبل π به نام اوکام ، اشاره ای است به اوکام KRoC که شامل چند ایده تأثیر گرفته از جبر π است. اوکام π شامل چندین افزونه مهم نسبت به کامپایلر اوکام ۲٫۱ است. برای مثال:

* پروتکل‌های تودرتو
* ایجاد فرایندهای زمان اجرا
* کانال‌ها، داده و فرایندهای متحرک
* بازگشت
* پروتکل وراثتی
* سازنده آرایه
* ملاقات‌های تمدید شده

جستارهای وابسته
---------------

* زبان برنامه‌نویسی XC که براساس زبان اوکام اما با ساختار زبان c بنا شده‌است.
* زبان‌های برنامه‌نویسی همزمان
* لیستی از زبان‌های همزمان و موازی

منابع
-----

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

* Information, compilers, editors and utilities at the WoTUG occam pages
* Compilers, documentation, examples, projects and utilities at the Internet Parallel Computing Archive (no longer maintained)
* Occam books on Transputer.net
* The occam-pi language
* Tock occam compiler – (translator from occam to C from Kent) a Haskell-based compiler for occam and related languages