Чи заслуговують динамічні набрані мови всі критики? [зачинено]


35

Я прочитав кілька статей в Інтернеті про вибір мови програмування на підприємстві. Останнім часом популярними стали багато динамічних набраних мов, наприклад Ruby, Python, PHP та Erlang. Але багато підприємств все ще залишаються зі статичними мовами типу C, C ++, C # та Java.

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

Основна причина, чому підприємства не починають використовувати такі мови, як Erlang, Ruby та Python, здається, це те, що вони динамічно набираються. Це також, здається, є основною причиною, чому люди на StackOverflow вирішують проти Ерланга. Дивіться, чому ви вирішили "проти" Ерланга .

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

Дійсно, чому на підприємствах так багато критики проти динамічного набору тексту? Це насправді так сильно впливає на вартість проектів, чи що? Але, можливо, я помиляюся.


3
Я вважаю, що статичний набір із виведенням типу та можливим набором качок - це найкращий спосіб вчинити. Це також дуже складно
Casebash

2
Я щойно переглянув набрання качки C # (я не використовую мову), і хоча це, здавалося б, повністю виконало визначення набору качки, необхідне багатослів’я ніби перемагає мету. Це не означає, що це часом не корисно.
Chinmay Kanchi

3
Це лише я чи є більше критики щодо статично набраних мов, ніж динамічно набраних? Також, на мій досвід, вибір мов / технологій великих «підприємств», схоже, диктується сучасними тенденціями / безпечним вибором, а не реальними технічними достоїнствами.
МАК

2
@ChinmayKanchi: Verbosity? Ви просто декларуєте щось як dynamicі починаєте його використовувати. Це не більш багатослівне, ніж звичайні виклики методу або перевантаження оператора.
Joey

4
Я не можу підрахувати кількість годин, які я витратив на мою поточну помилку налагодження в моїй компанії в Groovy on Grails коді, яку компілятор виявив би негайно, якби ми використовували Java.
WKS

Відповіді:


46

Так, я вважаю, що вони так роблять.

Є кілька причин, які потрібно враховувати при виборі мови для нового проекту:

  • Швидкість виконання. Порівняно з C / C ++ / Fortran, Perl і Python настільки повільні, що смішно.
  • Швидкість ініціалізації. Порівняно з перерахованими вище швидкими мовами, Java опускається і плаче, коли JVM продовжує завантажувати та завантажувати, і ... while(1)....
  • Прототип-здатність. Вичерпно переглядаючи та виконуючи роботу з декларацією / визначенням, необхідною для C ++ або Java, збільшується LOC, що є єдиним відомим показником, який надійно корелює з рахунками помилок. Це також займає багато часу. Це також вимагає трохи більше продумати типи та з'єднання.
  • Внутрішня чутливість. Динамічно возитися з вашими внутрішніми є чудовими, поки ви не почнете налагоджувати свій самовиправляючий код . (Python, Lisp, Perl)
  • Перевірка правильності. Компілятор може забезпечити швидкий повторний пропуск напівкоректності вашого коду в C ++, і це може бути справді приємно.
  • Деталі статичного аналізу C і Java мають досить хороший статичний аналіз. Perl не є повністю статистично проаналізованим на теоретичному рівні (можливо, і Python). Я впевнений, що і Лісп не є.
  • Дивні платформи приймають лише C, загалом.
  • Ланцюг підтримки. Якщо у вас може бути укладення контракту, ви побачите і працюєте над вашими помилками, це величезна кількість .

Якщо ви можете припустити, що організація, з якою ви працюєте, має принцип "Іти вперед" (для цього існує термін бухгалтерського обліку), і не просто випадково вирішить не працювати над програмним забезпеченням, то у вас є набагато кращий випадок для за допомогою програмного забезпечення. Оскільки немає великого продажу бізнесу (що несе відповідальність за його підтримку) Python / Perl / $ dynamic_language, це значно знижує ризик.

На мій досвід, у сервісів з відкритим кодом часто виникають проблеми з повною відповідальністю за помилки та випуск оновлень. "Це безкоштовно, ви працюєте над цим!" - це не відповідь, прийнятна для більшості підприємств (не серед інших їх компетенцій).

Звичайно, я не говорю про світ webapp / startup, який прагне грати за правилами високого ризику / високої винагороди та бути дуже відкритим для того, щоб залишитися на пенітному краю техніки.


16
"Це безкоштовно, ви працюєте над цим!" <- Найбільша проблема з F / OSS взагалі, я б
поставив

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

