Что означает "экспрессивный" при обращении к языкам программирования?
Я часто слышу это слово в предложениях типа "javascript-очень выразительный язык". Означает ли это, что существует не так много правил, или "выразительный" имеет более конкретное значение?
7 ответов:
'Expressive' означает, что легко написать код, который легко понять, как для компилятора, так и для человека-читателя.
два фактора, которые делают для выразительности:
- интуитивно читаемые конструкции
- отсутствие шаблонного кода
сравните этот выразительный Groovy, с менее выразительным Java eqivalent:
3.times { println 'Hip hip hooray' }
vs
for(int i=0; i<3; i++) { System.out.println("Hip hip hooray"); }
иногда вы торгуете точностью для выразительности -- пример Groovy работает, потому что он предполагает, что Java заставляет вас явно указывать.
Я так понимаю, что он способен выражения идеи/алгоритмы/задачи в удобном для чтения и сжатой форме.
обычно я связываю язык, выразительные с синтаксическим сахаром, хотя это не всегда так. Примеры в C# его выразительности были бы:
foreach
(вместо явного написания итерации)- the
using
оператор (вместо явного написания попробуйте / наконец)- выражения запросов (более простой синтаксис для написания запросов LINQ)
- методы расширения (позволяющие цепочку вызовов методов, опять же в первую очередь для LINQ)
- анонимные методы и лямбда-выражения (что позволяет упростить делегирование и построение дерева выражений)
Другим примером могут быть дженерики: до того, как C# получил дженерики, вы не могли выразить идею " an
ArrayList
содержит только строки" в коде. (Вы можете документировать это, конечно, или напиши самStringList
тип, но это не совсем то же самое.)
у Нила Графтера есть блог С хорошей цитатой из него на эту тему...
на мой взгляд, языковая конструкция выразительна, если она позволяет вам писать (и использовать) API, который не может быть написан (и использован) без конструкции.
Я бы сказал, что это означает, что вы можете более естественно выразить свои мысли в коде.
это сложно.
Если вы хотите напечатать число с плавающей запятой, которое имеет двоичный шаблон
0xdeadbeef
, Это гораздо проще сделать в C, чем в Bash, например. Тем не менее, Bash, по сравнению с C, является языком сверхвысокого уровня. С другой стороны, если вы хотите запустить программу и собрать ее вывод в текстовый файл, это так просто, что он почти невидим в Bash, но потребует по крайней мере страницы кода в C (предполагая среду POSIX).
вот, очень спорное сравнение:
http://redmonk.com/dberkholz/2013/03/25/programming-languages-ranked-by-expressiveness/
Итак, каковы лучшие языки по этим метрикам?
Если вы выбираете топ-10, основываясь на рейтинге медиана и межквартильный интервал, то взять пересечение их, вот что осталось. Медиана и межквартильный интервал перечисляются сразу после имен:
Augeas (48, 28): A предметно-ориентированные языки для файлов конфигурации
Puppet (52, 65): Еще один DSL для конфигурации REBOL (57, 47): язык, предназначенный для распределенных вычислений
eC (75, 75): Ecere c, производная C с ориентацией объекта
CoffeeScript (100, 23): язык более высокого уровня, который транскомпилируется в JavaScript
Clojure (101,51): диалект Lisp для функционального, параллельного программирования
Вала (123, 61): An объектно-ориентированный язык, используемый GNOME
Haskell (127, 71): чисто функциональный, скомпилированный язык с сильным статическим типом
может быть, этот сайт http://gafter.blogspot.com/2007/03/on-expressive-power-of-programming.html может помочь вам
короче он говорит: по-моему, a языковая конструкция это выразительных если это позволяет вам писать (и использовать) API, который не может быть написан (и использован) без конструкции. В контексте закрытия для предлагаемого расширения языка Java API абстракции управления-это то, что не кажется будут поддержаны конкурирующие предложения.