Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

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

вместо

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

Итак, вы должны установить, спрашиваете ли вы об экспрессивной силе синтаксиса или более глубокой структуре.

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

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

Ответ 4

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

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

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

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

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

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

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

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

Ответ 5

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

Я считаю JavaScript выразительным (хотя это может быть потому, что Дуглас Крокфорд пробурил эту идею в моем noggin), потому что он может сделать так много всего за несколько ключевых слов. Например, ключевое слово 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 и некоторых фигурных скобок и скобок я создал статический класс с методами и частными переменными.

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

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

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

Пример

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

(loop for x in list sum x)

Ответ 10

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

Ответ 11

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

Итак, я согласен. "Насколько легкий, всеобъемлющий и сложный язык для вас, чтобы выразить свои намерения".. Я считаю, что это показатель выразительности.


ВОПРОС: Является ли это вербальностью/лаконичностью? Я имею в виду, если один язык может записать что-то меньшее, чем другое, означает ли это выразительность?

Нет. Например, Brainfuck язык выразительный? Я так не думаю. Посмотрите пример Hello World в Brainfuck:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

Или: hq9plus язык. Привет, Мировой код:

H

ВОПРОС: Является ли это силой языка? Пол Грэм говорит, что один язык более мощный, чем другой язык, в том смысле, что один язык может сделать то, что другой язык не может сделать (например, LISP может что-то делать с макросом, который не может сделать другой язык).

Я не согласен с Полом. Как видно из приведенных выше примеров, язык hq9plus делает Hello World с одной буквой: H. В то время как большинство других языков будут делать это с гораздо большим количеством писем. Но вы можете создавать композитный и легко читаемый код с другими языками. Если hq9plus делает Hello World с H, значит ли это, что он мощный? Я верю, что нет.


ВОПРОС: Это просто облегчает жизнь? Регулярное выражение может быть одним из примеров.

Режимы велики, но иногда они теряют свою выразительную силу. Иногда это зависит от программиста.

ВОПРОС: Это другой способ решения одной и той же проблемы: что-то вроде SQL для решения проблемы поиска?

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

Я также считаю, что функциональные языки очень выразительны. Потому что вы описываете свое намерение, а не ваши хаусы, а основные технологии всегда могут меняться и оптимизироваться, но это не повредит вашему выразительному коду.

Пример:

// top 10 products with rating higher than 5
return products
  .sort(p => p.rating)
  .filter(p => p.rating > 5)
  .map(p => p.title)
  .take(10)

Выше программа выразительна, она передает ваши намерения. И, скорее всего, это не изменится при изменении основных механизмов.