Про динамическую типизацию
Oct. 11th, 2012 01:33 pmПоразжигал немного в комментах у ребе Б. рознь к социальной группе "ленивые авторы языков". Чтобы не излагать свою позицию каждый раз заново, сохраню сюда.
Знаете, некоторые печальные даты надолго остаются в памяти людей: 11 сентября, 17 августа, 1917-й год, 1941-й. К ним стоит добавить 1995-й - год появления JavaScript, PHP, Ruby, ну и Java тоже. Кому-то захотелось по-быстрому добавить динамизма в веб-странички, и он за пару недель наговнякал интерпретатор, встроив его в браузер Netscape. Кому-то захотелось оживить свою домашнюю страничку, добавить счетчик посетителей, еще что-то, и он на коленке сделал такой вот изменятель страничек на стороне сервера. О больших проектах тогда никто не думал, personal home page назывался тот изменятель. А когда делаешь интерпретатор, проще всего сделать его на динамической типизации. Это банально очень просто. О системе типов вообще можно не задумываться, не говоря уже об их выводе. К сожалению, на фоне тогдашнего мейнстрима (Си, ранние плюсы, что там еще было?) эти скриптовые языки выглядели очень выигрышно, писать мелкие куски кода на них было намного проще. Что такое нормальная система типов тогда мало кто знал: хаскель был еще в пеленках, ML'и традиционно не выходили из университетов. Так что люди эти скрипты подхватили, стали добавлять все новые функции. Менять систему типов стало поздно. В итоге выросло то, что выросло. С тех пор одна масса людей занята тем, чтобы делать все более сложные интерпретаторы, которые бы не так тормозили, другая масса придумывает 121-й способ добавить в JS типы, а третья на динамических языках пишет и плачет в бложиках о том, как грустно им делается. И проблема не только и не столько в скорости, сколько в maintainability кода и усилиях на необходимые тестирование и отладку при росте проектов.
Единственная реальная причина появления динамически типизированных языков - лень и недальновидность авторов. Эволюционно динамические языки - тупиковая ветвь, хоть они и обречены рождаться вновь и вновь просто потому что их делать проще, а делать языки люди любят. Сегодняшняя популярность некоторых из них - случайность, исторический казус, следствие контраста между этими языками и мейнстримом начала 90-х. То, что много идиотов используют идиотские языки, говорит лишь о том, что идиотов много. Сегодня, когда есть языки с нормальной статической системой типов, никаких реальных преимуществ у динамической больше нет. Только я имею в виду действительно нормальные статически типизированные языки - как минимум с параметрическим и ad hoc полиморфизмами, с выводом типов. Не Си с джавой. Хаскель, окамл, скала - такого уровня. У этих конкретных языков могут быть свои проблемы, часто инфраструктурные, но речь сейчас не о них, речь о динамической vs. статической типизации в целом.
Знаете, некоторые печальные даты надолго остаются в памяти людей: 11 сентября, 17 августа, 1917-й год, 1941-й. К ним стоит добавить 1995-й - год появления JavaScript, PHP, Ruby, ну и Java тоже. Кому-то захотелось по-быстрому добавить динамизма в веб-странички, и он за пару недель наговнякал интерпретатор, встроив его в браузер Netscape. Кому-то захотелось оживить свою домашнюю страничку, добавить счетчик посетителей, еще что-то, и он на коленке сделал такой вот изменятель страничек на стороне сервера. О больших проектах тогда никто не думал, personal home page назывался тот изменятель. А когда делаешь интерпретатор, проще всего сделать его на динамической типизации. Это банально очень просто. О системе типов вообще можно не задумываться, не говоря уже об их выводе. К сожалению, на фоне тогдашнего мейнстрима (Си, ранние плюсы, что там еще было?) эти скриптовые языки выглядели очень выигрышно, писать мелкие куски кода на них было намного проще. Что такое нормальная система типов тогда мало кто знал: хаскель был еще в пеленках, ML'и традиционно не выходили из университетов. Так что люди эти скрипты подхватили, стали добавлять все новые функции. Менять систему типов стало поздно. В итоге выросло то, что выросло. С тех пор одна масса людей занята тем, чтобы делать все более сложные интерпретаторы, которые бы не так тормозили, другая масса придумывает 121-й способ добавить в JS типы, а третья на динамических языках пишет и плачет в бложиках о том, как грустно им делается. И проблема не только и не столько в скорости, сколько в maintainability кода и усилиях на необходимые тестирование и отладку при росте проектов.
Единственная реальная причина появления динамически типизированных языков - лень и недальновидность авторов. Эволюционно динамические языки - тупиковая ветвь, хоть они и обречены рождаться вновь и вновь просто потому что их делать проще, а делать языки люди любят. Сегодняшняя популярность некоторых из них - случайность, исторический казус, следствие контраста между этими языками и мейнстримом начала 90-х. То, что много идиотов используют идиотские языки, говорит лишь о том, что идиотов много. Сегодня, когда есть языки с нормальной статической системой типов, никаких реальных преимуществ у динамической больше нет. Только я имею в виду действительно нормальные статически типизированные языки - как минимум с параметрическим и ad hoc полиморфизмами, с выводом типов. Не Си с джавой. Хаскель, окамл, скала - такого уровня. У этих конкретных языков могут быть свои проблемы, часто инфраструктурные, но речь сейчас не о них, речь о динамической vs. статической типизации в целом.
no subject
Date: 2012-10-11 11:13 am (UTC)no subject
Date: 2012-10-11 11:26 am (UTC)дело в том, что когда нельзя тотально гарантировать корректность логики посредством типов (см. выше пример про перепутанные между собой номер счёта и назначение платежа) - то не получится отвертеться от необходимости писать (А) тесты и (Б) рантаймные валидаторы. а вот эта вот неизбежность тестов и рантаймных валидаторов - она достаточно сильно нивелирует пафос по части статической типизации ;-)
no subject
Date: 2012-10-11 11:32 am (UTC)no subject
Date: 2012-10-11 11:35 am (UTC)no subject
Date: 2012-10-11 11:45 am (UTC)no subject
Date: 2012-10-11 11:53 am (UTC)я хочу, чтобы волшебная система типов меня спасла!
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-10-11 11:43 am (UTC)Тесты - это одиночная стрельба в игре "морской бой". Типы - стрельба очередями, проходящими через все поле.
no subject
Date: 2012-10-11 01:32 pm (UTC)в условиях хитрозамуженного API и структур, естественно, mileage may vary. но призыв в такой ситуации продумать то, откуда взялась эта сложность и нужна ли она вообще, походу вообще ни у кого не вызывает отклика, так что ладно.
no subject
Date: 2012-10-11 03:43 pm (UTC)no subject
Date: 2012-10-11 03:57 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-10-11 12:34 pm (UTC)no subject
Date: 2012-10-11 12:39 pm (UTC)no subject
Date: 2012-10-11 02:06 pm (UTC)Кстати, работы не так, чтобы много. Даже на Java можно. Один полиморфный класс PString<A>, повторяющий только нужные действия над String, несколько пустых классов для обозначения полей и пошло-поехало.
Я тут ознакомился с TSP поближе. У них есть postmortem анализы работ, в которых выявляются ошибки и предлагаются действия по их устранению в будущих проектах.
Моё мнение, что иметь представление об ошибке и о том, как её можно исправить и не исправлять - не то, что преступление, но совершенно ненужная бравада своей отвагой. Наподобие "кто кого перепьёт".
no subject
Date: 2012-10-11 02:26 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-10-11 04:53 pm (UTC)генерики в жабе сделаны через очень большую жопу на самом деле.
(no subject)
From:no subject
Date: 2012-10-12 11:07 am (UTC)Где почитать? Смотрю на авиаторов и завидую тому, что у них есть разбор полётов.
(no subject)
From:no subject
Date: 2012-10-11 11:29 am (UTC)почему "большой софтверный проект" - это обязательно объектно-озабоченный монолит на десятки и сотни тысяч строк кода с паттернами, типами, кросс-зависимостями, жабами и змеями?
no subject
Date: 2012-10-11 11:45 am (UTC)no subject
Date: 2012-10-11 12:35 pm (UTC)А монолитный проект на C#/F#/Жабе хотя бы часть гарантий дает.
no subject
Date: 2012-10-11 12:55 pm (UTC)no subject
Date: 2012-10-11 03:51 pm (UTC)Надо будет посчитать интереса ради, как меняется число связей в полносвязной системе, если начать делить ее на кластеры. Где-то там в середине долна быть точка минимума.
no subject
Date: 2012-10-11 06:06 pm (UTC)как вы думаете, сколько у него депендансов на код аппликейшен сервера?
no subject
Date: 2012-10-12 08:54 am (UTC)no subject
Date: 2012-10-17 12:42 pm (UTC)Скрипты были на sh и awk в основном. ;-)
no subject
Date: 2012-10-17 12:44 pm (UTC)