Летать

— Йоко Оно, Fly Piece, 1963 г.

Что такое язык программирования? У нас есть представление, даже ожидание, что языки программирования очень похожи на программное обеспечение — мы что-то вставляем, что-то получается, и все. Но это далеко не вся картина. Языки программирования можно было бы лучше определить, сказав:

Языки — это списки правил интерпретации комбинаций символов, которые иногда используются для написания программ. Они больше похожи на область потенциального программного обеспечения; инструменты, которые можно использовать бесконечно по-разному, но со своей логикой достижения этой цели (1)

Что это означает на практике? Итак, первый и очевидный вывод: языки программирования способны написать все, что нужно выполнить. Теоретически это означает, что мы можем написать целую модель полета птиц на Javascript, или виртуальный мир на Go, или все, о чем мы только можем мечтать. Некоторые из этих вещей сложнее, чем должны быть — попробуйте написать системы атомных электростанций на Ruby — но все это в конечном счете возможно.

Во-вторых, что более важно для наших целей, запуск кода — это производительность. Это уникальная форма производительности в том смысле, что здесь нет никакой интерпретации — код, который выполняется, мы ожидаем (и фактически должны) «выполнять» один и тот же код каждый раз, когда он выполняется. «Hello World» всегда будет «Hello World», а не «Привет, меня зовут Джим, и я хороший мальчик». Это, конечно, хорошо, в большинстве случаев.

В качестве иллюстрации того, как перформативность кода отличается от того, что мы ожидаем понимать под производительностью, я хотел бы использовать контрпример — Fluxus»произведение Йоко Оно Fly > — который состоит буквально из одного слова летать. Fly — это программа, очень похожая на hello world, за исключением одного ключевого отличия: она полностью открыта для интерпретации и интерпретации на нескольких уровнях. Тот, кто читает инструкцию и визуализирует результат, получит принципиально иной результат, чем тот, кто делает то же самое, и эти две вещи не будут иметь никакого отношения к человеку, который на самом деле пытается выполнить физическую работу. На самом деле, мы могли бы даже утверждать, что никакой запуск Fly никогда не приведет к тому же результату — прямо противоположному запуску кода.

Теперь вы, наверное, думаете — это все очень интересно, но как, черт возьми, это отдаленно полезно? И какое это имеет отношение ко всему, что я когда-либо собираюсь делать? Ответ таков: это совершенно бесполезно — и вряд ли как-то повлияет на вашу жизнь (кроме того, что вы потратите 4 минуты своего времени на чтение этого). Тем не менее, я хотел бы продолжить тратить ваше драгоценное время и посмотреть на то, что выбрасывает обычный программный сценарий из окна.

Эта штука называется whenever.js. Whenever.js — это javascript-реализация эзотерического языка (сокращенно esolang), основанная на одном простом правиле:

Всякий раз, когда это язык программирования, который не имеет чувства срочности. Он делает что-то, когда захочет, а не в какой-то последовательности, заданной программистом.

Это, конечно же, означает, что в программе Whenever нет такого понятия, как поток управления — функции добавляются в «пакет выполнения», а затем запускаются точно (и только тогда), когда программа кажетсязапускающим их. Он основан на нескольких ключевых идеях:

Добавление — функции добавляются в «мешок» — часто с фиксированным количеством копий.

Удаление — то же, что и добавление, только с удалением.

Отложенное выполнение позволяет добавить функцию в «корзину», которая запускается только после того, как другая именованная функция запустится заданное количество раз.

И наконец:

СноваЕсли аргумент, переданный снова, истинен, оператор обратного вызова выполняется, но остается в пакете, чтобы быть выполненным снова некоторое время спустя. Если аргумент ложен, инструкция выполняется и удаляется из списка дел как обычно.

Все это может выглядеть как поток управления, но это не так, поскольку до сих пор нет способа точно определить, когда что-либо когда-либо запустится. Нет никакого способа узнать, что в данный момент делает программа, или текущее значение каких-либо переменных (на самом деле, Whenever также хотел бы, чтобы вы вообще не использовали переменные).

Теперь я ожидаю, что все будут кричать либо от жалкого ужаса, либо от полного замешательства. И, честно говоря, я тоже. Но я думаю, что всякий раз, когда речь идет о чем-то важном и интересном, — как мы выполняем код? Как мы можем думать о коде как о производительности и что это означает для нас как программистов сейчас и в будущем?

Что ж, первый урок, по крайней мере для меня, из Whenever заключается в том, что он делает явным элемент «производительности» кода и, более того, вытаскивает «компьютер» прямо в ведущую роль — это уже не просто молчаливый партнер — делающий. что бы мы ни сказали ему делать, без вопросов и, в конечном счете, без контроля, но вместо этого это дирижер и исполнитель в одном лице. Я, как «программист», не имею абсолютно никакого контроля над тем, что на самом деле происходит или что на самом деле выводится после того, как я попрошу программу запуститься. Все это теперь у меня отнято настолько полностью, что меня как будто бы и нет, и можно утверждать, что происходящее вообще не для меня. Страшный? или освобождение? Я просто не уверен.

Всякий раз, когда также говорится о чем-то, что будет все больше определять нашу работу в будущем — мы просто делаем шаги к программам, которые не только зависят от пользовательского ввода, но также могут модифицировать себя на лету, и мы собираемся все чаще видеть они «помогали» нам в работе, которую мы делаем. Это также переворачивает с ног на голову традиционную модель — подобное программирование становится дуэтом — «программист» и «запрограммированный» работают вместе, чтобы создать что-то, что «программист» мог лишь приблизительно представить себе до акта действия. само «программирование». Готовы ли мы к этому переходу? Можем ли мы думать о «машинах» или «программах», которые могут стать их собственными авторами? Готовы ли мы к миру, в котором мы можем сказать компьютеру «Лети» и отступить? Это новая форма разума?

Все это большие и важные вопросы, и нам нужно найти ответы на них. Всякий раз, когда это глупая иллюстрация этих больших идей, но, надеюсь, она предоставила нам возможность начать обдумывать хотя бы начало некоторых ответов.