|
Модератор
|
|
Динамически типизированные языки : один вред, никакой пользы31.01.2016, 01:13. Показов 9422. Ответов 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 - капля пользы?
|
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||
| 27.02.2016, 21:42 | |||
|
Ты кстати уже несколько раз повторяешь свой пример со строкой, но похоже кроме тебя никто не понимает, что ты им хочешь показать.
0
|
|||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
||||||
| 27.02.2016, 23:49 | ||||||
|
Вообще, вот, почитай: http://www.cse.iitk.ac.in/user... otcode.pdf Там как раз о попытке реализовать горячую замену кода в Cloud Haskell'е и с какими проблемами (в т.ч. и типизиации) авторы столкнулись . Добавлено через 1 минуту Добавлено через 2 минуты KolodeznyDiver, ну и вот ещё: http://erlang.org/pipermail/er... 39261.html Добавлено через 22 минуты Тут тоже есть, что почитать:
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||||||||||||||||||||||||
| 28.02.2016, 12:20 | ||||||||||||||||||||||||||||||||||||||||||||
|
я его привожу, и вуаля: вы мне инкрементируете неверное использование инструмента. разумеется, использование не верно, поскольку статический инструмент не рассчитан для решения задач типичных для динамики. но из этого никак не вытекает, что динамическая типизация подмножество статической. это два принципиально разных подхода. в динамике доступно то, что в принципе не доступно в статике, например. но иллюстрировал я её на примере с++ поэтому я и не рассчитывал, что понять смогут все присутствующие однако, рассчитывал, что его сможете понять вы и Ctor. ок, давайте ещё раз. задача - спроектировать и реализовать универсальный аргумент. это - контейнер, способный принимать, и хранить ссылки на объекты любых типов. ближайшие аналоги: void*, boost::any пример использования:
ну самое главное, даже если бы гипотетически представить себе, что нам удалось построить такой механизм, все равно это уже не будет статикой. содержимое контейнера определяется только в рантайме. следовательно, что бы гарантировать корректность извлечения, все проверки придется неизбежно выполнять только в рантайме. а это уже есть динамика, и не есть статика. и второе: могу ли я сделать так:
и в статике такая операция была бы правомерна. но как это сделать в динамике? другой пример этой же проблемы: в статике подобная операция правомерна:
следовательно, мы вправе ожидать аналогичного поведение от динамики:
запоминая некий идентификатор типа при создании arg и сверяясь с ним при извлечении. именно так и работают boost::any и компания. но мы не сможем реализовать полноценную поддержку правил для различного приведения типов. объясняю почему: метод извлечения имеет вид:
с идентификатором типа, который был запомнен при создании контейнера. если все гладко - отлично. извлекаем данные. она работает при точном соответствии типов, и не работает, если требуется приведение типов проблема в том, что эта схема - единственная, которая работает в статике.
что наш статический язык - не какой то там жалкий с++, а очень даже оснащен статической рефлексией, и мы все таки смогли решить проблему валидации типов. будем считать, что как то мы это порешали. просто поехали дальше:
дело не в ограничении языков. это - проблема здравого смысла. невозможно заранее (в статике) поиметь то, что известно станет только в рантайме, и от случая к случаю может быть разным. итого: в статике невозможно построить полноценный контейнер универсальных типов данных. механизмы наподобие boost::any могут действовать только с дикими ограничениями. и в любом случае теряются бонусы статической типизации: эффективность и проверки времени компиляции. вместо этого имеем: отсутствие оптимизаций, проверки времени выполнения, ограничение возможностей. резюмируя: учитывая, что мы все равно не можем поиметь выигрыша, сражаясь с ограничениями статики, и максимум, что у нас получится - велосипед динамики, то не проще ли сразу же взять годный динамический язык, и не заморачиваться?
0
|
||||||||||||||||||||||||||||||||||||||||||||
|
Модератор
|
||||
| 28.02.2016, 13:39 [ТС] | ||||
|
типов. Всё это без проблем сериализуется. Но не обеспечивает автоматически совместимость модулей разных версий, в том числе для дин.языков, в том числе для Erlang. В общем случае, требуется знать какие версии протокола обмена (на уровне приложения) поддерживают другие модули. Например, в приведённом по Вашей ссылке первом примере из pankaj2014hotcode.pdf модуль, взаимодействующий с обновляемым, должен знать, поддерживает ли тот уже новую команду или "выкручиваться" самому. Вообще, документ интересный, но описываемые там проблемы, это не проблемы статики, а общие проблемы DSU (совместимость версий модулей, перенос состояния процесса в новую версию, корректность функционирования во время обновления и т.п.), большая часть которых стоит и в Erlang. К тому же, в Erlang часть проблем решается на уровне rts, а авторы ставят задачу решения на уровне библиотеки, что, естественно, сложнее. Впрочем, Cloud Haskell развивается, с 2014-го для него появились фишки и на уровне компилятора-rts (StaticPointers). (Про себя скажу что я системы с DSU не делал, а вот просто распределённые с обновлением отдельных модулей делал и делаю. И там одна только проблема совместимости версий доставляет. И никак не соотносится со статикой - см. выше про версии протоколов. Приходится хранить в модулях версии протоколов других модулей и поддерживать их актуальность.)
0
|
||||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
||||||
| 29.02.2016, 01:24 | ||||||
![]() Добавлено через 18 минут Добавлено через 4 минуты Добавлено через 9 минут И желательно побыстрее. И в большинстве случаев, чёрт с ним, что есть баги в каких-нибудь пограничных случаях. Ведь писать что-то классное всегда интереснее, чем искать баги и наяривать на отказоустойчивость (и производительность ) Для того, чтобы увеличить производительность труда, нужны языки максимально гибкие. Статически типизированные языки таковыми не являются по определению.
0
|
||||||
|
Модератор
|
|||||||||||||||||||
| 29.02.2016, 09:47 [ТС] | |||||||||||||||||||
0
|
|||||||||||||||||||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|||
| 29.02.2016, 12:47 | |||
|
Например, в Python это делается в docstring-ах в определённом формате, который, например, хорошо понимает PyCharm https://www.jetbrains.com/pych... charm.html. Обрати внимание, это делают тогда, когда действительно нужно, а не параноидально на каждый чих.
0
|
|||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
||
| 29.02.2016, 13:09 | ||
|
Обрати внимание, в первом случае SBCL в compile time определил что тип строчного литерала "foo" не является целым числом. Во втором и третьем случае, мы получили run time ошибки типов - входной аргумента не является чётным числом и выходной аргумент не является нечётным числом соответственно. Тут примечательно то, что проверка на чётность/нечётность определена в декларации типа, а не явным образом в теле функции. Не подскажешь, как в Haskell описать подобный тип?
0
|
||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|||
| 29.02.2016, 13:24 | |||
|
Добавлено через 10 минут
0
|
|||
|
Модератор
|
||||
| 29.02.2016, 13:50 [ТС] | ||||
|
0
|
||||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
||||||||
| 29.02.2016, 14:54 | ||||||||
|
Добавлено через 4 минуты ![]() Добавлено через 2 минуты Добавлено через 7 минут
0
|
||||||||
|
Модератор
|
||||||||
| 29.02.2016, 16:02 [ТС] | ||||||||
|
Не по теме:
Не по теме:
0
|
||||||||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|||||
| 29.02.2016, 16:25 | |||||
0
|
|||||
|
Модератор
|
|||||
| 29.02.2016, 16:53 [ТС] | |||||
|
Для проверке в rt достаточно определить приведение в MyEvenInt из целого с проверкой на чётность. Для проверки в сt константы в Haskell понадобится написать слайд (макрос). Кажется, это же можно получить макросом rust. Полноценная проверка преобразования константных выражений в ct, "до куда можно" есть, насколько знаю, только в Ada.
0
|
|||||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
||||||||||||
| 29.02.2016, 17:28 | ||||||||||||
И как же Ada в compile-time проверит чётность числа прилетевшего в run-time? ![]() Добавлено через 8 минут Добавлено через 1 минуту Добавлено через 3 минуты ![]() Добавлено через 15 минут
0
|
||||||||||||
|
Модератор
|
||||||||||||||||||||||
| 29.02.2016, 21:29 [ТС] | ||||||||||||||||||||||
|
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
0
|
||||||||||||||||||||||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
|||||
| 29.02.2016, 22:34 | |||||
|
Где и что мне придётся дублировать, чем такое описание принципиально отличается от сигнатур функций в каком-нибудь ML? Добавлено через 2 минуты ![]() Добавлено через 1 минуту Добавлено через 2 минуты
0
|
|||||
|
Супер-модератор
|
|||||||
| 29.02.2016, 22:36 | |||||||
raised Dynamic_Predicate failed
0
|
|||||||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
||
| 29.02.2016, 22:37 | ||
|
0
|
||
|
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
|
||
| 29.02.2016, 22:41 | ||
|
0
|
||
| 29.02.2016, 22:41 | |
|
Как динамически выделять память на один элемент массива? Один обработчик события для нескольких динамически созданных объектов Интерпретируемые языки VS Компилируемые языки В коде динамически наполняется массив и его элементы выводятся на сцену, но выводится только один элемент никакой тип Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|