Коротка відповідь: ні, тому що еквівалентність Тьюрінга.
Довга відповідь: Цей хлопець є троллем. Хоча це правда, що системи типів "обмежують вас підмножиною", речі за межами цього підмножини, за визначенням, це речі, які не працюють.
Все, що ви можете зробити на будь-якій мові програмування, повністю завершеній Тьюрінгом (це мова, призначена для програмування загального призначення, а також багато, чого немає; це досить низька смуга для очищення, і є кілька прикладів того, що система стає Тьюрінґ- Ви можете це зробити ненавмисно) будь-якою іншою мовою програмування Тьюрінга. Це називається "еквівалентність Тюрінга", і це означає лише те, що він говорить. Що важливо, це не означає, що ви можете зробити іншу справу так само легко на іншій мові - дехто може стверджувати, що в цьому і полягає вся суть створення нової мови програмування: щоб вам було краще робити певні дії речі, які всмоктують існуючі мови.
Наприклад, система динамічного типу може бути емульована поверх статичної системи типу OO, просто оголосивши всі змінні, параметри та значення повернення як базовий Object
тип, а потім використовувати відображення для доступу до певних даних усередині, тож коли ви усвідомлюєте це ви бачите, що буквально нічого не можна зробити в динамічній мові, чого неможливо зробити статичною мовою. Але зробити це таким чином було б величезним безладом, звичайно.
Хлопець із цитати правильний, що статичні типи обмежують те, що можна зробити, але це важлива особливість, а не проблема. Лінії на дорозі обмежують те, що ви можете зробити у своєму автомобілі, але чи вважаєте ви їх обмежуючими чи корисними? (Я знаю, що я не хотів би їхати по зайнятій, складній дорозі, де нічого не сказати автомобілям, що рухаються у зворотному напрямку, щоб не триматися на своїй стороні, а не переходити туди, де я їду!) Встановлюючи правила, які чітко окреслюють те, що вважаючи недійсною поведінку і гарантуючи, що цього не відбудеться, ви значно знижуєте шанси на випадкові аварії.
Крім того, він неправильно характеризує іншу сторону. Справа не в тому, що "всі цікаві програми, які ви хочете написати, працюватимуть як типи", а, скоріше, "всі цікаві програми, які ви хочете написати, потребують типів". Як тільки ви виходите за певний рівень складності, дуже важко підтримувати базу коду без типової системи, щоб тримати вас в порядку з двох причин.
По-перше, тому що код без анотацій типу важко читати. Розглянемо наступний Python:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
Як ви очікуєте, що дані виглядатимуть так, що система отримує на іншому кінці з'єднання? І якщо він отримує щось, що виглядає абсолютно не так, як ви зрозумієте, що відбувається?
Все залежить від структури value.someProperty
. Але як це виглядає? Гарне питання! Що дзвонить sendData()
? Що це проходить? Як виглядає ця змінна? Звідки воно взялося? Якщо це не місцево, вам доведеться простежити всю історію, value
щоб відстежити, що відбувається. Можливо, ви передаєте щось інше, що також має someProperty
властивість, але це не робить те, що ви думаєте, що робить?
Тепер давайте розглянемо це з анотаціями типів, як ви могли бачити в мові Boo, яка використовує дуже схожий синтаксис, але статично набрана:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
Якщо щось відбувається не так, раптом ваша робота з налагодження просто набрала на порядок простіше: шукайте визначення MyDataType
! Крім того, шанс отримати погану поведінку, оскільки ви передали якийсь несумісний тип, який також має властивість з тим самим іменем, раптом переходить до нуля, оскільки система типу не дозволить вам помилитися.
Друга причина ґрунтується на першій: у великому та складному проекті ви, швидше за все, отримали декілька учасників. (А якщо ні, то ви будуєте його самостійно протягом тривалого часу, що по суті те саме. Спробуйте прочитати код, який ви написали 3 роки тому, якщо ви мені не вірите!) Це означає, що ви не знаєте, що було перебираючи голову людини, яка написала майже будь-яку задану частину коду в той час, коли вони її написали, тому що вас там не було, або не пам’ятаєте, чи був це ваш власний код давно. Наявність декларацій типу справді допомагає зрозуміти, у чому полягав намір коду!
Такі люди, як хлопець у цитаті, часто неправильно характеризують переваги статичного набору тексту як про "допомогу компілятору" або "про ефективність" у світі, де майже необмежені апаратні ресурси роблять це все менш актуальним з кожним роком. Але, як я показав, хоча ці переваги, безумовно, існують, головна користь полягає в людських факторах, зокрема, читабельності коду та ремонтопридатності. (Хоча додаткова ефективність, безумовно, приємний бонус!)