Наблюдение за основным докладом Рича Хики на JVM Languages ​​Summit 2009 вернуло меня в прошлое. В частности, к лету 2003 года, когда меня зачислили на курс философии. Мы размышляли о реальности, восприятии, объектах и ​​времени. Часто, говоря о реальности, мы оказываемся погруженными в мир абстрактного.

Интересно, что Хикки говорит о времени как о характеристике, одновременно уклончивой и существенной. А вот моя попытка обобщить одно из самых популярных выступлений Хики, в котором он обсуждает будущее объектно-ориентированного программирования.

Хикки углубляется в некоторые концепции, противоречащие программированию, большая часть которых выходит за рамки моего собственного опыта. Он вводит основные принципы — состояние, идентичность, значение и т. д. — и исследует вопросы, связанные со временем, параллелизмом и параллелизмом.

То же самое, но другое

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

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

Хикки попадает в точку, когда говорит об общих чертах между объектно-ориентированными языками программирования, такими как Java, Python и C++. Он сравнивает эти языки с автомобилями и тем, как все автомобили выполняют одну и ту же функцию (отсюда и работа художника Диего Кардосо). Основное различие связано с предпочтениями программиста в отношении синтаксиса и выразительности. В конце концов, вот общие атрибуты для языков ООП:

  • Концепция объектов, основанная на моделировании реального мира
  • Миксины/интерфейсы
  • Статическая/динамическая типизация
  • Точки с запятой/отступы/блоки
  • Внутренние классы

Хикки призывает нас задуматься о том, как программирование может ориентироваться в сложном, параллельном и неоднородном мире. Он говорит о «случайной сложности». Это относится к набору проблем, возникающих при выборе определенного языка, инструмента, стратегии или чего-то еще. Возможно, самые сложные проблемы маскируются под простые. Например, в C++ отсутствует автоматизированное управление памятью, также известное как сборка мусора (или GC), которое относится к памяти, которая больше не используется в программе. С другой стороны, Java реализует GC и, следовательно, имеет огромную коллекцию библиотек.

Чистые функции, кирпичи нашего дома

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

Одним из преимуществ ООП является возможность компоновки единиц. В конце концов, с помощью ООП мы можем именовать, хранить информацию и инкапсулировать функции, чтобы использовать их. Чистые функции идеальны во многих отношениях: они принимают неизменяемые значения, делают с ними что-то локально и возвращают другое неизменяемое значение. Их легко понять, изменить, протестировать и составить. И у них нет понятия времени. (Напротив, объекты и методы не беззаботны).

Тем не менее, большинство программ не являются функциями; это процессы, поскольку они не возвращают один и тот же результат.

Нет чувства времени

Здесь я чувствую, что мы входим в философию кода. Объекты — это упрощенные модели реального мира. Они включают поведение, связанное с данными. И, наконец, у них нет ни конкретного понятия времени, ни правильного понятия ценности. (Функции, с другой стороны, не имеют отношения ко времени и не претендуют на то, чтобы иметь дело со временем).

Что ООП делает не так? Он ошибся во времени. Создавая объекты, мы создаем способность объекта меняться на месте и делаем объекты, которые позволяют нам видеть изменения на месте. Нет конкретного понятия времени и ценностей. Ценности сфабрикованы. Кроме того, у нас есть символическая ссылка (идентичность) с реальными сущностями. Идея, которую я связываю с этой вещью, — это вещь, которая длится с течением времени. (Я знаю… как трипно). Например, установка переменной в целое число не означает, что целое число сохраняется с течением времени.

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

Процесс создает будущее из прошлого; будущее есть функция прошлого (не меняет прошлого)

Чтобы углубиться в психологические сорняки, Хики заявляет следующее:

  • Фактические сущности — это неизменяемые значения, которые являются атомарными (происходят мгновенно и изолированно от параллельных процессов).
  • Будущее есть функция прошлого, но оно его не меняет (процесс создает будущее из прошлого)
  • Идентичность представляет собой ряд связанных значений, но не существует устойчивой сущности.
  • Время – это последовательность событий процесса

