موضوع مقاله: برنامه نویسی مبتنی برجریان | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # برنامه نویسی مبتنی برجریان | مقدمه: در برنامه نویسی کامپیوتر و برنامه نویسی مبتنی برجریان (FBP) یک پارادایم برنامه نویسی است که برنامه رابه عنوان شبکه‌های فرایندهای «جعبه سیاه» تعریف می‌کند، که با انتقال پیام داده‌ها را از طریق اتصال از پیش تعریف شده رد و بدل می‌کند. | ## بخش 1: برنامه نویسی مبتنی برجریان | در جایی که اتصالات به‌طور مستقیم به فرایندها مشخص می‌شود، این فرایندهای جعبه سیاه را می‌توان بی وقفه به برنامه‌های مختلف وصل کرد بدون اینکه در داخل تغییر کند؛ بنابراین FBP به‌طور طبیعی محور جزء است. یک شکل خاص از برنامه نویسی جریان FBP داده‌است که براساس بافرهای محدود، بسته‌های اطلاعاتی با طول عمر تعریف شده، بنادر نام گذاری شده و تعریف جداگانه‌ای از اتصالات است. مقدمه برنامه نویسی مبتنی بر جریان با استفاده از استعاره یک «کارخانه داده» برنامه‌ها را تعریف می‌کند. این یک برنامه را نه به عنوان یک فرایند متوالی واحد، که در یک نقطه از زمان شروع می‌شود، مشاهده می‌کند و سپس یک کار رابه طور همزمان انجام می‌دهد تا اینکه به پایان برسد، بلکه به عنوان شبکه ای از فرایندهای ناهمزمان که با استفاده از جریان‌های بخش‌های داده ساختاری ارتباط برقرار می‌کنند، «بسته‌های اطلاعاتی» (IP) نامیده می‌شود. در این نمای، تمرکز برروی داده‌های برنامه و تحولات اعمال شده برروی آن برای تولید خروجی‌های مورد نظر است. این شبکه به صورت بیرونی به فرایندها تعریف می‌شود، به عنوان لیستی از اتصالات که توسط یک قطعه نرم‌افزار تفسیر می‌شود، معمولاً به عنوان «برنامه‌ریز» نامیده می‌شود. از آنجا که فرایندهای FBP معمولاً در مدت زمان کمتری نسبت به برنامه‌های معمولی اجرا می‌کنند، واستفاده بهینه از تمام پردازنده‌های موجود در دستگاهارا انجام می‌دهند، بدون برنامه نویسی خاص مورد نیاز است. برای رسیدن به این هدف تعریف شبکه معمولاً دیاگرامی است ودر برخی از زبان‌ها یا نمادهای سطح پایین به لیست اتصال تبدیل می‌شود. تعاریف پیچیده‌تر شبکه دارای ساختار سلسله مراتبی است که از زیر شبکه‌هایی با اتصالات «چسبنده» ساخته می‌شود. بسیاری از زبان‌ها زبان‌های دیگر مبتنی برجریان در اطراف زبان‌های برنامه نویسی سنتی تر ساخته شده‌اند که قابل توجه‌ترین نمونه آن raftlib است که اپراتورهای شبیه به c++ stream برای مشخص کردن نمودار جریان استفاده می‌کند. در واقع، با توجه به یک برنامه ریز که به زبان کافی سطح پایین نوشته شده‌است، مؤلفه‌هایی که به زبان‌های مختلف نوشته شده‌اند می‌توانند در یک شبکه واحد به هم وصل شوند؛ بنابراین FBP خود را به مفهوم زبانهای خاص دامنه یا «مینی زبان‌ها» وام می‌دهد. FBP نمایشگاه «اتصال داده» را دارد که در مقاله مربوط به اتصال به عنوان سست‌ترین نوع اتصال بین اجزا توضیح داده شده‌است. مفهوم اتصال سست به نوبه خود به معماری‌های سرویس گرا مربوط می‌شود و FBP با تعدادی از معیارهای چنین معماری متناسب است، البته در سطح ریزتر و ظریف تر از بسیاری از نمونه‌های این معماری. FBP ویژگی‌های سطح بالا و عملکردی را ارائه می‌دهد که استدلال در مورد رفتار سیستم را ساده می‌کند. نمونه ای از این مدل توزیع داده‌های توزیع شده برای توصیف سازنده و تجزیه و تحلیل معنایی پروتکل‌های چند حزبی توزیع شده‌است. تاریخ برنامه نویسی مبتنی بر جریان توسط جی پائول موریسون در اوایل دهه ۱۹۷۰ اختراع شد، و در ابتدا به صورت نرم‌افزاری برای یک بانک کانادایی اجرا شد. در سال ۱۹۷۵ یکی از برنامه‌های بزرگ در کانادا به‌طور زنده اجرا شد و از سال ۲۰۱۳ تقریباً ۴۰ سال است، که در حال استفاده مداوم از تولید است و روزانه در حال اجرا است. از آنجا که IBM ایده‌های پشت FBP را «خیلی شبیه به یک قانون طبیعت» می‌داند قابل ثبت است، آنها در عوض مفاهیم اصلی FBP را با استفاده از یک بولتن افشای فنی «اطلاعات پاسخگو مدولار، سیستم برنامه نویسی وظیفه بین‌المللی» در حوزه عمومی قرار می‌دهند. به‌طور کلی مفاهیم درون IBM به عنوان «جریان داده» نامیده می‌شدند، اما به نظر می‌رسید این اصطلاح خیلی کلی است و در نهایت نام «برنامه نویسی مبتنی بر جریان» پذیرفته شد. استیونز چندین مقاله برای توصیف و پشتیبانی از مفهوم FBP نوشت، و مطالب مربوط به آن را در چندین کتاب خود درج کرد. در سال ۱۹۹۴ موریسون کتابی را منتشر کرد که توصیف FBP و ارائه شواهد تجربی مبنی بر اینکه FBP منجر به کاهش زمان توسعه شده‌است. مفاهیم نمودار زیر اشخاص اصلی نمودار FBP (جدا از بسته‌های اطلاعات) را نشان می‌دهد. چنین نمودار می‌تواند به‌طور مستقیم به لیستی از اتصالات تبدیل شود، که می‌تواند توسط یک موتور مناسب (نرم‌افزار یا سخت‌افزار) اجرا شود. O1، O2 و دو IN پورتهایی هستند که اتصالات M و N را به فرآیندهای مربوطه آن‌ها وصل می‌کنند. اجرای پروسه‌های B و C مجاز است که همان کد را اجرا کنند، بنابراین هر فرایند باید مجموعه ای از ذخیره‌سازی کار، بلوک‌های کنترل و غیره را داشته باشد، چه اینکه آنها دارای کد اشتراکی هستند یا نه، B و C می‌توانند از همان درگاه استفاده کنند. نام‌ها، به عنوان نام بندر فقط در اجزای ارجاع دهنده آن‌ها معنی دارند (و البته در سطح شبکه). M و N آنهایی هستند که اغلب به آن‌ها «بافرهای محدود» گفته می‌شود و از نظر تعداد IPهایی که می‌توانند در هر نقطه از زمان داشته باشند از ظرفیت ثابت برخوردار هستند. M و N آنهایی هستند که اغلب به آن‌ها «بافرهای محدود» گفته می‌شود و از نظر تعداد IPهایی که می‌توانند در هر نقطه از زمان داشته باشند از ظرفیت ثابت برخوردار هستند. مفهوم پورت‌ها همان چیزی است که امکان استفاده از همان مؤلفه را در بیش از یک مکان شبکه می‌دهد. درگاه‌ها در ترکیب با توانایی پارامتریزاسیون، به نام بسته‌های اطلاعات اولیه (IIPs) , FBP را با قابلیت استفاده مجدد از کامپوننت‌ها فراهم می‌کنند و FBP را به یک معماری مبتنی بر مؤلفه تبدیل می‌کنند؛ بنابراین FBP آنچه رائول دو کامپو و نیت ادواردز از IBM Research از ماژولاریتی قابل تنظیم نام برده‌اند، نمایش می‌دهد. M و N آنهایی هستند که اغلب به آن‌ها «بافرهای محدود» گفته می‌شود و از نظر تعداد IPهایی که می‌توانند در هر نقطه از زمان داشته باشند از ظرفیت ثابت برخوردار هستند. | ## بخش 2: برنامه نویسی مبتنی برجریان | مفهوم پورت‌ها همان چیزی است که امکان استفاده از همان مؤلفه را در بیش از یک مکان شبکه می‌دهد. درگاه‌ها در ترکیب با توانایی پارامتریزاسیون، به نام بسته‌های اطلاعات اولیه (IIPs) , FBP را با قابلیت استفاده مجدد از کامپوننت‌ها فراهم می‌کنند و FBP را به یک معماری مبتنی بر مؤلفه تبدیل می‌کنند؛ بنابراین FBP آنچه رائول دو کامپو و نیت ادواردز از IBM Research از ماژولاریتی قابل تنظیم نام برده‌اند، نمایش می‌دهد. IPها معمولاً تکه داده‌های ساختاری هستند - برخی IPها ممکن است دارای هیچ داده واقعی نباشند، اما فقط به عنوان سیگنال مورد استفاده قرار می‌گیرند. همچنین ممکن است IPها به صورت زنجیر ساخته شوند تا "درختان IP" (IP IP) ایجاد شوند، که از طریق شبکه به عنوان اشیاء مجزا سفر می‌کنند. در حین تهیه یک برنامه، فرایندهای نظارت ممکن است بین جفت فرایندها اضافه شوند، فرآیندهای ممکن است «منفجر شوند» به زیر شبکه‌ها، یا شبیه‌سازی فرایندها ممکن است با منطق فرایند واقعی جایگزین شوند؛ بنابراین FBP خود را به نمونه سازی سریع تبدیل می‌کند. این واقعاً یک تصویر خط مونتاژ از پردازش داده‌ها است: ممکن است IPهایی که از طریق شبکه‌ای از پردازش‌ها عبور می‌کنند، به عنوان ابزارهای مسافرتی از ایستگاه به ایستگاه در یک خط مونتاژ در نظر گرفته شوند. «ماشین آلات» ممکن است به راحتی وصل شود، خط را برای تعمیر، تعویض و موارد دیگر از بین برد. به اندازه کافی عجیب و غریب، این تصویر بسیار شبیه به تجهیزات ضبط واحد است که برای پردازش داده‌ها قبل از روزهای رایانه‌ها استفاده می‌شد، به جز این که باید برگه‌های کارت از یک دستگاه به دستگاه دیگر حمل شود. این واقعاً یک تصویر خط مونتاژ از پردازش داده‌ها است: ممکن است IPهایی که از طریق شبکه ای از پردازش‌ها عبور می‌کنند، به عنوان ابزارهای مسافرتی از ایستگاه به ایستگاه در یک خط مونتاژ در نظر گرفته شوند. «ماشین آلات» ممکن است به راحتی وصل شود، خط را برای تعمیر، تعویض و موارد دیگر از بین برد. به اندازه کافی عجیب و غریب، این تصویر بسیار شبیه به تجهیزات ضبط واحد است که برای پردازش داده‌ها قبل از روزهای رایانه‌ها استفاده می‌شد، به جز این که باید برگه‌های کارت از یک دستگاه به دستگاه دیگر حمل شود. اجرای FBP ممکن است غیر پیشگیرانه یا پیشگیرانه باشد - اجرای‌های قبلی تمایل به پیشگیری (زبان اصلی و زبان C) ندارند، در حالی که آخرین اجرای جاوا (زیر را ببینید) از کلاس Java Thread استفاده می‌کند و پیشگیرانه است. مشکلی که شرح داده شد بسیار ساده به نظر می‌رسد همان‌طور که در کلمات شرح داده شده‌است، اما در واقع تحقق آن با استفاده از منطق رویه معمولی به طرز شگفت‌آور دشوار است. وظیفه موسوم به «مسئله تلگرام» که در ابتدا توسط پیتر نئور توصیف شده‌است، نوشتن برنامه ای است که خطوط متن را می‌پذیرد و خطوط خروجی را با حداکثر کلمه تولید می‌کند، جایی که تعداد کاراکترهای هر سطر از حد خاصی تجاوز نمی‌کند. طول ممکن است کلمات تقسیم نشوند و تصور می‌کنیم هیچ کلمه‌ای بیش از اندازه خطوط خروجی نیست. در منطق متعارف، برنامه نویس به سرعت متوجه می‌شود که نه ورودی و نه سازه‌های خروجی نمی‌توانند برای هدایت سلسله مراتب تماس جریان کنترل استفاده شوند. در FBP، از طرف دیگر، توصیف مسئله خود یک راه حل را پیشنهاد می‌کند: «کلمات» به صراحت در توصیف مسئله ذکر شده‌است، بنابراین برای طراح منطقی است که کلمات را به عنوان بسته‌های اطلاعاتی (IP) رفتار کند. در FBP هیچ سلسله مراتبی برای تماس وجود ندارد، بنابراین برنامه نویس وسوسه نمی‌شود که یک الگوی فرعی از راه حل را وادار کند تا سطح عالی باشد. IIPها بخش‌هایی از داده‌های مرتبط با یک درگاه در تعریف شبکه هستند که وقتی «دریافت» برای درگاه مربوط صادر می‌شود، IPهای «عادی» می‌شوند. بروزرسانی دسته ای این نوع برنامه شامل ارسال پرونده ای از «جزئیات» (تغییر، اضافه کردن و حذف) در برابر «پرونده اصلی»، و تولید (حداقل) یک پرونده استاد به روز شده و یک یا چند گزارش است. برنامه‌های به روز رسانی با استفاده از کد همگام و رویه ای بسیار سخت است، زیرا دو جریان ورودی (گاهی اوقات بیشتر) باید همزمان شوند، حتی اگر ممکن است استادان بدون جزئیات مربوطه وجود داشته باشند، یا برعکس. فرض کنید یک جریان ("استادان" در این حالت) از IPهایی با مقادیر اصلی ۱، ۲ و ۳ تشکیل شده و IPهای جریان دوم ("جزئیات") دارای مقادیر اصلی ۱۱، ۱۲، ۲۱، ۳۱، ۳۲، ۳۳ هستند و ۴۱، که در آن رقم اول با مقادیر اصلی کلید مطابقت دارد. با استفاده از شخصیت‌های براکت برای نشان دادن IPهای "براکت"، جریان خروجی جمع شده به شرح زیر خواهد بود: (m1 d11 d12) (m2 d21) (m3 d31 d32 d33) (d41) Collate یک جعبه سیاه قابل استفاده مجدد است که فقط باید بدانید که زمینه‌های کنترل در IPهای ورودی آن (حتی این امر کاملاً ضروری نیست زیرا می‌توان فرآیندهای ترانسفورماتور را در بالادست برای قرار دادن فیلدهای کنترل در مکانهای استاندارد قرار داد) و در واقع قابل تعمیم است. Collate از یک پورت از نوع آرایه برای ورودی استفاده می‌کند و تعداد متغیر جریان ورودی را در اختیار شما قرار می‌دهد. از آنجا که مؤلفه‌ها فقط خواندنی هستند، هر تعداد از اجزای معین ("فرآیندها") می‌توانند بطور غیر همزمان همزمان با یکدیگر اجرا شوند. اکنون که ماشین‌ها معمولاً دارای چندین پردازنده هستند، وقتی پردازش‌ها با CPU فشرده باشند نیز شروع به کار می‌کنند. نمودار در این بخش یک فرایند "Load Balancer" را نشان می‌دهد که داده‌ها را بین ۳ فرایند، با علامت S1، S2 و S3 توزیع می‌کند، به ترتیب، که نمونه‌های یک جزء واحد هستند، که به نوبه خود به یک فرایند واحد در "اول" می‌خورند. اتصالات متقابل نشان دهنده درخواستهایی است که نیازی به مراجعه به انتهای پشتی ندارند، یا درخواستهایی که باید بیش از یک بار قبل از بازگشت به کاربر، از طریق شبکه چرخش کنند. از آنجا که درخواست‌های مختلف ممکن است از بک‌های مختلف استفاده کند، و ممکن است برای پردازش آنها مقادیر زمانی متفاوتی برای بک گراندها (در صورت استفاده) نیاز داشته باشد، باید مقدماتی فراهم شود تا داده‌های برگشتی را با معاملات درخواست کننده مناسب، به عنوان مثال جداول هش یا انبارها مرتبط کند. نمودار فوق بصورت شماتیک شماتیکی است به این معنی که برنامه نهایی ممکن است حاوی فرآیندهای بسیار بیشتری باشد: ممکن است فرآیندهای دیگری برای مدیریت انبارها، نمایش ترافیک اتصال، نظارت بر توان و غیره در بین فرآیندهای دیگر درج شوند. همچنین بلوک‌های موجود در نمودار ممکن است «زیر شبکه» باشد - شبکه‌های کوچک با یک یا چند اتصالات باز. | ## بخش 3: برنامه نویسی مبتنی برجریان | مقایسه با سایر پارادایم‌ها و روش‌ها برنامه نویسی ساختار یافته جکسون (JSP) و توسعه سیستم جکسون (JSD) این روش فرض می‌کند که یک برنامه باید به عنوان یک سلسله مراتب رویه ای واحدهای فرعی ساخته شود. نقطه شروع آن توصیف برنامه به عنوان مجموعه ای از "خطوط اصلی"، بر اساس ساختار داده‌های ورودی و خروجی است. سپس یکی از این "خطوط اصلی" برای هدایت کل برنامه انتخاب می‌شود و سایر موارد برای تبدیل آنها به زیرآبی (از این رو نام "وارونگی جکسون") باید "وارونه" شوند. این بعضی اوقات منجر به آنچه که "برخورد" می‌شود، می‌شود که این برنامه به چندین برنامه یا کارنتین تقسیم شود. هنگام استفاده از FBP، این فرایند وارونگی لازم نیست، زیرا هر مؤلفه FBP را می‌توان یک "خط اصلی" جداگانه در نظر گرفت. FBP و JSP مفهوم درمان یک برنامه (یا برخی مؤلفه‌ها) را به عنوان تجزیه کننده جریان ورودی به اشتراک می‌گذارند. سپس این مدل به تعداد پردازنده‌های متوالی به تعداد پردازنده‌های موجود تبدیل می‌شود. جکسون در بخش ۱٫۳ از کتاب خود (اجرای برنامه‌های اضافی) در مورد امکان اجرای مستقیم مدل شبکه ای که قبل از این مرحله وجود دارد بحث می‌کند: مشخصات تولید شده در پایان مرحله سیستم زمان‌بندی، در اصل، قابلیت اجرای مستقیم را دارد. محیط لازم شامل یک پردازنده برای هر فرایند، وسیله ای معادل بافر بدون مرز برای هر جریان داده و برخی از دستگاه‌های ورودی و خروجی است که سیستم به دنیای واقعی متصل است. مطمئناً چنین شرایطی توسط نرم‌افزار مناسبی که در حال اجرا بر روی یک دستگاه به اندازه کافی قدرتمند است فراهم می‌شود. گاهی اوقات، چنین اجرای مستقیم مشخصات امکان‌پذیر خواهد بود، و حتی ممکن است یک انتخاب معقول باشد. یک جزء FBP را می‌توان تابعی دانست که جریان (های) ورودی خود را به جریان (های) خروجی آن تبدیل می‌کند. یا نماد عملکردی به وضوح می‌تواند مورد استفاده قرار گیرد تا حداقل بخشی از یک شبکه FBP را نشان دهد. سپس این سؤال پیش می‌آید که آیا مؤلفه‌های FBP می‌توانند خودشان با استفاده از نماد عملکردی بیان شوند. WH Burge نشان داد که چگونه می‌توان با استفاده از شیوه برنامه نویسی بازگشتی، برنامه‌ها را تولید کرد، اما این اثر از نظر (جریان) مقادیر اتمی بود.W.H. فریدمن و ویز با افزودن مفهوم "منفی تنبل" به کارهای Burge راهی برای انجام این کار پیشنهاد دادند. "منفی تنبل" در واقع جریان ایجاد نمی‌کند تا هر دو استدلال آن محقق شود - قبل از آن به سادگی "وعده" ای را برای انجام این کار ثبت می‌کند. این اجازه می‌دهد تا یک جریان از جلو به صورت پویا تحقق یابد، اما با یک پایان عقب غیر واقعی. پایان جریان تا پایان فرایند غیر واقعی باقی می‌ماند، در حالی که آغاز دنباله ای طولانی مدت از موارد است. لیندا به نظر می‌رسد بسیاری از مفاهیم FBP طی سالها به‌طور مستقل در سیستم‌های مختلف کشف شده‌اند. تفاوت بین این دو تکنیک توسط تکنیک تعادل بار "لینداً مدرسه پیراناها "نشان داده شده‌است - در FBP، این نیاز به یک مؤلفه اضافی" بالانسور بار "دارد که درخواست‌ها را به مؤلفه ای در لیستی منتقل می‌کند که کمترین تعداد IP را در انتظار دارد. پردازش می‌شود واضح است که FBP و لیندا با یکدیگر ارتباط نزدیکی دارند و می‌توان از آنها به راحتی برای شبیه‌سازی دیگری استفاده کرد. برنامه نویسی شی گرا یک شیء در OOP را می‌توان به عنوان یک واحد نیمه خودمختار توصیف کرد که شامل هر دو اطلاعات و رفتار است. اشیاء با استفاده از «فراخوانی متد»، که در واقع تماسهای زیرمجموعه ای هستند، ارتباط می‌یابند که بطور غیرمستقیم از طریق کلاسی که شیء گیرنده متعلق به آن است انجام می‌شود. از طریق تماسهای متد به داده‌های داخلی این شیء دسترسی پیدا می‌کند، بنابراین این نوعی از اطلاعات پنهان یا «کپسوله سازی» است. اما محصور کردن، OOP را پیش‌بینی می‌کند - دیوید پرناس یکی از مقالات اصلی را در اوایل دهه ۷۰ نوشت: - و یک مفهوم اساسی در محاسبات است. در FBP، بخشی از مشخصات یک جزء فرمت‌های داده و ساختارهای جریان است که می‌تواند بپذیرد و آنهایی را که تولید می‌کند. محصور سازی نیز با داشتن فرآیندهای بیرونی از داخلی می‌تواند در سطح شبکه پیاده‌سازی شود. الیس و گیبز در مقاله خود اظهار داشتند که اشیاء فعال نسبت به اشیاء غیرفعال پتانسیل بسیار بیشتری برای توسعه سیستمهای نگهدارنده دارند. یک برنامه FBP را می‌توان ترکیبی از این دو نوع شیء دانست، جایی که فرآیندهای FBP با اشیاء فعال مطابقت دارند، در حالی که IPها با اشیاء غیرفعال مطابقت دارند. مدل بازیگر FBP بازیگر کارل هیویت را به عنوان یک فرایند ناهمزمان با ۲ پورت در نظر می‌گیرد: یکی برای پیام‌های ورودی و دیگری برای سیگنال‌های کنترل. | ## جمع‌بندی | هدف از این سیگنال جلوگیری از اجرای موازی بدن بازیگر است و از این رو اجازه می‌دهد بدون هماهنگی به زمینه‌های موضوع بازیگر دسترسی پیدا کنید.