Чи справді синтаксис має значення в мові програмування? [зачинено]


41

Один із моїх професорів каже, що «синтаксис - це інтерфейс мови програмування», такі мови, як Ruby, мають велику читабельність і вона зростає, але ми бачимо, що багато програмістів продуктивні з C \ C ++, тому як програмісти це дійсно має значення, що синтаксис має бути прийнятним?

Я хотів би дізнатися вашу думку з цього приводу.

Відмова: Я не намагаюся розпочати аргументи. Я подумав, що це гарна тема обговорення.

Оновлення: це виявляється хорошою темою. Я радий, що ви всі в цьому берете участь.


16
Гм, це, здається, припускає, що синтаксис C / C ++ поганий? Безумовно, деякі елементи шаблонів C ++ некрасиві, але що стосується мов (історично), C / C ++ все ще є дуже, дуже читабельним.
Macneil

2
добре, я знаю багатьох програмістів, які не погоджуються з цим, в основному, з рубінового співтовариства, проте його читабельніше, ніж ліс, наскільки я можу сказати :)
Сайф аль Харті,

9
Це був теоретичний курс? Пам'ятайте: професори часто одні з найгірших програмістів. Вони не мають поняття, що це таке, як у дикій природі.
робота

2
Читання - в очах глядача :).
MAK

8
Гарний синтаксис не може покращити жалюгідну мову. Але жалюгідний синтаксис може погіршити гарну мову;)
Даріо

Відповіді:


65

Так. Якщо ви сумніваєтесь, візьміть APL , або J , або Brainfuck , або навіть звичайний і простий Lisp або Forth, і спробуйте зрозуміти будь-яку не зовсім тривіальну програму. Потім порівняйте, наприклад, Python.

Потім порівняйте той же Python (або Ruby, або навіть C #) з такими речами, як Cobol або VB6.

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


26
Лисп, безумовно, зрозумілий.
cbrandolino

65
+1 за включення Lisp до списку нечитаних мов.
асмеурер

65
-1 за включення Lisp до списку нечитабельних мов.
Пол Натан

27
Програмування взагалі є нечитабельним для непосвячених. Як музичні позначення, так і архітектурні плани. (= XY) так само читається, як X == Y, тому, хто вміє читати.
Пол Натан

6
Я любив APL, і якщо код навмисно не був написаний для придушення (це дуже легко зробити), його було досить легко прочитати. Сила синтаксису полягала в тому, що ви могли запрограмувати алгоритми на 2 або 3 рядки коду APL, які потребували б десяток чи сотень рядків C, Fortran або COBOL. Лаконічність та потужність такої мови, як APL, є важливою для цього обговорення, оскільки спроба прочитати сотні рядків коду іншої мови може бути так само неприємною, як і розшифровка незрозумілих елементів APL.
oosterwal

11

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

Також я вважаю корисним в деяких контекстах аналізувати та / або генерувати фрагменти коду за допомогою іншої комп'ютерної програми. Складність розбору мови та / або генерування правильного коду потім безпосередньо впливає на те, скільки зусиль потрібно для створення / підтримки таких інструментів.


Чудове спостереження про друкарські помилки, які легко розрізнити.

7
Але в теорії немає різниці між теорією та практикою.
робота

10

Я вважаю, що ваш професор має на увазі синтаксичний цукор .

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

Отже, що має на увазі ваш професор, - це те, що будь-який код / ​​синтаксис, написаний однією мовою програмування, може бути виражений на інших мовах так само - або навіть тією ж мовою.

Роберт Мартін, витягнувши із теореми про структуроване програмування , абстрагував те, що програмісти принципово роблять з мовами програмування у своєму викладі на RailsConf 2010: Роберт Мартін (відео на YouTube, дивіться через 14 хвилин, хоча я рекомендую все це):

  • Послідовність (завдання)
  • Вибір (якщо заяви)
  • Ітерація (do-петлі)

Тобто всі програмісти роблять, від однієї мови програмування до іншої, просто в іншому синтаксисі або інтерфейсі користувача (UI). Це я здогадуюсь вашого професора, якщо він / вона говорить абстрактно про мови програмування.

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


Ви б назвали C просто синтаксичним цукром для асемблера?
Горан Йович

1
Я б. Але я стверджую, що синтаксис має значення. ;)
Леннарт Регебро

2
"... Роберт Мартін абстрагував те, що програмісти принципово роблять ..." Роберт Мартін? Роберт Мартін ?? Ви можете насправді розглянути цей документ: C. Böhm, G. Jacopini, "Діаграми потоків, машини Тюрінга та мови з лише двома правилами формування", Comm. ACM, 9 (5): 366-371,1966. що, як правило, зараховується як джерело «Теореми структурованої програми». en.wikipedia.org/wiki/Structured_program_theorem
leed25d

