Чому старі мови програмування продовжують переглядати?


46

Це питання не: "Чому люди все ще використовують старі мови програмування?" Я це добре розумію. Насправді дві мови програмування, які я найкраще знаю, - це C і схема, обидві вони датуються 70 -ми.

Нещодавно я читав про зміни в C99 та C11 порівняно з C89 (що, здається, все ще є найбільш використовуваною версією C на практиці та версією, яку я дізнався у K&R). Оглядаючись навколо, здається, що кожна мова програмування у важкому використанні отримує нову специфікацію принаймні раз на десятиліття або близько того. Навіть Fortran все ще отримує нові версії, незважаючи на те, що більшість людей, які його використовують, все ще використовують FORTRAN 77.

Порівнюйте це з підходом, скажімо, набірної системи TeX. У 1989 році, випустивши TeX 3.0, Дональд Кнут заявив, що TeX є повноцінною функцією, і майбутні версії будуть містити лише виправлення помилок. Навіть поза цим він заявив, що після смерті "всі помилки, що залишилися, стануть функціями", і жодних додаткових оновлень абсолютно не проводиться. Інші можуть розщедрити TeX і зробили це, але отримані системи перейменовані, щоб вказати, що вони відрізняються від офіційних TeX. Це не тому, що Кнут вважає, що TeX є ідеальним, а тому, що він розуміє цінність стабільної передбачуваної системи, яка зробить те саме за п’ятдесят років, що це робить зараз.

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

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

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

Які (реальні чи сприйняті) переваги оновлення мовного стандарту, на відміну від створення нової мови на основі старої?


2
Багато компіляторів можуть викликати комутатори, які застосовуватимуть старіші стандарти (наприклад, --std=xперемикач GCC ), тому це не так, якби створення нових стандартів призводить до інструментів, що дестабілізує старий код.
Blrfl

2
Як ви визначаєте "нову мову на основі старої"? Я б стверджував, що Fortran 90 - це "нова мова", заснована на старому F77. Це повністю змінило те, як ви програмуєте - фіксований проти вільного джерела, динамічну проти статичної пам’яті тощо. Ви також можете стверджувати, що Fortran 2003 - це «нова мова», заснована на F90 - вона додала об'єктно-орієнтованого програмування, зберігаючи сумісність з F90. Схоже, що стосунки між C ++ та C.
tpg2114

1
Я думаю, що це питання є дуже важливим, і я не розумію, чому деякі хочуть його закрити. Це дуже цікаве явище, яке, мабуть, має якесь пояснення. Кілька (20?) Років тому я читав про нові функції Fortran і запитав себе: якщо програмістам Fortran потрібні ці функції, чому вони просто не переходять на C? Нещодавно я мав подібний розгляд щодо C ++: якщо розробники C ++ хочуть використовувати лямбда, чому б не перейти до, скажімо, OCaml ( linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php )? Чому вони вважають за краще створити нову мову і все ще називають її C ++?
Джорджіо

3
@ tpg2114 Різниця між (FORTRAN 77: Fortran 90) і (C: C ++) полягає в тому, що Fortran 90 вважається витісненим FORTRAN 77, до того моменту, коли людям кажуть: "Якщо ви хочете навчитися Fortran, вивчіть Fortran 2003 або принаймні 90, тому що це зараз стандарт ". Ніхто не скаже щось на кшталт "Якщо ви хочете вивчити C, вивчіть C ++, тому що це новий стандарт", оскільки вони представлені у вигляді двох різних мов. Як я вже сказав, конотації мають наслідки.

6
ЗАПАС С НЕ Вмирає
Адель

Відповіді:


13

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

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

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

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

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

В якості побічного коментаря я вважаю, що аргумент, що дозволяє еволюцію при збереженні сумісності зі застарілим кодом, досить слабкий: Java може викликати код C, Scala може легко інтегруватися з кодом Java, C # може інтегруватися з C ++. Існує багато прикладів, які показують, що ви можете легко взаємодіяти зі застарілим кодом, написаним іншою мовою без необхідності сумісності вихідного коду.

ПРИМІТКА

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

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


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

@SunAvatar: Наскільки я знаю, у Ліспа є кілька діалектів, але деякі з них є більш успішними, ніж інші (загальні Lisp, схема, ракетка, Clojure). Щоразу, коли ви розпочинаєте нову мову, ви ризикуєте, що навколо неї зберуться лише дуже невеликі громади. У спільноті Лісп це здається звичайною практикою: якщо у когось є нова ідея, вони розгалужуються і бачать, що відбувається. Для творців інших мов втратити спільноту - це не варіант.
Джорджіо

@SunAvatar: Я не вважаю успадкування існуючих бібліотек вагомим аргументом. Для цього вам не потрібна сумісність вихідного коду. Подивіться, наприклад, як Clojure і Scala можуть використовувати код Java.
Джорджіо

