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

Eugene Sharygin eush at ispras.ru
Mon Mar 19 22:38:18 MSK 2018


Вячеслав Козырев <weautify at gmail.com> writes:

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

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

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

Если вы считаете, что целесообразно, чтобы над какой-то задачей работали
двое, могут работать и двое.

> 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.

--
Regards,
Eugene Sharygin,
ISP RAS.


More information about the plug mailing list