Який передбачуваний приріст продуктивності динамічного набору тексту? [зачинено]


82

Я часто чув твердження, що мови, що динамічно набираються, є більш продуктивними, ніж мови, які мають статичний характер. Які причини цієї претензії? Хіба це не просто інструментарій із сучасними концепціями, такими як конвенція щодо конфігурації, використання функціонального програмування, вдосконалені моделі програмування та використання послідовних абстракцій? Справді, буває менше затруднень, оскільки (наприклад, на Java) часто надмірні декларації типу не потрібні, але ви також можете опускати більшість декларацій типу на мовах статичного типу, які використовують умови виводу, не втрачаючи інших переваг статичного введення тексту. І все це доступно і для сучасних мов, що мають статичний тип, як Scala.

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

Пояснення: Мене більше цікавлять великі / середні проекти, ніж швидкі хаки. :-)


10
Чи очікуєте ви, що "статичний дует" буде швидшим або продуктивнішим, ніж "динамічний дует"?
Steve314

Що ти маєш на увазі з дуетом? У будь-якому випадку: я можу подумати про кілька причин того, що статичне введення тексту є більш продуктивним, ніж динамічне введення тексту: більше перевіряє компілятор на помилки, завершення коду, більше інформації про наміри програміста в коді. Ось чому я запитую про зворотне.
Ганс-Пітер Штерр

11
Це був жарт із пунктом. "Динамічний дует" - Бетмен і Робін. Вони б не завдали майже такого ж страху в кримінальному підземному світі Готем, якщо їх назвуть "статичним дуетом". Оскільки розробники - це люди, поверхневі речі можуть змінити значення незалежно від того, що означають терміни.
Steve314

Перше моє запитання - я знаю, що роблю чи ні. Якщо я це зробити, то я можу спроектувати речі достроково, а статичне введення тексту має сенс. Якщо цього не зробити, тоді мені доведеться багато чого змінити на ходу, і динамічне введення тексту стане простіше. Common Lisp - найкраща мова, яку я знайшов, коли я не знаю, що роблю. (Caveat: Я лише подряпав Хаскелл, і, отже, не маю гарного почуття для висновку про статичне набір тексту.)
David Thornley,

2

Відповіді:


99

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

Причини динамічного набору тексту є більш продуктивним:

  • Це більш стисло - багато сторонніх кодових шаблонів можна видалити, якщо все динамічно набрано декларації типу, логіки набору тексту тощо. Усі інші речі, однакові, коротший код пишеться незначно швидше, але що важливіше, можна швидше читати та підтримуйте (оскільки вам не потрібно перебирати багато сторінок коду, щоб зрозуміти, що відбувається)
  • Простіші "зловмисні" методи, такі як набирання качок та виправлення мавп, можуть отримати результати дуже швидко (хоча згодом можуть вас заплутати ...)
  • Більш інтерактивна - динамічне введення тексту, можливо, більше підходить для інтерактивного програмування, подібного до REPL, для швидкого прототипування, налагодження в режимі реального часу запущених екземплярів програми або навіть кодування в реальному часі.
  • Тестові випадки можуть виявити помилки під час виконання - якщо припустимо, що ви використовуєте TDD або, принаймні, маєте хороший тестовий набір, це має вирішити будь-які проблеми введення тексту у вашому коді.
  • Кращий поліморфізм - динамічні мови з більшою ймовірністю сприяють створенню поліморфних функцій та абстракцій, що може підвищити продуктивність та повторне використання коду. Наприклад, Clojure широко використовує динамічний поліморфізм у багатьох своїх абстракціях .
  • Прототипи - моделі даних / об'єктів на основі прототипу, на мій погляд, є більш потужними та гнучкими, ніж статично типізовані спадкові спадщини. Динамічні мови швидше дозволяють або заохочують підхід, заснований на прототипі, відмінним прикладом є Javascript.