1
Мови не вмирають, лише програмісти, які ними користуються.
Еван Плейс

@SunAvatar: Є також спільноти, які намагаються дотримуватися іншої політики: ім’я визначає мову, і якщо частина спільноти створює діалект, який занадто сильно розходиться, вони використовують свіжу назву, щоб уникнути плутанини. Дивіться, наприклад, racket-lang.org/new-name.html
Джорджіо

21

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

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

Що стосується Кнута, пам’ятайте, що він академік і що TeX є лише правильним, а не оновленим.


14
Проблемна область текстового тексту наукового тексту Tex = мало змінилася. Область мов програмування = пошук нових застосувань для нових комп’ютерів є досить розширною. Це та сама причина, що латинь не додає так багато нових слів, як англійська
Мартін Бекетт

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

@Martin Beckett: "Проблемна область текстового тексту наукового документу Tex = не дуже змінилася.": Я думаю, ви пропускаєте точку питання. ОП не запитує, чи має бути інновація в мовах програмування (ніхто не може заперечити, що інновації необхідні), але чому старі мови переглядаються замість створення нових.
Джорджіо

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

Якби не оновлені стандарти мови COBOL та реалізатори інструментів COBOL, додаючи до цього свої власні унікальні функції, це покращило мову та покращило можливість роботи на більш широких, основних, сучасних платформах; додаток не пережив би 60 років. Незважаючи на те, що відносні витрати, безумовно, зросли пізніше в житті, через дефіцит експертних знань, цілі зусилля складали копійки на долар порівняно з звичайним переписуванням, коли з'явилася мова моменту.
JustinC

5

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


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

Ні, я мав на увазі, що мови все ще активно використовуються, і ними користуються люди, які хочуть скористатися найновішими методами. Я не думаю, що ніхто не буде додавати підтримку багатопотокових програм до ALGOL, оскільки (AFAIK) він не використовується активно. FORTRAN та COBOL все ще використовуються для розробки нових систем, тому їх мовні характеристики періодично оновлюються, щоб включити нові методи та технології.
TMN

1

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

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

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


1
Зміни, які ви описуєте у другому абзаці, є досить непередбачуваними (під якими я маю на увазі не просто те, що я не заперечую, але і що ніхто не може серйозно заперечити). Щодо лямбда, то я не можу коментувати їх корисність у C ++, але навіщо турбуватись додавати їх, якщо не змінювати спосіб вираження алгоритмів?

О, вони неймовірно корисні. Не зрозумійте мене неправильно. Вони є найважливішим доповненням у C ++ (IMO). Я думаю, мені не було зрозуміло, що я там маю на увазі. Зазвичай обирає C ++ для прямого доступу до пам'яті, детермінованої продуктивності та високого потенціалу оптимізації. Це не змінюється з останніми доповненнями. Ми спрощуємо багато інших завдань програмування навколо того, чому ви вибрали C ++, але C ++ все ще діє та корисно з тих же причин. Схема оновлюється регулярно, але код-коди-дані та безладність не змінюються, тому ви обираєте схему з тих же причин, що й 20 років тому.
Бен

"Що стосується лямбда, я не можу коментувати їх корисність у C ++, але навіщо турбуватися додавати їх, якщо не змінювати спосіб вираження алгоритмів?": Я йду ще далі: навіщо додавати їх у C ++ замість переключення на мову, що мав їх з самого початку?
Джорджіо

2
@Giorgio Щоб контролювати функції кешу та абстракції в мові. Якщо жодна з існуючих мов не забезпечує обох, то ви не можете перемикати мови, не жертвуючи жодною. Ви повинні змінити мову або створити нову.
mike30

@mike: Що ви маєте на увазі під "кеш-функціями"?
Джорджіо

-2

Це трохи схоже на розгляд розмовної мови.

У минулому там, де слова, які використовувались не так часто, як зараз (або використовуються для іншого значення).

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

Погано: не дуже давно поганий мав лише одне значення, тепер він може означати щось надзвичайно дивовижне (воно використовується феєрично (я, мабуть, сумую за написаним фесивом)!

Ще одна нова розробка - мобільний телефон "Текстовий розмова" для письмових мов.

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

Я знаю людей, які розмовляють багатьма різними мовами, і вони часто припускають, що після 3-ї чи 4-ї стало легше вивчити нову.

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

Я знаю, що я відчуваю, що програмую хаппі в JAVA (настільки ж, як я відчуваю, що хаппі говорять англійською) . Так само, як їхати з Java на PHP до Perl, конструкції схожі, але є маленькі готчі, щоб мене наздогнати і змусити бити головою об стіну.

Це відрізняється від переходу з англійської на французьку або Java на SAS. вони настільки різні, що знадобиться досить багато часу, щоб стати ними досвідченим.

У будь-якому випадку, це мій погляд на це.


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