Что такое «мощный» язык?


22

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


5
Язык так же силен, как и его пользователь.
ysolik

6
@ysolik не обязательно верно. Я мог бы дать кому-то дерьмовый язык и посмотреть, как далеко он продвинется. у него есть один оп, NOOP! =)
Марк Канлас

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

1
PowerBASIC: не может стать более мощным, чем это. ^^
Габлин

1
@ysolik: правильнее было бы сказать, что «язык не может быть более мощным, чем его пользователь».
Дункан Бэйн

Ответы:


32

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

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

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

  • Обширный универсальный фреймворк или библиотека для выполнения широкого спектра общих задач
  • Сложный предметно-ориентированный синтаксис, который «делает одно и делает это хорошо»
  • Прямой доступ к функциям машины, т.е. возможность писать низкоуровневый код
  • Абстрагирование от понятий машинного уровня, т.е. способность писать код высокого уровня
  • Очень богатая система типов, учитывающая передовые стратегии, такие как рефлексия, DI и статический анализ
  • Очень свободная система типов, которая позволяет программистам просто делать это (приведение типов и т. Д.)
  • Способность рассматривать все как объект , который предлагает концептуальную проверку
  • Способность рассматривать все как функцию , которая предлагает математическую проверку
  • Автоматическое управление памятью и ресурсами (GC, RAII), приводящее к меньшему количеству ошибок
  • Ручное управление памятью и ресурсами, что может привести к оптимизации производительности
  • Минимальное количество синтаксического шума , что приводит к улучшению читабельности
  • Более похожий на английский синтаксис , который предлагает более мелкую кривую обучения
  • Способность писать очень лаконичный код (т. Е. Троичный оператор, объединение нулей, расширение нуль)
  • Неспособность к записи потенциально запутанной коде (т.е. не тройные операторов и т.д.)

Все видят, что здесь происходит? Практически каждый элемент пули может быть интерпретирован как признак «силы», так же как и его полная противоположность!

Кто-то где-то явно думал, что переменные переменные - это отличная идея, которая сделает язык очень мощным . Я не буду судить; Я не парень по PHP.

Я предлагаю, чтобы вместо всей этой чепухи о священной войне мы все использовали это действительно простое определение:

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

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

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


1
+1 Это единственное определение, которое пытается включить все различные понятия языковой власти. Мне особенно нравится, как вы показываете, что конфликтующие функции могут считаться мощными. Информатика - это наука о компромиссах, даже в выборе языка.
CodexArcanum

11

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

C, C ++, D мощные, но, очевидно, это всего лишь мое скромное мнение.


Вы бы использовали Java для программирования на уровне ядра или я вас неправильно понял?
Davy8

@ Davy8, ты прав, по моему собственному определению, я не должен был включать Java.
grokus 7.10.10

5

Есть несколько определений силы за пределами полноты по Тьюрингу. Марк привел то, что я склонен считать «определением Пола Грэма». Это довольно хорошее определение с одним серьезным недостатком: это неправильно. Это теоретически очень хорошее определение языковой силы, но вы знаете, что они говорят о разнице между теорией и практикой ...

Если бы каждый был способен писать идеальный код, не только идеально безошибочный, но и идеально ориентированный на будущее, то определение Пола Грэма было бы правильным. Но это явно не тот случай. В реальном мире большая часть времени и усилий, затрачиваемых на разработку программного обеспечения, занимает не первоначальное создание продукта, а его последующее обслуживание. В зависимости от того, какую статистику вы слушаете (и она, вероятно, сильно отличается от проекта к проекту), обслуживание может составлять от 60% до 90% от общего объема усилий, затрачиваемых на программу.

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

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

РЕДАКТИРОВАТЬ: есть еще один важный момент в описании силы языка: диапазон понятий, которые вы можете выразить, и как легко вы можете достичь обоих целей. Пол Грэхам любит оценивать этот уровень, насколько высоко вы можете достичь уровня абстракции, но это только половина. Любой язык, который устанавливает нижний предел абстракции, ниже которого вы не можете перейти, когда это необходимо, ограничен, потому что детали, которые абстрагируются, существуют по причине. В этом разница между легко читаемым игрушечным языком, таким как COBOL, и легко читаемым мощным языком: у COBOL нет указателей и нет доступа к встроенной сборке, где вы можете выражать любые вычисления, даже те, для которых COBOL плохо подходит.

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