@ lee25d Я не хотів вважати дядька Боба автором абстракції, але як джерело, де я чув це нещодавно (і пов'язане з ним). Але дякую за посилання, я оновлю свою відповідь, щоб відобразити ваше посилання.
губка

Згаданий вище фрагмент Вікіпедії не зовсім розуміє історію "теореми про структуроване програмування". Ідея передувала Bohm & Jacopini. Вклад Бома і Якопіні показав, що це була теорема, а не просто здогадка, тобто вони надавали суворий формальний доказ.
Джон Р. Стром

7

Так і ні.

У синтаксису є кілька різних аспектів.

  • читабельність
  • виразність
  • проаналізація

Читання вже згадувалося.

Експресивність - цікавий випадок. Я буду використовувати приклад передачі функцій, тому що це свого роду перегин семантичного / синтаксичного болю.

Візьмемо для прикладу C ++. Я можу створити функцію першого порядку після цієї моди:

class funcClass
{
  int operator()(int);
}
funcClass fun;

void run_func(funcClass fun)
{
   fun();
}

Ця особлива ідіома зазвичай використовується в Елементах програмування Степанова .

З іншого боку, я можу імітувати його в Common Lisp з чим - то на кшталт цього :

(defun myfunc() )

(defun run_func(fun)
  (fun))

Або в Perl -

   sub myfunc
   {
   }

   sub run_func
   {
      my $func = shift;
      $func->();          #syntax may be a little off.
   }

Або в Python -

def myfunc():
    pass

def run_func(f):
    f()

Усі вони мають - по суті - однаковий смисловий зміст, хоча приклад C ++ містить метадані певного типу. Яка мова виражає ідею найкращого функціонування вищого порядку? Звичайний Лісп ледве робить синтаксичну варіацію. C ++ вимагає створення класу просто для 'виконання' функції. Perl досить відвертий щодо досягнення певного рівня диференціації. Так само і Python.

Який підхід найкраще відповідає проблемній галузі? Який підхід найкраще може висловити думки у вашій голові з найменшою «невідповідністю імпедансу»?

Пасивність - на мій погляд, - велика справа. Зокрема, я маю на увазі здатність IDE розбирати та рубати мову, не допускаючи помилок. Переформатування корисне. Мови, обмежені токеном, як правило, добре розбирають - ruby ​​/ c / pascal тощо.

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


5

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

if (AlertCode = RED)
   {LaunchNukes();}

2
+1: Цікаво, що я ніколи не бачив (або визнавав) цього сумнозвісного жарту "останнього помилка в світі". Але я бачу, як залежно від синтаксису мови (або насправді навіть семантики) результатом цього псевдокоду може бути що завгодно. Враховуючи семантичний кут, це дійсно може бути пов’язане з класичним випадком культурних невдач.
Стівен Свенсен

Ось чому ви повинні використовувати умовні умови Yoda, тобто if(RED = AlertCode)ніколи не слід компілювати, тому що RED є постійним (або повинен бути!)
Malfist

4
@Malfist: І таким чином ми бачимо, що поганий синтаксис призводить до ще гіршого компенсації синтаксису. Умовні умови Yoda некрасиві і важко читати, оскільки вони не так, як люди думають про пов'язану концепцію. Моя думка більше нагадувала "це (одна з багатьох причин), чому слід уникати сім'ї С, коли це можливо".
Мейсон Уілер

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

3
Залежить від того, що REDє. Якщо це 0, то LaunchNukes()його ніколи не називатимуть.
dan04

5

Синтаксис має значення, і я можу навести два підтверджуючих приклади: Ділан, який є Lisp з більш звичайним синтаксисом, і Liskell, який є Haskell з синтаксисом, подібним до Lisp. У кожному випадку був запропонований варіант мови, який мав абсолютно однакову семантику, але кардинально відрізнявся синтаксисом.

У випадку з Діланом вважалося, що скасування s-виразів на користь чогось більш звичайного допоможе залучити більш широке коло програмістів. Виявилося, що синтаксис - не єдине, що заважає програмістам використовувати Lisp.

У випадку з Ліскеллом вважалося, що використання s-виразів дозволить легше використовувати макроси. Виявилося, що макроси справді не потрібні в Haskell, так що і експеримент не спрацював.

Ось у чому річ: якби синтаксис ні для кого не мав значення, жоден експеримент не був би спробуваний.


1
Ділана було занадто мало, надто пізно над іншими мовами. Те, що було на його користь, не могло це компенсувати. Ми більше не можемо припустити, що це збій синтаксису, ніж провал в іменуванні.
Macneil

@Macneil: Ти маєш рацію щодо занадто малої, занадто пізньої речі. Скидання синтаксису Ліспа було лише завершальним цвяхом у труні. Я не думаю, що це була основна причина відмови Ділана, але я не впевнений, як переформулювати відповідь, щоб найкраще це відобразити.
Ларрі Коулман

Цікаво, що я не знав, що вони мали синтаксис Lisp у більш ранній версії ... Це було, коли його називали Ральфом? Спочатку Newton Message Pad мав Ділана в основі. Через 15 років у нас є iOS з об'єктивом-C в основі, меншою мовою двох - IMHO.
Macneil

Я не пам'ятаю точних подробиць про те, коли Ділан втратив s-вирази. Я давно ховаюся на comp.lang.lisp, і пам’ятаю тему, що з’являється в одному з їх періодичних полум'ях над дужками.
Ларрі Коулман

Ділан передував Java, і я не думаю, що тоді було багато C ++.
Том Хотін - тайклін

3

Відповідь може бути в розділенні того, що "має значення", на комп'ютерні фактори та людські фактори . У синтаксисі є багато людських факторів:

  • Читабельність
  • Успішність
  • Технічне обслуговування
  • Педагогіка
  • Попередження помилок
  • Відповідність цілі - це мова REPL, мова сценарію чи велика мова системи?

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

Це може бути причиною того, що ви завжди отримаєте відповідь "так і ні" на це запитання - адже в ньому є два аспекти.


1

Без синтаксису у нас не було б спільного «шаблону», з якого на людському рівні спілкуватись про намір блоку коду. Синтаксис забезпечує загальну основу, з якої компілятори можуть бути стандартизовані; методи можуть бути спільними; технічне обслуговування можна спростити.


Чому моя відповідь була заперечена?
IАнотація

1

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

Для всього, окрім веб-розробки (та математики), я виявив, що C / C ++ все ще є мовою операційної системи та програми. Це те, що підтримується більшість часу для справжньої багатопотокової, попередньої форми, розробки міжплатформних додатків. І синтаксис С - це нормально. Просто дуже простий і відносно багатослівний. Дивовижний синтаксис насправді не так важливий. Потужність та доступність API - нам усім потрібно взаємодіяти з кодом інших людей (що більшість часу написано на С або його похідних).


У мене немає ніяких труднощів із C, але натовп ML / Haskell, певно, може щось сказати щодо нарізки.
Рей Міясака

+1 для "доступу до API": я думаю, це може бути навіть важливіше, ніж мовні функції.
Джорджіо

1

Синтаксис, безумовно, має значення. Це надзвичайно цінно, якщо синтаксис мови є досить гнучким, щоб можна було створити зручну і читабельну для домену мову для вашої програми. Якщо ви сумніваєтесь у цьому, просто уявіть, як робите проблеми з алгеброю на прозаїчній латинській мові, як це було зроблено до 18 століття, або уявіть собі обчислення без знайомих тепер позначень Лейбніца. Звичайно, текст обчислення не читається для початківців, але з практикою ми можемо використати обчислення та нотацію Лейбніца для швидкого вирішення класу завдань, які потребували сторінок математики класичними методами. Програмування - це ще один шматочок математики. Зручне позначення, близьке до проблемної області, може змінити продуктивність.


DSL - це не все про синтаксичний цукор. Семантика - набагато цінніша частина. Добре розробити eDSL, які нічого не додадуть до наявного синтаксису.
SK-логіка

@SK: звичайно, але семантика знаходиться під повним контролем програміста. Синтаксис обмежений базовою мовою. Ми можемо створити зручні DSL в межах Groovy та інших мов, але не так багато на Java.
кевін клайн

1

Ось програма, яка обчислює факультет з 6:

S(K(S(S(SI(KK))(K(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)
(S(KS)(S(K(SI))K))))(KK)KK))))))(S(K(S(S(K(SI))(SII)(S(K(SI))(SII))
(S(K(S(S(KS)(S(KK)(S(SI(KK))(K(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)KK)))))))
(S(K(S(S(KS)(S(K(SI(KK)))(SI(K(KI)))))))(S(K(S(K(S(S(K(SI))(SII)(S(K(SI))
(SII))(S(K(S(S(KS)(SI(KK)))))(S(S(KS)(S(K(S(KS)))(S(K(S(KK)))(S(S(KS)K)
(K(SI(K(KI))))))))(K(K(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)))))))))))
(S(S(KS)K)(K(SI(K(KI)))))))))))(S(S(KS)K)(K(SI(K(KI))))))(S(S(KS)(S(KK)(S(KS)
(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)
(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)
(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)
(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)KK)))))))