Причини статичного набору тексту є більш продуктивним:

  • Кращий дизайн - примушення думати про типи значень у вашому програмному забезпеченні на передній план може підштовхнути вас до більш чистих і логічних рішень. (Я кажу, що можна - все-таки можна створити дійсно поганий код ...)
  • Краща перевірка часу компіляції - статичне введення тексту дозволяє забезпечити більше помилок під час компіляції. Це величезна перевага, і, мабуть, найкраща річ у загальномовному типізованому мові.
  • Автоматичне завершення - статичне введення тексту може також надати більше інформації для IDE, щоб автоматичне завершення пошуку коду чи документації було більш ефективним.
  • Перешкоджає хакам - вам доведеться зберігати дисципліну типу у своєму коді, що, швидше за все, буде перевагою для довгострокового ремонту.
  • Введення тексту - у деяких мовах (напр., Scala) це може отримати багато лаконічних переваг динамічних мов і надалі підтримуватиме дисципліну типу.

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

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


14
+1, дуже детальна відповідь. Значення пункту "Краща перевірка часу компіляції" не може бути підкреслено достатньо.
NoChance

8
Поряд з типом Inference, є також перевантаження в стилі Haskell, шаблони C ++, загальна інформація та, можливо, деякі інші мовні функції, які забезпечують деякі переваги введення качки в рамках статичного набору тексту - доки об'єкт забезпечує необхідний інтерфейс (він "крякає, як качка") ви можете використовувати його, майже незалежно від того, що об'єкти номінального типу. "Практично" тому, що деякі підходи вимагають декларування "такого типу трясенів, як відповідні види качки" - наприклад, декларації "класу" в Haskell.
Steve314

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

21
Я прошу не погодитися з більшістю причин, наведених тут. Візьміть Haskell, який, мабуть, там має найсуворішу систему. У нього є REPL (насправді принаймні дві), він відрізняється дуже потужним поліморфізмом, виконуючи відповідність шаблонів на конструкторах, і він такий же стислий, як можна сподіватися - набагато більше, ніж Javascript або Python. Тому я здогадуюсь, що деякі з причин, які ви згадуєте, є випадковішими, а не притаманними нещільно набраним мовам.
Андреа

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

56

За допомогою динамічних мов ви можете писати скажений код швидше, ніж при використанні набраної мови.

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

Це підвищення продуктивності :)

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

Тож підвищення продуктивності може бути міфом для середнього / великого проекту протягом його життя.


11
Так, мій досвід той самий. Сценарій Perl зі 100 рядками добре, і без таких чудових інструментів ми б втратили. Але 100-лінійний проект Perl, швидше за все, буде кошмаром.
Інго

3
... і тоді у вас є JavaScript (не просто динамічний, але і слабо набраний).
День

16

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

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

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


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

5
загальні контейнери та явне спів- / протиріччя мають на меті «заважати», якщо ви робите це неправильно. яка користь від компіляції коду, який вийде з ладу під час виконання?
М.Страмм

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

-1 Не стосується фактичного питання ("підвищення продуктивності", пам’ятаєте?) Також, напевно, ви навіть не хочете писати ті "дійсні програми, які система типу відкидає". Просто тому, що ти не можеш означати, що ти повинен. І чому ви навіть маєте "дійсну програму", яку перевіряє машинка? Що, ви кодували програму Javascript і раптом намагалися зробити її компіляцією на Java?
Андрес Ф.

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

15

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

Вам не доведеться думати про це так сильно - писати код, який робить щось нетривіальне з будь-яким об’єктом на Java, важко і, ймовірно, вимагає роздумів, які в основному динамічно набираються; з чимось на зразок JavaScript, написання функції, яка робить щось цікаве для всіх об'єктів, є другою природою. Ідеальним прикладом може бути функція, яку я нещодавно писав, яка бере об’єкт і замінює всі його методи на ті, які роблять те саме, але і знімають подію. Я поняття не маю, як підійти до подібного на Java. Однак я не впевнений, наскільки це пов’язано із типовими системами та скільки через інші мовні відмінності.