1
Проблема, с которой я сталкиваюсь, заключается в том, что, похоже, COBOL является очень мощным языком.
Дэвид Торнли

2
Я так понимаю, ты не знаешь Лисп? :)
dash-tom-bang

1
@Matt: вот в чем дело. То, для чего используется язык, ограничено тем, для чего он может использоваться, и с Python вы можете сделать гораздо меньше, чем с языком, который не абстрагируется от деталей, связанных с памятью.
Мейсон Уилер

3
-1 Из-за неявного представления о том, что более короткий, более выразительный код труднее поддерживать. Вы взяли оба общих значения языковой силы (выразительность против открытости) и объединили их в одну концепцию, которая только наполовину выражает любую из двух оригинальных идей.
CodexArcanum

1
@ Йорг Миттаг: Вы правы, но я думаю, что приведенное мной предложение относится к прямому контролю аппаратных ресурсов (например, памяти): C ++ дает вам больше контроля. Конечно, если вы внедряете виртуальную машину, у вас есть полный контроль, но я думаю, что Мейсон Уилер имел в виду контроль над реальной машиной.
Джорджио

4

Это многократно обсуждалось много раз (например, на comp.lang.lisp, несколько раз). Я не думаю, что кто-нибудь когда-либо придумал «правильный» ответ, но многие люди придумали ответы, которые кажутся мне явно неправильными.

В ответах, которые я вижу здесь, позвольте мне выбрать ответ Мейсона Уилера. С одной стороны, проблемы, которые он освещает , важны, но с другой, я не могу себе представить, что их вообще называют «властью». Это похоже на то, как будто он говорит, что его минивэн Хонда более мощный, чем драгстер на верхнем топливе, потому что он безопаснее, тише, имеет лучшую управляемость, больше пассажирского пространства и намного более комфортную поездку. Все это абсолютно верно, и все это важно. Эти факторы (среди многих других) делают минивэн намного более практичным и разумным для большинства людей - но они не меняют того факта, что двигатель минивэна вырабатывает только около 250 л.с., тогда как двигатель драгстера выдает где-то около 8000 л.с.

Проблема, конечно, заключается в том, что с транспортными средствами существует четкое определение того, что составляет «власть», а что нет. Что касается языков программирования, то мне кажется, что обсуждение в конечном итоге сводится к тому, чтобы рассматривать эквивалентность обработки, комфорта, скорости, грузоподъемности и дальности полета как части «мощности». В результате получаются потоки, которые работают бесконечно, выделяя гораздо больше тепла, чем света. Большинство вопросов, которые возникают, в основном сводятся к степени важности, которую вы придаете совершенно не связанным и ортогональным функциям - например, это способность программировать MMU на ассемблере более или менее «мощно», чем способность создавать функции более высокого уровня в Хаскеле? По крайней мере, IMO, нет никакого значимого способа сравнить два, и нет никакого значимого ответа на который "

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


3

Правильный баланс краткости и гибкости.

Отличный вопрос Учитывая, что многие языки являются «завершенными по Тьюрингу», мы можем поставить их всех на равных основаниях в отношении того, на что они теоретически способны. Но мы этого не делаем, потому что языки явно отличаются друг от друга. А какая разница?

Разница заключается в умении говорить много разных вещей с очень небольшим . Если бы мы могли прыгнуть прямо до крайности, я мог бы сделать язык, который является лучшим языком для автоматической инициализации системы управления контентом, используя только один символ, 'c'. Но какой в ​​этом смысл? Конечно, это мощно в смысле краткости, но не гибко. То, что вы хотите, это язык, который позволяет вам говорить много разных сложных вещей, не будучи слишком многословным. Не будучи подобной сборке, способной на все под солнцем, бесконечно гибкой, но чрезвычайно многословной.

Мощный язык - это язык, который позволяет вам говорить много разных вещей с наименьшей возможной длиной.


1
-1. Извините, но это не только заблуждение, но и опасное, поскольку оно может серьезно снизить производительность в дальнейшем.
Мейсон Уилер

@ Мейсон Уилер: Не могли бы вы уточнить?
Джои Адамс

@Joey: см. Мой ответ на этот вопрос.
Мейсон Уилер

1

