На що конкретно йдеться про виражальну силу?


34

Виразна сила визначається Вікіпедією як:

.. широта ідей, які можуть бути представлені та передані цією мовою.

Чи "ідеї" стосуються речей (операцій, структур, алгоритмів тощо), які ми можемо передавати машині ? Або йдеться про «людські» поняття, які можна захопити та донести мовою до інших людей?

Як оцінюється і вимірюється виразна сила?

Наприклад, якщо ми взяли таку мову, як JavaScript, і наклали дивне обмеження на імена змінних, наприклад, змінна повинна бути 8-значним числом, перед яким підкреслюється відповідність/^_[0-9]{8}$/ , чи втратимо ми виразну силу?

Або це було б лише абсурдно і дратівливо?


Для уточнення:

Чи виражальна сила вимірюється загальними ідеями, притаманними мові:

  • цілі числа і рядки
  • петлі
  • умовні

Або кількість конкретних , унікальних ідей, які може представляти мова:

  • цілі числа 1, 2 ... 2 ^ 32
  • рядки, що містять "що говорить лисиця?" і "а-а-а-а-а-а-а"
  • для кожної жаби в моїй колекції жаб
  • якщо жаба є зелений або що - то , то що - то зробити

3
Слід зазначити, що обмеження програми максимум 100 мільйонами змінних у заданій області накладає деякий ліміт на виразність. Наприклад, це може унеможливити реалізацію Firefox. ;-)
R ..

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

Відповіді:


39

Орієнтирний документ про виразність - " Про виразну силу мов програмування " Маттіаса Феллейсена (1991) . Він містить математично суворе визначення мовної виразності.

Інтуїтивно зрозуміло, що якщо кожна програма, яка може бути написана мовою A, також може бути написана мовою B лише з локальними перетвореннями, але є деякі програми, написані мовою B, які не можуть бути написані мовою A без зміни їх глобальної структури (тобто не просто чисто локальні перетворення), то мова Б є більш виразним , ніж мова А .

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


Отже, (ще ​​не подивившись на папір) виразність полягає в тому, що ви можете висловити машині на відміну від читачів джерела? Це міра того, що ви можете доручити обладнання зробити? Чи не міра того, скільки «людських» ідей ви можете зберегти чи спілкуватись у коді? ... Можливо, мені потрібно задати ще одне запитання; але, якщо це так, то чим він відрізняється від «функціональності», про який ми також говоримо?
svidgen

Можливо, мій приклад в ОП поганий. Розгляньте мови A і B, обидва з масивами; але, мова А також має структури. На будь-якій мові я можу представити серію Points, використовуючи масив 2D-масивів. Але, A має перевагу в тому, щоб дозволити мені висловити Pointконцепцію, більш зрозумілу для людини. Є більш виразним?
svidgen

