Что Вы подразумеваете под выразительностью языка программирования?

Я вижу большое слово 'выразительность', когда люди хотят подчеркнуть, что один язык лучше, чем другой. Но я не вижу точно, что они подразумевают под ним.

  • Действительно ли это - подробность / сжатый? Я имею в виду, если один язык может записать что-то короче, чем другой, который означает выразительность? См. мой другой вопрос - Статья о плотности кода как мера питания языка программирования
  • Действительно ли это - питание языка? Paul Graham говорит, что один язык более мощен, чем другой язык в некотором смысле, что один язык может сделать это, другой язык не может сделать (например, LISP может сделать что-то с макросом, который другой язык не может сделать).
  • Это - просто что-то, что делает жизнь легче? Регулярное выражение может быть одним из примеров.
  • Это другой способ решить ту же проблему: что-то как SQL для решения поисковой проблемы?

Что Вы думаете о выразительности языка программирования? Можно ли показать выразительность с помощью некоторого кода?

Каковы отношения с выразительностью и DSL? Люди придумывают DSL для получения выразительности?

48
задан Community 23 May 2017 в 11:47
поделиться

10 ответов

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

Например, мне кажется, что C # (особенно LINQ через C # 3+) становится намного более выразительным. Этот оператор LINQ является отличным примером:

var results = collection.Where(item => item > 5);

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

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

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

30
ответ дан 26 November 2019 в 18:44
поделиться

«Выразительность» означает способность говорить только то, что вы хотите сделать:

bad_event = events.find(&:bad)

, а не то, как вы хотите, чтобы это было сделано:

i = 0
bad_event = nil
while i < events.size && bad_event.nil?
  event = events[i]
  if event.bad?
    bad_event = event
  end
  i += 1
end

Среди вещей, которые способствуют выразительности:

  • Отсутствие необходимого синтаксического сахара
  • Первоклассные функции
  • Сборка мусора
  • Либо динамическая типизация, либо вывод типа
  • Ядро языка не является рабски минималистичным
  • Хорошая функциональность в стандартной библиотеке

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

Можно также подумать о «мета-выразительности» языка: насколько выразительным является язык при построении доменных языков?

27
ответ дан 26 November 2019 в 18:44
поделиться

Мне нравится понятие выразительной силы Матиаса Феллейзена, которое является сравнительным :

  • Язык A более выразительный, чем язык B, если верны оба следующих утверждения:

    • Любую программу, написанную на языке B, можно переписать на языке A, сохранив при этом основную структуру программы.
    • Некоторые программы, написанные на языке A, должны быть сильно реструктурированы, чтобы они были написаны на языке B.

Обычно мы хотим проводить эти сравнения, глядя на какое-то «существенное ядро» языка - например, возможно, мы хотим рассмотреть диалект C только с , в то время как , а не также для и do ... while .Или, может быть, мы хотим рассмотреть диалект Perl только с префиксом , если форма , и без , кроме формы . Но иногда эти поверхностные синтаксические различия - это именно то, что мы подразумеваем под «выразительной силой»; Некоторым программистам важно сказать

die ("found no solutions") unless length(solutions) > 0;

вместо

if (length(solutions) == 0) { die("found no solutions"); }

. Таким образом, вы должны установить, спрашиваете ли вы о выразительной силе поверхностного синтаксиса или более глубокой структуры.

Еще мне нравится идея Фелляйзена, что она допускает понятие двух языков, которые определенно различны, но ни один из них не является более выразительным, чем другой.

Вы можете прочитать более подробное изложение на первых двух страницах его статьи О выразительной силе языков программирования . После этого следует много остроумных теорий: -)

25
ответ дан 26 November 2019 в 18:44
поделиться

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

3
ответ дан 26 November 2019 в 18:44
поделиться

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

Более выразительный язык может быть очень хорош для выполнения довольно большого объема работы без написания много кода. Однако он, вероятно, будет более специфичным для предметной области и немного медленнее для некоторых задач, чем менее выразительный.

1
ответ дан 26 November 2019 в 18:44
поделиться

Если вам нужен теоретический, но более строгий ответ, чем большинство других, вы можете поискать статью Маттиаса Феллейзена О выразительной силе программирования. Языки . Я почти уверен, что если немного поискать в сети, найдется хотя бы несколько копий.

Если вы хотите получить более практический ответ о том, что на самом деле имеет в виду большинство людей, когда они это говорят, то, честно говоря, это совсем другое. Обычно, по крайней мере, по моему опыту, «выразительный» язык означает: «Мне нравится язык, но я не могу сослаться на объективную поддержку этого». И наоборот, такие вещи, как «менее выразительный» или «невыразительный» обычно означают: «Мне не нравится язык [также], но я не могу сослаться на какую-либо объективную поддержку этого».

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

Одна из больших проблем проистекает из фундаментального расхождения во мнениях. Есть по крайней мере две фундаментально разные общие идеи, которые люди, кажется, имеют о выразительности:

  1. способность выражать самые разные идеи.
  2. способность ясно (и часто лаконично) выражать некоторые конкретные идеи.

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

Очевидно, ассемблер выглядит не так хорошо по второму критерию - обычно он требует довольно большого количества довольно непрозрачного кода для выполнения большей части чего-либо. Эта мера будет иметь тенденцию отдавать предпочтение таким языкам, как Haskell или APL, если привести только пару примеров.

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

7
ответ дан 26 November 2019 в 18:44
поделиться

Возьмем, например, LINQ. Это позволяет использовать функциональное программирование .

Функциональное программирование подчеркивает применение функций, в отличие от императивного стиля программирования, который подчеркивает изменения в состоянии.

LINQ позволяет вам выражать то, что вы хотите сделать, а не то, как это делать. Это яркий пример выразительности.

1
ответ дан 26 November 2019 в 18:44
поделиться

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

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

Некоторая иллюстрация кода (опустив для краткости некоторые детали) на JavaScript. Это класс событий, который я написал:

SJJS.util.Event = (function() {
    var _listeners = [];
    var _listenerReturns = [];

    return {
        addDomListener: function(element, eventName, listener) {
        },
        trigger: function(element, eventName) {
        },
        removeListener: function(eventlistener) {
        }
    }
})();

С помощью всего лишь function, var и некоторых фигурных скобок и круглых скобок я сделал статический класс с методами и приватными переменными.

3
ответ дан 26 November 2019 в 18:44
поделиться

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

Я считаю, что под выразительностью понимается то, как много вы можете сказать легко и насколько хорошо / ясно это может быть сказано. Способность быть краткой - часть этого (очень мощный и краткий язык похож на J ). Обычно я считаю, что лаконичность - хороший показатель выразительности. Если язык может выразить сложную операцию простым способом, он движется в правильном направлении.

Что касается силы, выразительность - это еще не вся сила языка. Хотя это может быть частью этого, также учитываются скорость, безопасность, стабильность, все эти вещи.

пример: суммирование списка в Common Lisp с использованием оператора цикла является кратким и выразительным

(цикл для x в сумме списка x)

0
ответ дан 26 November 2019 в 18:44
поделиться

Точность, краткость и удобочитаемость являются основными компонентами выразительности.

0
ответ дан 26 November 2019 в 18:44
поделиться