Однак я нещодавно почав використовувати Haskell. Haskell дозволяє мені писати абстрактний, загальний код так само легко, як і будь-яка динамічно набрана мова, яку я використовував. Мій приклад Java / JavaScript вище в Haskell не має сенсу, оскільки в ньому немає об'єктів, методів, подій або навіть багато мутацій, але інші види загального коду дуже легко написати.

Насправді, Haskell може написати якийсь загальний код, який динамічно набраних мов не може; ідеальним прикладом є readфункція, яка в основному протилежна toString. Ви можете отримати Intабо будь-який Doubleабо будь-який тип, який хочете (до тих пір, як це у певному класі типу). Ви навіть можете мати поліморфні константи , тому maxBoundможуть бути максимумом Int, Double, Char... і т.д .., Все залежить від того, якого типу він повинен бути.

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

Однак навіть у типовій системі Haskell є деякі набридливі проблеми, яких у вас не було б у динамічно набраній мові. Найбільше мене дратувало - це спосіб обробки чисел; наприклад, вам доведеться возитися з типовою системою, щоб використовувати length(список) як подвійний, з чим у вас не було б проблем без системи типу. Ще одна дратівлива річ, з якою я зіткнувся - це робота Word8(непідписаний тип int) та функції, які очікують Int.

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


1
Так, чомусь важко підібрати системи числення. У scala це також безлад. Я думаю, що системи динамічного типу перемагають над простими статичними системами типів з точки зору простоти роботи з нею, але програють від більш досконалих (наприклад, Scala, Haskell, ML тощо), де всі використовуються варіанти system-F ).
Едгар Клеркс

3
Ваша відповідь цілеспрямована, але має помилки. По-перше, це неправда, що динамічні мови "не мають системи типів", тому це не може бути причиною того, що вони "полегшують запис загального коду". Це не робить простіше, як показує ваш власний контрприклад з Haskell (ви розвінчуєте своє власне твердження!). "Ніколи не доведеться боротися з системою типів" є помилковим: ви боретеся з нею щоразу, коли ви маєте виправити помилку, спричинену недостатньою статичною перевіркою тексту. Нарешті, явне примушування Intповерненого списком тривіальне; Приклад: 1.0 + fromIntegral (length myList), тобто просто використовувати fromIntegral.
Андрес Ф.

2
Нарешті, "швидко писати код"! = "Бути більш продуктивним". Ваш код повинен працювати! Якщо ви пишете баггі програмне забезпечення, на яке пізніше потрібно витратити час на налагодження та виправлення, ви не будете продуктивними.
Андрес Ф.

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

Якщо типові системи дійсно підвищили продуктивність, де є всі корисні програми в Haskell або Idris? Я думаю, такі речі, як просте розуміння помилки типу, "промальованість" (здатність редагувати додаток непередбачуваними способами) та 90% перевірка помилок у документах та висновку типу можуть бути важливішими.
aoeu256

7

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

Це має історичні причини. Якщо повернутися на кілька десятиліть назад, динамічні мови, безперечно, були набагато продуктивнішими, ніж статичні мови (в той же час значно повільніше). Perl, очевидно, набагато продуктивніший, ніж C, якщо ви знаєте і те, і завдання під рукою дозволяє будь-яке. Але з часом мови багато запозичили один у одного, і новіші мови звужують розрив (і в продуктивності, і в продуктивності).

Ось кілька моментів, які слід врахувати:

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

Безпека пам’яті : Це підвищення продуктивності, що вам не доведеться турбуватися про те, щоб стріляти в ногу. Перед "керованими" статичними мовами, такими як Java, статичні зазвичай означали прямий доступ до пам'яті. Налагодження також є частиною продуктивності, і небезпечний доступ до пам'яті може призвести до дійсно незрозумілих помилок.

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

Велика стандартна бібліотека. З-за великої стандартної бібліотеки Python славно рекламувався як "батареї включені". Це порівняно з C, які мають дуже мінімалістичну стандартну бібліотеку. Але на таких платформах, як Java та .net, велика стандартна бібліотека стає стандартною, і нові мови, такі як Scala та F #, успадковують це "безкоштовно".

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

