2

Вдохновленный this questionКак выглядят языки программирования, если каждая вычислимая вещь может быть выполнена за 1 секунду?

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

Используйте свое воображение, как это возможно, например. он использует какой-то гиперпространственный континуум, чтобы автоматически распараллеливать что угодно, насколько это желательно, чтобы он мог рассчитать ответ на любой вычислимый вопрос, независимо от его сложности времени и количества фактических «логических шагов» за одну секунду.

Однако он может отвечать только на вычислимые вопросы за одну секунду ... так что я не стану «невозможной» машиной (по крайней мере, я так не думаю) ... Например, эта машина все равно не будет " чтобы решить проблему остановки.

Каким будет язык программирования для такой машины? Все языки программирования, о которых я знаю, в настоящее время должны сделать некоторые уступки «алгоритмической сложности» ... с этим ограничением, удаленным, хотя, я бы ожидал, что все, о чем мы будем заботиться, будет «выразительностью» языка программирования. то есть его способность лаконично выражать «вычисляемые вопросы» ...

Во всяком случае, в интересах надеюсь, интересной дискуссии, открыв ее в качестве вики сообщества ...

+5

Если бы это было возможно, мы могли бы проверить, действительно ли ответ на вопрос о жизни Вселенной и все на самом деле 42. – Gumbo

ответ

2

Обратите внимание, что даже если проблема с остановкой не является вычислимой, «это останавливается в пределах N шагов на всех возможных входах с размером, меньшим, чем M»!

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

Кроме того, это очень быстро вызовет сингулярность. Построение ИИ было бы намного проще, если бы вы могли сделать почти бесконечное вычисление - и как только у вас был один из любой эффективности, он мог задать вычислимый вопрос «Как бы улучшить мою программу, если я потратил миллиард лет на размышления о ? это»...

1

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

+0

* Настоящие программисты ™ * уже делают это и только пытаются написать более оптимальное решение, если производительность является проблемой (так что только для 5% кода);) – delnan

+1

Просто быть nitpicker: нет такого понятия, как «более оптимальное» решение, так же, как нет «худшего худшего случая» ;-) – n3rd

2

Возможно, это язык haskell-ish. Честно говоря, это мечта ввести код. Вы программируете «законы» своих типов, классов и функций, а затем освобождаете их. Это невероятно весело, мощно, и вы можете написать очень сжатый и элегантный код. Это похоже на искусство.

+0

+1 Любой язык, который утверждает, что высокий уровень должен быть абсолютно, положительно абстрактным (т. е. независимым от лежащего в основе архитекта), например, Haskell. К сожалению, это обычно не делается - для соображений производительности (примитивы в Java и различные ключевые слова, например, C/C++, в основном служат этой цели, удаляют их, а язык проще, хотя и немного медленнее). – delnan

1

Ваша недооценка O (1). Это означает, что существует постоянная C> 0 такая, что время для вычисления проблемы ограничено этим.

Что вы игнорируете, так это то, что фактическое значение C может быть большим и может (и в основном) отличаться для разные алгоритмы. У вас может быть два алгоритма (или компьютеры - не имеет значения) как с O (1), а с одним, что C может быть в миллиард раз больше, чем в другом, - тогда последний будет намного медленнее и, возможно, очень медленным с точки зрения времени.

4
SendMessage travelingSalesman "Just buy a ticket to the same city twice already. You'll spend much more money trying to solve this than you'll save by visiting Austin twice." 
SendMessage travelingSalesman "Wait, they built what kind of computer? Nevermind." 
1

Масштабируемость не будет проблемой. У нас были бы ИИ более умные, чем мы. Нам больше не нужно было программировать, и вместо этого ИИ выяснил бы наши намерения, прежде чем мы их осознаем.

+4

Но см. Http://xkcd.com/534/. –

4

Это не совсем логично. Если вещь занимает O (1) раз, то n раз будет занимать O (n) время, даже на квантовом компьютере. Невозможно, чтобы «все» занимало O (1) раз.

Например: Grover's algorithm, упомянутый в принятом ответе на вопрос, с которым вы связались, занимает O (n^1/2) время, чтобы найти элемент в базе данных из n элементов. И это не O (1).

+2

Квантовый компьютер мог бы, конечно, делать n экземпляров параллельно, поэтому в целом все равно будет O (1). Это предполагает произвольно большой квантовый компьютер (count (qbits) >> n forall n), но тогда это часть вопроса. – Richard

+1

Это абсурдно. Переменная в O - это размер задачи, а не счетчик повторений. – sharptooth

+0

OK Я уточнил свой вопрос. Забудьте о сложности времени. В конце концов, это вопрос вопроса ... Как выглядят языки программирования, если у вас есть веская причина не заботиться о временной сложности? –

0

SQL - такой язык - вы запрашиваете какой-то фрагмент данных, и вы его получите. Если вам не нужно беспокоиться о мельчайших деталях реализации db, это может быть даже забавно для программирования.

+1

SQL не имеет ничего общего с алгоритмической сложностью. Это может быть язык 4-го поколения (это то, что вы, похоже, имеете в виду), но он уверен, что, как черт возьми, не требуется O (1) время для выполнения запроса. – Tomalak

+0

Вы правы, SQL - это «декларативный» язык, и это важное ограничение ... Однако на самом деле это не «завершение полного», если вы не приступите к приписыванию более интересных свойств вашим «отношениям». Для доказательства ... SQL может запрашивать только конечное число таблиц ... поэтому, если ваши таблицы также имеют только конечные строки, можно в конечном итоге оценить вывод любого оператора SQL за конечное время и, следовательно, доказать, что он всегда останавливается. –

3

Объем памяти или скорость памяти или скорость процессора не определяют сложность времени и пространства алгоритма. Базовая математика делает это. Спросите, как выглядят языки программирования, если все можно было бы вычислить в O (1), это как спросить, как выглядят наши калькуляторы, если pi равно 3, а результаты всех квадратных корней - целые числа. Это действительно невозможно, и если это не так, это вряд ли будет очень полезно.

Теперь, спрашивая себя, что мы будем делать с бесконечной мощностью процесса и бесконечной памятью, может быть полезным упражнением. Нам все равно придется иметь дело со сложностью алгоритмов, но мы, вероятно, будем работать как-то иначе. Для этого я рекомендую The Hundred-Year Language.

+0

Да, я уточнил свой вопрос. Что касается столетнего языка ... он по-прежнему выглядит слишком алгоритмическим и похож на обычный Lisp/Scheme для меня, с некоторыми незначительными изменениями синтаксиса ... т.е. все еще очень озабочен «как» вычислять, а не «что вычислить »... –

0

Если все это будет сделано в течение одной секунды, то большинство языков, в конечном счете выглядеть, я называю это DWIM теории (то, что я имею в виду теорию):

Just do what I said (without any bugs this time) 

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

-1

Я не знаю, как появятся новые языки (я физик, а не компьютерный ученый), но я все равно буду писать свои программы для него на Python.