Чи дійсно можливо мати "корисну" мову програмування, яка не є Тюрінгом повною?


37

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

Я повинен уточнити, що мова йде саме про мови програмування в традиційному розумінні, а не про мови розмітки чи запитів.


3
@PhonicUK SQL спочатку не закінчувався
Ryathal

4
@Ryathal SQL - це не мова програмування, це мова запитів.
Янніс

2
@PhonicUK ваше запитання в коментарі насправді варто, змініть розміщене запитання на таке, або воно закриється як не конструктивне. Насправді є корисні непостійні цілі мови, і мені було б цікаво почути їх деталі.
Джиммі Хоффа

5
Regex не закінчується, але він широко використовується
храповик, урожай

3
@DavidHammen Фактичні реалізації обмежені, так, через обмеження нашої фізичної всесвіту (може створювати лише обмежену пам’ять, може працювати лише машина протягом обмеженого часу, перш ніж вона не працює). Але це не означає, що мови обмежені. IOW специфікація цілковитої мови не вимагає впровадження таких обмежень для програми, тоді як мова, яка не є TC, вимагає, наприклад, підтвердження припинення.

Відповіді:


48

Coq , Agda , HOL та ACL2 - дуже корисні та надзвичайно потужні мови, хоча вони не є повною для Тьюрінга.

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


2
Для тих, хто не знайомий з цими мовами, чи можете ви детальніше розповісти про те, чого їм не вистачає, що робить їх не Тьюрінгом завершеними, а також деякі приклади речей, побудованих із цими мовами?
PhonicUK

8
@PhonicUK: компілятор Сі не є реалізація C . Це інструмент, який перетворює код з однієї мови (С) в інший (зазвичай машинний код). Це не означає, що сам компілятор C еквівалентний будь-якій випадковій програмі C.
Йоахім Зауер

9
@PhonicUK, ви не можете реалізувати інтерпретатора для мови, що повністю закінчується Тьюрінгом, у мові, що не закінчується Тьюрінгом. Але ви можете, звичайно, реалізувати компілятор (оскільки процесор, повний Turing, буде робити фактичну оцінку).
SK-логіка

11
@ SK-логіка: "Звичайно?" Це можливо лише для C, оскільки це досить проста мова. Для C ++ це неможливо, оскільки компілятор повинен інтерпретувати код шаблону (який є Turing-завершеним під час компіляції).
MSalters

11
@MSalters Так, якщо компіляція мови є завершеною, компілятор для неї повинен бути написаний повною мовою. Що також явно очевидно (не кажучи про тавтологічний). Однак зауважте, що стандарт C ++ дозволяє обмежувати вхідні програми, такі як максимальна глибина оцінювання для шаблонів шаблонів (а існуючі реалізації беруть на себе цю свободу). Якщо я не помиляюся, це означає, що можливий повний компілятор C ++ (звичайно, забороняючи непов'язані проблеми).

12

Я думаю, що термін Йегге "міні-мова" стосується того, що часто корисно використовувати мову для конкретних проблем, коли для виконання цього завдання не потрібна цілісність, і це стосується того, як -використання цілих мов може бути корисним. https://sites.google.com/site/steveyegge2/language-grubbing

Вікіпедія відповідає на це дуже добре, прямо відповідно до того, що сказала моя кишка. Спершу я думав про чисту математику, потім згадав про регулярне вираження, а у Вікіпедії перелічено епіграму, яка, на мою думку, опиниться у «чистому математиці».

http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages

Мови, які не є Тюрінгом

Існує багато обчислювальних мов, які не закінчують Тьюрінга. Одним із таких прикладів є набір регулярних мов, найчастіше регулярних виразів, які генеруються за допомогою кінцевих автоматів. Більш потужним, але все ще не закінченим Тьюрінгом розширенням кінцевих автоматів є категорія автоматичних розгортань та безконтекстних граматик, які зазвичай використовуються для генерації дерев розбору на початковій стадії складання програми. Подальші приклади включають деякі ранні версії піксельних шейдерних мов, вбудованих у розширення Direct3D та OpenGL, або ряд математичних формул в електронній таблиці без циклів. припиняють, такі як Благодійність та Епіграма. Благодійність використовує систему типів та керує конструкціями на основі теорії категорій,

Мови даних

Поняття повноти Тьюрінга не поширюється на такі мови, як XML, JSON, YAML та S-вирази, оскільки вони зазвичай використовуються для представлення структурованих даних, а не для опису обчислень. Їх іноді називають мовами розмітки, а точніше - "мовами опису даних".

Він також згадує, що представлення структури даних не є мовами, але я думаю, що XSLT слід вважати представленням обчислень, можливо, XPath не базується на тому, що Янніс сказав вище про те, що SQL є мовою запитів, а не мовою обчислень. Можливо, T-SQL або PL / SQL вважаються мовами обчислень, хоча ви можете зробити велику кількість обчислень, використовуючи їх агрегати, де узагальнена форма SQL, можливо, не визначає агрегати.


8

Я розумію, SQL досить популярний серед типів бізнесу


3
SQL - мова запитів, а не мова програмування.
PhonicUK

4
@PhonicUK: а яка саме різниця між мовою запиту та мовою програмування?
Йоахім Зауер

8
@PhonicUK - Tex - це мова розмітки тексту, і вона закінчується Тюрінгом
Мартін Беккет

3
сучасні реалізації sql, наскільки я знаю, закінчуються.
shabunc

6
@shabunc IIRC лише із збереженими процедурами. Аргументація стає дещо круговою, якщо вона не є Тюрінг завершеною, то це не мова програмування - тому всі мови "програмування" - TC
Мартін Бекетт

5

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

  • Білий простір, як виявилося, є Тьюрінгом повним, але, очевидно, не підходить для будь-якої проблемної області поза програмою розваг програміста.
  • Шаблони C ++ були доведені Тюрінгом завершеними, але ви насправді ніколи не писали б цілі програми з ними.

І навпаки, DSL підходить для проблемної області, для якої він був розроблений (якщо припустити, що він насправді пристойно розроблений), навіть без Тюрінга повноти:

  • HTML * забезпечує стислий спосіб описати дерево DOM. Хоча JavaScript є Тьюрінгом повним і його можна використовувати так само, він набагато більш галасливий і незрозумілий
  • XPath та інші мови запитів, PCRE без вбудованого коду і такі потужні інструменти для єдиного завдання, для якого вони були розроблені

* IIRC було доведено, що HTML з анімацією CSS є Тьюрінг завершеним, використовуючи їх для реалізації гри «Життя життя Конвей» на масиві прапорців. Але корисність HTML зберігається навіть у браузерах, які не підтримують анімацію CSS.


2
Чи є у вас посилання на життя Conway, реалізоване в CSS?
RBerteig

Я не знаю про реалізацію CGOL в CSS, але я знаю, що правило 110 було реалізовано. Здається, не можна знайти його, здається, його перемістили.
Крістіан Манн


-1 Дуже цікаво, але не стосується поставленого питання
mattnz

2
@mattnz: Неправильно. Я наводжу конкретні приклади корисних мов, які не закінчуються Тюрінгом, і я вважаю, що це відповідна відповідь на запитання "Чи дійсно можливо мати" корисну "мову програмування, яка не є повною Тюрінгом?", Не на відміну від іншої відповіді тут
back2dos

3

Насправді існують мови програмування, де можна писати лише "ефективні" програми. Ефективна в цьому сенсі означає, що кожна програма, написана такою мовою, являє собою мову P. Bellantoni, Niggl та Schwichtenberg описують тут таку мову .


1

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

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

  1. забезпечити нерозумно велике динамічне число (за замовчуванням 2 ^ 64 або близько того), достатньо велике для вирішення більшості реалістичних задач за допомогою експоненціального процесу розширення ( бурмотіння метушиться життя всесвіту бурмотить ).

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

Не сперечатися, що Замовлення обов'язково саме по собі "корисне" або що будь-який двигун, реалізований CPP, був би, але це цікавий доказ концепції. Він також нібито динамічно набирається , що незвично для цієї області.


Підсумок для бурчання в середині лекції.
jpaugh

-1

Так, дійсно можна використовувати корисну мову, яка не є Тюрінгом повною. Дивіться тут: http://tkatchev.bitbucket.org/tab/examples.html

Ще один приклад корисної неповної мови Тюрінга - SQL. (І ще одна - електронні таблиці типу Gnumeric або Excel, хоча вони насправді не є мовами програмування.)

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

Визначення повноти, простіше кажучи, означає здатність до рекурсії. Рекурсія означає наявність в пам'яті потенційно необмежених структур. Оскільки в реальному світі пам'ять не є нескінченною, повнота Тьюрінга вимагає управління пам'яттю та / або збирання сміття.

Заборона рекурсії - це чудовий спосіб уникнути справді дуже важкої проблеми управління ресурсами.

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


-1

Один цікавий "мова програмування суб-Тьюрінга" до цього часу не згадувався, тому я додам його.

Це називається "Крема" . Він описує себе як:

Crema - це LLVM-фронт-енд, який має на меті спеціально виконати в повному просторі під-Turing. Конструйований таким чином, щоб він був простим у навчанні та практичним для більшості завдань програмування, Crema може обмежити обчислювальну складність програми до мінімуму, необхідного для підвищення безпеки.

Це досить мінімалістичний і досить низький рівень.

Це повинно виглядати звично розробникам C.

Спочатку він фінансувався Агентством прогресивних науково-дослідних проектів в галузі оборони (DARPA), але на даний момент він виглядає досить недосяжним. Але, можливо, комусь все-таки цікаво.

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