Разрушая это

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

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

  • Значение: неизменная величина, количество, число или комбинация этих вещей.
  • Идентичность: производная концепция, основанная на ряде значений/состояний, причинно связанных во времени.
  • Состояние: моментальный снимок удостоверения в определенный момент времени.
  • Время: все об относительности, оно не поддается измерению или имеет размерность; скорее, это относится к определенным значениям до или после
  • Восприятие: наблюдения за миром.

Это кажется мне особенно плодовитым. Восприятие в значительной степени параллельно и не требует координации, коммуникации и передачи сообщений. Он не принадлежит временной шкале. Мы всегда воспринимаем прошлое и никогда не воспринимаем настоящее. Мы рассчитываем на основе прошлого. К тому времени, когда мы принимаем решение о чем-либо, мы наблюдаем за прошлым, потому что время мгновенно.

Собираем все вместе

Хикки говорит о том, что нам нужно от языка программирования. Нам нужен язык, представляющий значения и управляющий изменениями или последовательностью значений (то есть временем). Мы можем потреблять память для моделирования времени. В чистой функции старое значение передается в новое значение, и это неизбежно требует некоторой памяти. Это создает визуальный снимок, который служит записью, памятью или восприятием. Если мы потребляем память, роль GC будет заключаться в очистке прошлого, на которое больше не ссылаются, поскольку мы больше не заботимся о нем.

Хикки выступает за постоянные структуры данных (PDS) в качестве решения. Вот их определяющие качества:

  • Неизменяемый, который идеально подходит для состояний, моментальных снимков и памяти со стабильными значениями для принятия решений/расчетов.
  • Им никогда не нужна синхронизация между всеми воспринимающими!
  • Когда создается новая ценность, она имеет ту же структуру, что и предыдущая, но не разрушает старую ценность или восприятие прежней ценности.
  • Снижение сложности.

Под капотом PDS представлены деревьями. Деревья поддерживают совместное использование структур и копирование путей с добавлением новых узлов. Они легко компонуются. Хотя одной из проблем с постоянными структурами данных является их более низкая производительность, Хикки утверждает, что один из способов решить эту проблему — использовать безопасные «временные» версии, которые на 90% быстрее, чем изменяемые объекты.

Хики также говорит о важности имитации времени в программе и продвижения вперед. Для этого требуется последовательность состояний и возможность предоставления значения момента времени. Несколько сроков также являются важным и желательным соображением. Различные стратегии построения времени включают: сравнение и обмен (CAS), который строит временную шкалу для каждой личности; агенты, которые являются асинхронными и не подключенными к временной шкале; и программная транзакционная память, которая позволяет координировать временные рамки между несколькими личностями и вызывающим абонентом.

Хикки указывает на концепцию, часто используемую в разговорах о базе данных, как о способе осмысления параллелизма. «Управление многоверсионным параллелизмом» относится к сохранению истории для удовлетворения читателей. Его ключевым свойством является то, что воспринимающие не мешают процессу; в контексте данных читатели не мешают авторам. Это позволяет наблюдателям/читателям иметь представление о временной шкале, сохраняя некоторую историю. PDS удешевляет историю. Когда наш мозг реконструирует поведение, мы наблюдаем снимок, известный как до, и снимок, известный как позже, и вычисляем дельту.

Выводы из разговора следующие:

  • Чрезмерная сложность требует изменений
  • Сложность можно объяснить сочетанием поведения, состояния, идентичности и времени.
  • Нам нужно четко указать время
  • Мы должны программировать с использованием чистых функций и неизменяемых значений.
  • Модель эпохального времени (диаграмма выше) является общим решением
  • У нас есть текущая инфраструктура для экспериментов
  • В будущем нам придется координировать внутреннее время с внешним временем, иметь лучшую производительность и больше параллелизма, а также лучшие версии структур данных и больше временных конструкций.