Я хотів би звернутися до думки, яку висловили багато плакатів, що така мова була б "марною". Можливо, людині було б марно писати вручну, маючи намір вирішити якусь конкретну задачу. Однак, не дивлячись на те, що це більшість випадків використання для мов програмування, це, звичайно, не єдиний випадок використання. Приходять на думку кілька випадків використання, коли така мова корисна, і ми можемо звернутися до цих полів для прикладів таких мов.
По-перше, алюзія Корта Аммона на генетику помітна : перетворення програми у питанні (заміщення )
на яке 5
) може розглядатися як мутація . Цей вид маніпуляцій поширений у галузі еволюційних обчислень ; зокрема, генетичні алгоритми виконують такі перетворення на струнах , тоді як генетичне програмування перетворює програми . У будь-якому випадку ми зазвичай хочемо присвоїти значення кожній можливості, оскільки це створить найбільш компактний простір пошуку.
Генетичні алгоритми покладаються на якусь функцію оцінки рядків; якщо ми використовуємо інтерпретатор мови програмування як нашу функцію оцінювання, тоді у нас є сценарій, коли мова програмування, яка присвоює значення всім можливим рядкам. У генетичному програмуванні передбачається, що наша функція оцінювання є перекладачем мови програмування, але ми можемо обирати різні уявлення для наших програм; наприклад, багато систем працюють на абстрактних синтаксичних деревах. Якщо ми обираємо рядки як своє представлення, то ми відновимо той самий сценарій, що і з генетичними алгоритмами.
Інша ситуація, коли ми можемо бажати, щоб кожна рядок була дійсною програмою, це при перерахуванні програм. Це пов'язано з біекцією, згаданою CodesInChaos, але ми можемо з кількох причин оперувати на рядках, а не на натуральних числах:
- Якщо в мові є якась структура, напр. ми можемо присвоїти значення підрядкам, це може бути втрачено при перекладі на натуральні числа. У цьому випадку ми можемо вважати за краще використовувати рядки для того, щоб міркувати про та перетворювати підрядки локально, а не представляти всю програму як число. Це аналогічно тому, як ми могли б вважати за краще використовувати побітові операції над int, а не арифметичними виразами, коли кожен біт має індивідуальне значення. Це в основному узагальнення еволюційного сценарію.
- Ми можемо захотіти генерувати програми на вимогу; наприклад, ми можемо почати виконувати програму, яка повністю не визначена, і генерувати (наприклад, випадковим чином) окремі інструкції (наприклад, символи), коли / якщо вказівник інструкції досягає їх. Це поширене в алгоритмічній теорії інформації, де програма є стрічкою машин Тьюрінга, а мета - охарактеризувати поведінку випадково згенерованих програм. Наприклад, ми можемо сформулювати Solomonoff попередньо над довільними рядками як ймовірність того, що універсальна машина Тьюрінга зі випадковою стрічкою виведе цю струну.
З точки зору прикладних мов, багато еволюційних обчислювальних систем базуються на мовах стеків, як сім'я Push . Вони, як правило, дозволяють довільні потоки жетонів (які ми могли б представляти як окремі символи). Іноді (як, наприклад, приклад BrainSlugs83 Brainfuck) існують обмеження щодо балансування дужок; Однак, ми можемо пов'язати це з саморазгранічни програмами , в тому , що рядок , як [
не може бути дійсною програмою , але вона є дійсним префіксом програми . Якщо ми уявляємо, що компілятор / інтерпретатор читає вихідний код із stdin, то він не відкине рядок типу [
, він просто чекатиме більше введення, перш ніж продовжувати.
Такі мови, як Бінарна комбінаційна логіка та Двійковий обчислення лямбда, виникли безпосередньо поза роботою над теорією алгоритмічної інформації, наприклад. від http://tromp.github.io/cl/cl.html
Ця конструкція мінімалістичного універсального комп’ютера була мотивована моїм бажанням придумати конкретне визначення складності Колмогорова, яке вивчає випадковість окремих об’єктів.
You are a bimbo.