4
Ви можете отримати комерційну підтримку будь-якого великого проекту з відкритим кодом. Великі компанії використовують динамічно набрані PL для великих частин (впевнені, що підходять), Facebook використовує PHP (UI) та Erlang (чат), Twitter використовує Ruby (UI), Google використовує Python (я не знаю для чого), а Lisp і Python є використовується в багатьох складних науково-дослідних проектах. Примітка: Я - розробник C #, я (майже) ніколи не використовував динамічно набрану мову; але ці пункти не є валідними в значній мірі.
Каве Шахбазян

4
Мені подобається ваша відповідь, але Java не динамічно набирається ...
Mehrdad

2
@PaulNathan: Ти занадто важко думаєш. Питання було про динамічно набрані мови, і ця відповідь згадує Java як би динамічно набрану.
Мехрдад

24

Ви надаєте занадто багато технічного кредиту керівникам підприємств. Є стара приказка: "Ніхто не звільнявся за покупку IBM". Якщо ви підете іншим маршрутом, і все стає непомітним (вони завжди роблять), ніхто не хоче ризикувати, щоб його звинуватили. Дотримуйтесь стандартів і звинувачуйте когось іншого.

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

І не будемо забувати про мільярдні рядки коду, написані у VBA!


1
+1 для "... підприємства завтра [і] будуть використовувати ці мови."
rdmueller

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

17

Причина, по якій підприємства використовують C, C ++, C # та Java, не полягає в тому, що вони набрані статично (принаймні, не безпосередньо). Запевняю вас, керівники підприємств не роблять такого вибору на основі об'єктивного порівняння типів систем.

