Динамические возможности в статических языках
От: x-code  
Дата: 14.11.11 10:06
Оценка:
Речь о языках типа С++, т.е. компилируемых в машинный код.
Под динамическими возможностями я понимаю в первую очередь динамическое(позднее) связывание (хотя может есть что-то еще?)
Из известного мне:
1. Виртуальные функции C++. В основе — некая таблица указателей на функции (vtbl), каждой функции класса ставится в соответствие некий идентификатор (номер), который используется для индексирования vtbl.
2. Сообщения Objective C. Отправка сообщения — это вызов функции objc_msgSend, которой передается уникальный идентификатор сообщения (вероятно, глобальный номер функции). Вызов осуществляется путем поиска по таблицам, похожим на vtbl, но, насколько я понимаю, там используется хеш-таблица или что-то в этом роде.
3. Сигналы и слоты в QT. Аналогично, при отправке сигнала вызывается функция activate_signal, аргументом которой является некий идентфикатор сигнала. Отличие в том, что в ObjC нет отдельной сущности "сигналы" (наверное, ближе всего к сигналам тип "селектор" — тот самый идентификатор функции).
4. Тип dynamic в C#. Принцип, насколько я понимаю, в общем тот-же — вызов метода превращается в вызов InvokeMember, в который передается имя метода в виде строки (я не настолько хорошо знаю C#, так что это я просто подсмотрел в какой-то статье).

Итак, предположим что разрабатывается некий язык программирования. Хочется объединить все эти возможности наиболее грамотно и красиво, и так, чтобы объединить все фичи всех перечисленных вариантов.

И еще — какие динамические возможности есть еще? Какие возможности вы хотели видеть в вашем языке программирования?

В общем, предгалаю пофантазировать не тему
Re: Динамические возможности в статических языках
От: maxkar  
Дата: 14.11.11 11:56
Оценка: +1
Здравствуйте, x-code, Вы писали:

XC>4. Тип dynamic в C#. Принцип, насколько я понимаю, в общем тот-же — вызов метода превращается в вызов InvokeMember, в который передается имя метода в виде строки (я не настолько хорошо знаю C#, так что это я просто подсмотрел в какой-то статье).


Не все так просто . lookup метода по строковому идентификатору — это мелочи. Не мелочи — работа с типами аргументов. Что будет, если я при вызове функции у "динамического" объекта передам неверные аргументы (неверное число, неверный тип и т.п.)? Все это проверяется рантаймом. При компиляции в машинный достать "тип" функции по ее адресу/имени можно (хотя тоже не так просто, см. дальше). А вот как быть с типами передаваемых аргументов? Вы будете с каждым объектом таскать "тип данных"? В том числе для примитивных int/double и т.п.? А что будет со сложными (составными) типами? C++ еще сложностей добавляет — как формировать "массив" аргументов? Передавать ли туда сложные объекты или только данные по ссылке? Ну и после всего этого захочется глобальную оптимизацию по отпиливанию лишней информации о типах там, где она не нужна.

XC>И еще — какие динамические возможности есть еще? Какие возможности вы хотели видеть в вашем языке программирования?


Возможность получить аргументы функции в "нетипизированном" виде в точке вызова. Выглядит так:
//пример 1
public static function ignore(...args) : void {
  //игнорирует аргументы.
}

//пример 2
public function mkGuard(f : Function, onException : Function) : Function {
  return function(...args) : * {
    try {
      f.invoke(null, args);
    } catch (e : *) {
      onException(e);
    }
  }
}


Язык ActionScript 3.0. f.invoke — вызов функции с передачей аргументов в виде массива. Первый параметр — this, для примера не важен.

Еще для динамики может потребоваться подробная информация о типах во время выполнения. Особенно хорошо смотрится в сочетании с той же Function.apply()

//пример 3
var x : R = R.lift(someFunction, [arg1, arg2, 3, 4]);

