В области философии компьютерных наук изучение смысла и референции в языках программирования набирает все большую актуальность. Это связано с тем, что программные языки, будучи формальными системами, одновременно функционируют как инструменты создания вычислительных машинных инструкций и как потенциальные представления эмпирических систем. Однако, несмотря на широкое принятие терминов «семантика» и «референция» в лингвистике и философии языка, перенос этих понятий в контекст программирования требует тщательного анализа и переосмысления. Проблема значения и референции традиционно сформулирована в философии языка как вопрос о том, определяется ли смысл языкового выражения объектом внешнего мира, на который это выражение ссылается, либо, наоборот, смысл предопределяет референцию, или же смысл и референция существуют независимо друг от друга. В контексте языков программирования эта проблема трансформируется в вопрос о том, позволяет ли смысл, вкладываемый в программные конструкции, самим по себе ссылаться на какие-либо объекты или процессы, и если да, то на какие именно.
Различные виды семантики в программировании призваны объяснить, как именно конструкции языка приобретают смысл. Среди них можно выделить операционную, денотационную, игровую и аксиоматическую семантики. Операционная семантика описывает смысл с точки зрения изменения состояния абстрактной машины при выполнении команд — каждый оператор программы приводит к переходу из одного состояния машины в другое. Денотационная семантика связывает конструкции с математическими объектами, чаще всего функциями между областями, отражая трансформацию состояния. Игровая семантика рассматривает выполнение как диалог или игру между агентом вычисления и окружающей средой, что позволяет формализовать интерактивный характер вычислительных процессов и доказать полноту соответствия с операционной семантикой.
Аксиоматическая семантика же использует логические формулы и правила вывода, чтобы формализовать свойства программ и служит основой для доказательства корректности. Каждый из этих подходов предоставляет определенную форму «значения» для программных выражений, но вопрос в том, насколько эти значения обеспечивают референцию — то есть возможность программных конструкций ссылаться на что-то конкретное. Исторически, в философии языка, идея о том, что смысл определяется референцией, прочно закрепилась благодаря работам таких мыслителей, как Фреге и Тарский. Однако уже Фреге отмечал, что референция не способна полностью описать смысл — одна и та же референция может быть представлена разными значениями или «смыслами» (сознательными способами представления объекта). Аналогично, для языков программирования можно говорить о том, что различные семантики представляют разные «способы видения» вычислительных процессов, причем не обязательно сводимые друг к другу напрямую.
Важно подчеркнуть, что все основные виды семантики программирования в конечном итоге ссылаются не на внешний эмпирический мир, а на внутренние операции абстрактных машин — моделей, используемых для понимания и формальной верификации программ. Таким образом, смысл программных конструкций формируется в терминах этих внутренних моделей, а не внешней реальности. В философии языка существует ряд теорий референции: дескриптивистская, каузальная, характера и интенциональная. В случае языков программирования наиболее релевантной оказывается именно интенциональная теория, согласно которой референция зависит от намерений говорящих или пользователей языка применительно к конкретному контексту. Для программ это означает, что связь между программным кодом и физическим исполнением или взаимодействием с внешними объектами устанавливается не семантическими свойствами языка как такового, а намерениями разработчиков и контекстом реализации программы.
Еще один важный аспект — множественная реализуемость абстрактных машин, на которых строится понимание программ. Один и тот же абстрактный алгоритм может быть реализован на различных физических устройствах с разными характеристиками. Это означает, что программные конструкции не имеют однозначной референции на конкретные физические объекты, что еще раз подчёркивает внутренний характер семантики и сложность референции. Такое понимание вызывает вопросы о статусе программ в рамках философии науки: могут ли программы рассматриваться как теории? Согласно одной из точек зрения, программы лучше понимать как модели, а не теории, поскольку для теорий характерны законоподобные предсказательные утверждения, которых программы как таковые не содержат напрямую. Представление программ как моделей предполагает наличие определенных изоморфизмов между программой и реальной системой, причем эти изоморфизмы не исходят из семантики языка, а устанавливаются дополнительно.
Несмотря на то, что высокоуровневые языки программирования обладают механизмами формализации смысла, их символы и конструкции не соотносятся прямо с объектами внешнего мира, а лишь с операциями абстрактных вычислительных машин. Реальная же связь с внешними системами формируется через намерения, контекст применения и процессы реализации, отсюда следует, что язык программирования сам по себе является семантическим, но не референциальным в классическом смысле. Важный философский вывод заключается в том, что в программировании, в отличие от естественных языков, следует рассматривать семантику как внутреннюю характеристику языков и их моделей, а референцию — как результат актов намерения и практического применения. Это, в свою очередь, имеет практическое значение для разработки, тестирования и верификации программного обеспечения, подчеркивая, что формальное доказательство корректности должно сопровождаться эмпирическим тестированием и проверкой соответствия реальным исполнениям. На фоне описанного, современные исследования в области философии компьютерных наук продолжают развивать новое понимание роли значений, референций и смыслов в языках программирования, предлагая гибкие и основанные на контекстах модели интерпретации.
Таким образом, понимание «значения» и «референции» в языках программирования требует признания глубокой внутренней связи с вычислительными моделями и процессов формирования смысла через человеческие намерения. Это означает, что языки программирования, обладая семантикой, не гарантируют прямой референциальной связи с внешним миром без соответствующего контекстуального и интенционального обоснования. Данное осмысление оказывает существенное влияние на философские дискуссии о природе вычислений, теории языков и перспективы искусственного интеллекта, определяя новые направления в исследовании связи между формальными системами и реальностью.