Компанії роблять турботу про:

  • Довгострокові витрати на обслуговування : чи можна обґрунтовано очікувати, що справи продовжуватимуть працювати добре через 10 років? Насправді це добре, якщо еволюція мови консервативна та зворотно сумісна (як у Java). Тут є корисним статичне введення тексту, оскільки воно вловлює основні типи помилок під час компіляції, перш ніж вони потрапляють у ваші виробничі системи .....
  • Доступність талантів - чи зможете ви знайти розробників, щоб підтримувати вашу блискучу нову систему? Що робити, якщо оригінальний розробник піде, чи всі інші зрозуміють код? Це спричиняє значну перешкоду для впровадження будь-якої "нової" мови (особливо якщо вона також створює нові вимоги до розгортання, побудови систем, оперативної підтримки тощо). Це дає величезні переваги мовам, які широко використовуються (C, C ++, C # і Java)
  • Витрати на інтеграцію : чи легко підключитися / інтегруватися з іншими технологіями, які у вас вже є або є ймовірними придбати? Якщо у вас вже є стек застарілих систем J2EE, тоді вам потрібно інтегруватися з ними. Нове рішення Java EE для цього, ймовірно, буде набагато практичнішим, ніж, наприклад, Python.
  • Передбачуваність / низький ризик : чи підтверджена платформа / мова, і чи можу я бути впевненим, що вона буде працювати? Зазвичай це важливіше простої продуктивності. Менеджеру набагато простіше переконати свого начальника дати йому великий бюджет на робочу силу для побудови нової системи, ніж для нього повернутися пізніше і сказати, що це не спрацювало .....
  • Підтримка / підтримка підприємств - чи є основними міжнародними організаціями підтримка мови та платформи? Чи підпишуть вони договір на підтримку мене, щоб я мав кого зателефонувати, якщо все піде не так?
  • Нейтральність постачальника / незалежність платформи - я збираюся замикатися на одному постачальнику? Або у мене доступний широкий спектр майбутніх варіантів постачальників / шляхів переходу? Ви не хочете застрявати в архітектурному тупику, не в змозі досягти прогресу, поки ваші конкуренти їдять ваш обід. Якщо ви робите свою роботу належним чином як архітектор підприємства, вам потрібно подумати над цим предметом як мінімум на 5-10 років.

Особисто я вважаю, що якщо ви хочете використовувати динамічні мови на підприємстві, то на сьогоднішній день ваш найкращий шанс - це використовувати щось, що відповідає за існуючу екосистему підприємства. Найбільш помітними є нові динамічні мови JVM: наприклад, JRuby, Groovy, Clojure. Що стосується управління ІТ, то це "безпечний" динамічний вибір мови, оскільки вони функціонують усередині і чудово грають з рештою екосистеми корпорації Java.


1
Не можу повірити, що ще ніхто не підтримав вашу відповідь.
Себастьян Н.

11

Основна причина, чому підприємства не починають використовувати такі мови, як Erlang, Ruby та Python, здається, це те, що вони динамічно набираються.

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

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


8
Дійсно? Востаннє я бачив, що Google кинув досить велику вагу та значні зусилля з розробки за Python, включаючи наймання творця Python та дозволяючи йому витрачати 50% свого часу на роботу над мовою. Google також вніс велику кількість коду в Python, особливо зараз, коли ненавантажена ластівка була об'єднана у вихідне дерево Python 3. Це робить для мене Python "великим іменем бізнесу".
Chinmay Kanchi

13
@Chinmay Kanchi: Цікаво, як ви робите свій висновок із статистики з розміром вибірки 1.
Timwi

6
Touché. Однак деякі ваші висновки також є помилковими. Правильно реалізувати динамічну мову набагато складніше, ніж реалізувати мову, що має статичний характер. Динамічний набір тексту, безумовно, не є "ледачим чоловіком", як ви сказали. Це дозволяє розробникам лінуватися, але не людиною, яка пише компілятор / інтерпретатор. Насправді оптимізація динамічно набраної мови настільки важка, що я можу думати лише про одну мову, яка останнім часом широко отримувала цю обробку (JavaScript), хоча є проекти з оптимізації / JITting для інших мов (Python, PHP).
Chinmay Kanchi

2
Крім того, якщо ви вважаєте, що динамічно набрані мови найчастіше використовуються у відкритих середовищах, це далеко не чітко. Залежно від вибраної метрики це може бути правдою, але часто це не так. Вимірюючи рядки коду, C виграє дальнім ударом. Якщо ви вимірюєте, які мови використовуються в проектах з відкритим кодом, включаючи багатомовні, найпопулярнішими мовами є JavaScript, C, C ++ та PHP у цьому порядку. Якщо ви вимірюєте лише основну мову, найпопулярнішими мовами є Perl, Java, C # та JavaScript. bit.ly/C6xTB
Chinmay Kanchi

7
Звичайно, написати оптимізатор для динамічно набраних мов важко, але це не інтерпретатор : ви можете усувати всі перевірки типу, а решта - те саме. Жоден аматорський виробник мови не думає написати оптимізатор. - Щодо останнього біта, я не мав на увазі того, що більшість програм з відкритим кодом написано на динамічній мові програмування, а більшість мов програмування з відкритим кодом (я сказав "середовища", тому що я говорю про компілятори / перекладачі, IDE тощо) динамічно набираються.
Тімві

9
  • Мови, що динамічно набираються, як правило, повільніше, ніж їхні родичі, які мають статичний тип.
  • Помилки важче зрозуміти і їх важче налагодити
  • Компілятор / перекладач, як правило, набагато менш вибагливий щодо того, що можна, а що не можна робити. тобто ви вловлюєте лише синтаксичні помилки на етапі компіляції
  • Якщо ви не дуже обережні з дизайном динамічно універсальна мова, ви в кінцевому підсумку з JavaScript, який є мова коду, запахи

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


1
Хоча правда, що компілятор не є вибагливим, інтерпретатор зазвичай є. Здебільшого перекладач виявляє проблемні ситуації та сигналізує про помилки.
Вінстон Еверт

17
Я люблю динамічне введення тексту, але ненавиджу не попередньо визначати змінні! Так багато разів я випадково ввожу нову змінну, тому що я неправильно написав ім'я змінної.
Френк Ширар

1
@Frank: Я непримітно люблю те, що Perl має налаштування форсувати оголошення змінної. На мою думку, це одна з переваг Perl.
Пол Натан

8

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

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

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


2
"Сприймаються" деякими програмістами. Коли у мене є аргументи з програмістами щодо динамічного набору тексту, вони, як правило, визнають, що вони ніколи насправді не використовували таку мову.
Френк Ширар

1
@Frank, ви кажете, що люди, які стверджують про неповноцінність динамічного набору тексту, як правило, не використовували його?
Вінстон Еверт

2
@Frank: Я використовував таку мову, і більшу частину часу результат був незбагненним безладом. (Справедливо кажучи, це був PHP, а у PHP є інші проблеми, крім динамічного набору тексту)
Біллі ONeal,

@Billy: Я думаю, що це звичайне явище. Я протягом багатьох років переймався динамічним типізацією через свій досвід роботи з VB - коли врешті-решт зрозумів, що ця страшна, шизофренічна реалізація динамічного набору тексту не типова, моя думка кардинально змінилася.
Shog9

@Winston: Я кажу, що люди, з якими я посперечався, не мають. Для мене це був випадок, "динамічне введення тексту не може працювати" ... але вони із задоволенням використовуватимуть багато методів, вперше розроблених на, і для динамічних мов (IDE, рефакторинг, у верхній частині моєї голови). Крім того, такі питання: stackoverflow.com/questions/2317579 вказують на те, що, мабуть, не є універсальним, мій випадок сперечатися з цим не можу працювати, але я не намагався програмістів, не відокремлений. (Мені здається, що обидва підходи мають значення.)
Френк Шірар

8

Зауважте: це здебільшого суб’єктивно і ґрунтується на моїх переживаннях та враженнях.

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

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

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

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

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

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

Інша причина, що корпорації підприємств не використовують сильно динамічно набрані мови - це застарілий код. Як би нерозумно нам не здалося, великі корпорації часто дотримуються рішень, які працюють, навіть якщо вони вже минули термін їх зберігання. Ось чому так багато великих компаній застосовують Internet Explorer 6 і так повільно модернізують свої ОС. Ось чому вони часто пишуть новий код "старими" мовами (наприклад, старовинні версії Java): набагато простіше додати кілька рядків коду до неживого програмного забезпечення, ніж отримати схвалення на повне перезапис у новій мова.

tl; dr: статичні мови більше схожі на бюрократію, тому підприємливі менеджери їм подобаються краще.


3
Мови з правилами введення нечестиво-гусячі створюють багато можливостей для речей, які неправильно справляють своєрідну роботу. Наприклад, у JavaScript, передача числа до коду, який очікує, що рядок часто поводиться так, як ніби хто передав рядкове представлення цього числа, але не завжди. Якщо намагатися, наприклад, додати 456 до 123, це не призведе до 123456, але натомість отримає 579. Якщо тільки не зрозуміло, хто несе відповідальність за перетворення числа в рядок, це може бути зроблено надлишком або взагалі не виконати.
supercat

1
@supercat, я думаю, що PHP та JavaScript є хорошими прикладами для двох способів вирішення цього питання (що стосується операторів): у PHP оператори однозначні - +приймає номери та додає їх, якщо потрібно конкатенацію, яку потрібно використовувати .; в JS обидві операції мають одного оператора - якщо ви не знаєте, як будуть вести себе ваші значення, очікується, що вони явно перетворять їх. Звичайно, це також має відношення до дружнього введення та суворого набору тексту (Python навіть суворіший), але в основному ви повинні переконатися, що ваші значення мають правильний тип, або змусити ваші операції виконувати очікувані типи.
Алан Плюм

1
Я не дуже знайомий з PHP, але це здається, що він використовує те, що я назвав би "правильним" підходом. Javascript є IMHO в багатьох аспектах гидотний, але я вважаю, що поведінка "+" є однією з найгірших. Насправді, я не переконаний, що динамічне введення loosy-goosy матиме велику перевагу перед сильнішою системою типів, яка дозволила інтерфейсу заявляти, що речі якогось іншого класу чи типу інтерфейсу повинні розглядатися як такі, що реалізуються або випливають із нього, з певними правилами про те, як претензії були б пріоритетні. Велике обмеження, про яке я знаю при існуючих структурно типових структурах, полягає в тому, що ...
supercat

1
... якщо двоє людей самостійно розробляють подібні інтерфейси, третя сторона не може написати код, який може використовувати їх взаємозамінно. Якщо третя сторона могла б визначити новий інтерфейс і заявити, що реалізація будь-якого або обох існуючих повинна автоматично реалізувати новий (використовуючи обгортки, що поставляються в новому інтерфейсі, якщо потрібно), я думаю, що це оброблятиме 99% того, що є семантично добре щодо динамічного набору тексту.
supercat

3

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

З мого досвіду (і я не намагаюся узагальнити це твердження), програмісти, які критикують динамічні мови, не використовували їх. Бесіда зазвичай йде "але при статичному наборі компілятора виявляється стільки помилок!" і я кажу "ну, це просто не проблема, на мій досвід". (Зазвичай інші програмісти походять з Java, Delphi або подібних програм; я не знаю жодних програмістів Haskell або ML.)

Єдине , що на насправді коліки мене, коли хто - то стверджує , що метод Foo не може можливо зробити (або може бути дуже важко зробити) в динамічно типізований мову ... коли цей метод був винайдений в, по і динамічно типізований мова. ІДЕ? Невеличка розмова. Автоматичний рефакторинг? Невеличка розмова. Викликаючі / виконавці? Невеличка розмова.


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

6
Коли інший програміст походить з Haskell, він / вона вже знає, що це чудова мова як для Java, так і для динамічних мов;)
Андрес Ф.

0

Підприємства просто не використовують нові мови та інструменти досить швидко, і для цього є вагомі причини. Але коли один із основних інструментів на зразок C # реалізує деякі з цих функцій, вони потраплять в основні підприємства ....


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