Re: Назначение динамических языков
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 13.12.08 14:28
Оценка: 39 (3)
Здравствуйте, busk, Вы писали:

B>Расскажите пожалуйста основное назначение динамических языков и функциональных?

B>Чем например сочетание ASP.NET + JavaScript уступают им?

Динамические языки типа Питона и Руби часто позволяют записать решение задачи очень лаконично, но при этом читаемо. Сочетание такой лаконичности и хорошей стандартной библиотеки позволяют сократить время разработки небольших проектов примерно втрое по сравнению с С++/Java.
При этом у них есть две особенности: низкая скорость работы и тот факт, что многие ошибки, которые в статически типизированных языках поймал бы компилятор, тут проявляются уже во время исполнения. Соответственно, если программа не совсем тривиальная, то приходится прилагать много усилий на покрытие ее тестами, что тоже требует времени и сил. Соответственно, назначение — области, где скорость работы не самое важное (как многие web-приложения, где все упирается в скорость базы данных) и где важна быстрота и гибкость разработки.
Кроме того, гибкий синтаксис некоторых из них очень хорош для создания DSL'ей. На мой взгляд, тут Руби вне конкуренции.


Функциональные языки в большинстве своем строго типизированы, причем даже более строго, чем традиционные императивные, что позволяет сильно уменьшить число багов и необходимость в отладке. Плюс, такие языки обычно имеют вывод типов и ряд интересных концепций, за счет которых происходит выигрыш по объему исходников и времени разработки. Они сложнее для изучения и понимания, что делает их менее читаемыми для обычных программеров. Соответственно, назначение — области, где важна корректность программ и алгоритмов, всевозможные исследования и эксперименты.

Частенько про ФЯ говорят в аспекте их хорошей параллелизуемости, но на практике этот аспект мало где реализован и используется, он пока больше теоретический.
Re[2]: Назначение динамических языков
От: z00n  
Дата: 13.12.08 23:54
Оценка: 11 (3)
Здравствуйте, nikov, Вы писали:

N>Вот я, честно говоря, не вижу никаких преимуществ у динамических языков перед языками со статической типизацией, поддерживающими вывод типов и structural typing (например, Scala). Если мне кто-то их укажет, я буду очень благодарен.

Вообще, это очень флеймоопасная тема (например на LtU ее обсуждение просто запрещено) — за пределами признания пары очевидных фактов:
— Любая статическая система типов обявит некоторое множество корректных программ некорректными.
— Никакая статическая система типов не может гарантировать коррекности программы в целом.

Хороший пример реальной проблемы, которая вообще не возникает, например, в лиспе: "Scrap your boilerplate":
http://www.cs.vu.nl/boilerplate/

Браху еще можно почитать:
http://bracha.org/pluggable-types.pdf
http://pico.vub.ac.be/~wdmeuter/RDL04/papers/Bracha.pdf
Re[5]: Назначение динамических языков
От: dotneter  
Дата: 14.12.08 11:27
Оценка: +2
Здравствуйте, D. Mon, Вы писали:


DM>А многие ли статически типизированные языки разрешают описать функцию, принимающую произвольный кортеж (в том числе произвольной длины)?

Тогда что нибудь типа анонимного union type,
["a", 1, "b"] string|int list
["a", 2, true] string|int|bool list
А потом патерн мачингом бежим по этому списку и радуемся жизни.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[13]: Назначение динамических языков
От: Кодт Россия  
Дата: 15.12.08 12:14
Оценка: 1 (1)
Здравствуйте, Курилка, Вы писали:

К>>Так вот, собственно: есть такая штука, как декорированные имена. И для С++ных dll это прекрасно работает. Хотя C++ в отказе от типизации обвинить сложно


К>И для них есть хотсвоп?


Для С++ — нет. Там даже ручная загрузка проблематична, поскольку сам язык очень убого поддерживает позднее связывание.
Конечно же, можно
typedef int (*PFN_Int_Int)(int);
#define MANGLE_Int_Int(s) s "@XZ" // наобум :) - лень смотреть настоящую декорацию

PFN_Int_Int foo = (PFN_Int_Int) GetProcAddress(hDLL, MANGLE_Int_Int("foo"));

И даже, наверно, можно как-то автоматизировать это.
Но вот классы уже прогрузить таким способом будет мучительно.

А для COM эта задача вполне решаема.
Другое дело, что не всем это нужно: разводить в программе зоопарк из сосуществующих версий.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[4]: Назначение динамических языков
От: anonymous Россия http://denis.ibaev.name/
Дата: 13.12.08 19:32
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

К>>Может не очень важный аргумент, но всёж: как ты себе представляешь статически типизируемые shell-скрипты?

AVK>В чем конкретно проблема?

Тут даже 2 проблемы. Во-первых, за время написания кода тип переменной может несколько раз измениться. Это конечно решается на этапе проектирования, но кто будет всерьёз проектировать скрипты, тут важна скорость написания кода. Во-вторых, за время работы скрипта может несколько раз измениться тип значения переменной. Например, получили мы в качестве аргумента некоторое строковое значение и хотим произвести над ним некоторые арифметические операции. То что мы можем работать с той же переменной, существенно сокращает объём кода.

Проблемы со статически типизированными скриптами как бы нет, но динамическая типизация тут просто удобнее.
Re[3]: Назначение динамических языков
От: dotneter  
Дата: 14.12.08 08:25
Оценка: +1
Здравствуйте, D. Mon, Вы писали:

DM>Здравствуйте, nikov, Вы писали:


N>>Вот я, честно говоря, не вижу никаких преимуществ у динамических языков перед языками со статической типизацией, поддерживающими вывод типов и structural typing (например, Scala).


DM>Первый пришедший на ум пример — гетерогенные структуры данных без предварительного описания. Например, на Руби я свободно могу использовать такое значение:

DM>
DM>[:while, [:less, :r0, [:getb, :p2]],
DM>  [:do,
DM>    [:inc, :r3, [:getb, :p2]],
DM>    [:inc, :r2, 1]     
DM>  ]
DM>]
DM>

Кортеж?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[7]: Назначение динамических языков
От: deniok Россия  
Дата: 14.12.08 09:33
Оценка: +1
Здравствуйте, z00n, Вы писали:

Z>Здравствуйте, deniok, Вы писали:


D>>Здравствуйте, z00n, Вы писали:


Z>>>Чем tagged-list с предикатом не тип?


D>>Тип, тип. Только о тегах надо заранее позаботится. Иначе не к чему будет предикат цеплять. Собственно Typable + Data в SYB этим и занимаются, я разницы особой не вижу.


Z>Разница в том, что любой первокурсник может сделать это на схеме (ну или скажем руби). А SYB — это несколько Ph.D лет, куча статей ... В плохом смысле напоминает метапрограмирование на шаблонах.


Первокурсник? Аналог кода от Олега? С таким количеством ФВП?
Такой первокурсник на втором курсе легко заимплементирует SYB.

Z>Кстати, где брать SYB для других статически-типизированных языков?

Это к адептам этих других языков
Re[7]: Назначение динамических языков
От: deniok Россия  
Дата: 14.12.08 09:48
Оценка: +1
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, deniok, Вы писали:


D>>Тип, тип. Только о тегах надо заранее позаботится. Иначе не к чему будет предикат цеплять. Собственно Typable + Data в SYB этим и занимаются, я разницы особой не вижу.


К>Выделенное по-моему очень важный момент, т.е. программист должен практически ещё до возникновения задачи интуитивно догадаться, что ему понадобятся тэги. Т.е. фактически типизация вручную. А если код делал другой программер в другой стране пару лет назад?


Ну тут и со статически типизированными языками есть некоторая проблема. Поскольку задача заключается в нетривиальной обобщенной инспекции непосредственно внутреннего устройства типа, что редко каким языком напрямую поддерживается.

Но поскольку в Хаскелле интерфейсы (т.е. классы типов) добавляются когда надо к чему угодно, то это не проблема. К тому же в современном GHC автоматически поддерживается deriving (Typeable, Data), то есть весь SYB вообще поддерживается практически бесплатно.
Re[13]: Назначение динамических языков
От: z00n  
Дата: 14.12.08 12:37
Оценка: +1
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, z00n, Вы писали:


Z>>Здравствуйте, Курилка, Вы писали:


К>>>Задачи типизации, т.е. гарантии контрактов.

Z>>Тут недавно гейм девелоперы мерялись ассертами — 1 ассерт на 5 строк кода. Не доверяют, видать, статической типизации

К>Вопрос — на каком языке гейм-девелоперы?

К>На Ocaml? Или C++?

А что, Ocaml уже поддерживает dependent types?

Z>>>>Вот пример D.Mon-а. Как бы вы избавились бы от тегов?

К>>>Там изначально был нужны тэги, так что вопрос некорректен. Я говорил как раз о варианте, когда тэги требуются после.
Z>>Например о каком? Мы то сначала говорили о SYB.
К>Речь как раз о вещи аля SYB. Только я говорю что у тебя есть 2 разных "момента написания кода": 1) написание исходной структуры данных; 2) написание собственно решения задачи на SYB (или обхода по тэгам как ты показывал). И в моменте 1 разработчик может быть совершенно не в курсе возможности момента 2, т.е. получим, что нужные тэги придётся добавлять.
Я, извините, уже писал выше, что не предствляю. Как вы представляете себе XML без тегов? Как плоский текст? Тогда придется написать компилятор — как-то так

К>В чём может быть проблема зависит от конкретной ситуации, я же говорю о исходном факте (вроде бы тривиальном), что проверка контракта для статики происходит заметно раньше, т.е. ещё до запуска программы.

А вот представьте себе что вы пишете программу на Smalltalk, Lisp или Erlang, и запуск прграммы уже произошел несколько лет назад и у вас есть дебагер, который позволяет исправлять ошибки рантайм. Так ли ценна в таких условиях взможность находить опечатки в программе до запуска?

К>Хотя мощность выразимых контрактов очень зависит от языка, безусловно, и просто статика не покрывает 100% необходимых вариантов К>(хотя, если будет развиваться что-то аля total function programming, то покрытие можно очень близко к этому приблизить).

К>Ну и никто не мешает автору "ручками" перепроверять контракты, безусловно
К>Пусть даже с использованием полуавтоматических средств, аля юнит-тесты и т.п.

Вот я например пишу компилятор, или рефакторер какой-нибудь на статически типизированном языке. Он мне замечательно указывает когда я передал в функцию [Int] вместо Int, а за это, когда я трансформирую AST он просит описывать все случаи. Я не могу сказать — для всех своих субтермов сделай тоже самое рекурсивно, а вот тут замени x на y. Самая маленькая трансформация занимает строк 200 кода. Когда вы напишете эти 200 строк десятый раз (у вас кстати полно шансов ошибиться), вы вполне можете задуматься — а не променять ли исправление опечаток на возможность писать 5 строк вместо 200, а тестов у компилятора заведомо будет полно. (SYB решает эту проблему для Haskell — остальные пока cjcen
Другое дело, если вы пишете, например ядро OS. И это все совершенно нормально.
Re[7]: Назначение динамических языков
От: dotneter  
Дата: 14.12.08 17:20
Оценка: +1
Здравствуйте, D. Mon, Вы писали:

DM>Здравствуйте, dotneter, Вы писали:


D>>Тогда что нибудь типа анонимного union type,

D>>["a", 1, "b"] string|int list
D>>["a", 2, true] string|int|bool list
D>>А потом патерн мачингом бежим по этому списку и радуемся жизни.

DM>Не пойдет — элементами списка могут быть другие такие списки. Т.е. дерево обычное. Придется по-хорошему описать все дерево.

Не вижу противоречий
["a", [1]] : list<string|list<int>>

или написать что нибудь типа.
 
type tree<'a> = 'a| list<tree<'a>>

["a", [1, "b"]] : tree<int|string>
Talk is cheap. Show me the code.
Re[15]: Назначение динамических языков
От: z00n  
Дата: 15.12.08 07:48
Оценка: +1
Здравствуйте, Курилка, Вы писали:


Z>>Здравствуйте, Курилка, Вы писали:

К>Не сочти за личный наезд, но ты еврей?
Я вам советую тон сменить.
Назначение динамических языков
От: busk  
Дата: 13.12.08 10:53
Оценка:
Привет!

Много в последнее время слышу про язык Python от достаточно продвинутых парней. Также много слышу, что будущее за функциональными языками.
Расскажите пожалуйста основное назначение динамических языков и функциональных?
Чем например сочетание ASP.NET + JavaScript уступают им?

спасибо
Re: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.12.08 11:51
Оценка:
Здравствуйте, busk, Вы писали:

B>Привет!


B>Много в последнее время слышу про язык Python от достаточно продвинутых парней. Также много слышу, что будущее за функциональными языками.

B>Расскажите пожалуйста основное назначение динамических языков и функциональных?
У любых языков главное назначение — программировать (за исключением всяких брейнфков)
B>Чем например сочетание ASP.NET + JavaScript уступают им?
1. Кому "им"?
2. Зачем сваливать в 1 кучу технологию и язык? Сравниваешь тёплое с мягким?
Ну и Javascript вполне себе динамически типизированный язык (просто динамическим называть некорректно по-моему), а под ASP.Net ты можешь, наверное, и на F# писать (который очень даже функциональный)
Re: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.12.08 11:52
Оценка:
Здравствуйте, busk, Вы писали:

B>Привет!


B>Много в последнее время слышу про язык Python от достаточно продвинутых парней. Также много слышу, что будущее за функциональными языками.

Ну и про "будущее":

There is no silver bullet


А если про решение задач, то первейший инструмент программиста — его мозг.
Re: Назначение динамических языков
От: anonymous Россия http://denis.ibaev.name/
Дата: 13.12.08 12:17
Оценка:
Здравствуйте, busk, Вы писали:

B>Чем например сочетание ASP.NET + JavaScript уступают им?


JavaScript и есть динамический и во многом функциональный язык.
Re: Назначение динамических языков
От: nikov США http://www.linkedin.com/in/nikov
Дата: 13.12.08 18:47
Оценка:
Здравствуйте, busk, Вы писали:

B>Расскажите пожалуйста основное назначение динамических языков и функциональных?


Вот я, честно говоря, не вижу никаких преимуществ у динамических языков перед языками со статической типизацией, поддерживающими вывод типов и structural typing (например, Scala). Если мне кто-то их укажет, я буду очень благодарен.
Re[2]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.12.08 19:10
Оценка:
Здравствуйте, nikov, Вы писали:

N>Вот я, честно говоря, не вижу никаких преимуществ у динамических языков перед языками со статической типизацией, поддерживающими вывод типов и structural typing (например, Scala). Если мне кто-то их укажет, я буду очень благодарен.


Может не очень важный аргумент, но всёж: как ты себе представляешь статически типизируемые shell-скрипты?
Также, наверное, можно вспомнить горячую замену кода на эрланге, хотя, возможно, для языка со статической типизацией это реализуемо, но эквивалента я не знаю.
Re[3]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.12.08 19:20
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Может не очень важный аргумент, но всёж: как ты себе представляешь статически типизируемые shell-скрипты?


В чем конкретно проблема?

К>Также, наверное, можно вспомнить горячую замену кода на эрланге, хотя, возможно, для языка со статической типизацией это реализуемо


Реализуемо. ASP.NET, к примеру, вполне справляется. Это фича рантайма, а не языка.
... << RSDN@Home 1.2.0 alpha 4 rev. 1120 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[4]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.12.08 19:36
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Курилка, Вы писали:


К>>Может не очень важный аргумент, но всёж: как ты себе представляешь статически типизируемые shell-скрипты?


AVK>В чем конкретно проблема?


Скорей всего в скорости и удобстве написания, хотя принципиальных проблем, скорее всего нет.

К>>Также, наверное, можно вспомнить горячую замену кода на эрланге, хотя, возможно, для языка со статической типизацией это реализуемо


AVK>Реализуемо. ASP.NET, к примеру, вполне справляется. Это фича рантайма, а не языка.


И там можно подменить dll, код которой выполняется процессом?
Скажем, вебсервер выдаёт в течении полуминуты очень длинную страницу из последовательности цифры, которая задана в dll. Скажем в старой dll это была 1, в новой — 2. Можно ли получить ...111112222... и если да, то какими усилиями?
Re[5]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.12.08 19:48
Оценка:
Здравствуйте, anonymous, Вы писали:

A>Тут даже 2 проблемы. Во-первых, за время написания кода тип переменной может несколько раз измениться.


Вывод типов спасет

A>Во-вторых, за время работы скрипта может несколько раз измениться тип значения переменной.


Зачем?

A> Например, получили мы в качестве аргумента некоторое строковое значение и хотим произвести над ним некоторые арифметические операции. То что мы можем работать с той же переменной, существенно сокращает объём кода.


Неявные операторы преобразования типов?

A>Проблемы со статически типизированными скриптами как бы нет, но динамическая типизация тут просто удобнее.


Ну вот хотелось бы поконкретнее.
... << RSDN@Home 1.2.0 alpha 4 rev. 1120 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[5]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.12.08 19:48
Оценка:
Здравствуйте, Курилка, Вы писали:

К>И там можно подменить dll, код которой выполняется процессом?


Подменить нельзя, можно загрузить параллельно

К>Скажем, вебсервер выдаёт в течении полуминуты очень длинную страницу из последовательности цифры, которая задана в dll. Скажем в старой dll это была 1, в новой — 2. Можно ли получить ...111112222... и если да, то какими усилиями?


Нет, нельзя. А зачем такой изврат? Один запрос будет выполнятся на старой версии, следующий уже на новой, этого вполне достаточно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1120 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[6]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.12.08 20:11
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Курилка, Вы писали:


К>>И там можно подменить dll, код которой выполняется процессом?


AVK>Подменить нельзя, можно загрузить параллельно


К>>Скажем, вебсервер выдаёт в течении полуминуты очень длинную страницу из последовательности цифры, которая задана в dll. Скажем в старой dll это была 1, в новой — 2. Можно ли получить ...111112222... и если да, то какими усилиями?


AVK>Нет, нельзя. А зачем такой изврат? Один запрос будет выполнятся на старой версии, следующий уже на новой, этого вполне достаточно.


Пример, безусловно, надуманный, но используется особенность задачи, т.е. относительно короткие, но частые запросы (т.е. для другого рода приложений потребуется отдельное решение, в отличие от общего решения в случае эрланга). Плюс вопрос каким образом здесь проявляется статическая типизация, если обрабатываются HTTP-запросы, которые явно нетипизированы?
Re[7]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.12.08 20:27
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Пример, безусловно, надуманный, но используется особенность задачи, т.е. относительно короткие, но частые запросы (т.е. для другого рода приложений потребуется отдельное решение, в отличие от общего решения в случае эрланга).


Так вот интересуют то именно практические моменты, а не надуманные примеры. И засада здесь не с языком, а с единицей деплоймента.

К> Плюс вопрос каким образом здесь проявляется статическая типизация, если обрабатываются HTTP-запросы, которые явно нетипизированы?


Для написания кода используются вполне себе статически типизированные C# и VB
... << RSDN@Home 1.2.0 alpha 4 rev. 1120 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[8]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.12.08 20:51
Оценка:
Здравствуйте, AndrewVK, Вы писали:

К>> Плюс вопрос каким образом здесь проявляется статическая типизация, если обрабатываются HTTP-запросы, которые явно нетипизированы?


AVK>Для написания кода используются вполне себе статически типизированные C# и VB


ОК, насколько я понимаю единицей будет dll, какие статические контракты на неё накладываются?
Re[9]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.12.08 20:57
Оценка:
Здравствуйте, Курилка, Вы писали:

К>ОК, насколько я понимаю единицей будет dll, какие статические контракты на неё накладываются?


Контракты на dll? Мы еще о языках разговариваем?
... << RSDN@Home 1.2.0 alpha 4 rev. 1120 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[10]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.12.08 21:11
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Курилка, Вы писали:


К>>ОК, насколько я понимаю единицей будет dll, какие статические контракты на неё накладываются?


AVK>Контракты на dll? Мы еще о языках разговариваем?


Вот об этом-то тебе я и пытаюсь сказать: при переходе к dll мы теряем типизацию, т.е. хотсвоп типизированного кода не происходит. Т.е. если упростить, то фактически решение почти равносильно перезагрузке программы. В отличие от этого, эрланговские процессы при хотсвопе продолжат работу с новым кодом, если, конечно, в новом модуле нет багов и т.п.
Можно ли сделать обновление кода без какого-то отказа от типизации по-моему большой вопрос.
Re[11]: Назначение динамических языков
От: Кодт Россия  
Дата: 13.12.08 23:38
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Вот об этом-то тебе я и пытаюсь сказать: при переходе к dll мы теряем типизацию, т.е. хотсвоп типизированного кода не происходит. Т.е. если упростить, то фактически решение почти равносильно перезагрузке программы. В отличие от этого, эрланговские процессы при хотсвопе продолжат работу с новым кодом, если, конечно, в новом модуле нет багов и т.п.

К>Можно ли сделать обновление кода без какого-то отказа от типизации по-моему большой вопрос.

Хотсвоп в эрланге основан на позднем связывании: когда функцию из подменяемого модуля вызывают не по ссылке, а по имени.
С dll, в общем-то, та же история, только нужно обеспечить правильное время жизни и сосуществования модулей; это ручная работа, а в эрланге оно всё "само" делается.

Так вот, собственно: есть такая штука, как декорированные имена. И для С++ных dll это прекрасно работает. Хотя C++ в отказе от типизации обвинить сложно
Перекуём баги на фичи!
Re[2]: Назначение динамических языков
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 14.12.08 03:59
Оценка:
Здравствуйте, nikov, Вы писали:

N>Вот я, честно говоря, не вижу никаких преимуществ у динамических языков перед языками со статической типизацией, поддерживающими вывод типов и structural typing (например, Scala).


Первый пришедший на ум пример — гетерогенные структуры данных без предварительного описания. Например, на Руби я свободно могу использовать такое значение:
[:while, [:less, :r0, [:getb, :p2]],
  [:do,
    [:inc, :r3, [:getb, :p2]],
    [:inc, :r2, 1]     
  ]
]

И работать с ним как с обычным массивом. Во многих статических языках пришлось бы либо попотеть для описания такой структуры, либо приводить все элементы к одному базовому типу (что не везде возможно).
Re[3]: Назначение динамических языков
От: deniok Россия  
Дата: 14.12.08 06:30
Оценка:
Здравствуйте, z00n, Вы писали:


Z>Хороший пример реальной проблемы, которая вообще не возникает, например, в лиспе: "Scrap your boilerplate":

Z>http://www.cs.vu.nl/boilerplate/

Тут не понял. В чем проблема-то? Поскольку в лиспе типов нет, то это у него проблема: он не может проехаться по сложной иерархии и в ней выполнить некоторую операцию только над вхождениями определенного типа в иерархию
Re[4]: Назначение динамических языков
От: z00n  
Дата: 14.12.08 08:22
Оценка:
Здравствуйте, deniok, Вы писали:

D>Здравствуйте, z00n, Вы писали:


D>Тут не понял. В чем проблема-то? Поскольку в лиспе типов нет, то это у него проблема: он не может проехаться по сложной иерархии и в ней выполнить некоторую операцию только над вхождениями определенного типа в иерархию


У меня нет слов
Чем tagged-list с предикатом не тип?

P.S. Tree fold имени Олега Киселева:
;------------------------------------------------------------------------
;            Extended tree fold
; tree = atom | (node-name tree ...)
;
; foldts fdown fup fhere seed (Leaf str) = fhere seed str
; foldts fdown fup fhere seed (Nd kids) =
;         fup seed $ foldl (foldts fdown fup fhere) (fdown seed) kids

; procedure fhere: seed -> atom -> seed
; procedure fdown: seed -> node -> seed
; procedure fup: parent-seed -> last-kid-seed -> node -> seed
; foldts returns the final seed

(define (foldts fdown fup fhere seed tree)
  (cond
   ((null? tree) seed)
   ((not (pair? tree))        ; An atom
    (fhere seed tree))
   (else
    (let loop ((kid-seed (fdown seed tree)) (kids (cdr tree)))
      (if (null? kids)
      (fup seed kid-seed tree)
      (loop (foldts fdown fup fhere kid-seed (car kids))
        (cdr kids)))))))

http://okmij.org/ftp/Scheme/xml.html#SXSLT
Re[5]: Назначение динамических языков
От: deniok Россия  
Дата: 14.12.08 08:43
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Здравствуйте, deniok, Вы писали:


D>>Здравствуйте, z00n, Вы писали:


D>>Тут не понял. В чем проблема-то? Поскольку в лиспе типов нет, то это у него проблема: он не может проехаться по сложной иерархии и в ней выполнить некоторую операцию только над вхождениями определенного типа в иерархию


Z>У меня нет слов

Z>Чем tagged-list с предикатом не тип?

Тип, тип. Только о тегах надо заранее позаботится. Иначе не к чему будет предикат цеплять. Собственно Typable + Data в SYB этим и занимаются, я разницы особой не вижу.
Re[6]: Назначение динамических языков
От: z00n  
Дата: 14.12.08 09:14
Оценка:
Здравствуйте, deniok, Вы писали:

D>Здравствуйте, z00n, Вы писали:


Z>>Чем tagged-list с предикатом не тип?


D>Тип, тип. Только о тегах надо заранее позаботится. Иначе не к чему будет предикат цеплять. Собственно Typable + Data в SYB этим и занимаются, я разницы особой не вижу.


Разница в том, что любой первокурсник может сделать это на схеме (ну или скажем руби). А SYB — это несколько Ph.D лет, куча статей ... В плохом смысле напоминает метапрограмирование на шаблонах.
Кстати, где брать SYB для других статически-типизированных языков?
Re[12]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.08 09:16
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Хотсвоп в эрланге основан на позднем связывании: когда функцию из подменяемого модуля вызывают не по ссылке, а по имени.

К>С dll, в общем-то, та же история, только нужно обеспечить правильное время жизни и сосуществования модулей; это ручная работа, а в эрланге оно всё "само" делается.
Согласен, и плюс я вроде не возражал, что на статике это сделать нельзя, вопрос в том, что это не сделано, ну или сделано, но в гораздо более ограниченном объёме.
В Эрланге, наверное, самый основной пункт для динамики будет обмен сообщениями. Введение типизации туда, по-моему, как минимум заметно усложнит работу как программиста, так и самой ВМ.

К>Так вот, собственно: есть такая штука, как декорированные имена. И для С++ных dll это прекрасно работает. Хотя C++ в отказе от типизации обвинить сложно


И для них есть хотсвоп?
Re[6]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.08 09:22
Оценка:
Здравствуйте, deniok, Вы писали:

D>Тип, тип. Только о тегах надо заранее позаботится. Иначе не к чему будет предикат цеплять. Собственно Typable + Data в SYB этим и занимаются, я разницы особой не вижу.


Выделенное по-моему очень важный момент, т.е. программист должен практически ещё до возникновения задачи интуитивно догадаться, что ему понадобятся тэги. Т.е. фактически типизация вручную. А если код делал другой программер в другой стране пару лет назад?
Re[3]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.08 09:40
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Здравствуйте, nikov, Вы писали:


N>>Вот я, честно говоря, не вижу никаких преимуществ у динамических языков перед языками со статической типизацией, поддерживающими вывод типов и structural typing (например, Scala). Если мне кто-то их укажет, я буду очень благодарен.

Z>Вообще, это очень флеймоопасная тема (например на LtU ее обсуждение просто запрещено) — за пределами признания пары очевидных фактов:
Z>- Любая статическая система типов обявит некоторое множество корректных программ некорректными.
Продемонстрируй практический пример теоретического высказывания?
Ключевой вопрос имхо — в рамках чего будут корректны твои корректные программы?
Z>- Никакая статическая система типов не может гарантировать коррекности программы в целом.
Вообще никакие тулзы не могут гарантировать 100% корректность (даже в тулзах доказательства теорем есть пункт, а ту ли теорему вы сформулировали ), но есть по-моему заметная разница между некими гарантиями/констрейнтами и отсутствием оных. Я ничего не имею против динамической типизации, но статическая типизация переводит заметную часть "дисциплины" разработчика из его головы на компилятор, но при этом отнюдь не отменяет её. Т.е. мозг программиста всё равно обязателен, но внимание его переключается, туда или нет — зависит от языка (скажем не везде есть вывод типов и т.п. ньюансы)
Re[7]: Назначение динамических языков
От: z00n  
Дата: 14.12.08 09:49
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, deniok, Вы писали:


D>>Тип, тип. Только о тегах надо заранее позаботится. Иначе не к чему будет предикат цеплять. Собственно Typable + Data в SYB этим и занимаются, я разницы особой не вижу.


К>Выделенное по-моему очень важный момент, т.е. программист должен практически ещё до возникновения задачи интуитивно догадаться, что ему понадобятся тэги. Т.е. фактически типизация вручную. А если код делал другой программер в другой стране пару лет назад?


Я честно говоря не очень понимаю о чем вы оба говорите. Речь шла о SYB, т.е. грубо говоря о том как обходить всякие разлапистые деревья. Как изобразить такое дерево на языке с динамической типизацией без тегов я так даже с ходу и не соображу. Вот D.Mon рядом привел код на руби, который явно AST, c тегами. XML — хороший пример, тоже с тегами.
Прелесть таких структур данных заключается в том, что независимо от их сложности, они обходятся обычной функцией fold.

Интуитивно догадываться не нужно, есть книги, SICP например
Re[4]: Назначение динамических языков
От: z00n  
Дата: 14.12.08 10:01
Оценка:
Здравствуйте, Курилка, Вы писали:

Z>>- Любая статическая система типов обявит некоторое множество корректных программ некорректными.

К>Продемонстрируй практический пример теоретического высказывания?
Хрестоматийный пример: функция flattree — функция берет любое дерево и превращает его в плоский список.
К>Ключевой вопрос имхо — в рамках чего будут корректны твои корректные программы?
Z>>- Никакая статическая система типов не может гарантировать коррекности программы в целом.
К>Вообще никакие тулзы не могут гарантировать 100% корректность (даже в тулзах доказательства теорем есть пункт, а ту ли теорему вы сформулировали ), но есть по-моему заметная разница между некими гарантиями/констрейнтами и отсутствием оных. Я ничего не имею против динамической типизации, но статическая типизация переводит заметную часть "дисциплины" разработчика из его головы на компилятор, но при этом отнюдь не отменяет её. Т.е. мозг программиста всё равно обязателен, но внимание его переключается, туда или нет — зависит от языка (скажем не везде есть вывод типов и т.п. ньюансы)

Я не хочу спорить, но хочу заметить, что это вам кажется, что статическая типизация переводит заметную часть "дисциплины" разработчика из его головы на компилятор. Есть люди, которым кажется по другому — о чем тут говорить?
Re[5]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.08 10:12
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Здравствуйте, Курилка, Вы писали:


Z>>>- Любая статическая система типов обявит некоторое множество корректных программ некорректными.

К>>Продемонстрируй практический пример теоретического высказывания?
Z>Хрестоматийный пример: функция flattree — функция берет любое дерево и превращает его в плоский список.
Раскрой, пожалуйста, пример и проблему в нём для статики, по ходу мы разные христоматии читали.
Плюс я просил практический пример.

К>>Ключевой вопрос имхо — в рамках чего будут корректны твои корректные программы?

Этот вопрос ты скипнул?

Z>Я не хочу спорить, но хочу заметить, что это вам кажется, что статическая типизация переводит заметную часть "дисциплины" разработчика из его головы на компилятор. Есть люди, которым кажется по другому — о чем тут говорить?

Откуда ты берёшь "кажется"? Возьмём "соседний" пример: наличие тэгов ничем не гарантируется, кроме доброй воли автора, наличие типов в компилируемой программе гарантируется компилятором.
Но флейм начинать смысла нет, коли реальные факты принимаются за "кажется".
Re[8]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.08 10:17
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Здравствуйте, Курилка, Вы писали:


К>> А если код делал другой программер в другой стране пару лет назад?


Z>Интуитивно догадываться не нужно, есть книги, SICP например


Специально для тебя. 2 года назад даже намёка на задачу "по всему дереву" не было (и чего-нибудь около того), тэги были элементарно не нужны.
Ты же фактически говоришь на самом деле о "ручной" типизации, которую обязательно должен делать программист.
Re[9]: Назначение динамических языков
От: z00n  
Дата: 14.12.08 10:32
Оценка:
Здравствуйте, Курилка, Вы писали:

Z>>Интуитивно догадываться не нужно, есть книги, SICP например


К>Специально для тебя. 2 года назад даже намёка на задачу "по всему дереву" не было (и чего-нибудь около того), тэги были элементарно не нужны.

Сдаюсь — как такие задачи решает статическая типизация ?

К>Ты же фактически говоришь на самом деле о "ручной" типизации, которую обязательно должен делать программист.


Вот пример D.Mon-а. Как бы вы избавились бы от тегов?
[:while, [:less, :r0, [:getb, :p2]],
  [:do,
    [:inc, :r3, [:getb, :p2]],
    [:inc, :r2, 1]     
  ]
]
Re[8]: Назначение динамических языков
От: z00n  
Дата: 14.12.08 10:48
Оценка:
Здравствуйте, deniok, Вы писали:

Z>>Разница в том, что любой первокурсник может сделать это на схеме (ну или скажем руби). А SYB — это несколько Ph.D лет, куча статей ... В плохом смысле напоминает метапрограмирование на шаблонах.


D>Первокурсник? Аналог кода от Олега? С таким количеством ФВП?

D>Такой первокурсник на втором курсе легко заимплементирует SYB.

Первокурсник легко обойдется чем-нибудь попроще (олегов код передает состояние от родителей к детям и обратно)
Re[4]: Назначение динамических языков
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 14.12.08 10:49
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Кортеж?


А многие ли статически типизированные языки разрешают описать функцию, принимающую произвольный кортеж (в том числе произвольной длины)?
Re[10]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.08 10:53
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Здравствуйте, Курилка, Вы писали:


Z>>>Интуитивно догадываться не нужно, есть книги, SICP например


К>>Специально для тебя. 2 года назад даже намёка на задачу "по всему дереву" не было (и чего-нибудь около того), тэги были элементарно не нужны.

Z>Сдаюсь — как такие задачи решает статическая типизация ?
Задачи типизации, т.е. гарантии контрактов.

К>>Ты же фактически говоришь на самом деле о "ручной" типизации, которую обязательно должен делать программист.


Z>Вот пример D.Mon-а. Как бы вы избавились бы от тегов?

Там изначально был нужны тэги, так что вопрос некорректен. Я говорил как раз о варианте, когда тэги требуются после.
Но как вариант "развития ситуации": что будет если в код, которому был нужен этот "байткод" (именно тот код, а не тот, который работает просто с массивами) я передам [1,1,1]? Переходим к переходу к обработке контрактов в рантайме (или падению).
Re[11]: Назначение динамических языков
От: z00n  
Дата: 14.12.08 11:23
Оценка:
Здравствуйте, Курилка, Вы писали:

Z>>Сдаюсь — как такие задачи решает статическая типизация ?

К>Задачи типизации, т.е. гарантии контрактов.
Тут недавно гейм девелоперы мерялись ассертами — 1 ассерт на 5 строк кода. Не доверяют, видать, статической типизации

Z>>Вот пример D.Mon-а. Как бы вы избавились бы от тегов?

К>Там изначально был нужны тэги, так что вопрос некорректен. Я говорил как раз о варианте, когда тэги требуются после.
Например о каком? Мы то сначала говорили о SYB.

К>Но как вариант "развития ситуации": что будет если в код, которому был нужен этот "байткод" (именно тот код, а не тот, который работает просто с массивами) я передам [1,1,1]? Переходим к переходу к обработке контрактов в рантайме (или падению).


Это зависит — если это компилятор — то все "неинтересные" случаи мы просто пропускаем. В ерланге, например, можно подождать с этим пару недель — пока код не проапдейтят. Иногда имеет смысл исключение бросить. В чем проблема то?
Re[12]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.08 11:48
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Здравствуйте, Курилка, Вы писали:


К>>Задачи типизации, т.е. гарантии контрактов.

Z>Тут недавно гейм девелоперы мерялись ассертами — 1 ассерт на 5 строк кода. Не доверяют, видать, статической типизации

Вопрос — на каком языке гейм-девелоперы?
На Ocaml? Или C++?

Z>>>Вот пример D.Mon-а. Как бы вы избавились бы от тегов?

К>>Там изначально был нужны тэги, так что вопрос некорректен. Я говорил как раз о варианте, когда тэги требуются после.
Z>Например о каком? Мы то сначала говорили о SYB.
Речь как раз о вещи аля SYB. Только я говорю что у тебя есть 2 разных "момента написания кода": 1) написание исходной структуры данных; 2) написание собственно решения задачи на SYB (или обхода по тэгам как ты показывал). И в моменте 1 разработчик может быть совершенно не в курсе возможности момента 2, т.е. получим, что нужные тэги придётся добавлять.

К>>Но как вариант "развития ситуации": что будет если в код, которому был нужен этот "байткод" (именно тот код, а не тот, который работает просто с массивами) я передам [1,1,1]? Переходим к переходу к обработке контрактов в рантайме (или падению).


Z>Это зависит — если это компилятор — то все "неинтересные" случаи мы просто пропускаем. В ерланге, например, можно подождать с этим пару недель — пока код не проапдейтят. Иногда имеет смысл исключение бросить. В чем проблема то?


В чём может быть проблема зависит от конкретной ситуации, я же говорю о исходном факте (вроде бы тривиальном), что проверка контракта для статики происходит заметно раньше, т.е. ещё до запуска программы. Хотя мощность выразимых контрактов очень зависит от языка, безусловно, и просто статика не покрывает 100% необходимых вариантов (хотя, если будет развиваться что-то аля total function programming, то покрытие можно очень близко к этому приблизить).
Ну и никто не мешает автору "ручками" перепроверять контракты, безусловно
Пусть даже с использованием полуавтоматических средств, аля юнит-тесты и т.п.
Re[14]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.08 13:01
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Здравствуйте, Курилка, Вы писали:


К>>Вопрос — на каком языке гейм-девелоперы?

К>>На Ocaml? Или C++?

Z>А что, Ocaml уже поддерживает dependent types?


Не сочти за личный наезд, но ты еврей?
А "скипанье" вопросов несколько "гасит" желание общаться.
Плюс я не раз повторил, что 100% покрытия не будет, но приводить в пример не лучшие языки статической типизацией по меньшей мере не корректно.

К>>Речь как раз о вещи аля SYB. Только я говорю что у тебя есть 2 разных "момента написания кода": 1) написание исходной структуры данных; 2) написание собственно решения задачи на SYB (или обхода по тэгам как ты показывал). И в моменте 1 разработчик может быть совершенно не в курсе возможности момента 2, т.е. получим, что нужные тэги придётся добавлять.

Z>Я, извините, уже писал выше, что не предствляю. Как вы представляете себе XML без тегов? Как плоский текст? Тогда придется написать компилятор — как-то так
ОК, для корректного XML тебе понадобится XSD, что есть по сути типизация.

К>>В чём может быть проблема зависит от конкретной ситуации, я же говорю о исходном факте (вроде бы тривиальном), что проверка контракта для статики происходит заметно раньше, т.е. ещё до запуска программы.

Z>А вот представьте себе что вы пишете программу на Smalltalk, Lisp или Erlang, и запуск прграммы уже произошел несколько лет назад и у вас есть дебагер, который позволяет исправлять ошибки рантайм. Так ли ценна в таких условиях взможность находить опечатки в программе до запуска?

ОК, у тебя свич в продашкне на котором крутятся постоянно звонки, по нему ты пойдёшь дебагером? Плюс не только опечатки ловятся, некоторый класс логических ошибок тоже можно избежать (пусть и не так много)
Т.е. из 2 вариантов: 1)с меньшим числом гарантий и 2) с большим числом; я скорее склонюсь ко второму (если не будут существенны другие факторы).
Ну и флеймить больше что-то не охота
Re[2]: Назначение динамических языков
От: dotneter  
Дата: 14.12.08 13:34
Оценка:
Здравствуйте, nikov, Вы писали:

N>Вот я, честно говоря, не вижу никаких преимуществ у динамических языков перед языками со статической типизацией, поддерживающими вывод типов и structural typing (например, Scala). Если мне кто-то их укажет, я буду очень благодарен.


А кто-нибудь может перечислить преимущества статически типизированных языков перед динамическими?
Например можно ли считать таковым более простой способ реализации поддержки IDE, или это проблемма разработчиков инструментов и к языку не имеет относится?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[6]: Назначение динамических языков
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 14.12.08 15:55
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Тогда что нибудь типа анонимного union type,

D>["a", 1, "b"] string|int list
D>["a", 2, true] string|int|bool list
D>А потом патерн мачингом бежим по этому списку и радуемся жизни.

Не пойдет — элементами списка могут быть другие такие списки. Т.е. дерево обычное. Придется по-хорошему описать все дерево.
Re[11]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.12.08 16:29
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Вот об этом-то тебе я и пытаюсь сказать: при переходе к dll мы теряем типизацию


При переходе к dll мы вообще оказываемся за рамками языка.

К> Т.е. если упростить, то фактически решение почти равносильно перезагрузке программы.


Ничего не понял.

К> В отличие от этого, эрланговские процессы при хотсвопе продолжат работу с новым кодом


Ну и что? Во-первых какое это имеет отношение к типизации, если сей процесс принципиально происходит в рантайме и выходит за рамки контроля компилятора, а во-вторых нафига нужна эта мегафича?