Как только вы достигнете завершения по Тьюрингу (и это легко сделать для языка), «сила» не будет иметь большого значения в том смысле, что все, что вы можете сказать на одном полном языке Тьюринга, вы можете сказать на другом. Ответ Марка Канласа гласит : краткость и гибкость имеют значение.

Сказав это, статья Матиаса Феллайзена « О выразительной силе языков программирования» делает интересным чтение. В нем он пытается формализовать понятие выразительности в языках.


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

@reinerpost - говорит, что полный по Тьюрингу язык все еще может вычислять произвольные функции на строках, он просто должен представлять их по-другому. Полнота Тьюринга в значительной степени ортогональна вопросу о доступных типах данных. Например, некоторые Тьюринга языков не имеют ни одного типа данных , а просто представляют собой все , что с функциями - и вынуждены прибегать к вещам , как Церковь Encoding для арифметика.
Микера

1

Кажется, существует много разногласий по поводу того, что составляет языковую силу. Это краткость, удобочитаемость, адаптивность или просто полнота по Тьюрингу? Я думаю, что все эти факторы вступают в игру, поэтому, возможно, лучший способ взглянуть на это с точки зрения статов. Да, я говорю о бумажной RPG здесь.

Идея состоит в том, что каждый язык имеет (примерно) одинаковое количество «точек», которые могут быть произвольно распределены по ряду категорий. В целях обсуждения, скажем, единственными факторами являются краткость, разборчивость и гибкость. Тогда язык может быть чрезвычайно кратким и гибким, но, следовательно, очень трудным для чтения; или очень разборчивый и гибкий, но очень многословный.

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

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

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

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

По индукции, единственные программисты, которые в состоянии увидеть все различия в мощности между различными языками, - это те, кто понимает самый мощный язык. (Это, вероятно, то, что имел в виду Эрик Рэймонд о том, что Lisp делает вас лучшим программистом.) Вы не можете доверять мнению других из-за парадокса Blub: они довольны тем, каким языком они пользуются, потому что он диктует как они думают о программах.

Я не согласен с вашей моделью, что все языки обязательно имеют одинаковое количество точек в своем распределении. Давайте возьмем крайний пример brainf * ck, и мы можем легко сказать, что он не сопоставим ни с одним современным языком, даже хотя бы по общему количеству баллов. то есть это не игра с нулевой суммой на языке программирования - язык не начинается с x баллов, а распределяет их, они начинаются с 0 и получают баллы в зависимости от особенностей. То, что есть некоторый компромисс, который нужно принять, конечно, естественно, но все варианты не равны (по крайней мере, мое мнение).
n1ckp

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

извините, я перечитал ваш пост, и я должен согласиться, что я читаю слишком быстро ... но я все еще не согласен с тем, что каждый (основной) язык имеет примерно одинаковые моменты. Давайте возьмем Java и C ++, потому что это язык, который я знаю несколько хорошо. Я вполне уверен, что могу подтвердить, что c ++ более мощный, чем Java, только потому, что c ++ отключил практически все, что делает Java (кроме gc - но тогда java также не предлагает ручного управления памятью) ПЛЮС больше (реальные шаблоны FTW). Это то, что я хотел бы подчеркнуть: нет, не все языки примерно равны в программировании, даже в сказочной стране
n1ckp 8.10.10

при сравнении только основных языков.
n1ckp

0

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

Я бы сказал, что самый «мощный» язык - это тот, который позволяет вам достичь ваших целей с минимальными затратами времени, энергии и других исследований; то есть язык, который обеспечивает наибольшую рентабельность инвестиций. В некоторых ситуациях это может быть C; в других - Java; в других - Хаскелл.

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


-1

Дискуссии о языках программирования - ИМХО - похожи на дискуссии о почтовых клиентах в некоторых группах новостей Linux: они, как правило, являются пламенной войной. Я помню времена, когда VB6 был популярен. Были люди, которые даже утверждали, что это вообще не язык программирования, в то время как другие создавали с ним потрясающие приложения.

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


+1, чтобы противостоять необъяснимому понижению, и потому я вообще с этим согласен. Используйте язык для задачи, для которой он был разработан. Не пишите сложные графические интерфейсы на C, не пишите сложные алгоритмы или операционные системы на VB6
Джерри

-1

Они все инструменты в вашем сундуке с инструментами. Молоток может быть мощным, но нет, если вам нужен гаечный ключ. C / C ++ отлично подходит, если вы системный программист, но Adobe Flash, вероятно, лучше подходит для того игрового веб-сайта, который вы хотите создать.


