Чому слабо типізовані мови все ще активно розвиваються?


17

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

$someVar = 1;
(...)  // Some piece of code
$someVar = 'SomeText';

замість того, щоб використовувати набагато іншу, строго набрану версію

int someInt = 1;
(...)
string SomeString = 'SomeText';

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


9
"Сильно набраний" - це не чітко визначений термін. Переважно це означає "ви не можете підривати систему типів". Це ортогонально тому, що ви описуєте вище, що може бути латентним проти маніфестного набору тексту або статичним проти динамічного набору тексту.
Френк Ширар

10
Що мені не вистачає, щоб перенести це з принади полум'я з кількома тісно пов'язаними, можливо, навіть дублюючими питаннями (просто шукайте SackOverflow для запитань про статичне та динамічне введення у їх тегах) до законного питання?

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

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

1
@delnan Допомагає той факт, що на це запитання є два обґрунтовані відповіді та не переходить у вогненну війну.
Адам Лір

Відповіді:


25

Сильне / слабке введення та статичне / динамічне введення тексту є ортогональними.

Сильний / слабкий - це те, чи має значення тип значення, функціонально кажучи. На мові з слабким типом можна взяти два рядки, які, начебто, заповнені цифрами та виконати додавання цілих чисел на них; у сильно набраній мові це помилка (якщо ви не вводите або конвертуєте значення спочатку у правильні типи). Сильний / слабкий набір тексту - не чорно-біла річ; більшість мов не є ні 100% суворими, ні 100% слабкими.

Статичне / динамічне введення тексту - це те, чи типи прив'язуються до значень або до ідентифікаторів. У динамічно набраній мові ви можете призначити будь-яке значення будь-якій змінній, незалежно від типу; статичне введення тексту визначає тип для кожного ідентифікатора, а присвоєння іншому типу або є помилкою, або призводить до неявного набору. Деякі мови застосовують гібридний підхід, дозволяючи статично оголошені типи, а також нетипізовані ідентифікатори ("варіант"). Існує також висновок типу - механізм, коли статичне введення можливе без явного декларування типу всього, шляхом компілятора з'ясувати типи (Haskell це широко використовує, C # розкриває його за допомогою varключового слова).

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


У відповідній слабо типизированного мови , як HyperTalk з окремими операторами для конкатенації і додавання (наприклад , припустимо , &для конкатенації), такі операції , як "12"+3і 45 & "6"не представляють ніякої двозначності (вони обчислюють 15 і і «456», відповідно). У більш сильно набраній мові оператор "+" може бути безпечно перевантажений як для конкатенації рядків, так і для числового додавання, не викликаючи двозначності, оскільки операції над рядками та числами будуть заборонені. Проблеми виникають, коли мова вказує нігті ні типи, ні операції, які слід виконати.
supercat

4

Слабке введення тексту більше відповідає лінії 1 == "TRUE". Цей розділ у вікіпедії чудово ілюструє різницю.

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

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


0

Мови слабкого типу все ще розробляються, оскільки люди їх використовують і подобаються. Якщо вам не подобається слабке введення тексту, не використовуйте слабко набрані мови. Заявляючи, що щось є Єдиним Істинним Шляхом і що всі повинні робити Це Єдиний Істинний Шлях, ігнорує складність світу.


0

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

Не обов'язково. Навчальна мета-С: Підручник вирішує це питання безпосередньо в контексті Цілі-С:

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

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