Это из рабочего кода с небольшими изменениями. R — имеет метод value (получить значение) и методы для подписки/отписки на изменения. В результате x.value изменяет свое значение при изменении ar1 и arg2 (они типа R). Значение вычисляется вызовом функции someFunction на аргументах arg1.value, arg2.value, 3 и 4. Если смущает функциональный тип — могу передать объект и название метода. Возможность формирования аргументов вызова все равно потребуется. Как вы это планируете реализовать?

А само "позднее связывание" в динамике у меня практически нигде не используется. Вместо него если нужен "полиморфизм" — явно передаются сами функции (благо соответствующий тип есть). На позднее связывание оно чем-то похоже, но вместо "объект+адрес" передаются сразу те сущности, которые нужны.
Re: Динамические возможности в статических языках
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 14.11.11 12:12
Оценка:
XC>И еще — какие динамические возможности есть еще? Какие возможности вы хотели видеть в вашем языке программирования?

duck typing
изменение структуры объекта на лету (или в твоим терминах — изменение vtable в runtime-е из кода)
возможность собрать/разобрать произвольный код в runtime
Re: Динамические возможности в статических языках
От: AlexCab LinkedIn
Дата: 14.11.11 14:28
Оценка: :))
XC>Здравствуйте, x-code, Вы писали:
XC>Речь о языках типа С++, т.е. компилируемых в машинный код.
XC>Под динамическими возможностями я понимаю в первую очередь динамическое(позднее) связывание (хотя может есть что-то еще?)
XC>...
XC>В общем, предгалаю пофантазировать не тему

Я в своём проекте
Автор: AlexCab
Дата: 01.03.11
использовал следующую модель(что-то типа "COM"):

Термины:
Программа — Проект когда он в виде исходного кода.
Приложение — Собранная программа(дистрибутив или уже установленная или работающая).
Прототип модуля — На подобии класса ООП.
Экземпляр модуля – На подобии объекта ООП.
Процесс(Windows) — Контейнер работающего приложения.

Описание:
Работающее приложение состоит из экземпляров модулей, связанных друг с другом интерфейсами:

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

Здесь(~500kB) более подробно но менее понятно, рабочая версия

Буду сильно благодарен за критику.
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re: Динамические возможности в статических языках
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.11.11 22:54
Оценка:
Здравствуйте, x-code, Вы писали:

XC>И еще — какие динамические возможности есть еще? Какие возможности вы хотели видеть в вашем языке программирования?


Паттен-матчинг и мультиметоды. Язык без одного из перечисленных для меня сразу попадает в разряд устаревших.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Динамические возможности в статических языках
От: Ziaw Россия  
Дата: 15.11.11 00:43
Оценка: 1 (1) +2
Здравствуйте, AlexCab, Вы писали:

Картинка зачетная. Не удивлюсь, если она станет популярной
Re: Динамические возможности в статических языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.11.11 18:15
Оценка:
Здравствуйте, x-code, Вы писали:

XC>4. Тип dynamic в C#. Принцип, насколько я понимаю, в общем тот-же — вызов метода превращается в вызов InvokeMember, в который передается имя метода в виде строки (я не настолько хорошо знаю C#, так что это я просто подсмотрел в какой-то статье).


Все несколько сложнее (ты, надеюсь, понимаешь, что динамика в шарпе вызовом метода не ограничивается?). Работу с динамиками компилятор шарпа преобразует в семантическое дерево, которое скидывает прямо в бинарный код (в виде набора вызовов статических фабричных методов). В рантайме дерево отдается биндеру, который это дерево использует для непосредственно исполнения. В простейшем случае — интерпретирует, в более сложных пытается что то скомпилировать, оптимизировать и т.п.

XC>Итак, предположим что разрабатывается некий язык программирования. Хочется объединить все эти возможности наиболее грамотно и красиво, и так, чтобы объединить все фичи всех перечисленных вариантов.


Если тебе нужна динамика в полный рост, ничего принципиально лучше шарпа я в этом плане не видел.
... << RSDN@Home 1.2.0 alpha 5 rev. 1537 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[2]: Динамические возможности в статических языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.11.11 18:15
Оценка:
Здравствуйте, DarkGray, Вы писали:

XC>>И еще — какие динамические возможности есть еще? Какие возможности вы хотели видеть в вашем языке программирования?


