Вимірювання потужності, відмінне від повноти Тюрінга


18

Я спочатку намагався задати це питання на StackOverflow, але це було занадто суб'єктивно :-(. Мене цікавлять методи визначення потужності мов програмування. Тюрінг повноти - це одне, але це майже повсюдно задоволено. Що було б добре - визначити наприклад, чи може хтось запропонувати не суб'єктивний метод, який би дискримінував збірку та Java?

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

Відповіді:


24

Поняття, яке ви шукаєте, називається виразністю, і Маттіас Феллейзен має математично суворе визначення:

" Про виразну силу мов програмування "

www.ccs.neu.edu/scheme/pubs/scp91-felleisen.ps.gz (версія сценарію)

Інтуїція, що стоїть за ідеєю, полягає в тому, що якщо у вас є дві еквівалентні програми на двох різних мовах - скажімо, програма A мовою X і програма B мовою Y-- і якщо ви внесете локальну зміну на A, що вимагає глобальної зміни на B , то X більш виразний, ніж Y.

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

Моя дискусія спростила деякі деталі, і ви повинні прочитати саму статтю, щоб отримати повний рахунок.

Щоб відповісти на ваше інше запитання: Ви можете сказати, що Java є більш виразною, ніж збірка, оскільки ви можете додати новий клас до своєї програми Java, а потім отримати переваги поліморфізму, якщо інші частини програми називають її методи без глобальної модифікації. Поводження з винятками - ще один приклад, коли Java є більш виразною, ніж збірка: Вам просто потрібно написати одне throwтвердження, щоб перенести контроль над стеком. На більш елементарному рівні ви також можете додати нове caseвисловлювання на початку a, switchі вам не доведеться турбуватися про перерахунок будь-яких зрушень стрибка вручну.


Велике спасибі! Це саме те, що я шукав!
Casebash

6

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

Якщо ви шукаєте щось більш суб’єктивне, я б сказав, як це весело . Програмісти, як правило, люди, які хочуть вирішити проблеми, тому мова програмування, яку цікаво використовувати програмістам, неминуче стане тією, яка вирішить більшість проблем. Цей захід враховує, що різні люди мають різні переваги щодо використання речей, тому "найкращою" мовою програмування буде та, яка найбільше приваблює найширший спектр програмістів. Однак вам може знадобитися врахувати не тільки мову програмування та API, але й середовище (IDE), що, звичайно, з чим насправді взаємодіє програміст.


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

1
@John: Просто те, що щось можна аналізувати лише статистично, не означає, що це суб'єктивно.
Девід Торнлі

@David: Це насправді не моє значення. Суть полягала в тому, що без попереднього дослідження запитувач не зміг би порівняти "силу" мов, які він дбав - залишаючи це суб'єктивним, коли його статистично не аналізуватимуть у великій групі.
Джон Фішер

1

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


2
Складність з цим полягає в тому, що знання мови полегшує того, хто її знає. Отже, цей захід стає суб’єктивним.
Джон Фішер

1

Вам потрібно краще визначити свою термінологію.

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

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

EDIT

Просто для написання цього мови мови програмування не мають властивості як "влади". Існує поняття, загальновідоме як «виразність» або «виразна сила» мови програмування. Експресивність - це частково про те, як легко писати стислі програми для вирішення конкретних проблем. Але є також значна міра того, наскільки легко читати та писати програми. Це начебто "краса". Я буду знати це, коли побачу, але не вимагайте, щоб я його визначав.

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


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

@Casebash - ти ще не сказав, що таке "влада".
Стівен C

2
Це тому, що я не знаю, і в цьому вся суть цього питання!
Casebash

Тоді в чому сенс вашої відповіді? Це мав бути коментар.
reinierpost

@reinerpost - Суть моєї відповіді полягає в тому, щоб детально пояснити, що Питання є безглуздим, і чому. В основному питання запитує: "Є щось, що називається" виражальна сила "- я не знаю, що це таке, але ви можете сказати мені, як це виміряти". І суть моєї відповіді полягає в тому, що «виражальна сила» - це неправильно визначена концепція / властивість, і ВИЗНАЧЕНО не є вимірюваною / вимірюваною. (І це однозначно відповідь, а не коментар. Можливо, ви просто не зрозуміли, що я намагаюся сказати?)
Stephen C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.