Що таке "потужна" мова?


22

Я часто бачив людей, які б’ються за те, що їх улюблена мова є «потужнішою», ніж інші. Що стосується опису мови програмування, я можу зрозуміти, що таке об'єктно-орієнтована мова чи що таке динамічна мова, але я все ще не можу зрозуміти, що саме є "потужною" мовою. Які ваші думки?


5
Мова настільки ж потужна, як і її користувач.
ysolik

6
@ysolik не обов'язково правда. я міг би дати комусь хитру мову і побачити, як далеко вони дістаються. У нього є одна оп, НООП! =)
Марк Канлас

2
@ Марк, якщо ми говоримо про крайності, то ти маєш рацію. Однак якщо розглядати сьогодні більш-менш широко використовувані мови, то користувач - це значна частина.
ysolik

1
PowerBASIC: Неможливо отримати більше потужного. ^^
габлін

1
@ysolik: точніше було б сказати "мова може бути не потужнішою за її користувача".
Данкан Бейн

Відповіді:


32

Ми не можемо визначити, що таке "потужна" мова, не попередньо визначивши слово "потужний".

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

Практично, нам дійсно варто зупинитися на цьому; визначення "потужної мови" трохи схоже на визначення "доброї людини" чи "якісного продукту". Абсолютно немає об'єктивного визначення цих слів, з яким ви могли б погодитися всіх, а то й більшості експертів, і більшість визначень просто в кінці запитують питання . Залежно від того, з ким ви спілкуєтесь, влада може бути будь-якою з наступних:

  • Багата рамка загального призначення або бібліотека для виконання найрізноманітніших загальних завдань
  • Витончена синтаксис, орієнтований на домен, який "робить одне і робить це добре"
  • Прямий доступ до функцій машини, тобто можливість писати код низького рівня
  • Абстрагування понять машинного рівня, тобто здатність писати код високого рівня
  • Дуже багата система типів, що дозволяє розвивати передові стратегії, такі як відображення, DI та статичний аналіз
  • Дуже вільна система типу, яка дозволяє програмістам просто виконати це (тип примусу тощо)
  • Можливість трактувати все як об’єкт , що пропонує концептуальну перевірку
  • Можливість трактувати все як функцію , яка пропонує математичну перевірку
  • Автоматичне управління пам'яттю та ресурсами (GC, RAII), що призводить до меншої кількості помилок
  • Ручне управління пам’яттю та ресурсами, що потенційно призводить до оптимізованої продуктивності
  • Мінімальна кількість синтаксичного шуму , що призводить до поліпшення читабельності
  • Більш англійський синтаксис , який пропонує більш дрібну криву навчання
  • Здатність дуже писати стислий код (тобто потрійний оператор, null-coalescing, null-extension)
  • Нездатність до запису потенційно заплутаною коді (тобто немає потрійні операторів і т.д.)

Чи всі бачать, що тут відбувається? Практично кожен кульову особливість можна трактувати як ознаку "сили", а так само може бути і навпаки!

Хтось десь, очевидно, думав, що змінні змінні - це дивовижна ідея, яка дуже зробить мову потужною . Я не буду судити; Я не хлопець PHP.

Я пропоную, щоб замість усієї цієї священної дурниці всі ми використовували це дійсно просте визначення:

Найпотужніша мова - це та, яка дозволяє за найкоротший проміжок часу доставляти товар найвищої якості з найменшими витратами.

Неясне? Ти бетча. Ось чому кожен, хто хоче назвати себе професіоналом, повинен розуміти як програми програмування, так і область проекту. Це єдиний спосіб, коли ви зможете вирішити, що для вас "потужне".

В іншому випадку ви можете просто принести справді великий ніж для бою з гармати.


1
+1 Це єдине визначення, яке намагається включити всі різні уявлення про владу мови. Мені особливо подобається, як ви показуєте, що конфліктні риси можна вважати потужними. Інформатика - це наука про компроміси, навіть у виборі мови.
CodexArcanum

11

Я, можливо, упереджений, бо я системний програміст. Я думаю, що мова програмування, яка використовується для всіх ядер, системних, серверних та прикладних програм, або підтримує декілька парадигм програмування, або обидві можна назвати "потужними".

