В большинстве языков (почти все, кроме C ++) компиляция отдельных модулей компиляции происходит довольно быстро.
Связывание / связывание часто бывает медленным - компоновщик должен ссылаться на всю программу, а не на отдельный блок.
C ++ страдает как - если вы не используете идиому pImpl - он требует подробностей реализации каждого объекта и всех встроенных функций для компиляции клиентского кода.
Java (от источника к байт-коду) страдает, потому что грамматика не различает объекты и классы - вы должны загрузить класс Foo, чтобы увидеть, является ли Foo.Bar.Baz полем Baz для объекта, на который ссылается статическое поле Bar Класс Foo или статическое поле класса Foo.Bar. Вы можете внести изменения в исходный код класса Foo между ними, и не изменять исходный код клиента, но все равно придется перекомпилировать клиентский код, поскольку байт-код различает две формы, даже если синтаксис не , Байт-код AFAIK Python не различает два - модули являются истинными членами своих родителей.
C ++ и C страдают, если вы включаете больше заголовков, чем требуется, поскольку препроцессор должен многократно обрабатывать каждый заголовок, а компилятор их компилирует. Минимизация размера и сложности заголовка помогает предположить, что лучшая модульность уменьшит время компиляции. Не всегда возможно кэшировать компиляцию заголовка, поскольку то, какие определения присутствуют, когда заголовок предварительно обработан, может изменить его семантику и даже синтаксис.
C страдает, если вы часто используете препроцессор, но фактическая компиляция происходит быстро; большая часть кода C использует typedef struct _X* X_ptr
, чтобы скрыть реализацию лучше, чем C ++ - заголовок C может легко состоять из typedefs и объявлений функций, обеспечивая лучшую инкапсуляцию.
Так что я бы предложил сделать так, чтобы ваш язык скрывал детали реализации от клиентского кода, и если вы являетесь языком OO с членами экземпляров и пространствами имен, сделайте синтаксис для доступа к двум однозначным. Разрешить истинные модули, поэтому клиентский код должен знать только интерфейс, а не детали реализации. Не позволяйте макросам препроцессора или другому механизму вариации изменять семантику ссылочных модулей.