Попытаюсь обобщить существующие проблемы при написании либ.
Наверно, самая главная проблема это взаимодействие либы и модулей. В зависимости от цели использования, они либо зря захламляют библиотеку, потому что не нужны в интерфейсе, но всё равно public
; либо наоборот попадают лишь частично, хотя требуются полностью.
Для решения этого предлагалось давать содержимому модулей модификатор internal
Однако это решило бы только первую часть проблемы, когда модуль используется только для внутренних операций, а конечному пользователю либы не нужен. При этом использовать типы модуля в интерфейсе вообще бы не вышло.
В этой же issue предложили ввести модификаторы доступа для типов. Это опять же в основном решило бы только первую часть проблемы. Например потомки класса всё равно бы не копировались в либу, если их явно не упомянуть. Да и пришлось бы постоянно ковыряться в модулях, что бы настроить их для очередной библиотеки, если модули переиспользуются.
Далее было предложено ввести ключевое слово import
Если таким методом типы будут копироваться в соответствующее пространство имён, а не в основное, то было бы действительно удобно. Ну и соответственно типам по uses [unit] import [typeNames]
давать public, а по обычному uses
– internal
и запретить использовать их в интерфейсе. Не знаю, стоит ли тут думать об обратной совместимости, тк ещё не видел серьёзных либ на pabc.
На данный момент можно решить только вторую часть проблемы, прописав пачку синонимов. Да, все необходимые классы откопируются в либу, но это не слишком удобно. Для других .net ЯП синонимы вообще бесполезны. А в pabc они пополняют (с точки зрения компилятора) основное пространство имён, в котором может быть и без того полно всего, то есть это не полезно для intellisense.
Помимо этого, при использовании либы на другом .net языке всё проходит не совсем гладко. От каждого модуля будет видно как минимум 1 фантомный класс. Вот, например, что оставляет PABCSystem и PABCExtensions
Да, пространства имён скрыты символом$
, но классы внутри – public
и Intellisese может их увидеть. Однако не знаю, можно ли их сделать internal
Скажется ли это как-то на раздел инициализации допустим. А вот классы, описанные в разделе реализации было бы неплохо сделать internal
, это, по идее, не должно ничего нарушить.
Так же не знаю, возможно ли не генерировать класс lib.lib
(или делать его internal
), если не используются глобальные переменные и подпрограммы, но это тоже было бы полезно. Правда для этого потребуется сначала закрыть #2745 (enum, не генерирующий глобальных констант).
Если все текущие фичи нельзя уместить так, что бы их кишки нигде не торчали, то, возможно, имеет смысл говорить о создании режима, который ограничивал бы эти фичи, но на выходе генерировал “чистую” dll. Это была бы хорошая цена за полноценное межязыковое взаимодействие.
Также, довольно полезно разрешить точку что в названии либы, что в названии модуля и генерировать пространства имён с соответствующими названиями. Это повысило бы интуитивность при использовании готовых библиотек.
На мой взгляд, проблема написания опрятных библиотек актуальна для языка. Наличие хороших библиотек позволило бы громче заявить о языке среди .net комьюнити. Но пока написание таких либ затруднено, а готовые удобно применять только на самом pabc, да и то не всегда.
Хотелось бы услышать мнение @Admin и @ibond и сформировать какой-то пакет issue исходя из возможностей