[plug] [обсуждение плана]

Вячеслав Козырев weautify at gmail.com
Mon Mar 19 22:26:19 MSK 2018


>>... как второй и в особенности четвёртый могут начать что-то делать, пока
третий не завершил с интерфейсом?

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

19 марта 2018 г., 22:16 пользователь Eugene Sharygin <eush at ispras.ru> написал:
> Вячеслав Козырев <weautify at gmail.com> writes:
>
>> 19 марта 2018 г., 20:48 пользователь Eugene Sharygin <eush at ispras.ru> написал:
>>> Вячеслав Козырев <weautify at gmail.com> writes:
>>>
>>>> Похоже, примерный план на ближайшие две недели следующий.
>>>>
>>>> В QBE закидывается куча проходов в нужном порядке, один человек это парсит и
>>>> дает второму, второй запускает их по очереди. Третий пишет интерфейс
>>>> реализации прохода,
>>>
>>> Входит ли сюда интерфейс доступа к результатам анализов?
>>
>> Полагаю, да.
>>
>>>> а четвертый - его спецификацию в виде прохода, который просто печатает
>>>> в файл функцию (для тестирования работоспособности).
>>>
>>> Есть ли между этими задачами зависимости, или все четверо готовы начать
>>> одновременно?
>>
>> Старался как раз придумать так, чтобы задачи были более-менее независимыми.
>
> Если задача третьего - разработать интерфейс (набор сигнатур методов),
> задача второго - эти методы вызвать из кода QBE, а задача четвёртого -
> сделать пример, на котором можно проверить работоспособность системы,
> то как второй и в особенности четвёртый могут начать что-то делать, пока
> третий не завершил с интерфейсом? Или предполагается, что четвёртый тоже
> в разработке интерфейса участвует?
>
>>>> После этого, в зависимости от затраченного на вышесказанное времени, можно
>>>> реализовать более интеллектуальный пайплайн с зависимостями от других
>>>> проходов. И одну неделю потратить на реализацию динамических библиотек.
>>>>
>>>> 18 Мар 2018 г. 21:02 пользователь "Eugene Sharygin" <eush at ispras.ru> написал:
>>>>
>>>>     Vladislav Ivanishin <vlad at ispras.ru> writes:
>>>>
>>>>     > Привет!
>>>>     >
>>>>     > Eugene Sharygin <eush at ispras.ru> writes:
>>>>     >
>>>>     >> Привет,
>>>>     >>
>>>>     >> Vladislav Ivanishin <vlad at ispras.ru> writes:
>>>>     >>
>>>>     >>> Добрый день,
>>>>     >>>
>>>>     >>> Вячеслав Козырев <weautify at gmail.com> writes:
>>>>     >>>
>>>>     >>>> Начну, пожалуй.
>>>>     >>>>
>>>>     >>>> Первое, что стоит сказать, есть проблема, связанная с тем, что без
>>>>     >>>> механизма подключения плагинов работа над собственно плагинами
>>>>     >>>> несколько осложняется. Однако больше двух человек работать над ним,
>>>>     >>>> пожалуй, не смогут - это будет перебор.
>>>>     >>>> Поэтому предлагается взять двум человечкам работы над механизмом
>>>>     >>>> подключения плагинов, а двум другим тем временем отдельно заниматься
>>>>     >>>> плагинами с поправкой на то, чтобы плагины работали сами по себе
>>>>     (как
>>>>     >>>> в работе по курсу "конструирование компиляторов"). Затем, когда
>>>>     работа
>>>>     >>>> над механизмом подключения плагинов будет закончена, можно начинать
>>>>     >>>> нормально оформлять плагины и делать новые уже сразу плагинами.
>>>>     >>>> Вопрос, как распределить работу на этом этапе практикума, остаётся
>>>>     >>>> открытым.
>>>>     >>>>
>>>>     >>>> Мне хочется заниматься подключением плагинов поначалу, и считаю, что
>>>>     >>>> на это можно отвести две недели - их должно быть более чем
>>>>     достаточно.
>>>>     >>>> После этого все будут заниматься сборкой плагинов. Вопрос, какие
>>>>     >>>> плагины реализовать, остаётся открытым.
>>>>     >>>
>>>>     >>> В принципе, реализация чего-либо как плагина должна быть
>>>>     >>> простой. Т.е. нужно просто взять имеющийся проход (из домашнего
>>>>     задания)
>>>>     >>> и воспользоваться интерфейсом, который нужно создать.
>>>>     >>>
>>>>     >>> Обычно соглашения для плагинов выглядят примерно так. Плагин
>>>>     собирается
>>>>     >>> как динамическая библиотека, и в нём обязательно определена функция
>>>>     (или
>>>>     >>> несколько) с известным именем, например, `onload'. А qbe должен
>>>>     >>> научиться в командной строке распознавать что-нибудь вроде
>>>>     >>> -plug=path-to-plugin.so (может быть и что-то более сложное, к
>>>>     примеру,
>>>>     >>> плагин может принимать параметры, тогда они должны задаваться там же
>>>>     --
>>>>     >>> интерфейс вам надо продумать). Соответственно, если в командной
>>>>     строке
>>>>     >>> такое встретилось, то в какой-то момент qbe должен вызвать
>>>>     >>> dlopen(path_to_plugin,...), затем dlsym(..., "onload") и вызвать
>>>>     >>> полученную функцию по указателю. Функция же onload в плагине может
>>>>     >>> использовать интерфейсы из all.h. Как-то так всё срастается.
>>>>     >>>
>>>>     >>> На самом деле, это упрощённое описание интерфейса. К примеру, вы
>>>>     хотите
>>>>     >>> иметь какой-то оптимизационный проход в виде плагина. Если все
>>>>     действия
>>>>     >>> производить в `onload', получится, что qbe должен знать, в какой
>>>>     именно
>>>>     >>> момент вызывать onload (при том, что он не должен знать наперёд,
>>>>     какие
>>>>     >>> плагины будут написаны). Поэтому нужна какая-то система хуков.
>>>>     Например,
>>>>     >>> onload будет вызываться достаточно рано и куда-то записывать
>>>>     callback'и,
>>>>     >>> которые qbe вызовет, когда придёт время. А время придёт, когда
>>>>     наступит
>>>>     >>> какое-то событие (например, завершится проход с определённым именем,
>>>>     >>> которое задаёт плагин). Таким образом, в вашу задачу входит
>>>>     определение
>>>>     >>> набора событий, где будут расставлены хуки, и патчинг qbe
>>>>     >>> соответствующим образом.
>>>>     >>>
>>>>     >>> В qbe (когда он используется не как библиотека, а как компилятор)
>>>>     >>> выполняется ряд проходов (см. main.c). Возможно, есть смысл
>>>>     переписать
>>>>     >>> их вызовы в новой концепции, т.е. определить единый интерфейс для
>>>>     всех
>>>>     >>> этих проходов и добавить менеджер проходов.
>>>>     >>
>>>>     >> Было бы хорошо иметь не только интерфейс, позволяющий встраиваться в
>>>>     >> основной пайплайн QBE (IR -> Asm), но и возможность запустить цепочку
>>>>     >> проходов в отдельности (IR -> IR). Пожалуй, для целей курса это было
>>>>     бы
>>>>     >> даже полезнее.
>>>>     >
>>>>     > Да, это основное. Я не подумал, что в func() в main.c проходы IR -> asm
>>>>     > тоже вызываются. Тогда единым интерфейсом все из них объединять
>>>>     наверное
>>>>     > не стоит.
>>>>     >
>>>>     > Если делать новый отдельный пайплан для IR -> IR преобразований, там не
>>>>     > будет предустановленных проходов, и все преобразования должны будут
>>>>     > предоставляться плагинами?
>>>>
>>>>     Можно и с предустановленными (-O0, -O1), но я думаю, что основным
>>>>     вариантом использования пока можно считать изначально пустой пайплайн, в
>>>>     который все проходы добавляются пользователем.
>>>>
>>>>     > И тогда можно обойтись без набора событий, а
>>>>     > порядок вызова проходов будет определяться порядком следования плагинов
>>>>     > в командной строке.
>>>>
>>>>     --
>>>>     Regards,
>>>>     Eugene Sharygin,
>>>>     ISP RAS.
>>>>
>>>
>>> --
>>> Regards,
>>> Eugene Sharygin,
>>> ISP RAS.
>
> --
> Regards,
> Eugene Sharygin,
> ISP RAS.


More information about the plug mailing list