Лучшее место назначения компилятора

Сначала создайте черту для проверки специализаций. array и span выглядят одинаково в том смысле, что они принимают параметр типа и параметр нетипичного типа:

template <typename T, template <typename, auto> class Z>
struct is_specialization : std::false_type { };
template <typename A, auto V, template <typename, auto> class Z>
struct is_specialization<Z<A,V>, Z> : std::true_type { };

template <typename T, template <typename, auto> class Z>
inline constexpr bool is_specialization_v = is_specialization<T, Z>::value;

И затем мы можем построить концепцию из этого:

[ 111]

Который вы бы использовали следующим образом:

template <typename Element, std::ptrdiff_t Extent = -1>
struct span {
    template <typename C> requires AllowedContainer<C, Element>
    span(C&);
    template <typename C> requires AllowedContainer<C const, Element>
    span(C const&);
};

Требование к const -мости не позволяет использовать хороший синтаксис частичного-концепта-идентификатора , но мы могли бы просто добавьте еще одну концепцию для этого:

template <typename T, typename E>
concept ConstAllowedContainer = AllowedContainer<T const, E>;

template <typename Element, std::ptrdiff_t Extent = -1>
struct span {
    template <AllowedContainer<E> C>      span(C&);
    template <ConstAllowedContainer<E> C> span(C const&);
};

Не уверен, что здесь есть более умный подход.


Но на самом деле вся эта пара конструкторов, вероятно, является ошибкой, и вы хотите сделать ссылку на пересылку:

template <typename Element, std::ptrdiff_t Extent = -1>
struct span {
    template <AllowedContainer<E> C>
    span(C&&);
};

Этот последний подход требует нескольких настроек для концепция (все remove_cv_t должны стать remove_cvref_t).

11
задан Joe 22 January 2009 в 02:25
поделиться

3 ответа

про / недостатки:

  • СБРОС:

    • про: легко доступная среда CLR; много материала для привязки с
    • довод "против": связанный с CLR (;-); предназначение для некоторых систем будет трудно или невозможно (встроенный, мейнфреймы, и т.д. CLR impl. мог бы быть менее сформировавшимся на не системы MS),
  • LLVM:

    • про: независимый от MS.
    • довод "против": предназначение для некоторых систем могло бы включить портирование LLVM (?); взаимодействуя через интерфейс к ТОЧЕЧНОЙ сети, Java и т.д. мог бы быть неприятным (возможно нуждается в FFI),
  • C как выходной язык:

    • про: почти все возможные цели; легкая генерация кода
    • довод "против": необходимо будет реализовать некоторый материал VM как библиотеку времени выполнения (GC, dynload, dyn компиляция и т.д.); некоторые вещи трудно сделать в C (продолжения, отслеживание в обратном порядке, трассировка стека, исключения); некоторые вещи трудно сделать эффективно и портативный в C (GC, динамические типы, зависимость расположения стека).
  • Байт-код Java как цель:

    • про: вероятно, самый большой набор возможных целевых платформ (даже мобильные телефоны и встроенный материал); много существующих инструментов вокруг; легкое взаимодействие через интерфейс к существующим библиотекам
    • довод "против": некоторые вещи трудно реализовать или трудно реализовать эффективно (динамические типы, продолжения, отслеживая в обратном порядке)

От всего вышеупомянутого я думаю, будучи нацелен на байт-код Java, вероятно, было бы лучшим для Вас.

Править: на самом деле ответ на комментарий, но 300chars недостаточно.

Сомнительный JByteCode - я соглашаюсь (быть Smalltalker, JBytecode также ограничивает для меня).

VM-wise, я думаю, что существует относительно широкий спектр производительности, которую можно получить как JVM, запускающаяся в чистых медленных интерпретаторах байт-кода до сложного JITting VMs высокого класса (IBM). Я предполагаю, VM's CLR нагонит, поскольку MS крадет и интегрирует все инновации так или иначе рано или поздно и методы к ускорению, динамический перевод публикуется (читает Сам бумаги, например). LLVM будет, вероятно, прогрессировать немного медленнее, но кто знает. С C Вы извлечете выгоду из лучших компиляторов бесплатно, но вещи как динамический переперевод и т.д. трудно реализовать с C как цель. Моя собственная система использует смесь предварительно скомпилированного и динамично скомпилированного кода (имеющий все: медленный интерпретатор байт-кода, Дрожание и предварительно скомпилированный статический C-код в одном пространстве памяти).

16
ответ дан 3 December 2019 в 01:13
поделиться

LLVM кажется обещанием. Команда требует лучших действий во время выполнения на gcc с их бэкендом по сравнению с собственным компонентом. Способность скомпилировать от AST действительно интересна (смотрите на учебное руководство). Это может скомпилировать и оптимизировать во времени выполнения, которое является необходимостью для динамического. Это может также работать как чистый интерпретатор.

Я рассматриваю использование LLVM в проекте, который включает создание подобного Tcl языка. Tcl является в большой степени динамичным, таким образом, я не знаю то, что это подразумевает на данном этапе, но я уверен, что получу лучшие действия, чем текущее основанное на байт-коде ядро.

3
ответ дан 3 December 2019 в 01:13
поделиться

Генерация кода является моим бизнесом :-)

Комментарии к нескольким опциям:

  • СБРОС:

    • Pro: промышленная поддержка
    • Довод "против": необходимо вложиться в их систему типов в значительной степени полностью; в зависимости от того, что Вы хотите сделать с типами, это не может иметь значения
    • Довод "против": Только платформа Windows является действительно показываемым в прайм-тайм качеством
  • LLVM:

    • Pro: восторженное пользовательское сообщество с харизматическим лидером
    • Pro: серьезная поддержка от Apple
    • Pro: много интересных повышений производительности
    • Довод "против": несколько сложный интерфейс
    • Довод "против": история дыр в разработке; поскольку LLVM назревает, ожидают, что дыры в разработке будут включены путем добавления к сложности интерфейса
  • C-

    • Pro: цель является фактическим письменным языком, не API; можно легко осмотреть, отладить и отредактировать C - код
    • Pro: дизайн является довольно сформировавшимся и довольно чистым
    • Pro: поддерживает точную сборку "мусора"
    • Pro: большинство пользователей сообщает, что это очень просто в использовании
    • Довод "против": очень малочисленная группа разработчиков
    • Довод "против": по состоянию на начало 2009, поддерживает только три аппаратных платформы (x86, PPC, ARM)
    • Довод "против": не поставлется со сборщиком "мусора"
    • Довод "против": проект не имеет никакого будущего
  • C как выходной язык

    • Pro: легкие взгляды
    • Довод "против": почти невозможный получить достойную производительность
    • Довод "против": сведет Вас с ума в конечном счете; спросите длинную линию людей, которые попытались скомпилировать Haskell, ML, Modula-3, Схему и больше использования этой техники. В какой-то момент каждые из этих людей сдались и создали их собственный генератор собственного кода.

Сводка: что-либо кроме C - разумный выбор. Для лучшей комбинации гибкости, качества и ожидаемой долговечности, я, вероятно, рекомендовал бы LLVM.

Полное раскрытие: Я аффилирован с C - проект.

25
ответ дан 3 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: