Информация об изменениях

Сообщение Re[8]: Carbon от 10.04.2024 19:39

Изменено 10.04.2024 19:41 Alekzander

Re[8]: Carbon
Здравствуйте, Sinclair, Вы писали:

A>>Не знаю, что имеют в виду мои собеседники, а я говорю про "как CLR/JVM". С поправкой на то, что обе — как я это называю, "инфраструктурные ВМ", т.е. откуда-то берутся, содержат джиттер, обеспечивают централизованное хранилище компонентов и т.п., а в C++ это, с моей точки зрения, был бы дурдом похлеще нынешнего. В C++, с моей точки зрения, есть смысл если и делать что-то подобное, то как-то бутстраппиться (в мюнхгаузеновском смысле). Например, на этапе сборки компилировать ВМ в бинари, а код приложения — в байт-код, и запаковывать вместе.

S>А, собственно, накуа? LLVM — и есть такая "виртуальная машина". Можно "паковать в бинарь" LLVM-представление (которое сейчас генерируют чуть менее, чем все компиляторы C/C++), и JIT/AOT его на целевой платформе непосредственно перед употреблением.
S>Ну, а если целевая платформа известна заранее, то, собственно, происходит то, что происходит в clang — LLVM IR отдаётся в бэкенд, который его немедленно компилирует в бинарь.

Я мало что знаю про LLVM. Да и про то, что под капотом у дотнета, ненамного больше. И не стесняюсь в этом признаться, потому что специализируюсь в других вещах, а ковыряться в байткодах и всяких AOT мне неинтересно. Прошу считать это дисклеймером.

Если взять, например, исключения, мне очень нравится, как работа с ними построена в дотнете. Они стандартизированы, унифицированы и поддержаны на уровне CLR (по крайней мере, я видел в IL инструкцию throw). В результате, можно написать программу, которая только выкидывает исключения, вообще их не ловя, а ловить их будет отладочная среда. Ловить, выводить в лог, и заставлять программу хромать дальше. Вот поэтому я люблю исключения в дотнете, это действительно хороший и надёжный механизм обработки ошибок. А в C++ исключения, если их неправильно приготовить, могут стать самостоятельным источником ошибок.

Что для этого предусмотрено в LLVM, и предусмотрено ли хоть что-то? Это вообще продукт (в этом смысле) или набор фарша "сделай сам"? Я спрашиваю без фиги в кармане, потому что, ещё раз, не использовал нигде и толком не разбирался. Но почитав про него, мне кажется, там нет ничего из того, что я бы оценил как юзер. В частности, не вижу среди его типов никакого root Object, никакого std::exception, а вижу только поддержку UDT-структур. Это, я так понимаю, означает для получения сопоставимого удобства необходимость "аккуратно обработать напильником".
Re[8]: Carbon
Здравствуйте, Sinclair, Вы писали:

A>>Не знаю, что имеют в виду мои собеседники, а я говорю про "как CLR/JVM". С поправкой на то, что обе — как я это называю, "инфраструктурные ВМ", т.е. откуда-то берутся, содержат джиттер, обеспечивают централизованное хранилище компонентов и т.п., а в C++ это, с моей точки зрения, был бы дурдом похлеще нынешнего. В C++, с моей точки зрения, есть смысл если и делать что-то подобное, то как-то бутстраппиться (в мюнхгаузеновском смысле). Например, на этапе сборки компилировать ВМ в бинари, а код приложения — в байт-код, и запаковывать вместе.

S>А, собственно, накуа? LLVM — и есть такая "виртуальная машина". Можно "паковать в бинарь" LLVM-представление (которое сейчас генерируют чуть менее, чем все компиляторы C/C++), и JIT/AOT его на целевой платформе непосредственно перед употреблением.
S>Ну, а если целевая платформа известна заранее, то, собственно, происходит то, что происходит в clang — LLVM IR отдаётся в бэкенд, который его немедленно компилирует в бинарь.

Я мало что знаю про LLVM. Да и про то, что под капотом у дотнета, ненамного больше. И не стесняюсь в этом признаться, потому что специализируюсь в других вещах, а ковыряться в байткодах и всяких AOT мне неинтересно. Прошу считать это дисклеймером.

Если взять, например, исключения, мне очень нравится, как работа с ними построена в дотнете. Они стандартизированы, унифицированы и поддержаны на уровне CLR (по крайней мере, я видел в IL инструкцию throw). В результате, можно написать программу, которая только выкидывает исключения, вообще их не ловя, а ловить их будет отладочная среда. Ловить, выводить в лог, и заставлять программу хромать дальше. Вот поэтому я люблю исключения в дотнете, это действительно хороший и надёжный механизм обработки ошибок. А в C++ исключения, если их неправильно приготовить, могут стать самостоятельным источником ошибок.

Что для этого предусмотрено в LLVM, и предусмотрено ли хоть что-то? Это вообще продукт (в этом смысле) или набор фарша "сделай сам"? Я спрашиваю без фиги в кармане, потому что, ещё раз, не использовал нигде и толком не разбирался. Но почитав про него, мне кажется, там нет ничего из того, что я бы оценил как юзер. В частности, не вижу среди его типов никакого root Object, никакого std::exception, а вижу только поддержку UDT-структур. Это, я так понимаю, означает для получения сопоставимого удобства по обработке ошибок необходимость "аккуратно обработать напильником".