Синтаксис мінімальний:

expression: expression term | term
term: ‘(‘ expression ‘)‘ | combinator
combinator: 'S' | 'K' | 'I' 

Здається, поширена думка, що синтаксис - це те, що ускладнює мову. Як це часто трапляється з загальноприйнятими переконаннями, саме навпаки.

Зауважте, що синтаксис LISP читабельний (якщо він взагалі є), оскільки він має набагато більше синтаксису, ніж вище. Отже, якщо шанувальники LISP скажуть вам, що "синтаксис не має значення", попросіть їх бути послідовними та спробуйте обчислення SKI. Їм доведеться визнати, що трохи синтаксис не так вже й поганий.


Я не можу зрозуміти проголосування. Це дійсно глибока відповідь. +1
scravy

0

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


6
Як щодо "часу на ринок", "вартості на користь" тощо?
робота

0

Так, синтаксис має значення, хоча насправді лише для читабельності. Порівняйте:

for i in range(10):
   print(i)

(Так, це Python) с

FOR(i<-RNG-<10){PRN<-i}

(Так, це мова, яку я щойно склав) Обидва робили б абсолютно те саме, однаково, але синтаксис інший, і Python читається легше. Так що так, синтаксис безумовно має значення. Навіть "синтаксичний цукор" має значення.

 @property
 def year(self):
     return self._date.year

Легше читати, ніж

 def year(self):
     return self._date.year
 year = property(year)

0

Так, звичайно.

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

void foo() {
  // blah
}

VS

void foo()
{
  // blah
}

або навіть VS

void foo() 
{ // blah
}

І це просто та сама мова! Крім того, запитайте їх про пробіли, де вони розміщуються (назва функції та брекет, оператори тощо).

1000 відповідей гарантовано!


я не хочу ініціювати полум'я & поки що у мене є гарні відгуки, і я дякую їм усім за участь & підвищення моїх знань, і я ставлю на облік, що інші люди вважають це корисним
Сайф аль Харті,

0

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

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

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

foreach (Рядок у stringList)

До:

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

...будь-який день!


0

Синтаксис має значення для тих, хто його вивчає, чим нижче бар'єр для вступу, тим популярнішою мовою може бути спочатку. Але якщо мові важко чи неможливо виразити своє самовираження і лаконічно, воно почне засихати за популярністю.

Дуже лаконічний і непрозорий (Perl) такий же поганий, як надмірно багатослівний і багатослівний (AppleScript).

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


-2

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


3
Гм ... 10000 SLOC parse.yу Рубіні не згодні. Існує причина, коли кожна з 7-ми реалізованих Ruby-готових реалізацій Ruby використовує один і той же аналізатор, і кожна окрема реалізація Ruby, яка коли-небудь намагалася розробити власний аналізатор, зазнала невдачі.
Йорг W Mittag

А потім з’явилася сумнозвісна мова ADA. Поряд з мовними специфікаціями було 100 програм, які повинні були запуститись правильно, щоб засвідчити компілятор. Про синтаксис було кілька справді тонких речей. Щоб зробити короткий короткий опис, КОЖЕН ранній компілятор ADA побудував пару цих програм. І виправити помилку було не просто, але потрібно було починати з нуля. Незважаючи на те, що він мав величезну державну підтримку (усі договори DOD передбачали ADA), він загинув нещасною смертю.
Омега Кентавра

-2

Простіше кажучи: синтаксис як такий не має значення. Семантика, яку ви можете висловити через неї, має значення.


5
В якості вправи напишіть складний аналізатор на C, а потім драйвер пристрою в Haskell. Чи допомагав вам синтаксис? Тоді зробіть навпаки, суворо дотримуючись семантику обох програм. </irony>
9000

1
@ 9000: Я бачив пару драйверів пристроїв у Haskell. Я не міг бачити нічого особливо поганого з ними. Хочете допрацювати?
Йорг W Mittag

2
@ 9000, враховуючи, наскільки важко отримати драйвери пристрою прямо в C, я не впевнений, що ви вибрали хороший приклад.

1
@ 9000: Це був саме мій погляд. Конкретна природа синтаксичної конструкції не має значення, це те, що ви виражаєте з нею. Мова програмування з точним синтаксисом Haskell , але в якому використовується інша стратегія оцінювання, змусить багато Haskell працювати жахливо або навіть застрявати в нескінченних петлях. Що стосується синтаксичних конструкцій (або ширше: мовних особливостей), то важливим є не їх конкретний синтаксис, а їх семантика, тобто те, що ви можете висловити з ними.
back2dos

@ 9000, це не буде проблемою написати парсер у Haskell із синтаксисом, подібним С (або драйвер, використовуючи C із синтаксисом, схожим на Haskell).
SK-логіка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.