К>Можно ли сделать обновление кода без какого-то отказа от типизации по-моему большой вопрос.


Это не большой вопрос, это абсолютно ортогональный статической типизации вопрос.
... << RSDN@Home 1.2.0 alpha 4 rev. 1120 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[3]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.12.08 16:29
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Первый пришедший на ум пример — гетерогенные структуры данных без предварительного описания.


Анонимные типы? Нет, конечно в существующем виде они не очень гибки, но саму возможность наличия подобной фичи в статических языках они, имхо, вполне демонстрируют. А дальше никто не мешает их, к примеру, скрестить с алгебраическими типами данных.
... << RSDN@Home 1.2.0 alpha 4 rev. 1120 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[8]: Назначение динамических языков
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 14.12.08 18:24
Оценка:
Здравствуйте, dotneter, Вы писали:

D>Не вижу противоречий

D>
["a", [1]] : list<string|list<int>>


Все еще нету желаемой произвольной глубины — я же говорил "другие такие списки".

D>или написать что нибудь типа...


Вот мы и пришли к полному описанию всего типа. А в динамических языках оно не требуется.
И еще — что это за ML такой, что позволяет делать (int | string) list?
Re[9]: Назначение динамических языков
От: dotneter  
Дата: 14.12.08 18:50
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Вот мы и пришли к полному описанию всего типа. А в динамических языках оно не требуется.

Можно предположить что этот тип идет в стандартной поставке вместе с list.
DM>И еще — что это за ML такой, что позволяет делать (int | string) list?
Вымышленный, хотя в трилиарде деалектов может где такое и реализовано.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[9]: Назначение динамических языков
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.12.08 18:55
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Здравствуйте, dotneter, Вы писали:


D>>Не вижу противоречий

D>>
["a", [1]] : list<string|list<int>>


DM>Все еще нету желаемой произвольной глубины — я же говорил "другие такие списки".


Стандартное хаскельное дерево
data Tree a = Leaf a | Tree a :^: Tree a


Потянет?
В вариант "Leaf a" можно запихать произвольный юнион каких хочешь листьев (хотя задачей этот юнион, безусловно, должен быть ограничен).
Re[3]: Назначение динамических языков
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 15.12.08 09:00
Оценка:
Здравствуйте, dotneter, Вы писали:

D>А кто-нибудь может перечислить преимущества статически типизированных языков перед динамическими?


Скорость исполнения. При наличии статической типизации компилятор способен генерировать быстрый код сразу. В случае статической типизации нужно иметь что-то типа HotSpot со сбором статистики и пр.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.12.08 10:47
Оценка:
Здравствуйте, eao197, Вы писали:

E>Скорость исполнения. При наличии статической типизации компилятор способен генерировать быстрый код сразу. В случае статической типизации нужно иметь что-то типа HotSpot со сбором статистики и пр.


Ничего не понял.
... << RSDN@Home 1.2.0 alpha 4 rev. 1120 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[5]: Назначение динамических языков
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 15.12.08 13:01
Оценка:
Здравствуйте, AndrewVK, Вы писали:

E>>Скорость исполнения. При наличии статической типизации компилятор способен генерировать быстрый код сразу. В случае статической типизации нужно иметь что-то типа HotSpot со сбором статистики и пр.


AVK>Ничего не понял.


Очепятка, последнее предложение читать следует как: "В случае динамической типизации нужно иметь что-то типа HotSpot со сбором статистики и пр."


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[10]: Назначение динамических языков
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 15.12.08 14:34
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Стандартное хаскельное дерево


Разумеется, можно описать дерево со всеми его особенностями (как обычно AST записываем). Просто тогда сразу возникают проблемы (задачи), которые призван решать SYB, но он доступен не везде. И работать с ним так же просто, как с массивом, уже не получится. Хотя на практике это редко нужно..
Re[2]: Назначение динамических языков
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 15.12.08 14:35
Оценка:
Здравствуйте, nikov, Вы писали:

http://www.rsdn.ru/Forum/Message.aspx?mid=3169353&amp;only=1
Автор: Serginio1
Дата: 10.11.08
и солнце б утром не вставало, когда бы не было меня
Re[6]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.12.08 14:49
Оценка:
Здравствуйте, eao197, Вы писали:

E>Очепятка, последнее предложение читать следует как: "В случае динамической типизации нужно иметь что-то типа HotSpot со сбором статистики и пр."


Опять не очень понятно. HotSpot сделали для статически типизированной джавы, для того чтобы съэкономить в некоторых сценариях на JIT компиляции. Ты имеешь в виду, что типы придется в рантайме ресолвить? Вполне возможно, но к хотспоту это отношения не имеет.
Кстати, на C# 4, по идее, такую фичу можно забацать сравнительно просто.
... << RSDN@Home 1.2.0 alpha 4 rev. 1120 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[7]: Назначение динамических языков
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 15.12.08 15:06
Оценка:
Здравствуйте, AndrewVK, Вы писали:

E>>Очепятка, последнее предложение читать следует как: "В случае динамической типизации нужно иметь что-то типа HotSpot со сбором статистики и пр."


AVK>Опять не очень понятно. HotSpot сделали для статически типизированной джавы, для того чтобы съэкономить в некоторых сценариях на JIT компиляции. Ты имеешь в виду, что типы придется в рантайме ресолвить? Вполне возможно, но к хотспоту это отношения не имеет.


Насколько я помню историю, корни HotSpot-а идут из самой быстрой реализации VM для Smalltalk-а под названием Strongtalk. И, если не ошибаюсь, сейчас увеличение скорости работы VM для динамических языков достигается за счет того, что после нескольких обращений к одному методу одного и того же объекта вызов этого метода заменяется простой инструкцией call вместо поиска тела метода через таблицу методов (включая унаследованные из базовых типов). Для чего и требуется сбор статистики.

Скажем, если в статически-типизированном языке у нас может быть:
// Для примера C++, в котором виртуальные методы нужно объявлять явно.
class B {
};

class C : public B {
  public :
    void a() { std::cout << "C::a" << std::endl; }
};

C a;
a.a(); // Транслируется в call C::a.
a.b(); // Не транслируется вовсе.

Тогда как в динамически-типизированном языке:
# Ruby, поскольку я его хоть чуть-чуть знаю.
class B
end

class C < B
  def a; puts 'C#a'; end
end

a = C.new
a.a # Напечатает C#a
a.b # Выдаст ошибку времени исполнения. Но, если ее перехватить и продолжить...

# Класс B обновляется.
class B
  def b; puts 'B#b'; end
end

a.b # Ошибки уже не будет, а будет напечатано B#b.

Т.е. в динамическом языке любой вызов, по умолчанию, должен проходить через поиск метода в таблице методов конкретного объекта (поскольку даже у объекта набор методов может не совпадать с набором методов класса, к которому объект изначально принадлежал). Но, если ни объект, ни его тип не изменялись с момента последнего вызова, то обращение к конкретному методу можно сделать более эффективным. Что, с другой стороны, требует затрат в run-time, которых, в принципе, нет в случае статически-типизированных языков (где даже в случае виртуальных методов возможны оптимизации еще во время компиляции/линковки и выбрасывание лишней косвенности).

