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

Что означает "выразительный", когда речь идет о языках программирования?

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

4b9b3361

Ответ 1

"Выразительный" означает, что легко писать код, который легко понять, как для компилятора, так и для читателя.

Два фактора, которые делают для выразительности:

  • интуитивно понятные конструкции
  • недостаток кода шаблона

Сравните этот выразительный Groovy, с менее выразительным Java-эквивалентом:

3.times {
   println 'Hip hip hooray'
}

против

for(int i=0; i<3; i++) {
    System.out.println("Hip hip hooray");
}

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

Ответ 2

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

Обычно я сопоставляю язык, выразительный с синтаксическим сахаром, хотя это не всегда так. Примерами в С# этого выражения являются:

  • foreach (вместо явной записи итерации)
  • оператор using (вместо явной записи try/finally)
  • выражения запроса (более простой синтаксис для написания запросов LINQ)
  • методы расширения (позволяющие цепочки вызовов методов, опять же в первую очередь для LINQ)
  • анонимные методы и лямбда-выражения (упрощение построения дерева делегатов и выражений)

Другим примером могут быть дженерики: до того, как С# получил дженерики, вы не смогли бы выразить идею "a ArrayList, содержащую только строки" в коде. (Вы могли бы задокументировать его, или написать свой собственный тип StringList, но это не совсем то же самое.)

Ответ 3

У Neal Grafter есть блог с хорошей цитатой из этого по теме...

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

Я бы сказал, что это означает, что вы можете более естественно выразить свои мысли в коде.

Ответ 5

Это тяжелое.

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

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

Если вы хотите напечатать номер с плавающей запятой, который имеет двоичный паттерн 0xdeadbeef, это гораздо проще сделать на C, чем, например, в Bash. Тем не менее Bash, по сравнению с C, является языком сверхвысокого уровня. С другой стороны, если вы хотите запустить программу и собрать ее вывод в текстовый файл, это настолько просто, что почти невидимо в Bash, но для этого потребуется хотя бы страница кода на C (при условии, что POSIX-среда).

Ответ 6

Здесь очень спорная сравнение:

http://redmonk.com/dberkholz/2013/03/25/programming-languages-ranked-by-expressiveness/

Итак, каковы лучшие языки по этим метрикам?

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

Augeas (48, 28): языки, специфичные для домена, для файлов конфигурации

Puppet (52, 65): другой DSL для конфигурации REBOL (57, 47): язык, предназначенный для распределенных вычислений

eC (75, 75): Ecere C, производная C с ориентацией объекта

CoffeeScript (100, 23): язык более высокого уровня, который транскопирует на JavaScript

Clojure (101,51): диалект Lisp для функционального, параллельного программирования

Vala (123, 61): объектно-ориентированный язык, используемый GNOME

Haskell (127, 71): чисто функциональный, скомпилированный язык с сильной статической типизацией

Ответ 7

Возможно, этот сайт http://gafter.blogspot.com/2007/03/on-expressive-power-of-programming.html может помочь вам

Вкратце он говорит. По моему мнению, языковая конструкция выразительная, если она позволяет вам писать (и использовать) API, который не может быть написан ( и используется) без конструкции. В контексте предлагаемого языкового расширения Closures for Java API-интерфейсы абстракции - это те вещи, которые, похоже, не поддерживаются конкурирующими предложениями.