@svidgen Оскільки всі мови повного Тьюрінга є обчислювально еквівалентними, набір можливих програм, які можна записати, теоретично однаковий для всіх. Згідно з вищенаведеним визначенням, мова B є більш виразною, ніж A, якщо програму, написану на B, потрібно реорганізувати, щоб вона могла відповідати A. (Не тільки зміна синтаксису за рядком, але і введення нових класів, циклів тощо. Подумайте про перезапис Python програма в Java 7 , яка використовує лямбда, map, filter, перший клас типів / методи / функції, може бути , деякі eval, НЕ кажучи вже про метаклассом магії або динамічно створювані типів і т.д.
marczellm

@marczellm, отже, "ідеї", на які посилається виразність, - це самі мовні конструкції? Наприклад, умовна - це ідея? Петля - ідея? Рядок? Число? І т. Д.?
svidgen

1
@ Jörg Чи можете ви навести приклад у своїй відповіді? Це миле визначення, але насправді не дуже багато, щоб відповісти на питання.
svidgen

10

Виразна сила визначається Вікіпедією як:

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

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

Чи "ідеї" стосуються речей (операцій, структур, алгоритмів тощо), які ми можемо передавати машині? Або йдеться про «людські» поняття, які можна захопити та донести мовою до інших людей?

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

Наприклад, (я буду використовувати javas у всьому світі для моїх прикладів, оскільки ваше запитання вказує на те, що його є однією з мов, які ви знаєте) врахуйте заяву javascript:

var x = 3 + 4;

Це означає, що обчислюється сума значень 3 і 4 і значення, пов'язане з міткою, xу межах заданої області простору імен.

Якби ми знищили всі комп'ютери у світі і написали цей код на аркуші паперу, залишилося б, що в JavaScript він все ще мав таке саме значення; ми б не змогли запустити такий код ні на чому, але абстрактне визначення мови - це все-таки те, про що ми могли б говорити.

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

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

Термін експресивна сила може використовуватися з діапазоном значень. Це може означати міру ідей, виражених цією мовою:

  • незалежно від легкості (теоретична виразність)

  • стисло і легко (практична виразність)

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

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

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

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

Наприклад, якщо ми взяли таку мову, як JavaScript, і наклали дивне обмеження на імена змінних, наприклад, змінна повинна бути 8-значним числом, перед яким підкреслюється відповідність /^_[0-9]{8}$/, чи втратимо ми виразну силу?

За формальним визначенням ми не втратили експресивної сили: нас обмежено 100 000 000 змінних, але якщо нам це дійсно потрібно, ми могли б обійти це, створивши об'єкти, щоб містити більше змінних у новоствореному просторі імен. Оскільки будь-яка програма, написана на Javascript сьогодні, може бути переписана в цій новій формі, тому вони однаково виразні.

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

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

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

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

Набагато більш неофіційне визначення знову - зміна від першого використання JavaScript у браузерах (можливість змінити значення входів форми, document.writeтоді як сторінка спочатку розбирається і переміщується на нове місце або повертається назад або вперед в історію, але досить набагато нічого іншого), що сьогодні (здатне змінити практично все на сторінці, в тому числі на основі даних з викликів сервера) абсолютно величезне, хоча більшість це стосується не JavaScript, а об'єктних моделей та API доступна, а не мова (наприклад, vbscript в IE виграв однаково з цих змін).

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

За формальним визначенням він насправді взагалі не став більш виразним.


2
"комп’ютери потребують інформатики, але інформатики не потрібні комп'ютери" Мені це подобається
chbaker0

Що стосується обмеження іменування змінної, чи здатність посилатися на зовнішні ідеї (назви рідної мови для речей) не пов'язана зі здатністю мови представляти ідеї? ... Можливо, більше до кореня питання: Чи ідеї, про які ми говоримо, виражають лише загальні мовні конструкції? Наприклад, додавання, віднімання, заперечення, масиви, класи тощо? На відміну від конкретних ідей, які ми можемо висловити мовою? Наприклад, масив, який називається fishiesтипуFish .
svidgen

Ви можете побачити мою редакцію для отримання додаткових роз'яснень. ... Це звучить так, як ви говорите, що це обоє (маючи на увазі мою редакцію); але перший список "формальний", а другий - "неофіційний". Якщо це так, чи існує норма того, як воно некваліфіковано використовується в розмові? Або ... ти просто схильний просити роз'яснення?
svidgen

4

Я не думаю, що правила перейменування змінних дійсно фіксують те, що розуміється під "виразністю". Я думаю, що "виразність" стосується більш фундаментальних речей. Розглянемо, наприклад, C # з Linq проти C # перед Linq, наприклад. Після додавання Linq з'явилася можливість записувати подібні SQL запити безпосередньо в C #. Це набагато більш елегантно, ніж попередні альтернативи, наприклад, введення SQL у рядкові літерали та передача його на сервер або ітерація над колекцією за допомогою "для".

Ще одним хорошим прикладом можуть бути мови з прототипом успадкування. У цих мовах можна просто додати нові методи до екземпляра або навіть класу (за будь-якою назвою, "клас" може перейти на даній мові ...) під час виконання. Насправді це не можна зробити на C ++ або C #. Їм не вистачає такої ступеня виразності порівняно з мовами-прототипами. (C # має концепцію методів розширення, і, безумовно, можна сказати, що вони додають виразності.)


0

Як посилається на статтю Вікіпедії, виразна сила стосується набору програм, які можуть бути виражені мовою. Все, що ви вважаєте "мовою програмування" (JavaScript, LISP, C #, Perl та ін.), По суті є Turing завершеним, це означає, що вони можуть виражати все, що говориться як "обчислювальне".

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

Версія SQL із загальними табличними виразами є більш виразною, ніж версія, оскільки CTE дозволяють представляти рекурсивні запити, які в іншому випадку неможливо би виразити в SQL.


0

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

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

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

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

  • Давайте визначимо мову A усі формули, що містять ціле додавання.

  • Давайте визначимо мову B як мову всіх формул, що включають ціле множення.

В обох випадках ми забороняємо використовувати елемент ідентичності. Таким чином, мова А містить слова "1 + 1", "1 + 2", "1 + 3", "2 + 3" тощо. Мова B містить слова "2 * 2", "2 * 3", "2 * 4", "3 * 4" тощо. Ми також присвоюємо звичайні інтерпретації "*" та "+" (ціле додавання та ціле множення) відповідним символам. Отже, інтерпретація "1 + 1" дорівнює 2, а інтерпретація "2 + 2" - 4.

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


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


-1

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

Змінні обмеження на іменування не знижують виразність (якщо тільки так мало імен, що вже не можна виразити всі алгоритми і не можна підробити змінні з чимось на зразок масивів + індексів).

Простий приклад відсутності виражальної сили такий: Ви повинні do_homeworkі bring_down_trash. Це легко записати в коді:

do_homework();
bring_down_trash();

Це рішення виглядає досить просто, але насправді do_homeworkі bring_down_trashє не упорядкованим, можна також написати:

bring_down_trash();
do_homework();

Що настільки ж неточно, оскільки не говорить про те, що ми не мали наміру виконувати наказ. Ми також не хочемо використовувати нитки. Ми хочемо сказати щось подібне:

compiler_or_interpreter_pick_one(
    {
        do_homework();
        bring_down_trash();
    },
    {
        bring_down_trash();
        do_homework();
    }
);

Наскільки я знаю, це дуже складно неможливо висловити жодною мовою програмування.

Приклад, який мене не доводить до помилок, - це те, що в Java неможливо мати масив об’єктів. Ви можете зробити масив покажчиків на об’єкти, але це не однакове розташування пам'яті (ефективність розмов).

Приклад з іншої відповіді : C ++ не підтримує додавання методів до класу чи екземпляра . Це правда, однак це не обмежує виразність C ++.

struct Extensible{
    std::vector<std::function<void(Extensible *)>> instanceExtensions;
    static std::vector<std::function<void(Extensible *)>> classExtensions;
};

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

* Деякі мови мають відсутність виразності як особливості. Зазвичай вони унеможливлюють запис нескінченних циклів. Це може зробити проблему зупинки вирішуваною та дозволити автоматичне підтвердження правильності.


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

1
@Telastyn Чому це було б абсурдом? Звичайно, просто записування сировини на диск не є експресивним, але мова, яка може це зробити, є більш виразною, ніж та, яка не може, а всі інші рівні.
nwp

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

@Telastyn Чому це була б найвиразніша мова? Він не може виражати дані читання або обчислювати що-небудь або відображати графіку або нитки. Мова, яка може записувати лише біти в пам'ять і диск, має настільки мало виразності, що я сумніваюся, що вона взагалі має користь.
nwp

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