C, C ++, D є потужними, але очевидно, це лише моя скромна думка.


Ви б використовували Java для програмування рівня ядра чи я вас нерозумію?
Davy8

@ Davy8, ти маєш рацію, за моїм власним визначенням, я не повинен був включати Java.
grokus

5

Є кілька визначень сили, що виходять за межі повноти Тьюрінга. Марк цитував те, що я схильний вважати "визначенням Пола Грема". Це досить хороше визначення, з одним серйозним недоліком: це неправильно. Теоретично це дуже добре визначення мовної сили, але ви знаєте, що вони кажуть про різницю між теорією та практикою ...

Якби кожен зміг написати ідеальний код, не лише ідеально відсутній помилок, а й ідеально стійкий до майбутнього, послідовно, то визначення Пола Грема було б правильним. Але це очевидно не так. У реальному світі більшість часу та зусиль, що спрямовуються на розробку програмного забезпечення, забираються не первинним створенням продукту, а технічним обслуговуванням. Залежно від того, яку статистику ви слухаєте (і вона, мабуть, дуже різниться від проекту до проекту), обслуговування може становити від 60% до 90% від загального обсягу зусиль, які спрямовані на програму.

Технічне обслуговування часто виконується іншими людьми, ніж особа, яка написала код спочатку, і часто через місяці чи навіть роки після первинного написання коду, це означає, що навіть для оригінального кодера це може бути "чужим кодом" цим бал. Якщо ви хочете бути продуктивними під час технічного обслуговування, вам потрібно мати можливість швидко встановити початковий намір коду, прочитавши його.

Тому більш потужна мова - це мова, яка полегшує швидке читання коду , а не мова, яка полегшує швидке записування коду . Існує тенденція до великої кількості збігів між ними, але поняття також часто є перехресними цілями, оскільки короткий синтаксис часто опускає деталі, про які компілятор / інтерпретатор може зробити висновок набагато простіше, ніж програміст технічного обслуговування.

EDIT: Є ще один важливий момент в описі сили мови: коло понять, які ви можете висловити, і те, як легко ви можете вдарити по обидва його кінці. Пол Грехем любить оцінювати це за тим, наскільки високий рівень абстракції ви можете досягти, але це лише половина. Будь-яка мова, що накладає нижню межу абстрагування, під якою ви не можете переходити, коли це необхідно, є калікою, оскільки деталі, які вилучаються далеко, є з причини. Це різниця між легко читабельною іграшковою мовою, такою як COBOL, та легко читабеною потужною мовою: COBOL не має вказівників та доступу до вбудованої вбудованої системи, де ви можете висловити будь-які обчислення, навіть ті, до яких COBOL не підходить.

COBOL також не особливо хороший у попаданні на високий кінець спектра абстракції. Згідно з Вікіпедією, він не має "визначених користувачем типів і не визначених користувачем функцій", що ускладнює створення алгоритмів і структур даних.


1
Проблема, яку я маю з цим, полягає в тому, що, схоже, це вказує на COBOL як дуже потужну мову.
Девід Торнлі

2
Я вважаю, ти не знаєш Лісп? :)
dash-tom-bang

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

3
-1 Через неявне уявлення про те, що коротший, виразніший код якось складніше підтримувати. Ви взяли обидва загальні значення мовної сили (виразність проти відкритості) і з'єднали їх в одне поняття, яке лише половина виражає будь-яку з двох оригінальних ідей.
CodexArcanum

