Чи можлива паралельна мова програмування на основі стека?


14

Я читав про мови програмування на основі стека, такі як FORTH та Cat , і, здається, зважаючи на їх характер, вони можуть виконувати лише одну дію одночасно незалежно від їх парадигми (FORTH є обов'язковим, тоді як Cat функціональний).

Імперативна мова змінює стек, а суто функціональна мова, наприклад Joy , повертає новий стек, але справа в тому, що одночасно використовується лише одна стека.

Отже, чи можуть мови програмування на базі стека одночасно? Чи могли вони домогтися одночасності, використовуючи кілька стеків одночасно або щось подібне?

Чи можливо реалізувати ледачу оцінку мовою програмування на основі стека?

Будь ласка, виправте мене, якщо я щось непорозумію щодо вищезгаданих мов та понять


5
Як будь-яка імперативна мова може бути одночасною?
Бергі


Ви дійсно маєте на увазі одночасність (чого не так вже й важко досягти, просто використовуйте декілька потоків із незалежними стеками плюс спільну пам'ять) або паралелізм?
Даніель Жур

@DanielJour, якщо я добре розумію, паралелізм означає одночасне виконання, тоді як паралелізм означає незалежне виконання, так що так, я маю на увазі сумісність. Чи можете ви детальніше розглянути деталі незалежних стеків для кожної нитки?
Армандо Х.

Відповіді:


16

Отже, чи можуть мови програмування на базі стека одночасно?

Звичайно.

Чи могли вони домогтися одночасності, використовуючи кілька стеків одночасно або щось подібне?

Вже для звичайних мов багатопотокова передача зазвичай означає наявність декількох стеків "call". Було б цілком природно надати кожному потоку свій стек даних. Скажімо, було б просто актора, скажімо, тіло якого було реалізовано кодом мовою на основі стека. Явний паралелізм parанотацій а-ля GHC повинен бути досить простим. Основна проблема паралельного виконання речей полягає в тому, що ви не знаєте, яким буде ефект стеку коду, поки не виконаєте його. Однак, використовуючи синтаксис, схожий на Радість, можна було б уявити його [a b c] parяк виконанняa b cабо проти порожнього стека, або копії стека, і лише після завершення збереження самого верхнього елемента стека (або натискання деякого фіктивного значення, якщо стек порожній). Можна уявити варіації. Неявний паралелізм було б важче зробити наївним порівняно з, скажімо, суто функціональною мовою, але, безумовно, це можна зробити також. Скомпільований код визначеного користувачем комбінатора часто не надто відрізняється від «звичайного» коду.

Чи можливо реалізувати ледачу оцінку мовою програмування на основі стека?

Невідомі ефекти стека - це знову складна частина. Якщо ви розробите мову таким чином, що всі ефекти стеку можна визначити статично, то це не здається занадто складним. Якщо у вас лінь бути явним, то це також здається відносно відвертим і виглядає приблизно так, як цитати і Джой i. Одна мова, яка називає себе ледачою конкатенативною мовою, здається, поєднує обидва вищезазначені підходи з того, що я можу сказати. Я насправді не бачу, як неявно ледача конкатенативна мова працюватиме в умовах динамічних ефектів стека, принаймні, не в чомусь невиразно корисному способі, але це може бути просто відсутністю уяви з мого боку.

Між іншим, не рідкість для мов на основі стека є декілька стеків, наприклад, Forth має стек даних і стек повернення, на який ви також можете розмістити довільні дані.


8

Я знаю трохи про FORTH, тому обмежуся цим. Це мова низького рівня, що надає вам як програмісту доступ до всіх апаратних ресурсів. Тож ви можете робити все, що завгодно.

Паралельність

Для того, щоб мати паралельні програми (редагувати: раніше говорити про реальні паралельні програми), вам потрібно принаймні дві одиниці виконання (CPU). Було б досить тривіально реалізувати слово в FORTH, кажучи, наприклад, "запустити це слово на процесорі 2, використовуючи ці два аргументи". Слово виділило б два необхідні стеки на процесорі 2 і почало виконувати слово. Вам потрібно буде дещо обмежитися саме тим, які саме конструкції ви можете використовувати в цій програмі.

Якщо кількість одночасних програм більше, ніж кількість одиниць виконання, ви б перейшли до програм "псевдопаралель". В основному це можна зробити двома способами: супровідні процедури або попереджувальна багатозадачність. У будь-якому випадку можна (не просто, але добре описано в літературі), як цього досягти, і FORTH дозволяє отримати доступ до всіх необхідних матеріалів низького рівня.

Ледача оцінка

Звичайно, ви можете зробити це в FORTH, як і майже на будь-якій мові програмування. Це не буде настільки ошатно чи «вбудовано», як у скажінні Haskell. Я буду використовувати дуже наївний приклад.

Ідея полягає в тому, що ви визначаєте "функцію" (тут використовується вільно), яка повертає набір речей. Одним із прикладів може бути функція, яка повертає всі цілі числа. Потім ви робите операції на цьому наборі, і коли ви закінчите, даєте результат. Наприклад, ви можете підсумовувати всі цілі числа до тих пір, поки сума не перевищить 1000. Оцінка, яка не лінива, спочатку виділить усі цілі числа як набір, що неможливо, оскільки існує нескінченна кількість цілих чисел. Потім він би почав працювати над цим набором. Ледача реалізація мала б спосіб "дати мені наступне значення у наборі". Для цього дійсно потрібна лише одна змінна у функції "останнє значення дай".

Haskell робить все так. Звичайно, він вирішує складніші ситуації, але ідея така ж. Це додає оцінку таким чином, що дозволяє програмісту зосередитись на проблемі, а не на тому, як її вирішити.


4
"Для того, щоб мати реальні паралельні програми, вам потрібно щонайменше два блоки виконання". Це лише питання впровадження. З точки зору мови програмування, майже немає різниці між двома потоками, що працюють на одному процесорі або на двох. У певному сенсі кожну нитку можна вважати власною "одиницею виконання".
Дискретна ящірка

1
Іноді деталі реалізації повинні бути враховані. Один із прикладів - взаємодія з реальним світом поза реальним комп'ютером. У важкому реальному часі, згідно з "правильною відповіддю занадто пізно невірно", час порівняння може бути різним, якщо ви порівнюєте біг на двох одиницях виконання з бігом, змішаним на одній одиниці.
ghellquist

Іноді ми робимо. Однак я сумніваюся, що це такий випадок. Наприклад, питання не згадує вимог щодо планування в режимі реального часу.
Дискретна ящірка

3
"Паралельність"! = "Паралелізм". Можна сказати, що декілька потоків, що працюють на машині з одним процесором, працюють одночасно, хоча паралельна обробка не відбувається.
Соломон повільно

Питання щодо паралельності проти паралелей. Я зміню текст.
ghellquist
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.