Мера мощности, кроме полноты Тьюринга


18

Первоначально я пытался задать этот вопрос в StackOverflow, но это было слишком субъективно :-(. Я заинтересован в методах определения мощи языков программирования. Полнота Тьюринга одна, но почти универсально удовлетворена. Что было бы неплохо, так это определить мера мощности, которая различает языки программирования, которые фактически используются. Например, может ли кто-нибудь предложить несубъективный метод, который будет различать ассемблер и Java?

Полнота Тьюринга означает, что язык является максимально мощным в том, что он может выводить (что в значительной степени означает, что он может делать все, что не связано с временем в реальном мире). Поэтому, если мы хотим определить более сильную меру власти, нам нужно использовать другой подход. Краткость была предложена в первоначальном вопросе, но это не так просто определить. У кого-нибудь есть другие предложения?

Ответы:


24

Понятие, которое вы ищете, называется выразительностью, и у Маттиаса Феллайзена есть математически строгое определение:

« О выразительной силе языков программирования »

www.ccs.neu.edu/scheme/pubs/scp91-felleisen.ps.gz (постскриптумная версия)

Интуиция заключается в том, что если у вас есть две эквивалентные программы на двух разных языках - скажем, программа A на языке X и программа B на языке Y - и если вы вносите локальное изменение в A, которое требует глобального изменения в B тогда X более выразителен, чем Y.

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

Мое обсуждение упростило некоторые детали, и вы должны прочитать сам документ для полного отчета.

Чтобы ответить на ваш другой вопрос: вы можете сказать, что Java более выразительна, чем ассемблер, потому что вы можете добавить новый класс в вашу программу Java, а затем получить преимущества полиморфизма, если другие части вашей программы будут вызывать ее методы без глобальной модификации. Обработка исключений - еще один пример, где Java более выразительна, чем сборка: вам просто нужно написать одну throwинструкцию для передачи управления в стек. На более элементарном уровне вы также можете добавить новый caseоператор в начале a, switchи вам не придется беспокоиться о пересчете любых смещений прыжка вручную.


Большое спасибо! Это именно то, что я искал!
Casebash

6

Если я правильно понимаю ваш вопрос, вы тем не менее ищете что-то относительно измеримое, а не просто субъективное суждение. Если это так, я лично предпочел бы количество времени, затрачиваемое на решение какой-либо конкретной проблемы (в среднем по всем проблемам и всем программистам). В этой мере вам, возможно, придется учитывать не только сам язык, но и структуру / API, используемые с ним. Краткий синтаксис является очень небольшим фактором: гораздо более важным является то, что наиболее часто требуемая функциональность легко доступна.

Если вы ищете что-то более субъективное, я бы сказал, как это весело . Программисты, как правило, люди, которые хотят, чтобы проблемы решались, поэтому язык программирования, который интересен программистам, неизбежно будет тем, который решит большинство проблем. Эта мера учитывает, что разные люди имеют разные предпочтения в том, как пользоваться вещами, поэтому «лучшим» языком программирования будет тот, который наиболее привлекателен для самого широкого круга программистов. Тем не менее, вам может понадобиться рассмотреть не только язык программирования и API, но и среду (IDE), с которой, естественно, взаимодействует программист.


Я бы сказал, что измерение времени также субъективно. Какой программист нашел время? Если вы тестировали время на обоих языках одним и тем же программистом, то какой язык он знал лучше? Есть статистические способы справиться с этим, но человек не может сделать это в одиночку.
Джон Фишер

1
@ Джон: То, что что-то можно анализировать только статистически, не означает, что оно субъективно.
Дэвид Торнли

@ Дэвид: Это не было моей целью. Дело в том, что без предшествующего исследования спрашивающий не смог бы сравнить «силу» языков, о которых он заботился, - оставив их субъективными, если не проводить статистический анализ для большой группы.
Джон Фишер

1

Я бы определил, насколько мощен язык, насколько продуктивно вы можете с ним работать. Многие люди склонны говорить о производительности с точки зрения быстрого написания кода, но, поскольку большая часть жизненного цикла программы - это обслуживание, а не разработка, лучше определить, насколько легко вы можете читать и отлаживать код, особенно когда он написан кем-то. остальное. Самые мощные языки - те, которые легче читать и поддерживать.


2
Сложность в том, что знание языка облегчает задачу тому, кто его знает. Итак, эта мера становится субъективной.
Джон Фишер

1

Вы должны определить свою терминологию лучше.

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

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

РЕДАКТИРОВАТЬ

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

Простое сравнение количества символов не дает достаточной степени выразительности. В противном случае вы могли бы сделать язык более выразительным, сжав исходный код ... и это чепуха. На самом деле, я не знаю ни одной объективной меры выразительности, и я сильно подозреваю, что ничего не существует. Что фактически делает характеристику бесполезной и довольно неинтересной.


1
Я знаю, что полнота Тьюринга - это вычислимость. Мы знаем, что существуют меньшие меры в масштабе вычислимости, такие как конечные автоматы. Но мы не можем использовать вычислимость для определения уровня мощности выше этого, поскольку полнота по Тьюрингу является максимально мощной с точки зрения вычислимости
Casebash

@ Casebash - ты еще не сказал, что такое «сила».
Стивен С.

2
Это потому, что я не знаю, и в этом весь вопрос!
Casebash

Тогда какой смысл твоего ответа? Это должен был быть комментарий.
reinierpost

@reinerpost - смысл моего ответа - подробно объяснить, что Вопрос бессмысленен и почему. По сути, вопрос заключается в следующем: «Существует нечто, называемое« выразительная сила »- я не знаю, что это такое, но не могли бы вы сказать мне, как это измерить». И суть моего ответа заключается в том, что «выразительная сила» является плохо определенной концепцией / свойством, и ОПРЕДЕЛЕННО не поддающейся измерению / количественной оценке. (И это явно ответ, а не комментарий. Возможно, вы просто не поняли, что я пытаюсь сказать?)
Стивен К.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.