Синтаксис закриттів та лямбда - динамічні мови зазвичай мали це з самого початку, але статичні мови прийняли це, останнім часом Java.

ВІДПОВІДАЙТЕ можливість швидкого тестування фрагментів коду в інтерактивному режимі - величезна користь. Але хоча інструменти IDE, як "безпосереднє" вікно у Visual Studio, статичні мови можуть певною мірою імітувати це.

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

Підсумок: Історично це було правдою, але сьогодні відповідь менш чіткий.


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

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

Рефлексія Рефлексія - це принципово динамічна функція набору тексту. Ви перевіряєте типи об'єктів на raterime rater, ніж час компіляції. Коли він був представлений, це було нахмурено, але в C # використання рефлексії стає все більш і більш всюдисущим, наприклад, ASP.Net MVC сильно використовує рефлексію.

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

Linq - SQL, EF mv. Різні трансформатори Linq перевіряють запити як об’єкти виконання та генерують sql на ходу. Це не стає більш динамічним, ніж перевірка коду під час виконання. CodeDom - інша сторона монети, де код може створюватися під час виконання

Roslyn Roslyn в основному реалізує eval, що колись вважалося визначальною рисою справді динамічної мови.

Dynamic The dynamic-type є найбільш чітко динамічною особливістю в C #, і рекламується при спрощенні та продуктивності взаємодії із зовнішніми об'єктами та мовами. Але він також використовується в Asp.net MVC для зручності.

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


Мені дуже не подобається ця відповідь, тому що майже всі пункти не стосуються основного питання: "Який передбачуваний приріст продуктивності динамічного набору тексту ?" не динамічні мови .
няня

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

@nanny: Питання насправді задає питання про "динамічно набрані мови", а не лише про "динамічне введення тексту".
ЖакB

@MichaelT Вибачте, я не зрозумів. Динамічне введення тексту є одним із аспектів усіх динамічних мов. Ця відповідь говорить про інші аспекти, які, історично, динамічні мови, як правило, приходять, не реально звертаючись до частини динамічного набору тексту.
няня

1
@nanny: Я в основному відповідаю на це: "Я часто чув твердження, що мови, що динамічно набираються, є більш продуктивними, ніж мови, які набираються статично. Які причини цього твердження?" - Я вважаю, що причини цього твердження є історичними та пов'язані не тільки з динамічним набором тексту, але і з іншими функціями підвищення продуктивності динамічних мов.
ЖакB

6

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

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

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

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

Програмування стає набагато простішим, коли ваша мова не замикає вас на релігійному виборі парадигм, а намагається бути просто хорошим інструментом. Існує ряд статичних та динамічних мов та змішаних мов, які досягають успіху в цьому. Деякі з них легко вивчити, найбільш важко освоїти.
Їх сила походить від того, як можна скласти їхні індивідуальні особливості, щоб легко створити прості рішення складних проблем. Це виключає певну ортогональність, яку можна досягти лише завдяки делікатному балансу включення чи упущення всіх досліджених досі мовних особливостей. Якби ви спробували додати статичний набір до Ruby, ви його покалічили, якщо б ви спробували відібрати його від Haskell, ви розтрощили б його. На відміну від цього: якби ви забрали його з C, люди навряд чи помітили б, і якщо ви відібрали його від Java, дехто може вам подякувати.

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

Але знову ж таки, статичне введення самотужки не може зробити нічого. Це питання комбінації. Я думаю, що десь між F #, Scala, Nemerle, OCaml або haXe ви можете знайти свій власний оптимум. Але це в кінцевому підсумку залежить від вас, адже мова повинна дозволяти вам вкладати свої думки без зусиль, а не змушувати вас згинати їх навколо себе. Зрештою, ніщо не приносить більшого підвищення продуктивності, ніж якщо програмування - це весело.


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

