OberonCore https://forum.oberoncore.ru/ |
|
Mini Component Pascal https://forum.oberoncore.ru/viewtopic.php?f=29&t=494 |
Страница 2 из 3 |
Автор: | Wlad [ Среда, 06 Июнь, 2007 17:36 ] |
Заголовок сообщения: | |
Алексей Елин писал(а): типы тоже могут быть одинаковыми - генерик тип FixedLengthArray.
Нет никакой причины запрещать для нескольких экземпляров генерик типа, даже с разными параметрами, ссылаться на один и тот же тип (дескриптор типа). ЭТО - РАЗНЫЕ ТИПЫ ПО РЕАЛИЗАЦИИ УТОЧНЁННОГО ГЕНЕРИКА! Не могут они ссылаться на один и тот же дескриптор типа! Мы получили два новых типа-"наследника" генерика, параметризировав общий генерик. Экземпляры объектов этих типолв будут имет разные тэги. |
Автор: | Илья Ермаков [ Среда, 06 Июнь, 2007 17:37 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Wlad писал(а): Trurl писал(а): Wlad писал(а): Зачем? В виртуальные методы вы только указатель на объект передаёте... В C++ только указатель, а в Обероне ещё и дескриптор типа. Кажецо я что-то упустил или запамятовал? Разве в метод (виртуальный) первым невидимым параметром не достаточно передать указатель на экземпляр объекта? Насколько я знаю, тэг извлекается именно из места, рядом с расположением структуры виртуальной таблицы данного класса... Я не прав, что-то поменялось или я что-то напутал? Или тег - это и есть указатель на область памяти с vtbl + ещё мишура чуть ниже прямо перед vtbl. Вы правы! В метод с динамическим параметром (POINTER TO...) передается только указатель. Тег извлекается по (адрес объекта - 4 байт). А вот если метод со ссылочным параметром (VAR/IN/OUT), тогда рядом с ним скрытно через стек идет тег типа... |
Автор: | Илья Ермаков [ Среда, 06 Июнь, 2007 17:41 ] |
Заголовок сообщения: | |
Как это так, прошу прощения, нет причины запрещать? Тег типа - это в том числе описание структуры полей в памяти - и размеров. FixedLengthArray только в данном конкретном случае инстанциировался с одинаковой внутренней структурой. А в общем случае именно что разные структуры получаются, от размера типа-параметра... Я работаю через метапрограммирование и получаю смещение для поля X какого-то интанциированного типа-дженерика. И в зависимости от конкретного типа, в который инстанцировался дженерик, я должен буду получить разные смещения. Соотв., и теги типов должны быть разные. |
Автор: | Алексей Елин [ Среда, 06 Июнь, 2007 19:05 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): Как это так, прошу прощения, нет причины запрещать?
Я работаю через метапрограммирование и получаю смещение для поля X какого-то интанциированного типа-дженерика. И в зависимости от конкретного типа, в который инстанцировался дженерик, я должен буду получить разные смещения. Нет. Смещения будут одинаковыми. Просто по смещению можно ВСЕГДА расспологать указатель на экземпляр (даже в случае, если тип типа-аргумента - record). Компилятор может "представлять" его как обычное поле, но фактически это будет указатель. Память под него можно выделять, например, одновременно с выделением памяти под экземпляр (инстанцированного) конейнера, в одном блоке, сразу после него. Это позволит избежать дополнительных временнЫх рассходов на выделение памяти для "фиктивных" полей. |
Автор: | Алексей Елин [ Среда, 06 Июнь, 2007 20:03 ] |
Заголовок сообщения: | |
Wlad писал(а): ЭТО - РАЗНЫЕ ТИПЫ ПО РЕАЛИЗАЦИИ УТОЧНЁННОГО ГЕНЕРИКА!
По этому поводу могу сослаться на: http://rsdn.ru/article/java/genericsinjava.xml где описаны особенности реализации generic в java. И обратите внимание на раздел "Одна реализация на все случаи". Конечно, в java все типы ссылочные, однако это "обходится" (маскируется?) предложенными ранее приемами... |
Автор: | Илья Ермаков [ Среда, 06 Июнь, 2007 23:00 ] |
Заголовок сообщения: | |
Вот именно, что смещения будут одинаковыми только если располагать там указатель... А если все-таки говорить о полноценных дженериках? А полноценные дженерики в Обероне можно реализовать только если код будет храниться в промежуточном представлении, и кодогенерация под каждую инстанцию шаблона идет динамически... |
Автор: | Алексей Елин [ Среда, 06 Июнь, 2007 23:13 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): А если все-таки говорить о полноценных дженериках?
И что же такое полноценные дженерики, стесняюсь спросить? Чем они отличаются от "неполноценных", кроме мизерных накладных расходов на неявное разыменование указателей для статических полей-рекордов? |
Автор: | Илья Ермаков [ Четверг, 07 Июнь, 2007 22:09 ] |
Заголовок сообщения: | |
Ага, если бы vector<int> в STL тоже делался с "всего-то одним лишним уровнем косвенности", то его популярность бы сильно поубавилась... Дело в том, что для динамических объектов дженерики как раз не сильно нужны - там можно себе позволить задействовать ОО-полиморфизм и т.п. Хочется дженериков для построения библиотеки базовых алгоритмов, работающих с любыми типами, начиная с атомарных - и без оверхеда. С оверхедом я вам и без дженериков напишу общий алгоритм - через метапрограммирование можно работать как угодно и с чем угодно... ОТ МОДЕРАТОРА: "излияние мыслей" по поводу стандартной библиотеки перенесено в отдельную ветку BlackBox Framework - Повторно используемые структуры данных-алгоритмы" |
Автор: | Сергей Прохоренко [ Среда, 14 Июль, 2010 22:35 ] |
Заголовок сообщения: | Mini Component Pascal |
Модератор: прикреплено к существующей теме. Геннадию Тышову спасибо за указание. Кто-нибудь разбирался с четырьмя экспериментальными языками под общим названием Mini Component Pascal? |
Автор: | Geniepro [ Четверг, 15 Июль, 2010 07:15 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Полистал описание FMCP (Functional Mini Component Pascal) -- понять не могу, при чём здесь слово Functional? Описывается субтипизация там всякая, пример чисто ООП-ный. Странно всё это... Код: MODULE FMCPTest; Ну вот где тут ФП?
TYPE Elem = EXTENSIBLE RECORD (ANYREC) x: INTEGER; END; ExtElem = RECORD (Elem) y: BOOLEAN; END; Pair = EXTENSIBLE RECORD (ANYREC) fst: Elem; snd: Elem; END; PROCEDURE (IN this: Pair) SetFst (e: Elem): Pair, NEW, EXTENSIBLE; BEGIN RETURN NEW Pair (fst = e, snd = this.snd) END SetFst; BEGIN util.WriteInt(NEW Pair(fst = NEW Elem(x = 1), snd = NEW Elem(x = 2)).SetFst(NEW ExtElem(y = TRUE, x = 1)).fst.x) END FMCPTest. |
Автор: | Valery Solovey [ Четверг, 15 Июль, 2010 12:56 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Наверное, тот, кто "разрабатывал концепцию" решил, что чем больше непонятна запись программы, тем более она функциональна... |
Автор: | Geniepro [ Четверг, 15 Июль, 2010 13:32 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Да в этом примерчике-то мне всё понятно, кроме одного -- причём тут ФП? |
Автор: | Валерий Лаптев [ Четверг, 15 Июль, 2010 14:19 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Может быть вот это? Цитата: Therefore in FMCP we add a "NEW R(...)" expression in order to ensure that the language is purely functional.
|
Автор: | ==== [ Четверг, 15 Июль, 2010 16:23 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Обсуждение этой темы уже проводилось. Смотрите http://forum.oberoncore.ru/viewtopic.php?p=5331#p5331 |
Автор: | Trurl [ Четверг, 15 Июль, 2010 16:43 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Geniepro писал(а): Да в этом примерчике-то мне всё понятно, кроме одного -- причём тут ФП? Присваиваний нет. |
Автор: | Geniepro [ Пятница, 16 Июль, 2010 07:29 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Trurl писал(а): Geniepro писал(а): Да в этом примерчике-то мне всё понятно, кроме одного -- причём тут ФП? Присваиваний нет. |
Автор: | Geniepro [ Пятница, 16 Июль, 2010 07:53 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Код: using System; И что, от того что в SetFst используется создание нового объекта Pair вместо модификации -- это считается характерной для ФП фишкой?using System.Collections.Generic; using System.Text; namespace FCMPTest { class Program { class Elem { public int x; public Elem(int x) { this.x = x; } } class ExtElem : Elem { public bool y; public ExtElem(int x, bool y) : base(x) { this.y = y; } } class Pair { public Elem fst; public Elem snd; public Pair(Elem fst, Elem snd) { this.fst = fst; this.snd = snd; } public Pair SetFst(Elem e) { return new Pair(e, this.snd); } } static void Main(string[] args) { System.Console.Write(new Pair(new Elem(1), new Elem(2)).SetFst(new ExtElem(1, true)).fst.x); } } } А как же функции как граждане первого сорта? |
Автор: | Valery Solovey [ Пятница, 16 Июль, 2010 11:36 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Geniepro писал(а): И что, от того что в SetFst используется создание нового объекта Pair вместо модификации -- это считается характерной для ФП фишкой? А как же функции как граждане первого сорта? Разве "первый сорт" - это отличительная черта всех функциональных языков? А вот наличие Set<чего-то-там> говорит об одной из двух вещей: либо автор не умеет давать адекватные имена абстракциям программы, либо язык не очень-то функциональный, и всё делать своими ручками приходится. |
Автор: | Valery Solovey [ Пятница, 16 Июль, 2010 11:42 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Geniepro писал(а): Вы же прекрасно знаете, что ФП заключается не в отсутствии присваиваний. Конкретно этот пример можно реализовать наверное на любом распространённом (стандартном) ООП-языке. Но этого вполне может не знать человек, который каким-то образом узнал, как менять синтаксис языка и где-то видел программу на Лиспе.
|
Автор: | Geniepro [ Пятница, 16 Июль, 2010 12:23 ] |
Заголовок сообщения: | Re: Mini Component Pascal |
Valery Solovey писал(а): Разве "первый сорт" - это отличительная черта всех функциональных языков? А разве есть функциональные языки, в которых функции не были бы главными сущностями?
|
Страница 2 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |