Чи всі мови цілей взаємозамінні


26

Зауважте, хоча я знаю, як програмувати, я досить новачок в теорії CS.

Відповідно до цієї відповіді

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

І будь-яку програму, написану на будь-якій мові Тьюрінга, можна переписати іншою .

Добре. Це має сенс. Я можу перекласти (компілювати) C в асамблею (і це роблю щодня!), А також можу перекласти збірку в C (виртуальну машину можна написати на C). І те ж саме стосується будь-якої іншої мови - ви можете зібрати будь-яку мову в Асамблею, а потім запустити її в VM, написаному іншою мовою.

Але чи можна будь-яку програму, написану цільною мовою Тюрінга, переписати іншою?

Що робити, якщо моя асамблея має код LIGHTBUTTON? Я фізично не можу наслідувати цю мову в системі (мові) без лампочки.

Добре. Тож ви скажете, що оскільки ми маємо справу з комп'ютерною теорією , ми не обговорюємо обмеження фізичних пристроїв.

А як щодо пристрою, який не має множення? поділ? Наскільки мені відомо (хоча це більше питання для математики.SE), не можна наслідувати множення (і, безумовно, не ділення) з додаванням і відніманням [1].

То як би "цільовий повний мова" (який може додавати, віднімати та стрибати) імітувати іншу мову, яка може додавати, віднімати, множувати та стрибати?

EDIT

[1]. Про довільні дійсні числа.


33
Реальні числа належать до сфери обчислень Гіпер-Тюрінга. Машина Тьюрінга не може мати справу з реальними числами, ерго, вони не мають відношення до повноти Тьюрінга.
Йорг W Міттаг

3
Пов’язано: набір інструкцій на мові збірки з однією інструкцією ще досить потужний для створення універсального комп'ютера: en.wikipedia.org/wiki/One_instruction_set_computer . Наприклад, "Віднімання і розгалуження, якщо менше або дорівнює нулю" з операндами пам'яті. Він буде повільним порівняно з сучасним x86, але коефіцієнт продуктивності є обмеженим для будь-якої програми.
Пітер Кордес

1
Жодна фізична (фактично існуюча) машина не є і ніколи не може бути Тюрінг завершеною, тому що повнота Тьюрінга вимагає нескінченного зберігання, а Всесвіт не є нескінченним. З цього випливає, що позитивна відповідь на те, чи є дві абстрактні машини рівнозначними, не допомагає вам відповісти на питання, чи є два фізичні наближення цих машин рівнозначними.
Бен

2
@PeterCordes: Я припускаю, що коли ви говорите, що коефіцієнт є скінченним, ви просто маєте на увазі, що будь-яке завдання, яке завершується в кінцевий час на будь-якому, зробить це в кінцевий час для обох - не те, що для будь-якої конкретної машини (не враховуючи введення) було б будь-яке обмежене обмеження на те, наскільки високим може бути коефіцієнт для деяких входів. Я думаю, що можна було б побудувати машини, повністю виконані Тьюрінгом, для яких можна було б вибрати вхідні дані, які зробили б коефіцієнт довільно високим - можливо, навіть не були обчислювані функції розміру вводу.
supercat

6
Я не знаю, звідки у вас ідея, що "не можна наслідувати множення (і, безумовно, не ділення) з додаванням і відніманням". Це вчили ще в початковій школі, коли ми дізнаємось, як розмножуватись
phuclv

Відповіді:


55

Тюрінг-повнота говорить лише одне і одне: модель обчислень є Тюрінг-повною, якщо будь-які обчислення, які можуть бути змодельовані машиною Тьюрінга, також можуть бути змодельовані цією моделлю.

Отже, які обчислення може моделювати машина Тюрінга? Ну, і в першу чергу, Алана Тьюрінга та всіх його колег цікавились лише функції натуральних чисел. Отже, машина Тьюрінга (і λ-обчислення, числення комбінатора СК, μ-рекурсивні функції, ...) говорять лише про обчислюваність функцій за натуральними числами. Якщо ви не говорите про функцію на натуральних числах, то поняття Тюрінг-повноти навіть не має сенсу, воно просто не застосовується.

