Можете ли вы указать язык программирования без реализации?

11

Возможно ли теоретически указать язык программирования, для которого не может быть никакой реализации? Язык программирования - это способ определения функций. Реализация означает метод для выполнения данной программы на этом языке на заданном входе для вывода функции, соответствующей программе на этом входе.

Каковы минимальные требования такого языка?

Кава
источник
3
Что такое «реализация» языка?
Рафаэль
@ Рафаэль: Это вы изменили «язык программирования» на «язык». Перед вашим редактированием было ясно, что означает реализация языка.
Tsuyoshi Ito
@TsuyoshiIto: не совсем; Я только адаптировал заголовок, чтобы он соответствовал вопросу, который был изменен в cstheory.SE. Я изменил его обратно, но до сих пор не ясно, что это значит. Компилятор? Переводчик? В любом случае, перенесите сюда вопрос, которому почти год, и пользователь, который, очевидно, никогда не возвращался к этому вопросу, в лучшем случае был опрометчивым.
Рафаэль
@ Рафаэль: Спрашивая «что такое реализация языка?» после удаления всех улик было просто за пределами моего понимания. Но я согласен, что вопрос был неясен с самого начала.
Tsuyoshi Ito
Я думаю, что ваше предполагаемое определение «языка программирования» является непродуманным. По крайней мере, его следует изменить, заменив «функции» на «вычислимые функции». В противном случае неясно, почему вы решили назвать язык «языком программирования». Как только вы измените его, вопрос станет бессмысленным, потому что нет таких «языков программирования, для которых не может быть никакой реализации».
Uday Reddy

Ответы:

7

Обычно реализация языка программирования, по крайней мере, дает переводчика на языке (или компиляторе на язык), который не более, чем Turing-complete.

Используя это «определение», мы можем указать такой язык программирования:

  • существует только одна возможная программа HALT;

  • Спецификация HALT: это функция, которая решает проблему остановки .

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

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

jmad
источник
1
Обобщенный: любой язык, который определяет функцию, которая решает неразрешимую проблему, не может быть реализован.
edA-qa mort-ora-y
@ edA-qamort-ora-y Технически это можно реализовать. Вы не можете решить проблему остановки, но ТМ может смоделировать другую машину и принять ее, если она остановится; язык, принятый такой ТМ, является в точности языком (кодировок) машин, которые останавливаются. Но для практических целей мы обычно хотим, чтобы примитивные операции языков программирования гарантированно заканчивались! (по крайней мере на «разумном» входе)
Бен
1
Да, функции языка должны иметь временную сложность меньше, чем :)О()
edA-qa mort-ora-y
@ edA-qamort-ora-y это не всегда так. Например, в денотационной семантике Хаскелла 1/0 и, следовательно, Ω ( ) в модели очевидной стоимости. На практике все реализации Haskell различают исключение и расхождение, и GHC имеет указанную семантику операции, которая объясняет, как исключения должны работать. Но было бы возможно иметь соответствующую реализацию, которая бы зацикливалась на деление на ноль! let loop = loop in loopΩ()
Филипп JF
3

Просто любопытное примечание: движок шаблонов C ++ является Turing-complete

Теорема 1: В отсутствие границ экземпляров шаблоны C ++ полны по Тьюрингу.

Следствие 1: В отсутствие ограничений на инстанцирование, будет ли остановлен компилятор C ++ при компиляции заданной программы.

... так что сам C ++ можно считать языком программирования, для которого не может существовать "реализация" ... :-D

Вор
источник
Так могли C «компилятор» будет использоваться в качестве переводчика , если один не заботились о коде , который был создан , а просто диагностика производится?
Supercat
Да, как показано в документе, компилятор останавливается со списком ошибок, которые соответствуют истории вычислений машины Тьюринга (и ее окончательной конфигурации ленты). Очевидно, что ввод не может быть интерактивным (он должен быть закодирован в исходном коде перед запуском компилятора).
Вор
2

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

Σ*2Σ*

MM0

Но это не тот язык спецификации , что люди имеют в виду , когда они используют выражение «язык программирования». Язык программирования , как правило , означает, что язык , чтобы выразить вычисляемые функции (процессы, ...) и передать инструкции к машине и , следовательно , существует TM , который может имитировать те свои программы и выводить их результаты. Таким образом, в некотором смысле наличие языка программирования, который не может быть реализован, не имеет смысла.

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

Кава
источник
Я уверен , что «язык программирования» означает язык программирования , как мы обычно говорим об этом, и «реализация языка» означает среду для выполнения программ на этом языке на реальных компьютерах. Вопрос не формализованы , но , конечно , это не неясно? Я могу легко написать спецификацию для нового языка программирования, не потрудившись реализовать его; вопрос просто спросить, можно ли сделать это таким образом , что язык не может быть реализован.
Бен
@Ben, если вы посмотрите на оригинальный вопрос о теории, вы увидите, что в этом вопросе нет словесного программирования только в названии. Вопрос, заданный ОП, определенно понятен. PS: Мне было бы интересно строгое (не должно быть формальным) определение того, что является языком программирования. Мы не можем доказать отрицательные результаты о языках программирования исключительно на основе интуиции и примеров. Если у вас есть ссылка на определение, вы можете опубликовать его в виде редактирования или комментария к вопросу.
Каве
Справедливо, хотя SE утверждает, что вы ответили на него 9 часов назад, задолго до того, как он был перенесен и отредактирован. В любом случае, я все равно сделал бы такую ​​же интерпретацию, основываясь на исходном вопросе. Что касается определения языка программирования, я бы сказал, что очевидным является формальная грамматика плюс сокращение к какой-либо другой хорошо понятной вычислительной модели (лямбда-исчисление, машина Тьюринга и т. Д.) Или строгая операционная семантика. Очевидно, что модель редукции сделает ответ на этот вопрос тривиальным «нет».
Бен
1

Было множество языков, указанных без реализации, например, Algol 60 должен был быть языком для написания алгоритмов, а не для реализации. Intercal вспоминает, что некоторые из многих языков «просто для удовольствия» были заданы задолго до того, как появилась реализация.

vonbrand
источник