Что вы подразумеваете под выразительностью языка программирования? - PullRequest
47 голосов
/ 11 марта 2010

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

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

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

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

Ответы [ 11 ]

30 голосов
/ 11 марта 2010

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

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

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

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

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

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

27 голосов
/ 11 марта 2010

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

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

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

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

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

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

25 голосов
/ 12 марта 2010

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

  • Язык 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"); }

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

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

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

7 голосов
/ 11 марта 2010

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

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

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

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

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

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

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

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

3 голосов
/ 11 марта 2010

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

3 голосов
/ 11 марта 2010

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

Я считаю 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 и некоторые фигурные скобки и скобки, я создал статический класс с методами и закрытыми переменными.

1 голос
/ 11 марта 2010

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

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

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

1 голос
/ 11 марта 2010

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

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

0 голосов
/ 27 декабря 2016

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

Итак, я согласен. «Как легко, полно и сочиняемо язык для вас, чтобы выразить свои намерения». : Полагаю, это мера выразительности.


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

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

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

Или: hq9plus язык. Код Hello World:

H

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

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


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

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


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

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

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

Пример:

// 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)

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

0 голосов
/ 11 марта 2010

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

...