Однак зауважте, що ми можемо кодувати безліч цікавих речей як натуральні числа. Ми можемо кодувати рядки як натуральні числа, ми можемо кодувати графіки як натуральні числа, ми можемо кодувати булеви як натуральні числа. Ми можемо кодувати машини Тюрінга як натуральні числа, що дозволяє нам створювати машини Тьюрінга, які говорять про машини Тюрінга!

І, звичайно, не всі функції на натуральних числах обчислюються. Машина Тьюрінга може обчислювати лише деякі функції на натуральних числах, λ-обчислення може обчислювати лише деякі функції на натуральних числах, розрахунок комбінатора SK може обчислювати лише деякі функції на натуральних числах…. Дивно (або ні) виявляється, що кожна модель обчислення (реально реалізована у нашому фізичному Всесвіті) може обчислити однакові функції на натуральних числах (принаймні для всіх моделей, які ми знайшли до цього часу). [Примітка: очевидно, є слабкіші моделі обчислення, але ми ще не знайшли сильнішої, за винятком тих, які, очевидно, несумісні з нашим фізичним всесвітом, наприклад, з моделями, що використовують реальні числа чи подорож у часі.]

Цей факт, що після тривалого пошуку багатьох моделей, ми щоразу виявляємо, що вони можуть обчислити абсолютно однакові функції, є основою для тези тези Церкви-Тьюрінга, яка говорить (приблизно), що всі моделі обчислень однаково потужні, і всі вони фіксують "ідеальне" уявлення про те, що означає бути "обчислюваним". (Існує також другий, більш філософський аспект CTT, а саме те, що людина, керуючись алгоритмом, може також обчислювати абсолютно ті самі функції, які TM може обчислити, і не більше.)

Однак ніщо з цього нічого не говорить

  • наскільки ефективні різні моделі
  • як зручно ними користуватися
  • що ще вони можуть зробити, окрім обчислити функції на натуральних числах

І що саме там , де різниця між різними моделями обчислень (і мов програмування) вступає в гру.

О(сizеаrrау)О(сizеаrrау2)сizеаrrаусizеаrrау

Як приклад для різної зручності, ви можете просто порівняти код, написаний дуже високим рівнем мови, код, написаний у зборі, та опис TM для вирішення тієї ж проблеми.

І ваш перемикач світла - це приклад третьої різниці: речі, які можуть зробити деякі моделі, не функціонують на натуральних числах і, таким чином, не мають нічого спільного з повнотою Тьюрінга.

Щоб відповісти на ваші конкретні запитання:

Але чи можна будь-яку програму, написану цільною мовою Тюрінга, переписати іншою?

Ні. Тільки якщо програма обчислює функцію обчислення Тюрінга на натуральних числах. І навіть тоді може знадобитися складне кодування. Наприклад, у λ-обчислення немає навіть натуральних чисел, їх потрібно кодувати за допомогою функцій (адже функції - це єдине, що має λ-обчислення).

Таке кодування вводу та виходу може бути дуже складним, як і алгоритм вираження. Отже, хоча правда, що будь-яку програму можна переписати, переписана програма може бути набагато складнішою, значно більшою, використовувати набагато більше пам’яті та значно повільніше.

Що робити, якщо моя асамблея має код LIGHTBUTTON? Я фізично не можу наслідувати цю мову в системі (мові) без лампочки.

Лампочка не є функцією обчислення Тюрінга на натуральних числах. Дійсно, лампочка не є ні функцією, ні обчисленням. Увімкнення та вимкнення лампочки є побічним ефектом вводу / виводу. Машини Тьюрінга не моделюють побічних ефектів вводу-виводу, і Turing-завершеність для них не стосується.

Про довільні дійсні числа.

Тюрінг-повнота має справу лише з обчислюваними функціями на натуральних числах, вона не стосується справжніх чисел.

Тюрінг-повнота просто не дуже цікава, якщо мова йде про такі питання, як ваше, з двох причин:

  1. Це не дуже велике перешкода. Все , що вам потрібно , це IF, GOTO, WHILEі одне ціле число змінної (передбачається , що змінна може містити скільки завгодно великі цілі числа). Або рекурсія. Багато, багато і багато чого є Тюрінг-завершений. Карткова гра Magic: The Gathering завершена. CSS3 є Тьюрінгом. Файл sendmailконфігурації завершено Тьюрінгом. Intel x86 MMU завершений Тьюрінгом. MOVІнструкція Intel x86 є Turing-завершеною. Анімації PowerPoint завершені Тьюрінгом. Excel (без сценаріїв, лише за допомогою формул) є повним Тьюрінгом. Протокол маршрутизації BGP завершений Тьюрінгом. sedє Тьюрінгом. mod_rewriteПравила Apache завершені Тьюрінгом. Google для " (випадково АБО не дивно) завершення"щоб знайти деякі інші цікаві приклади. Якщо майже все є Тьюрінг-завершеним, то бути Тюрінг-завершенням перестає бути цікавою властивістю.
  2. Насправді не потрібно бути корисним. Багато корисних речей не є Тьюрінгом. CSS до версії 3 НЕ Тьюринг-повній (і той факт , що CSS3 є насправді не використовується ким - небудь). SQL до 1999 року не був повним Тьюрінгом, але він був надзвичайно корисним ще тоді. Мова програмування на C без додаткових бібліотек , схоже, не є повною для Тьюрінга . Залежно набрані мови, більш-менш за визначенням, не є повним Тюрінгом, але ви можете писати в них операційні системи, веб-сервери та ігри.

Едвін Брейді, автор "Ідріса", використовує термін "повний тетріс", щоб поговорити про деякі з цих аспектів. Бути повноцінним тетрісом не є чітко визначеним (крім очевидного "можна використовувати для впровадження тетрісу"), але воно включає в себе такі речі, як достатньо високий рівень та виразність, що ви можете писати гру, не божевільна, вміючи взаємодіяти із зовнішнім світом (вхід та вихід), вміючи виражати побічні ефекти, вміти писати цикл подій, вміти виражати реактивне, асинхронне та одночасне програмування, вміти взаємодіяти з операційною системою, вміти взаємодіяти з іноземними бібліотеками (іншими словами: вміти телефонувати та називатися за допомогою коду С) тощо. Це набагато цікавіші особливості мови програмування загального призначення, ніж це повнота Тьюрінга.


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


7
Мені дуже подобається ця відповідь, але я думаю, що варто зазначити, що ми можемо представляти всілякі цікаві речі за натуральними числами. Наприклад, ми можемо представляти рядки натуральними числами, ми можемо представляти графіки натуральними числами, ми можемо представляти весь стан пам'яті комп'ютера натуральним числом. Реальні числа можуть бути кодовані як функції на натуральних числах, а (багато) функції на натуральних числах можуть бути закодовані натуральними числами. Тому обмеження функцій від натуральних чисел до натуральних чисел не є великим обмеженням - якщо тільки не темно і ви не хочете, щоб ваш комп'ютер увімкнув світло.
Теодор Норвелл

3
Приємна відповідь, але це: "бути Тьюрінгом-повним перестає бути цікавою властивістю" - це просто неправильно. Якщо щось є Тьюрінгом повним, то його проблема зупинки є Тюрінг-повним шляхом обчислювального скорочення до проблеми зупинки для машин Тьюрінга. Наприклад, карткова гра Magic: The Gathering завершена. Це означає, що його правила не можна визначити , тобто в загальному випадку неможливо обчислити висновок про те, що буде наступним ігровим станом, що є дуже цікавою властивістю. Більш серйозно, ми використовуємо Тьюрінг-повноту та скорочення, щоб довести проблеми, які не можна визначити.
хитрість

