Что означает «выразительный» при обращении к языкам программирования? - PullRequest
62 голосов
/ 12 марта 2009

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

Ответы [ 7 ]

56 голосов
/ 12 марта 2009

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

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

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

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

3.times {
   println 'Hip hip hooray'
}

против

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

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

15 голосов
/ 12 марта 2009

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

Обычно язык ассоциируется у меня с синтаксическим сахаром, хотя это не всегда так. Примеры в C # его выразительности были бы:

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

Другим примером могут быть дженерики: до того, как C # получил дженерики, вы не могли выразить идею «1021 *, содержащего только строки» в коде. (Конечно, вы можете задокументировать это или написать свой собственный тип StringList, но это не совсем то же самое.)

10 голосов
/ 12 марта 2009

У Нила Графтера есть блог с хорошей цитатой по теме ...

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

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

4 голосов
/ 12 марта 2009

Это сложный вопрос.

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

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

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

4 голосов
/ 12 марта 2009
2 голосов
/ 21 октября 2014

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

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): чисто функциональный, скомпилированный язык со строгой статической типизацией

1 голос
/ 12 марта 2009

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

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

...