|
Модератор
|
|
Динамически типизированные языки : один вред, никакой пользы31.01.2016, 01:13. Показов 9182. Ответов 177
Метки нет (Все метки)
Я имею ввиду языки, в которых только или почти только используются динамически типизированные данных. Не будем сейчас рассматривать рефлексию, в языках .NET или java – там используются динамические типы, но используется сама рефлексия относительно редко.
Где ещё, якобы нужна динамическая типизация? Для доступа к БД? Не нужна, если сама БД не написана на динамическом языке и/или не специально спроектирована для взаимодействия с динамическим языком. Если посмотреть API конкретных СУДБ (например, oracle, postgreSQL, Firebird/Interbase, SQLite) или ODBC API, то выяснится, что динамическая типизация не нужна. Для JSON ? Нет, не нужна. Библиотеки для работы с JSON реализованы, наверное, для всех распространённых, статически типизированных языков. Метапрограммирование? Смотря какое. Если под ним подразумевать выполнение строки кода введённого пользователем, то может оказаться и нужна. Только это для скриптов. При чём для скриптов без предкомпиляции (хотя бы в байт код). Сейчас 21 век, и код, даже на скрипте, должен вначале хотя бы парситься с проверкой типов весь, что бы не выгребать баги лопатой после жалоб пользователей (тулзы типа JSHint, это эрзацы. Декларации типов должна быть встроены в язык и несоответствия обнаруживаться компилятором.). А если под метапрограммированием понимать перекладывание на компилятор генерацию рутинных, повторяющихся кусков кода, то такое метапрограммирование (как и программирование вообще), предпочтительно типобезопасное и в динамической типизации не нуждается. Сторонники динамических языков часто возражают примерно так «мне нужно, что бы переменная xyz принимала то значение строки, то значение вот с эдакой структурой». Заметим, на практике, если уж мы будем работать с содержимым xyz, то кол-во вариантов конечно, и ограничено логикой программы (да, для выполнения, например, копирования xyz в другую область памяти, нам ничего кроме ссылки и размера не нужно, но не для работы с конкретным её содержимым). А раз так, то xyz может быть алгебраического типа. В pascal можно заменить на запись с вариантами, в С на union и пр. Распространённость динамически типизированных языков я связываю со временем, когда web-сервера были практически только у провайдеров, а они разрешали абонентам использовать на своих страницах почти только perl и php. В те времена ни о какой предкомпиляции и JIT слыхом не слыхивали. Как и о песочницах. Интерпретаторы этих скриптов делали на коленке и каждый помаленьку. По этому они, впрочем как и js, по дизайну напоминают письмо из простоквашино. Потом скрипты «возмужали» и «заматерели», обзавелись кое где JIT-ом, но примитивность динамической типизации осталась. Не даром сейчас полным ходом идёт разработка и внедрение языков со статической типизацией компилируемых в js (TypeScript, Elm), а php держится за счёт инерции мышления (как фортран или кобол), не более. Да, есть ещё вполне динамический, и более свежий Ruby. Ну, дык, его автор сам до того прогал на perlе, стало быть привык к динамической типизации, да и рассчитывал на любителей перловки. Собственно, я что хочу сказать. В конкретном, динамически типизированном скрипте могут быть очень интересные и полезные фенечки за что его могут любить прогеры с ограниченным знанием языков. Только фенечки фенечками, а динамическая типизация бяка. Почему бяка? Ну, легко нагуглить, и навикипедить. Использовать же в компилируемом языке динамическую типизацию – вообще маразм. Исключение – языки выполняемые на виртуальной Erlang машине со встроенной динамической типизацией. Автор (или кто то из разрабов) утверждал что иначе механизм динамической замены кода не получался. Со скрипом, поверим на слово. Тем более, что там стараются контролировать типы на уровне библиотеки.
0
|
|
| 31.01.2016, 01:13 | |
|
Ответы с готовыми решениями:
177
Определите, какие языки знают все школьники и языки, которые знает хотя бы один из школьников Meta Keywords - капля пользы?
|
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|||||
| 04.02.2016, 13:09 | |||||
|
Добавлено через 1 минуту Добавлено через 1 минуту Добавлено через 3 минуты
0
|
|||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 06.02.2016, 21:43 | |
|
0
|
|
|
Модератор
|
||
| 06.02.2016, 22:45 [ТС] | ||
|
Потому что в скриптах теряется основное преимущество статической типизации - обнаружение несоответствия типов во время компиляции. Ну, и выигрыш в скорости в скриптах не так важен обычно.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 06.02.2016, 22:51 | ||
|
вы осознаете причину существования динамической типизации? потому что это удобно. я повторю свой вопрос: почему вы считаете использование динамической типизации в статически компилируемом языке маразмом? в чем профит статической типизации? это - удобно. компилятор помогает находить множество ошибок. они легко правятся, процесс бежит быстро, и волосы у программиста мягкие и шелковистые. но если в каком то моменте удобнее задействовать динамическую типизацию, то скорее уж маразм - это отказ от удобства в пользу менее удобных подходов. разве это не очевидно?
0
|
||
|
Модератор
|
||||
| 06.02.2016, 23:02 [ТС] | ||||
|
Вы поняли как "почему это нельзя в статическом языке иногда использовать dynamic ?". Так остро я вопрос и не ставлю, бывают случаи. Хотя мне кажется что динамическая типизация не нужна никогда. Но, если, иногда, в особых случая, то пусть себе.
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 06.02.2016, 23:23 | |||
|
это может быть востребовано для оптимизации. почему же сразу маразм? технически всегда существует возможность реализовать через статику. вопрос лишь в удобствах. статическое решение не всегда бывает удобным. в динамике конечно нет такой железобетонной безопасности, но зато есть простота использования.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 07.02.2016, 00:11 | |||
|
я повторю свой вопрос: что такого маразматичного в возможности скомпилировать скрипт, тем самым ускорив его работу? по нажатию на которую должна запуститься функция пользователя. однако разработчик гуя понятия не имеет, какие у пользователя могут быть функции, типы, и тп. в общем не известно, что именно нужно будет запускать, и с какими аргументами. в динамике все просто - что укажет, то и запустится. в статике пришлось бы решить целый ряд инженерных задач. другой пример: есть библиотека для построение 3д сцены. сцена представляет собой некое дерево, узлы которого - какие то графические объекты. этим объектам пользователи хотят сопоставить какие то свои данные. однако библиотека понятия не имеет, что там за данные могут быть у пользователей. третий пример: нужна функция, способная принимать ссылку на объект любого типа. точный тип будет известен лишь времени выполнения. (например - та самая юзерская дата для 3д сцены) это не проблема. в статике можно построить универсальный тип данных, способный хранить внутри объекты любого типа. проблема начинается при извлечении: нужно убедиться, что тип приёмника данных соответствует посылке. что бы не получилось так: отправили строку, а забираем, как циферку. проблема в том, что отправить мы можем строку, а забирать как массив буковок. то есть нет точного соответствия типов. в статике, когда заранее известны тип посылки и приемника, такой проблемы не существует. компилятор может сгенерировать код приведения типов. но если тип посылки известен лишь времени выполнения, то это становится не возможным в принципе. итого: на статическом языке проблема общего решения не имеет. была бы полноценная динамика, тогда всегда можно было бы спросить: "посылка, а ты умеешь массив буковок?"
0
|
|||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||||
| 07.02.2016, 01:05 | |||||
![]()
0
|
|||||
|
Модератор
|
|||||||
| 07.02.2016, 01:14 [ТС] | |||||||
|
Добавлено через 1 минуту В остальном, всё верно.
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||
| 07.02.2016, 01:47 | ||||||||||||||||
|
я хочу использовать полиморфизм. у меня есть ссылка на объект базового класса. напомните мне пожалуйста, как обеспечить типо-безопасность извлечения данных, хотя бы времени выполнения, с возможностью приведения типов? мне просто захотелось скомпилировать его в натив, с целью ускорения его работы. я ещё раз повторю свой вопрос: что в этом такого "маразматического" ? очевидно жеж, что преимущества статической типизации - монопенисуальный фактор там, где выбор пал на динамику. 1. история не знает сослагательного наклонения. 2. бизнес все расставляет по своим местам. это - объективное мерило эффективности решения задач. и это мерило говорит мне: эту нишу захапали динамические языки. юзер может назначить кнопке (и любому другому виджету) какие то пользовательские данные. при нажатии на кнопку, эти данные должны быть переданы на обработку в функцию, которую он укажет. это - типичная ситуация для гуя. собственно все реакции на клики только в том и заключаются, что при клике нужно позвать какую нибудь функцию. которая захватила некоторый контекст, то вы ошибаетесь. проблема не в том, как захватить данные любых типов. а в том, как их потом извлечь обратно. потому что динамический язык - это целая технология. и если она не поддерживается языком, то проэмулировать её на статическом языке будет не просто. выше я писал вам, что без поддержки компилятора, невозможно выполнить извлечение с возможности приведения типов. которая умеет динамические типы. попробую привести ещё один пример: есть два объекта. "сериализатор" и "дата". они ничего друг про друга не знают. точный тип сериализатора становится известным лишь времени компиляции, но может быть различным в зависимости от параметров с которым он создается. дата - всего лишь интерфейс, у которого может быть 100500 наследников. фактический тип данных становится известным лишь времени выполнения. нужно сериализовать дату. если бы дата не была полиморфным интерфейсом, то можно было бы сделать что-то вроде:
и слить его в поток. проблема в том, что в той точке, в которой нужно выполнить сериализацию, есть только указатель на базовый интерфейс даты. а вот точный тип конкретной даты не известен, и может быть любым из 100500 возможных наследников. в этой ситуации есть только два пути: 1. передать наследнику даты знание о фактическом типе сериализатора. 2. передать сериализатору знание о фактическом типе конкретного наследника. ни то, ни другое не решается в статике. решения не существует в принципе.
0
|
||||||||||||||||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||
| 07.02.2016, 10:47 | |||
![]() Добавлено через 10 минут
0
|
|||
|
Модератор
|
||||||
| 07.02.2016, 12:01 [ТС] | ||||||
|
Не по теме: Пайтон, вроде, в байт-код компилируется, а не в натив? При такой постановке вопроса: "уже скрипт" ничего маразматического. Улучшаем что есть как можем. Или обработчик клика - это член класса, данные он сам возьмёт из своего экземпляра класса, или данные передаются через замыкание или каррирование.
0
|
||||||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
| 07.02.2016, 14:53 | |
|
Динамика гуд, если нужно забабахать скрипт или маленький прототип.
Для всего остального статика предпочтительнее. Это даже питоняши усекли: http://www.infoq.com/news/2014... n-proposal http://stackoverflow.com/quest... python-3-5 Добавлено через 1 минуту В хаскеле кстати есть довольно интересная весчь по типам и их структуре http://chrisdone.com/posts/data-typeable Добавлено через 24 минуты hoggy, кстати статика в плюсах далека от идеала, если ты с ней сравниваешь. Да, она уже не настолько слаба как в сях, но далеко не сильна. И типы для абсолютно всего автоматом не выводятся нормально, приходится везде указывать конкретно или через auto. Посмотри как реализована система типов хаскела - это пример того, как должно быть. Добавлено через 10 минут Короче, если сравнивать плюсы с хаскелем, то система типов в плюсах - слабая явная хаскеле - сильная неявная
0
|
|
|
1075 / 968 / 113
Регистрация: 04.11.2012
Сообщений: 1,013
|
|
| 07.02.2016, 15:59 | |
|
Просто некоторым реальным прогерам не даёт покоя мысль что есть мало распространённые динамически типизированные языки, круче чем кастрированная статически типизированная попса, которой они деньги зарабатывают. На мой взгляд ситуация такая. Динамические больше подходят для индивидуальной разработки, а статические для командной. Бизнес выбирает статику, потому что считает что проект важнее кодера, которому можно дать пинка под зад, если тот будет слишком много качать права, и взять на его место другого, который быстрее въедет в тему, так как статический язык легче читается, лучше документируется, и выглядит структурированнее.
0
|
|
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
| 07.02.2016, 16:08 | |
|
Lambdik, ну то есть питон и руби для отдельных индивидуумов, а окамл для команды. Да, такое сейчас в бизнесе повсюду наблюдается, все только на окамле и фигачат, это ты верно подметил
0
|
|
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||
| 07.02.2016, 16:41 | ||
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||
| 07.02.2016, 17:52 | ||||||||||||||||||||||
|
а про невозможность поиметь общее решение в статике. все очень просто:
максимум что тут можно сделать - это заранее предусмотреть возможность приведения типов для ограниченного количества случаев. универсальный тип данных в статике построить невозможно. как следствие, в статике не возможно построить полноценный динамический делегат, например. мой изначальный посыл был: причина существования статической типизации, равно, как и динамической - тупо в удобстве использования. есть задачи, с которыми статика справляется плохо (не удобно), либо не справляется вообще. есть задачи, для которых динамика просто не нужна. это "почти" все портит. лямбда - функтор, который генерируется компилятором на лету. в плюсы завезли сравнительно недавно, например. в то время, как ваше "большинство гуёв" - гораздо старше. так что в большинстве гуёв нужно сначала приготовить этот самый функтор вручную: наследуемся от базового ивента. наследник тащит на своём борту юзер-дату. кнопка выстреливает базовым ивентом, а юзерский код выполняет приведение к наследнику, после чего делается извлечение. и так каждый раз с каждой очередной юзер-датой. запаривает, если честно писать километры кода для реализации простых вещей. это именно то, что я имел ввиду, когда писал вам: "технически, в статике можно, но это будет не удобно". отдельные приседания связанны с такими вещами, как "проперти виджета", "лэяуты", и тп. с динамикой проблем нет - прямо на лету добавляем свойства виджету, как угодно меняем поведения, а все изменения сразу видны и из редактора, и целевому приложению. в статике это такой аццкий геммор. проще расширять базовые наборы виджетов в исходных кодах, и пересобирать всю библиотеку, что бы "применить изменения". который они решают - это велосипедирование технологии в статическом языке, и как следствие - те же самые "тормоза". вы мне сейчас напомнили новобранца, который: "о боже! виртуальные функции - это же оверхед! тормоза" отказ от виртуальных функций у него привел к созданию собственного велосипеда: тот же самый опосредованный вызов функции через промежуточный указатель. даже при наличии статической рефлексии. я о том, что если фактический тип наследника становится известным лишь времени выполнения, то в статике в принципе невозможно стукнуть лбами двух наследников. можно попробовать пойти например таким путем:
реализовать единый общий для всех типов алгоритм извлечения невозможно. с поправкой на метапрограммирование - не возможно в принципе:
что не возможно в принципе. именно для имитации шаблоно-виртуальной функции и нужны "универсальные типы". но здесь мы натыкаемся уже на их ограничения: либо полный запрет на приведение типов. либо работать будет лишь кучка заранее описанных частных случаев приведения. динамические языки существуют для того, что бы простые вещи делались просто. без необходимости применять тяжелую артиллерию в виде метапрограмминга, который максимум на что способен - удовлетворить кучку частных случаев, которые придется описывать вручную. а потому - суть костыль.
0
|
||||||||||||||||||||||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||
| 07.02.2016, 18:50 | ||
Вроде все слова знакомые, но в разумные и логичные предложения они не складываются.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 07.02.2016, 19:01 | ||
|
что бы простые вещи делались просто, и не приходилось долбаться с ограничениями статики.
0
|
||
| 07.02.2016, 19:01 | |
|
Помогаю со студенческими работами здесь
40
Как динамически выделять память на один элемент массива? Один обработчик события для нескольких динамически созданных объектов Интерпретируемые языки VS Компилируемые языки В коде динамически наполняется массив и его элементы выводятся на сцену, но выводится только один элемент никакой тип Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения
Продолжаю серию постов о дискретно-событийной модели рабочего. . .
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|