Тьюрінг та його колеги цікавились функціями на натуральних числах, але машини Тьюрінга насправді не мають числа, вони мають рядки символів. Очевидно, що ви можете тривіально інтерпретувати кінцеві смуги символів у відомому кінцевому алфавіті як натуральні числа, але ТМ безпосередньо не роблять "численні" речі своїм введенням, вони просто маніпулюють "цифрами". Насправді потрібно трохи логіки, щоб перейти від стандартних описів ТМ до "функцій на натуральних числах"; під час роботи з TM ви кодуєте натуральні числа як рядки, а не рядки як числа.
Бен

Це, очевидно, чудова відповідь, але я боюся, що це виходить за рамки розуміння ОП. ОП вже плутається щодо здійснення множення на (кінцеві підмножини) реальних чисел. Враховуючи це, ваша відповідь, мабуть, означає, що мови програмування, повні Тьюрінга, насправді не підлягають обміну для чистого обчислення, коли насправді вони є (адже все, що роблять сучасні процесори - не лише деякі речі), можна закодувати як природне числа).
Конрад Рудольф

9
@TheodoreNorvell Що стосується кодування дійсних чисел натуральними числами. Насправді майже всі реальні числа не можуть бути закодовані натуральними числами. Набір реальних чисел, які можуть бути закодовані натуральними числами, в силу того, що кодуються натуральними числами, є, щонайменше, нескінченним. А оскільки це лише незліченно безліч, набір має міру нуля. Трохи нечесно сказати, що ми можемо представляти реальні числа взагалі натуральним числом, оскільки ми можемо представляти лише нескінченно малий їх частину, а якщо бути точнішим: 0%.
Shufflepants

9

Звичайно, ви можете реалізувати множення з додаванням і відніманням:

/* Assume b is positive for simplicity */
int multiply(int a, int b) {
  int res = 0;
  while (b > 0) { res += a; b -= 1; }
  return res;
}

Той факт, що ви, ймовірно, цього не зробите, не робить його менш можливим.

Відділення навряд чи складніше:

/* Assume a and b are positive for simplicity */
int divide(int a, int b) {
  int res = 0;
  while (a >= b) { res += 1; a -= b; }
  return res;
}

І як ви думаєте, як насправді множення та ділення виконується схемою процесора? Підказка: це не величезна таблиця пошуку. Він є більш ефективним, ніж вищезазначене, оскільки також використовується бітовий зсув, але він принципово реалізується з точки зору додавання та віднімання.


4
2prеciсiон

7
@touring: Ви знаєте, арифметика з плаваючою комою була доступна ще до того, як були співпроцесори з плаваючою комою.
rici

6

Жодна фізична (фактично існуюча) машина не є і ніколи не може бути Тюрінг завершеною, тому що повнота Тьюрінга вимагає нескінченного зберігання, а Всесвіт не є нескінченним.

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

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


Але питання про мови. Він згадує конкретні машини, але лише тому, що він не усвідомлює, що практично жодна реальна машина не працює на реальній кількості.
Shufflepants

3

нм=н+н(м-1)м/н=1+(м-н)/н

Власне, операції "додати 1", "відняти 1" та "умовний стрибок, якщо вказаний реєстр дорівнює нулю" є достатніми для складання обчислювальної моделі Тьюрінга-повної (див. 2-лічильну машину як посилання на дуже мінімальна обчислювальна модель Тьюрінга).

22н=н+н2м×2н=2м×нм×(2н+1)=м+2м×н


3

tl; dr - машини Тюрінга - лише основний логічний опис для загальної роботи логічної системи. Вони можуть робити більшість речей, які ми можемо описати, включаючи виклик спеціалізованих опкодів та побудовані математичні операції.


Що робити, якщо моя асамблея має код LIGHTBUTTON? Я фізично не можу наслідувати цю мову в системі (мові) без лампочки.

