Витгенштейн 4. Язык

Я программист и занимаюсь языком каждый день. Я даже пару раз пытался разработать новый язык. Первый раз, в те далекие дни, когда еще не было такого разнообразия языков программирования. Мы пытались создать Систему Автоматизированного Проектирования (САПР) способную принять требования на сложный дизайн.  

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

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

ОО языки решили эту проблем сделав доступ к состоянию контролируемым (private) и передавая его вместе с процедурами его изменения (вычислительными алгоритмами) внутри специальной структуры названной “объектом”, который представлял собой конкретный вариант класса подобных программных структур.

Все сразу заговорили о том, что “теперь-то уже программирование это действительно моделирование объектов реального мира, потому что программный класс – это модель определенного класса реальных объектов; его конкретный программный вариант (программный объект) имеет состояние (значение промежуточных результатов) и поведение (процедуры обработки этих результатов) – точно так же как реальные объекты имеют состояние и поведение (реакцию) которое зависит от этого состояния.” Никто не осмелился тогда обратить внимание на тот факт, что даже это контролируемое состояние может быть изменено извне намеренно или по ошибке, потому что объекты должны влиять друг на друга (передавать промежуточные результаты), так что проблема общего состояния не исчезла (правда, стала более контролируемой). Все тогда были в восторге от ОО языков. Так что маркетинг и социальное давление опять победили.

Соответствие между программными и реальными объектами устанавливалось по их структуре. У нас может быть разное восприятие цвета, но в отношение структуры у нас меньше разногласий: мы все видим две руки, две ноги, четыре колеса. Поэтому структура – это первое, что приходит в голову при сравнении объектов. 

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

Чтобы преодолеть это ограничение ОО программирования, к ОО языкам стали добавлять элементы функционального программирования – когда вычислительные процедуры передаются как параметры и не имеют состояния. Это подтвердило практический опыт: да, некоторые программы моделируют реальные объекты, но другие занимаются вычислениями, которые не соответствуют реальным объектам или процессам.

Теперь давайте посмотрим на следующие цитаты из книг Витгенштейна:
– (Трактат) человеческий язык моделирует реальный мир и его структуру; таким образом значение слова/предложения приходит из реального мира
– (Философские Исследования) человеческий язык моделирует реальный мир; значение слова/предложения приходит из того, как оно используется в реальном мире

Не кажется ли вам, что здесь видна прямая аналогия с нашим опытом программирования?

Витгенштейн в 1920
Витгенштейн (второй справа) в 1920.

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

Замечаете ли вы здесь аналогию с алгоритмом? Программное утверждение “int x = x + 1” (увеличить целое x на 1) может означать “добавит доллар на этот счет” или “добавить одну корову к этому стаду” или даже “мне это нравится больше”. 

В программировании существует понятие “интерфейс”. Он описывает как вычислительная процедура может быть вызвана и какого типа результат можно от нее ожидать. Например, “int multiply(int x, int y)” означает, что процедура “multiply” вычисляет результат умножения x на y, если передать в нее конкретные величины: multiply(2, 2) произведет 4. Само имя “multiply” не влияет на результат. Оно просто описывает для программиста, что делает эта процедура. Процедура может быть названа “int doSomething(int x, int y)” и делать то же самое, что и “multiply”.

Существует много способов вычислить одни и те же величины. Один способ производит более точный результат, другой работает быстрее, например. Поэтому существуют различные алгоритмы могут скрываться за тем же интерфейсом. Это позволяет нам вставлять из в более сложный программный контекст, ничего в нем не меняя. Именно на этом основано функциональное программирование  – на передаче вычислительных процедур (функций) как параметров, что позволяет конструировать сложные вычисления из более простых процедур (функций).  

Каждая функция может использоваться для очень разных вычислений. Таким образом ее “значение” (что она вычисляет? высоту? вес? уровень счастья?) подобно значению “int x = x + 1” приходит из контекста.

[Интересно заметить, что в моей предыдущей статье я говорил о том, что каждый ставит проблему так, чтобы решить ее можно было тем способом, которым он владеет лучше всего. Сейчас я много пишу о функциональном программировании. Вот я и вижу его везде. Если бы я занимался предсказанием погоды, то нашел бы, наверное, у Витгенштейна много похожего на поведение природных явлений. Ну, ничего не поделаешь, что вижу, о том пишу.]

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

Поэтому я не согласен с метафорой Витгенштейна “языковые игры” как описание человеческого языка. Любая игра имеет правила, и отклонение от них вызывает остановку игры, а в человеческом языке остановки часто не происходит, даже если отклонение от правил очень большое. Чужое обобщение может нам помочь, но может добавит нам знаний без конкретных примеров. Услышав общее утверждение, мы мысленно немедленно проверяем на конкретных примерах, а действительно ли это так?

Мы рассказываем истории – конкретные примеры – с помощью литературы, искусства, мифов и делаем на из основе обобщения. Этим мы отличаемся от машин, которые выполняют конкретные инструкции и только – никаких обобщений и отклонений от правил исполнения. Мы же отказываемся исполнять команды бездумно, не поняв их смысл на конкретных примерах.

Именно поэтому, когда я пишу о программировании, я иллюстрирую все принципы примерами кода – фрагментов конкретных программ. Это очень помогает пониманию принципов. Если вы читали мои статьи по Java, вы согласны с этим? 

Trackbacks/Pingbacks

  1. Витгенштейн 5. Мышление - Николай Самойлов - программист и писатель - 27/05/2020

    […] как я писал в предыдущем блоге, пока это выглядит так, как будто язык компьютера […]

Powered by WordPress. Designed by Woo Themes