1
@ Йорг W Міттаг: Ви праві, але я вважаю, що речення, яке я цитував, стосується прямого контролю апаратних ресурсів (наприклад, пам'яті): C ++ дає вам більше контролю. Звичайно, якщо ви реалізуєте віртуальну машину, ви маєте повний контроль, але я думаю, що Мейсон Уілер посилався на контроль над реальною машиною.
Джорджо

4

Про це неодноразово обговорювалося з великою довжиною (наприклад, на comp.lang.lisp, кілька разів). Я не думаю, що ніхто ніколи не придумав "правильної" відповіді, але багато людей придумали відповіді, які вважають мене явно неправильним.

У відповідях, які я бачу тут, дозвольте вибрати відповідь Мейсона Віллера. З одного боку, питання, які він висвітлює, є важливими, але з іншого, я не можу уявити собі, щоб називати їх взагалі "владою". Це трохи схоже на те, що він каже, що його міні-фургон Honda є потужнішим, ніж топ-паливний драгстер, тому що він безпечніший, тихіший, має кращу керованість, більше пасажирського приміщення та набагато комфортнішу їзду. Все це абсолютно вірно, і це все важливо. Ці фактори (серед багатьох інших) роблять мінівен набагато більш практичним і розумним для більшості людей, але вони не змінюють факту, що двигун мікроавтобуса виробляє лише близько 250 к.с., тоді як драгстер виробляє десь близько 8000 к.с.

Проблема, звичайно, полягає в тому, що в транспортних засобах є чітке визначення того, що є "потужністю", а що ні. Що стосується мов програмування, то мені здається, що дискусія закінчується приблизно рівноправним поводженням з керованістю, комфортом, швидкістю, вантажопідйомністю та круїзною дальністю, як усі вони є частинами "влади". Результатом властиво бути нитки, які працюють нескінченно, генеруючи набагато більше тепла, ніж світла. Більшість питань, які виникають в основному, збиваються на ступінь важливості, яку ви надаєте абсолютно неспорідненим і ортогональним особливостям, - наприклад, це можливість програмування MMU в мові складання більш-менш "потужною", ніж здатність створювати функції вищого рівня в Haskell? Принаймні, IMO, немає жодного змістовного способу порівняння двох, і жодної змістовної відповіді на це "

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


3

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

Чудове запитання. Зважаючи на те, що багато мов є "Turing завершеними", ми можемо поставити їх усі на рівних підставах щодо того, на що вони теоретично здатні. Але ми цього не робимо, оскільки мови явно відрізняються одна від одної. І в чому різниця?

Різниця полягає в здатності говорити багато різних речей з дуже малою кількістю . Якби ми могли перейти до крайнощів, я міг би зробити мову, яка є найкращою мовою для автоматичної ініціалізації системи управління вмістом, використовуючи лише один символ, "c". Але який би це був сенс? Звичайно, він є потужним в сенсі бути дуже коротким, але не є гнучким. Те, що ви хочете - це мова, яка дозволяє говорити багато різних складних речей, не будучи занадто багатослівними. Не схожий на збірку, здатний на все, що знаходиться під сонцем, нескінченно гнучкий, але надзвичайно багатослівний.

Потужна мова - це мова, яка дозволяє говорити багато різних речей з якомога меншою довжиною.


1
-1. Вибачте, але це не лише помилкове уявлення, але й небезпечне, оскільки воно може сильно утримати продуктивність далі вниз.
Мейсон Уілер

@ Мейсон Уілер: Ви могли б детальніше розробитись?
Джої Адамс

@Joey: Дивіться мою відповідь на це запитання.
Мейсон Уілер

1

Після того, як ви натиснете Turing повністю (і мові це легко зробити), "power" не означає багато, в тому сенсі, що все, що ви можете сказати однією цілковитою мовою Turing, ви можете сказати на іншій. Відповідь Марка Канласа : стислість та гнучкість мають значення.

Сказавши це, стаття Маттіаса Феллейсена " Про виразну силу мов програмування" робить цікавим читання. У ньому він намагається формалізувати поняття виразності в мовах.


До речі, це насправді не так. Я бачив мови Тюрінга повними, але менш потужними, ніж інші мови. Простий приклад: розгляньте мову, яка має лише цілі числа та рядки як свої типи даних, ніякого способу перетворення між ними, довільне обчислення на цілі числа, а лише рядкове об'єднання та порівняння на рядках. (Я працював з такою мовою.) Це Тюрінг завершений, але він не може виражати довільних функцій на рядках, тому додавання більшої функціональності збільшить його обчислювальну потужність.
reinierpost

@reinerpost - мова Тюрінг-повної мови все ще може обчислювати довільні функції на рядках, вона просто повинна представляти їх по-іншому. Забезпечення повноти в значній мірі є ортогональним щодо питання, які типи даних у вас є. Наприклад, деякі цілісні мови не мають типів даних і просто представляють все з функціями - і для арифметики доводиться вдаватися до таких речей, як кодування церкви.
mikera

1

Здається, існує велика незгода з приводу того, що становить мовну силу. Це лаконічність, розбірливість, пристосованість чи просто зрозуміла повнота Тюрінга? Я думаю, що всі ці фактори вступають у гру, тому, мабуть, найкращий спосіб поглянути на це з точки зору статичних балів. Так, я говорю тут рулонний RPG з папером.

Ідея полягає в тому, що кожна мова має (приблизно) однакову кількість "точок", які можна довільно розподілити по ряду категорій. Для цілей обговорення скажіть, що єдиними факторами є стислість, розбірливість та гнучкість. Мова може бути надзвичайно стислим та гнучким, але, отже, дуже важким для читання; або дуже розбірливий і гнучкий, але надзвичайно багатослівний.

(Можливо, кількість балів, які має розподілити мова, визначається майстерністю дизайнера та виконавця, але давайте зробимо вигляд, що всі дизайнери мови однаково хороші в тому, що роблять.)

Коли мовний дизайнер вирішує збільшити силу мови в одній категорії, вони логічно забирають частину цієї потенційної сили у кожної іншої категорії. Ось чому так часто говорять, що дизайн мови програмування стосується лише компромісів. З цієї точки зору загальна сила мови все ще не визначена, і ми повинні повернутися до випробуваного і справжнього методу класифікації мов, виходячи з їх відносних сильних сторін. Не задовольняє? Дуже погано.

Можна сперечатися двома способами: потужна мова - це мова з відносно рівномірним розподілом очок (джек усіх торгів, майстер жодної) або з якомога більшою кількістю очок в одній області, не залишаючи інших без нагляду (спеціаліст). Немає такої речі, як мова "ренесансової людини", з досконалим майстерністю у численних галузях. І якщо це ваше визначення найпотужнішої можливої ​​мови, то вам просто не пощастить.

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

За індукцією, єдиними програмістами, які зможуть побачити всі відмінності у силі між різними мовами, є ті, хто розуміє найпотужнішу. (Це, мабуть, мав на увазі Ерік Реймонд про те, що Лісп зробить вас кращим програмістом.) Ви не можете довіряти думкам інших, через парадокс Блуба: вони задоволені якою мовою вони користуються, бо це диктує як вони думають про програми.

Я не погоджуюся з вашою моделлю, що всі мови обов'язково мають однакову кількість балів у своєму розповсюдженні. Візьмемо крайній приклад brainf * ck, і ми можемо легко сказати, що він не порівнянний ні з однією сучасною мовою, навіть якщо тільки за загальною кількістю балів. тобто це не гра з нульовою сумою в мові програмування - мова не починається з х очок і розподіляє їх, вони починаються з 0 і отримують бали залежно від особливостей. Що є якийсь компроміс, який потрібно зробити, звичайно, природно, але всі варіанти не рівні (принаймні, на мою думку).
n1ckp

Я не сказав, що всі мови обов'язково мають однакову кількість балів. Я сказав, що всі розглянуті мови (тобто мови, призначені для реального використання) мають приблизно однакову кількість. Езотеричні мови - це патологічний випадок, оскільки вони розраховані не на користь в першу чергу. Я робив спрощення заради аргументу, оскільки не корисно намагатися розмежовувати мови на основі чистої "кількості особливостей", якщо насправді функції підлічуються.
Джон Перді

вибачте, що я перечитав вашу публікацію, і я повинен погодитися, що я читаю трохи занадто швидко .. але я все ще не погоджуюся, що кожна (основна) мова має приблизно однакові моменти. Візьмемо Java та c ++, оскільки вони є мовою, яку я знаю дещо добре. Я впевнений, що можу підтвердити, що c ++ є більш потужним, ніж Java, лише тому, що c ++ відключається в основному все, що робить Java (крім gc - але тоді Java також не пропонує управління пам'яттю вручну) PLUS більше (реальні шаблони FTW). Що я дещо сенс хотів зробити, я думаю: Ні, не всі мови є приблизно рівними в програмуванні казкової землі, навіть
n1ckp

при порівнянні лише основних мов.
n1ckp

0

Мови програмування - це інструменти - ні більше, ні менше. Деякі інструменти надзвичайно спеціалізовані та добре підходять для певних цілей; інші узагальнюються та спрощуються до точки майже непотрібності.

Я б заперечував, що найбільш "потужною" мовою є та, яка дозволяє досягти поставлених цілей з мінімальними витратами часу, енергії та інших досліджень; тобто мова, яка забезпечує найбільшу рентабельність інвестицій. У деяких ситуаціях це може бути C; в інших - Java; в інших, Хаскелл.

Найкраще зробити це - ознайомитись із найрізноманітнішими мовами та чим вони корисні. Потім, коли настає час розпочати новий проект, ви можете прийняти зважене рішення, яке було б найбільш підходящим.


-1

Дискусії про мови програмування - подібні до IMHO - дискусії про поштових клієнтів у деяких групах новин Linux: вони, як правило, є вогнею війни. Я пам'ятаю часи, коли VB6 був популярним. Люди навіть стверджували, що це зовсім не мова програмування, а інші створювали приголомшливі програми з нею.

Я думаю, що мови програмування відрізняються вже в концепції, оскільки творці мали на увазі різні речі, коли вони створювали / розробляли мову. Тож мова, яка відповідає одній цілі - і за цієї обставини є потужною - може не відповідати іншій. Називати мову потужною чи ні - це суто суб'єктивно. Однак, я не думаю, що існує метрика, яку можна застосувати.


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

-1

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


-1

Самий потужний мову програмування є той , який вирішує такі завдання лінійного програмування :

Максимізуйте

      Швидкість розвитку
    + Легкість читання коду
    + Простота налагодження
    + Стислість / стислість вираження
    + Простота навчання / навчання
    - використання процесора
    - вимоги до пам'яті

На тему

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

(І так, я знаю, я вже опублікував абсолютно суперечливу відповідь. Це тому, що я діалектик.)


-2

Це було написано стосовно природних мов, але я думаю, що це доречно і для мов програмування:

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

"Влада" просто не відноситься до однієї мови над іншою. Нерозумно було б сказати, що «китайська мова є більш потужною, ніж корейська». Так само нерозумно говорити, що "APL - це більш потужна мова, ніж COBOL".

Було кілька спроб прирівняти мовну владу до якоїсь об'єктивної міри. Я вважаю, що ці спроби провалюються:

  • Можливо, буде легше влаштуватися на роботу в США, якщо ти розмовляєш американською англійською, ніж скажеш маорі. Так само, без сумніву, легше отримати роботу з програмування Java або C, ніж LISP або J. Але ця економічна перевага, безумовно, не відображає певної вродженої сили мови. Це про силу носіїв мови.
  • "Привіт" не кращий, ніж "ni hao" або "shalom", оскільки він коротший. Аналогічно, хоча функція може бути виражена краще в APL, ніж COBOL, це теж не відображає певної вродженої сили мови.

На мою думку, дискусія про "владу однієї мови над іншою" є завуальованим вираженням почуття переваги мовця над якоюсь іншою групою. Коротше кажучи, її упередження та стереотипізація. Звичайно, люди, яким насправді забороняється, насправді вірять їх стереотипам досить сильно, і навряд чи ви могли б переконати їх змінити свою думку.


Я не погоджуюсь. Для простого прикладу, я думаю, ніхто не скаже інакше, ніж сказати, ніж існує більш потужна мова, ніж brainf * ck (скажіть), навіть якщо теоретично це завершення (я думаю). Справа в тому, що «потужний» - це певна якість, яка не має нічого спільного з тим, що всі вони «завершені». Я погоджуюся з тим, що це може бути дещо суб'єктивно, але сказати, що всі мови рівні щодо "потужності", здається, досить далеко.
n1ckp

1
@ n1ck: ти кажеш, що Power = читабельність? І:. Недостатня читабельність BF означає її недостатню силу? APL та J також мають дуже низьку читабельність, але вони надзвичайно корисні та стислі (хоча я, звичайно, не прирівнюю ні корисність, ні стислість до сили). В іншому напрямку COBOL дуже читабельний; його прямо-таки багатослівне; але знову ж таки, це навряд чи робить його більш потужним, ніж APL або BF. BF дуже забавно; вона має силу розважати; але це не Power Qua Power. Проблема полягає в тому, що, здається, ніхто не має хорошої теорії влади, за якою вони можуть досягти консенсусу.
AN Інше

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