Введение

Язык фон Неймана в вычислительной технике — это язык программирования, являющийся высокоуровневой абстрактной изоморфной копией архитектуры фон Неймана. По состоянию на 2009 год, большинство современных языков программирования соответствуют этому описанию, вероятно, как следствие широкого доминирования архитектуры компьютеров фон Неймана на протяжении последних 50 лет. Различия между Фортраном, C и даже Java, хотя и существенные, в конечном счете ограничены тем, что все они основаны на стиле программирования, характерном для компьютера фон Неймана. Если бы, например, все объекты Java выполнялись параллельно с использованием асинхронного обмена сообщениями и декларативного обращения к атрибутам, то Java не входила бы в эту группу. Изоморфизм между языками программирования фон Неймана и соответствующими архитектурами проявляется следующим образом:

переменные программы ↔ ячейки памяти компьютера
управляющие операторы ↔ инструкции тестирования и перехода
операторы присваивания ↔ инструкции выборки и сохранения
выражения ↔ инструкции доступа к памяти и арифметические операции.

Критика

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

Присутствие в современных системах

Многие современные процессоры теперь содержат несколько процессорных ядер, и многопоточное программирование обычно является наиболее эффективным способом использования большей вычислительной мощности в рамках одной программы. Некоторые современные процессоры высоко оптимизированы с использованием таких техник, как внеочередное исполнение, но при этом имеют сложную логику для определения моментов, когда это можно сделать, не нарушая фон-неймановскую семантику логической модели программирования. Широко используются раздельные кэши инструкций и данных, что делает аппаратную архитектуру модифицированной Гарвардской, но опять же, с логикой для обнаружения случаев, когда оптимизация оказывается неэффективной, чтобы обеспечить возможность выполнения самомодифицирующегося кода. Некоторые специализированные процессоры (включая графические процессоры) представляют собой очень широкие устройства с множественным потоком инструкций и множественным потоком данных (MIMD). Процессоры общего назначения обычно имеют несколько ядер, но каждое из них достаточно быстрое, чтобы многие программы работали достаточно быстро без параллелизации отдельных задач. (Потоки обычно используются для обработки асинхронных входных или выходных данных, особенно в графическом интерфейсе пользователя). Процессоры общего назначения технически являются устройствами MIMD, но как устройства MIMD обычно называют только аппаратное обеспечение, разработанное с нуля для MIMD-программирования. Многие широко используемые языки программирования, такие как C, C++ и Java, перестали быть строго фон-неймановскими, добавив поддержку параллельной обработки в виде потоков. Однако большинство языков, принципиально отличных от фон-неймановских, также являются функциональными и не получили широкого распространения.