-1

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

Максимизация

      Быстрота разработки
    + Простота чтения кода
    + Простота отладки
    + Краткость / краткость выражения
    + Простота обучения / преподавания
    - Использование процессора
    - Требования к памяти

При условии

  • Это должно быть завершено по Тьюрингу.
  • Он должен быть мультипарадигматическим : функциональный, объектно-ориентированный, логическое программирование, программирование с ограничениями, параллелизм, распределенные вычисления и т. Д.
  • Он должен быть универсальным , позволяющим создавать интерфейсы командной строки, библиотеки компонентов, серверы, графические интерфейсы и веб-приложения.
  • Он должен быть переносимым , то есть легко переносимым и обслуживаться в кроссплатформенной среде.
  • Он должен быть адаптируемым , то есть открытым для изменения и способным развиваться по мере появления нового оборудования (квантовых чипов), новых парадигм и других инноваций в технологии.
  • Это должно стимулировать развитие библиотек (таких как CPAN, CTAN и CRAN).
  • Это должно быть бесплатно и с открытым исходным кодом .

(И да, я знаю, я уже опубликовал совершенно противоречивый ответ. Это потому, что я диалект.)


-2

Это было написано в отношении естественных языков, но я думаю, что это уместно и для языков программирования:

Вера в то, что некоторые языки по своей природе превосходят другие, широко распространена, но она не имеет оснований в языковом факте. Некоторые языки, конечно, более полезны или престижны, чем другие, в определенный период истории, но это происходит из-за превосходства говорящих в то время, а не из-за каких-либо врожденных языковых характеристик.
- Дэвид Кристал (ред.). Кембриджская энциклопедия языка 2 / е (1997). стр.7

«Власть» просто не относится к одному языку над другим. Было бы глупо говорить: «Китайский - более мощный язык, чем корейский». Точно так же глупо говорить: «APL - более мощный язык, чем COBOL».

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

  • Может быть легче устроиться на работу в США, если вы говорите на американском английском, чем, скажем, на языке маори. Кроме того, несомненно, легче получить работу по программированию на Java или C, чем на LISP или J. Но это экономическое преимущество, безусловно, не отражает какую-то врожденную силу языка. Речь идет о силе носителей языка.
  • «Привет» не лучше, чем «ни хао» или «шалом», потому что он короче. Точно так же, хотя функция может быть выражена более кратко в APL, чем в языке COBOL, это тоже не отражает какую-то врожденную силу языка.

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


Я не согласен. Для простого примера, я думаю, никто не сказал бы иначе, чем сказать, что существует более мощный язык, чем brainf * ck (скажем), даже если теоретически он завершен (я думаю). Дело в том, что «мощный» - это определенное качество, которое не имеет ничего общего с тем фактом, что все они «завершены». Я согласен, что это может быть несколько субъективно, но сказать, что все языки равны в отношении «мощности», кажется довольно надуманным.
n1ckp

1
@ n1ck: Вы говорите, Power = удобочитаемость? А также :. Недостаток читабельности БФ подразумевает отсутствие энергии? У APL и J также очень низкая читаемость, но они чрезвычайно полезны и лаконичны (хотя я, конечно же, не отождествляю полезность или лаконичность с силой). Идя в противоположном направлении, COBOL очень читабелен; его прямо-таки многословно; но опять же, это вряд ли делает его более мощным, чем APL или BF. BF очень забавный; он способен развлекать; но это не Power как сила. Проблема в том, что ни у кого, похоже, нет хорошей теории власти, за которой они могли бы достичь консенсуса.
Разное

1
Нет, я не имел в виду, что мощность = читабельность. Я просто не согласен с вашей точкой зрения, что все языки равны и что мы не можем сравнивать язык по «мощности», как бы вы его ни определяли. На мой взгляд, базовый уровень читаемости необходим для придания языку какой-либо силы, но это не совсем вопрос. Если мы хотим действительно ответить на вопрос, нам, конечно, сначала нужно определить силу, но, на мой взгляд, это не то же самое, что «лучшее в каждой ситуации», что, как мне кажется, ваш ответ намекает мне на то, что вы его так истолковали (то есть не лучший язык для всего, с чем я вроде согласен).
n1ckp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.