У моделі Тьюрінга такі символи, як LIGHTBUTTONопкод, є лише рядками в будь-якому алфавіті, який використовує комп'ютер Тьюрінга.

Отже, машина Тьюрінга відповідала б за створення рядка "LIGHTBUTTON"або якогось цілого значення, що відповідає цьому коду; чи діє на це зовнішнє підприємство, чи не це комп’ютер Тьюрінга.

Програми C мають однакове обмеження. Це означає, що програма C може зателефонувати тільки до коду LIGHTBUTTON, але незалежно від того, чи дійсно ЦП виконує операцію, пов'язану з цим кодом, залежить від процесора.


А як щодо пристрою, який не має множення? поділ? Наскільки мені відомо (хоча це більше питання для математики.SE), не можна наслідувати множення (і, безумовно, не ділення) з додаванням і відніманням [на довільні дійсні числа].

Так, машина Тьюрінга може робити це навіть у реальних числах, наскільки це може будь-яка логіка, описана людиною. Машина Тьюрінга може бути такою ж простою, як і стільникова автоматизація за правилом 110 .

Хитрість полягає в тому, щоб створити логічну систему з будь-якої фізики, якою є машина. Наприклад, основні процесори можуть робити множення та ділення, оскільки вони мають арифметичну логічну одиницю (ALU) . Але АЛУ - це не магія; вони просто прості логічні ворота самі по собі. І ці логічні ворота зроблені транзисторами . І ці транзистори зроблені з легованого піску .

Отже, щоб отримати повний пристрій Тьюрінга з математики, просто потрібно програмувати його таким чином.

π-π=0πππ-π=0


3

Але чи можна будь-яку програму, написану цільною мовою Тьюрінга, переписати іншою?

Якщо вхід до програми є довільно довгою послідовністю бітів, а вихід також є довільно довгою послідовністю бітів, то ТАК. Якщо припустити, що у вас є час і енергія, щоб їх переписати, і що вам не важлива ефективність, і що у вас є достатня кількість фізичної пам'яті для обох реалізацій.

Практичні міркування, що означають дві мови, що закінчуються Тьюрінгом, не є взаємозамінними:

  • вони підтримують різні види введення та виведення (наприклад, доступ до бази даних SQL)

  • вони мають різні бібліотеки типів даних (наприклад, підтримка рядків Unicode)

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

  • вони надають різні бібліотеки функцій (наприклад, XML-аналіз та серіалізація)


1

Ні. Тюрінг-повнота не має нічого спільного з програмами , мова йде про математичні функції (або алгоритми) ). Будь-який алгоритм - будь-який обчислення - ви можете робити на C, ви можете робити будь-яку іншу мову, повну Тьюрінга (це повинно бути очевидно). Але повнота Тьюрінга насправді не говорить про те, що ви можете робити введення-виведення - взагалі. Це зовсім не говорить про обладнання. Просто обчислення.

Ви можете розширити мову, повну Тюрінга, будь-якою апаратною операцією, яку ви хочете (технічно, це як fputcі fgetcпрацювати на C). Якщо ви візьмете дві мови, що повністю завершуються Тьюрінгом, і розширити їх однаковими для конкретного обладнання апаратними засобами, вони залишаться взаємозамінними. Тож ваша мова складання з LIGHTBULBексплуатацією є більш потужною, ніж Тюрінг; можна сказати, що закінчився ТьюрінгLIGHTBULB . Щоб будь-яка інша мова була ідентичною їй, вона також повинна бути закінченою Тьюрінгом LIGHTBULB; найпростіший спосіб зробити це - додати до нього LIGHTBULBпримітив / інструкцію / функцію / тощо.

Ось чому реалізація C, як правило, або підтримує вбудований асемблер, або документує спосіб виклику функцій, написаних у асемблері, і чому реалізація інших мов, як правило, забезпечує спосіб виклику функцій, написаних на C.

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