Ви можете доповнити динамічний набраний код такою інформацією, як значення аргументів за замовчуванням / аргументи ключових слів, типи, отримані з висновку типу, динамічні умовиводи типу компілятора JIT або просто вхід у систему всіх функцій [пройти кожну функцію чи клас у запущеній програмі та замінити їх на версія функції, яка записує свої аргументи / результати). Тоді ви можете побачити журнал попередніх запусків функції. Інша ідея полягає в тому, щоб відхилити код, який не має анотацій типу, контрактів на виконання або зразкових тестів сеансів REPL, але надає розробнику можливість вибору будь-якого з цих трьох.
aoeu256

3

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


0

Я думаю, що перш за все вам потрібно визначити "продуктивність". Що означає "продуктивність праці" та що вона включає?

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

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


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

@AndresF. О, я в основному використовую Python та C ++.
яобін

1
Гаразд, але ви не можете узагальнити динамічну та статичну, коли ви фактично порівнюєте Python та C ++. C ++ не є особливо репрезентативним прикладом мови зі статичним набором тексту. Існують надзвичайно стислі мови статичного типу, які в більшій чи меншій мірі дозволяють писати програми так коротко, як і в Python. Отже, загалом ваше твердження помилкове.
Андрес Ф.

Так, але що робити, якщо ви редагуєте програму, поки вона все ще працює? Будь-які проблеми з часом запуску будуть виникати просто, і ви можете їх виправити прямо там. У Lisp, коли ви отримуєте помилку, ви можете просто виправити свою програму, а потім продовжувати її запускати ... Так, для більш складних шляхів анотації типів було б добре [можливо, ви можете використовувати поступове введення тексту, як mypy & lisp], але ті більш складні шляхи. також є можливість помилок без типу, тому уникати складних шляхів будь-якою мовою може бути хорошою ідеєю.
aoeu256

-1

Великою перевагою динамічного набору тексту є продуктивність.

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

Штрафи за швидкість (або відсутність!) Та споживання ресурсів не такі погані, як можна було б очікувати, і в більшості випадків більш ніж компенсуються швидкістю та гнучкістю розвитку.

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

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

  1. Java JVM покращилися до невпізнання.
  2. Сучасні IDE покращили б продуктивність C ++ та Java-кодерів, однак це дуже мало змінило мову мов сценаріїв.
  3. C # буде включений і, ймовірно, знаходитиметься в тому ж парці кулі, що і Java, але трохи краще.

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


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

5
Це дослідження використовує лише C, C ++ та Java як приклади статичних мов, а потім намагається застосувати висновки, знайдені до традиційних мов програмування загалом. Усі три мови поділяють один і той же основний синтаксис, з однаковими притаманними вадами зменшення прдуктивності, що робить порівняння недійсним. Справа не в тому, що статичні мови непродуктивні, це те, що сімейство C непродуктивне. Якби вони включили діалект Паскаля у свої тести, вони, швидше за все, зробили б різні висновки.
Мейсон Уілер

@mason - в цій галузі існує дуже мало фактичних об'єктивних досліджень. Це одне з небагатьох реальних досліджень з фактичною кількістю тощо. Програма "зразок" не є тривіальною! Він поєднує в собі елементи обробки словника, складні алгоритми та великі обсяги даних. Високий відсоток невдалих і руйнуючих спроб підтверджує нетривіальний характер завдання.
Джеймс Андерсон

2
-1 Ви мало говорите про те, що робить динамічні введені мови більш продуктивними. Параметри та словники за замовчуванням можна знайти в типових мовах, наприклад, Scala.
Йонас

1
@JamesAnderson Ще гірше, папір, на яку ви посилаєтесь, навіть не підтримує вашу думку. Він порівнює "мови сценаріїв" (часто динамічні) із " звичайними мовами" (часто статичними). Тепер, скажіть мені, що саме це «звичайні» мови? Як ви вважаєте, це те саме, що набір мов зі статичним набором тексту? Ще гірше, папір не така вже й стара. До 2000 року вже існувало безліч чудових мов із статичним набором тексту, які, мабуть, були більш продуктивними, ніж динамічні мови.
Андрес Ф.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.