DG>duck typing


DT в общем случае не требует динамики обязательно. То же наложение делегата на метод в дотнете — DT, при этом статически типизированное. Классы типов в Хаскеле в какой то мере тоже DT.

DG>возможность собрать/разобрать произвольный код в runtime


Опять же ортогонально динамике.
... << RSDN@Home 1.2.0 alpha 5 rev. 1537 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[2]: Динамические возможности в статических языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.11.11 18:17
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Паттен-матчинг и мультиметоды.


А смысл в мультиметодах, если есть ПМ+АлгТД? Вот если б мультиметоды + АлгТД с контролем наличия всех вариантов (эдакий ПМ на уровне методов), тогда это имело бы смысл.
... << RSDN@Home 1.2.0 alpha 5 rev. 1537 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[3]: Динамические возможности в статических языках
От: Cyberax Марс  
Дата: 15.11.11 18:22
Оценка:
Здравствуйте, AndrewVK, Вы писали:

VD>>Паттен-матчинг и мультиметоды.

AVK>А смысл в мультиметодах, если есть ПМ+АлгТД? Вот если б мультиметоды + АлгТД с контролем наличия всех вариантов (эдакий ПМ на уровне методов), тогда это имело бы смысл.
Я бы не отказался от ПМ с контролем всех вариантов.
Sapienti sat!
Re[4]: Динамические возможности в статических языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.11.11 18:24
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я бы не отказался от ПМ с контролем всех вариантов.


Это само собой. Собственно, смысл применения АлгТД в основном и состоит в возможности статически проконтроллировать гарантию обхода всех вариантов. Влад уже где то писал, что АлгТД даже не обязательны, можно обойтись и более мягкими ограничениями, лишь бы возможность статического вычисления всех вариантов сохранилась.
... << RSDN@Home 1.2.0 alpha 5 rev. 1537 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[3]: Динамические возможности в статических языках
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.11.11 18:42
Оценка:
Здравствуйте, AndrewVK, Вы писали:

VD>>Паттен-матчинг и мультиметоды.


AVK>А смысл в мультиметодах, если есть ПМ+АлгТД? Вот если б мультиметоды + АлгТД с контролем наличия всех вариантов (эдакий ПМ на уровне методов), тогда это имело бы смысл.


Каков вопрос таков ответ. Если хочешь, могу вместо "и" поставить "или".

Просто, если уж говорить о динамики в статике, то про эти две фичи забывать нельзя.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Динамические возможности в статических языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.11.11 19:07
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Каков вопрос таков ответ. Если хочешь, могу вместо "и" поставить "или".


Если "или", то я предпочел бы ПМ — от него к мультиметодам перейти синтаксически довольно дешево, а вот в обратную сторону уже нет.
... << RSDN@Home 1.2.0 alpha 5 rev. 1537 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[5]: Динамические возможности в статических языках
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.11.11 19:18
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Если "или", то я предпочел бы ПМ — от него к мультиметодам перейти синтаксически довольно дешево, а вот в обратную сторону уже нет.


Как я понял автора темы, его интересуют различны. А так, я тоже считаю, что у мультиметодов проблем много, а их область применения уже.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Динамические возможности в статических языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.11.11 19:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Как я понял автора темы, его интересуют различны. А так, я тоже считаю, что у мультиметодов проблем много, а их область применения уже.


Ну, у мультиметодов тоже есть достоинства. К при меру, одно ПМ выражение на несколько сотен строк — тоже не здорово. Просто с ПМ можно вытащить интерфейс с методами (визитор, если кому угодно) и один раз написать ПМ, который содержит только диспетчеризацию по этим методам и ничего более. Писанины, конечно, больше будет, но непринципиально. А вот городить мультиметоды, когда надо несложный вариант распаковать — это примерно как линк без лямбд.
... << RSDN@Home 1.2.0 alpha 5 rev. 1537 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[2]: Динамические возможности в статических языках
От: vdimas Россия  
Дата: 16.11.11 12:01
Оценка:
Здравствуйте, AlexCab, Вы писали:

AC>Я в своём проекте
Автор: AlexCab
Дата: 01.03.11
использовал следующую модель(что-то типа "COM"):

AC>Буду сильно благодарен за критику.

Было бы неплохо обрисовать, чем отличается от COM и CORBA, и почему именно так, если хочешь с чего-то начать обсуждение.
Re[3]: Динамические возможности в статических языках
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 16.11.11 15:25
Оценка:
DG>>duck typing

AVK>DT в общем случае не требует динамики обязательно.


согласен. это просто сильно корреляция (обусловленная особенностями реализации одного и другого).

в реальности на объектах в статике редко делают duck typing, в первую очередь, из-за того, что этому не способствует обычный способ реализации объектов(vtable и т.д.) в статике: и для duck typing-а приходится придумывать всякие прокси, разбираться что происходит с равенством объектов и т.д.

DG>>возможность собрать/разобрать произвольный код в runtime


AVK>Опять же ортогонально динамике.


тоже согласен. здесь тоже лишь сильная корреляция — опять же больше обусловленная реализацией, что динамику обычно реализует на интерпретаторе (и сгенерить код — тогда ничего не стоит), а статику реализуют на компиляторе (и новый код уже сложнее затащить в программу)
Re[3]: Динамические возможности в статических языках
От: AlexCab LinkedIn
Дата: 17.11.11 13:13
Оценка:
Здравствуйте, vdimas, Вы писали:
V>Было бы неплохо обрисовать, чем отличается от COM и CORBA, и почему именно так, если хочешь с чего-то начать обсуждение.

Был исправлен фатальный недостаток, плюс ещё некоторые мелочи

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

Компонентный подход(в целом, на сколько я его понимаю) предлагает рассматривать приложение как набор модулей(компонентов), связанных интерфейсами. Каждый модуль инкапсулирует в себе некоторою часть функционала приложения, и может взаимодействовать с другими модулями исключительно через строго определённые интерфейсы, которые предварительно должны быть соединены(подключены), в отличии от ООП где любой объект может отравлять сообщения любому другому без каких либо формальностей.
Что даёт преимущества:
*.Сборка приложений из полностью готовых модулей или с минимальным количеством кодирования(при условии наличия достаточного числа готовых).
*.Динамическая сборка приложения(это например когда загружаются только те части приложения которые нужны в данный момент пользователю).
*.Во многих случаях более простая чем, в ООП, отладка.
*.Более строгие правила инкапсуляции обязывают к более тщательной проработке архитектуры приложения, но в тоже время позволяют легко разбить реализацию приложения на чисти и поручить например разными разработчикам.
и т.п.
И недостатки:
*.Сложность проектирования архитектуры.
*."громоздкость", по сравнению с ООП требуется дополнительный код для обеспечения работы самой КМ.
и т.п.

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

Вот в вкратце как то так. Через пару-тройку месяцев я доработаю текущую версию своего ЯП и выложу здесь на обсуждения, пожалуйста не разбегайтесь
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re: Динамические возможности в статических языках
От: jazzer Россия Skype: enerjazzer
Дата: 27.11.11 17:47
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Речь о языках типа С++, т.е. компилируемых в машинный код.

Если тебе ехать, а не шашечки, то заюзай Boost.Python или любой другой скриптовый движок (Boost.Python лучше с синтаксической точки зрения).
Соответственно, вся динамика у тебя будет в скриптах.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Динамические возможности в статических языках
От: BulatZiganshin  
Дата: 28.11.11 21:25
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Под динамическими возможностями я понимаю в первую очередь динамическое(позднее) связывание (хотя может есть что-то еще?)


rtti (вплоть до возможности получить все поля и методы объекта в таком виде, чтобы можно было их вызывать, использовать их типы, дальше деструктурировать составные типы и т.д.), изменение классов/объектов на лету (добавление/замена в класс/объект методов/полей), трассировка/аоп (скажем добавить свой preaction во все вызовы или получать управление при всех добавлениях в объект новых методов), организация своего порядка выполнения (создание управляющих операторов, монады, continuation)
Люди, я люблю вас! Будьте бдительны!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.