В двух словах :
Что характеризует императивные языки программирования как близкие к машинам Тьюринга и обычным компьютерам, таким как ПК (сами по себе ближе к машинам с произвольным доступом (ОЗУ), а не к машине Тьюринга), так это концепция явной памяти, которую можно модифицировать для хранения (промежуточные результаты ). Это автоматическое представление вычислений с концепцией состояния (включающего в себя как управление конечным состоянием, так и содержимое памяти), которое может меняться по мере выполнения вычислений.
Большинство других моделей более абстрактны. Хотя они могут выражать вычисления как последовательность шагов преобразования исходной структуры, эти преобразования применяются в некой межпространственной вселенной математических значений. Это может сохранить свойства, такие как ссылочная прозрачность, которые могут упростить математический анализ. Но он более далек от естественных физических моделей, которые полагаются на особенности памяти.
Таким образом, не существует естественных функциональных машин, кроме как в более широком смысле, как объяснено ниже, поскольку программное обеспечение на самом деле не отделимо от аппаратного обеспечения.
Ссылка на Тьюринга как критерий вычислимости происходит, вероятно, из-за того, что его модель, машина Тьюринга, была ближе всего к этому ограничению физической реализуемости, что делало ее более интуитивной моделью вычислений.
Дополнительные соображения :
Существует много моделей вычислений, которые были разработаны, чтобы охватить наиболее общий способ вычисления. Они включают машины Тьюринга, на самом деле во многих различных вариантах, лямбда-исчисление (в том числе и варианты), системы переписывания полу-тью, частично рекурсивные функции, комбинаторную логику
Все они отражают некоторые аспекты различных методов, используемых математиками для выражения или проведения вычислений. Большинство из них до некоторой степени использовались в качестве основы для разработки некоторых языков программирования (например, Snobol для систем переписывания, APL для комбинаторов, Lisp / Scheme для лямбда-исчисления) и часто могут комбинироваться различными способами в современных языках программирования.
Одним из основных результатов является то, что все эти вычислительные модели оказались эквивалентными, что приводит к тезису Черча-Тьюринга о том, что никакие физически реализуемые модели вычислений не могут сделать больше, чем любая из этих моделей. Модель вычислений называется полной по Тьюрингу, если она может быть доказана эквивалентной одной из этих моделей и, следовательно, эквивалентной всем им.
Название могло бы быть другим. Выбор машины Тьюринга (ТМ) в качестве эталона, вероятно, связан с тем, что она, вероятно, является самой простой из этих моделей, имитирующей близко (хотя и упрощенно) способ, которым вычисляет человек, и довольно легко реализуемым (в ограниченной конечной форме). в качестве физического устройства, до такой степени, что машины Тьюринга были построены с наборами Lego . Основная идея не требует математической сложности. Это, вероятно, простота и реализуемость модели, которая дала ей эту ссылочную позицию.
В то время, когда Алан Тьюринг создал свое вычислительное устройство, на столе находились другие предложения, которые могли бы служить формальным определением вычислимости, критической проблемой для основ математики (см.
Entscheidungsproblem ). Эксперты того времени рассматривали предложение Тьюринга как наиболее убедительно охватывающее известную работу о том, какой должна быть вычислимость (см. Вычислимость и рекурсия , Р. И. Соаре, 1996, см. Раздел 3.2). Различные предложения оказались эквивалентными, но предложение Тьюринга было более убедительным. [из комментариев Ювала Фильмуса]
Следует отметить, что с аппаратной точки зрения наши компьютеры - это не машины Тьюринга, а то, что называется машинами произвольного доступа (ОЗУ) , которые также являются полными по Тьюрингу.
Чисто императивный язык (что бы это ни значило) - это, вероятно, формализмы, используемые для самых основных моделей, таких как машины Тьюринга, или язык ассемблера (пропуская его двоичное кодирование) компьютеров. Обе они общеизвестно нечитаемы, и им очень сложно писать важные программы. На самом деле, даже язык ассемблера имеет некоторые функции более высокого уровня, чтобы немного упростить программирование по сравнению с прямым использованием машинных инструкций. Основные императивные модели закрыты для физических миров, но не очень удобны.
Это быстро привело к разработке моделей вычислений более высокого уровня, которые начали смешивать с ним различные вычислительные методы, такие как вызовы подпрограмм и функций, наименование места в памяти, определение области имен, количественное определение и фиктивные переменные, уже используемые в некоторой форме. в математике и логике и даже в очень абстрактных понятиях, таких как рефлексия ( Lisp 1958).
Классификация языков программирования по парадигме программирования, такой как императивная, функциональная, логическая, объектно-ориентированная, основана на превосходстве некоторых из этих методов при проектировании языка, а также на наличии или отсутствии некоторых вычислительных функций, которые обеспечивают некоторые свойства программ или фрагменты программы, написанные на языке.
Некоторые модели удобны для физических машин. Некоторые другие более удобны для высокоуровневого описания алгоритмов, это может зависеть от типа алгоритма, который должен быть описан. Некоторые теоретики даже используют недетерминированную спецификацию алгоритмов, и даже они могут быть переведены в более традиционные термины программирования. Но здесь нет проблемы несоответствия, потому что мы разработали сложную технологию компилятора / интерпретатора, которая может переводить каждую модель по мере необходимости (что также является основой тезиса Черча-Тьюринга).
Теперь вы никогда не должны смотреть на свой компьютер как на сырое оборудование. Он содержит логическую схему, которая выполняет очень элементарную обработку. Но во многом это связано с микропрограммами внутри компьютера, о которых вы никогда не узнаете. Тогда у вас есть операционная система, которая делает вашу машину даже отличной от того, что делает аппаратное обеспечение. Кроме того, у вас может быть виртуальная машина, которая выполняет байт-код, а затем язык высокого уровня, такой как Pyva и Jathon или Haskell. или OCaml, который может быть скомпилирован в байт-код.
На каждом уровне вы видите разные модели вычислений. Очень сложно отделить аппаратный уровень от уровня программного обеспечения, таким образом, назначив конкретную вычислительную модель машине. И поскольку все они являются взаимно переводимыми, идея конечной модели аппаратных вычислений в значительной степени является иллюзией.
Машина лямбда-исчисления существует: это компьютер, который может уменьшить выражения лямбда-исчисления. Объявление, которое легко сделать.
О специализированных машинных архитектурах
Фактически, дополняя ответ Питера Тейлора и развивая аппаратное и программное обеспечение, были созданы специализированные машины, которые лучше адаптированы к конкретной парадигме, и их базовое программное обеспечение было написано на языке программирования, основанном на этой парадигме.
Они включают
По сути, это также обязательные аппаратные структуры, но они смягчены специальными аппаратными функциями или микропрограммированными интерпретаторами для лучшей адаптации к намеченной парадигме.
На самом деле, аппаратное обеспечение, специализирующееся на конкретных парадигмах, похоже, никогда не было успешным в долгосрочной перспективе. Причина в том, что технология компиляции для реализации любой парадигмы на ванильном оборудовании становилась все более и более эффективной, так что специализированное оборудование было не так уж и нужно. Кроме того, производительность аппаратного обеспечения быстро улучшалась, но стоимость улучшения (включая развитие базового программного обеспечения) легче амортизировалась на аппаратном обеспечении vanilla, чем на специализированном оборудовании. Специализированное оборудование не может конкурировать в долгосрочной перспективе.
Тем не менее, и хотя у меня нет точных данных об этом, я подозреваю, что эти предприятия оставили некоторые идеи, которые действительно повлияли на эволюцию машин, памяти и архитектуры наборов команд.
(a -> a) -> a
.