Наблюдение за основным докладом Рича Хики на JVM Languages Summit 2009 вернуло меня в прошлое. В частности, к лету 2003 года, когда меня зачислили на курс философии. Мы размышляли о реальности, восприятии, объектах и времени. Часто, говоря о реальности, мы оказываемся погруженными в мир абстрактного.
Интересно, что Хикки говорит о времени как о характеристике, одновременно уклончивой и существенной. А вот моя попытка обобщить одно из самых популярных выступлений Хики, в котором он обсуждает будущее объектно-ориентированного программирования.
Хикки углубляется в некоторые концепции, противоречащие программированию, большая часть которых выходит за рамки моего собственного опыта. Он вводит основные принципы — состояние, идентичность, значение и т. д. — и исследует вопросы, связанные со временем, параллелизмом и параллелизмом.
То же самое, но другое
Я не сторонник того, что один язык программирования лучше другого. Это, пожалуй, самая опасная идея, особенно среди новых разработчиков. (Я также прочитал действительно хороший пост в блоге о том, как это культивирует культуру презрения).
Коллеги-новички в программировании заявляют о своей любви к JavaScript и презрении к Ruby. Возможно, это потому, что Ruby был моим набегом на программирование, и я смог изучить его глубже, чем другие. Но я не понимаю их точку зрения. Я хочу сказать, что ваше невосприятие — это просто граница вашего ограниченного понимания потенциала языка.
Хикки попадает в точку, когда говорит об общих чертах между объектно-ориентированными языками программирования, такими как Java, Python и C++. Он сравнивает эти языки с автомобилями и тем, как все автомобили выполняют одну и ту же функцию (отсюда и работа художника Диего Кардосо). Основное различие связано с предпочтениями программиста в отношении синтаксиса и выразительности. В конце концов, вот общие атрибуты для языков ООП:
- Концепция объектов, основанная на моделировании реального мира
- Миксины/интерфейсы
- Статическая/динамическая типизация
- Точки с запятой/отступы/блоки
- Внутренние классы
Хикки призывает нас задуматься о том, как программирование может ориентироваться в сложном, параллельном и неоднородном мире. Он говорит о «случайной сложности». Это относится к набору проблем, возникающих при выборе определенного языка, инструмента, стратегии или чего-то еще. Возможно, самые сложные проблемы маскируются под простые. Например, в C++ отсутствует автоматизированное управление памятью, также известное как сборка мусора (или GC), которое относится к памяти, которая больше не используется в программе. С другой стороны, Java реализует GC и, следовательно, имеет огромную коллекцию библиотек.
Чистые функции, кирпичи нашего дома
Большие программы может быть трудно поддерживать из-за случайной сложности. С каждым новым языком программирования появляется возможность решить проблему параллелизма. Параллелизм относится к параллельным единицам программы или алгоритма, приводящим к одному и тому же конечному результату, несмотря на неупорядоченное выполнение или частичное выполнение.
Одним из преимуществ ООП является возможность компоновки единиц. В конце концов, с помощью ООП мы можем именовать, хранить информацию и инкапсулировать функции, чтобы использовать их. Чистые функции идеальны во многих отношениях: они принимают неизменяемые значения, делают с ними что-то локально и возвращают другое неизменяемое значение. Их легко понять, изменить, протестировать и составить. И у них нет понятия времени. (Напротив, объекты и методы не беззаботны).
Тем не менее, большинство программ не являются функциями; это процессы, поскольку они не возвращают один и тот же результат.
Нет чувства времени
Здесь я чувствую, что мы входим в философию кода. Объекты — это упрощенные модели реального мира. Они включают поведение, связанное с данными. И, наконец, у них нет ни конкретного понятия времени, ни правильного понятия ценности. (Функции, с другой стороны, не имеют отношения ко времени и не претендуют на то, чтобы иметь дело со временем).
Что ООП делает не так? Он ошибся во времени. Создавая объекты, мы создаем способность объекта меняться на месте и делаем объекты, которые позволяют нам видеть изменения на месте. Нет конкретного понятия времени и ценностей. Ценности сфабрикованы. Кроме того, у нас есть символическая ссылка (идентичность) с реальными сущностями. Идея, которую я связываю с этой вещью, — это вещь, которая длится с течением времени. (Я знаю… как трипно). Например, установка переменной в целое число не означает, что целое число сохраняется с течением времени.
Хики широко ссылается на математика и философа Альфреда Норта Уайтхеда. Уайтхед утверждает, что время атомарно. Вы не можете коснуться времени; скорее, вы можете наблюдать его последовательные изменения. Все, что вы получаете, — это ценность в определенный момент времени. Другими словами, вы не можете пересечь одну и ту же реку дважды.
Процесс создает будущее из прошлого; будущее есть функция прошлого (не меняет прошлого)
Чтобы углубиться в психологические сорняки, Хики заявляет следующее:
- Фактические сущности — это неизменяемые значения, которые являются атомарными (происходят мгновенно и изолированно от параллельных процессов).
- Будущее есть функция прошлого, но оно его не меняет (процесс создает будущее из прошлого)
- Идентичность представляет собой ряд связанных значений, но не существует устойчивой сущности.
- Время – это последовательность событий процесса
Разрушая это
Чтобы наши программы принимали решения, нам нужны устойчивые ценности, которые можно воспринять и запомнить. Нам нужно получить правильное состояние и время, чтобы моделировать вещи, похожие на то, как мы кодируем. Однако разница между реальным миром и нашей моделью мира заключается в том, что мы не можем остановить мир, когда хотим осмотреться и контролировать его. В конкурентном мире все будет происходить следующим образом, независимо от того, чего мы желаем, намерены или на что надеемся.
Ниже представлена диаграмма того, как мы можем концептуализировать время. Ниже приведен список определенных терминов, которые могут прояснить диаграмму.
- Значение: неизменная величина, количество, число или комбинация этих вещей.
- Идентичность: производная концепция, основанная на ряде значений/состояний, причинно связанных во времени.
- Состояние: моментальный снимок удостоверения в определенный момент времени.
- Время: все об относительности, оно не поддается измерению или имеет размерность; скорее, это относится к определенным значениям до или после
- Восприятие: наблюдения за миром.
Это кажется мне особенно плодовитым. Восприятие в значительной степени параллельно и не требует координации, коммуникации и передачи сообщений. Он не принадлежит временной шкале. Мы всегда воспринимаем прошлое и никогда не воспринимаем настоящее. Мы рассчитываем на основе прошлого. К тому времени, когда мы принимаем решение о чем-либо, мы наблюдаем за прошлым, потому что время мгновенно.
Собираем все вместе
Хикки говорит о том, что нам нужно от языка программирования. Нам нужен язык, представляющий значения и управляющий изменениями или последовательностью значений (то есть временем). Мы можем потреблять память для моделирования времени. В чистой функции старое значение передается в новое значение, и это неизбежно требует некоторой памяти. Это создает визуальный снимок, который служит записью, памятью или восприятием. Если мы потребляем память, роль GC будет заключаться в очистке прошлого, на которое больше не ссылаются, поскольку мы больше не заботимся о нем.
Хикки выступает за постоянные структуры данных (PDS) в качестве решения. Вот их определяющие качества:
- Неизменяемый, который идеально подходит для состояний, моментальных снимков и памяти со стабильными значениями для принятия решений/расчетов.
- Им никогда не нужна синхронизация между всеми воспринимающими!
- Когда создается новая ценность, она имеет ту же структуру, что и предыдущая, но не разрушает старую ценность или восприятие прежней ценности.
- Снижение сложности.
Под капотом PDS представлены деревьями. Деревья поддерживают совместное использование структур и копирование путей с добавлением новых узлов. Они легко компонуются. Хотя одной из проблем с постоянными структурами данных является их более низкая производительность, Хикки утверждает, что один из способов решить эту проблему — использовать безопасные «временные» версии, которые на 90% быстрее, чем изменяемые объекты.
Хики также говорит о важности имитации времени в программе и продвижения вперед. Для этого требуется последовательность состояний и возможность предоставления значения момента времени. Несколько сроков также являются важным и желательным соображением. Различные стратегии построения времени включают: сравнение и обмен (CAS), который строит временную шкалу для каждой личности; агенты, которые являются асинхронными и не подключенными к временной шкале; и программная транзакционная память, которая позволяет координировать временные рамки между несколькими личностями и вызывающим абонентом.
Хикки указывает на концепцию, часто используемую в разговорах о базе данных, как о способе осмысления параллелизма. «Управление многоверсионным параллелизмом» относится к сохранению истории для удовлетворения читателей. Его ключевым свойством является то, что воспринимающие не мешают процессу; в контексте данных читатели не мешают авторам. Это позволяет наблюдателям/читателям иметь представление о временной шкале, сохраняя некоторую историю. PDS удешевляет историю. Когда наш мозг реконструирует поведение, мы наблюдаем снимок, известный как до, и снимок, известный как позже, и вычисляем дельту.
Выводы из разговора следующие:
- Чрезмерная сложность требует изменений
- Сложность можно объяснить сочетанием поведения, состояния, идентичности и времени.
- Нам нужно четко указать время
- Мы должны программировать с использованием чистых функций и неизменяемых значений.
- Модель эпохального времени (диаграмма выше) является общим решением
- У нас есть текущая инфраструктура для экспериментов
- В будущем нам придется координировать внутреннее время с внешним временем, иметь лучшую производительность и больше параллелизма, а также лучшие версии структур данных и больше временных конструкций.