AVK>Кстати, на C# 4, по идее, такую фичу можно забацать сравнительно просто.


Извини, но это напоминает "кто о чем, а вшивый о бане" Не .Net-ом единым


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[8]: Назначение динамических языков
От: Andrey_Pilya  
Дата: 17.12.08 11:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Курилка, Вы писали:


К>>Пример, безусловно, надуманный, но используется особенность задачи, т.е. относительно короткие, но частые запросы (т.е. для другого рода приложений потребуется отдельное решение, в отличие от общего решения в случае эрланга).


AVK>Так вот интересуют то именно практические моменты, а не надуманные примеры. И засада здесь не с языком, а с единицей деплоймента.


сейчас в вебе широко используется стриминг.
так вот, если процесс, который формирует поток (скажем Video или это XML-поток, или это докачка файла...), не закрывает соединение, и не получает новых запросов, а просто фигачит в OUTPUT что-то. но в какой-то момент,
власть поменялась и фигачить нужно уже "с другими загогулинами", например, с другой пред-обработкой видео или по-другому читать файл, который фигачить и т.п.

в такой ситуации правильнее разделять того, кто фигачит поток и того, кто его предоставляет.
таким образом, замена провайдера (того, кто предоставляет) произойдет более или менее прозрачно для исходящего потока, и замена сборки тут не нужна.

..Правда если речь идет не об одной задаче, а о множестве компонентов, которые мало знают друг о друге,
и далеко не все знают о том, что какие-то другие могут поменяться...
то тут возникает множество частных решений, ненужных усложнений и мусор в памяти
и это не проблема того, как написана программа, а проблема общей инфраструктуры, в которой нельзя динамически замещать куски программы.

.NET этим страдает — статическая среда для удобства компиллятора
(это обсуждать наверное не нужно, что бы избежать флейма, просто мое мнение)
Re[9]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.12.08 00:39
Оценка:
Здравствуйте, Andrey_Pilya, Вы писали:

A_P>в такой ситуации правильнее разделять того, кто фигачит поток и того, кто его предоставляет.

A_P>таким образом, замена провайдера (того, кто предоставляет) произойдет более или менее прозрачно для исходящего потока, и замена сборки тут не нужна.

Что то я шутки не уловил. Предполагается, что кто то будет править код сайта в момент скачки видео?
Ну и с незакрываемым соединением — с масштабируемостью у такого подхода траблы.

A_P>и это не проблема того, как написана программа, а проблема общей инфраструктуры, в которой нельзя динамически замещать куски программы.


А главное, к языку это совсем не имеет отношения.

A_P>.NET этим страдает — статическая среда для удобства компиллятора


.NET как раз таки динамический. Но строго типизированный. Не путай два ортогональных понятия.
... << RSDN@Home 1.2.0 alpha 4 rev. 1127 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[12]: Назначение динамических языков
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 18.12.08 15:41
Оценка:
AndrewVK,

AVK>Ну и что? Во-первых какое это имеет отношение к типизации, если сей процесс принципиально происходит в рантайме и выходит за рамки контроля компилятора, а во-вторых нафига нужна эта мегафича?


Хотя бы для этого: 12 min video
Чтобы это было возможно (это = сохранение остальных коннекшнов, процессов и данных в прежнем состоянии), нужна довольно маленькая гранулярность.

Можно провести параллель между фотографией и снапшотом процесса.
Пусть на фотографии мы пытаемся заменить красные зрачки на нормальные. Если гранулы достаточно маленькие, то мы легко заменяем оттенки красного на оттенки чёрного цвета в указанной маленькой области — и все дела.
Но если гранулы достаточно большие, то например замена красного цвета на левом зрачке вызовет посинение левой половины лица и потемнение уха, а жёлтые листочки на фоне станут тёмно-зелёными. Фотография (то есть состояние процесса) будет убита.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[10]: Назначение динамических языков
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 18.12.08 16:22
Оценка:
z00n,

К>>Ты же фактически говоришь на самом деле о "ручной" типизации, которую обязательно должен делать программист.


Z>Вот пример D.Mon-а. Как бы вы избавились бы от тегов?

Z>
 ...


Я полагаю, что речь идёт о такой задаче: сначала у нас есть просто дерево символов
'(while (less r0 (getb p2))
    (do
        (inc r3 (getb p2))
        (inc r2 1)))

А теперь мы говорим — у нас while, less и do имеют тип "оператор", getb и inc имеют тип "функция", а r0 и т.п. — "переменная". И потом хотим проехаться по такому дереву и чего-нибудь умное сделать.

Хотя решение в-общем-то тривиально, достаточно одного дополнительного применения foldts, переводящего скажем элемент while в '(op while), и получить
'((op while) ((op less) (var r0) ((func getb) (var p2)))
    ((op do)
        ((func inc) (var r3) ((func getb) (var p2)))
        ((func inc) (var r2) (var l))))

Да и явно создавать это дерево не нужно, достаточно во время траверса по исходному дереву просто вызывать функцию elem -> '(tag elem) перед обработкой элемента.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[13]: Назначение динамических языков
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.12.08 16:36
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Можно провести параллель между фотографией и снапшотом процесса.

LCR>Пусть на фотографии мы пытаемся заменить красные зрачки на нормальные. Если гранулы достаточно маленькие, то мы легко заменяем оттенки красного на оттенки чёрного цвета в указанной маленькой области — и все дела.
LCR>Но если гранулы достаточно большие, то например замена красного цвета на левом зрачке вызовет посинение левой половины лица и потемнение уха, а жёлтые листочки на фоне станут тёмно-зелёными. Фотография (то есть состояние процесса) будет убита.

Что такое гранулярность я в курсе, не надо объяснять. Мне непонятна связь гранулярности и возможности на ходу, по живому, править любой существующий код, связь этой фичи со статической типизацией языка, и практическое ее применение.
... << RSDN@Home 1.2.0 alpha 4 rev. 1127 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[11]: Назначение динамических языков
От: z00n  
Дата: 19.12.08 10:48
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

К>>>Ты же фактически говоришь на самом деле о "ручной" типизации, которую обязательно должен делать программист.


Z>>Вот пример D.Mon-а. Как бы вы избавились бы от тегов?

Z>>
 ...


LCR>Я полагаю, что речь идёт о такой задаче: сначала у нас есть просто дерево символов

LCR>
LCR>'(while (less r0 (getb p2))
LCR>...
LCR>

LCR>А теперь мы говорим — у нас while, less и do имеют тип "оператор", getb и inc имеют тип "функция", а r0 и т.п. — "переменная". И потом хотим проехаться по такому дереву и чего-нибудь умное сделать.

Интересная гипотеза, но поскольку тут теги есть изначально — наверное имели в виду что-то другое
Re[4]: Назначение динамических языков
От: cadet354 Россия
Дата: 02.02.09 19:32
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Реализуемо. ASP.NET, к примеру, вполне справляется. Это фича рантайма, а не языка.

А разве при этом всё web приложение не перегружается?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.