CLR против базовой CLR

Я понимаю, что среда CLR в ее текущем состоянии привязана к ОС Windows и предоставляет различные услуги с помощью внутренних API-интерфейсов Win32.

Поскольку .NET Core не зависит от платформы, это означает, что один и тот же IL-код может работать в разных ОС. Является ли ОС CoreCLR специфичной? Или код CoreCLR написан для разных путей выполнения в зависимости от текущей среды выполнения/ОС?


person rahulaga_dev    schedule 21.02.2018    source источник
comment
Разные пути — это неправильная ментальная модель. Это начинается с того, что Unix имеют совершенно другой формат исполняемого файла. Итак, вам нужен компилятор C++ и компоновщик, которые могут сделать это правильно, в настоящее время это набор инструментов GCC. И #define кучу макросов, которые соответствуют желаемой целевой ОС и процессору. Исходный код изобилует решеткой #if, что неизменно означает, что код на C++ должен быть кросс-платформенным. В настоящее время у них есть 10 серверов сборки, постоянно ищущих ошибки.   -  person Hans Passant    schedule 21.02.2018
comment
@HansPassant Спасибо !! Исходный код изобилует #if, вы имели в виду, что одна и та же копия CoreCLR подходит для всех ОС?   -  person rahulaga_dev    schedule 21.02.2018
comment
Грубо говоря, есть одна кодовая база, но некоторые файлы никогда не будут использоваться в конкретной сборке, поскольку они слишком специфичны для ОС. Но привыкай к другому билду.   -  person Hans Passant    schedule 21.02.2018
comment
@HansPassant Я должен скептически относиться ко всему вашему ответу только потому, что источники CoreCLR указывают, что ему нужен clang, а не gcc. github.com/dotnet/coreclr/blob/master/Documentation/building/.   -  person omajid    schedule 21.02.2018
comment
Вот почему я сказал afaik, я видел много gcc в файлах cmake. Но конечно, бросайте все это.   -  person Hans Passant    schedule 21.02.2018


Ответы (1)


Из обсуждения в репозитории coreclr:

Насколько мне известно, CLR в этом репозитории [coreclr] идентична CLR в полной версии .NET, и единственное отличие заключается в доступном наборе API в corefx.

... но похоже, что по крайней мере C++/CLI отсутствует...

Чтобы ответить на некоторые другие вопросы:

Поскольку .NET Core не зависит от платформы, это в основном означает, что один и тот же код IL может работать в разных ОС.

Да. IL — это пользовательский «язык». Вы можете написать для него интерпретатор/среду выполнения, который может работать на любой платформе. Это верно и для других промежуточных представлений на других языках, включая байт-код java, llvm ir, байт-код python и так далее.

Является ли ОС CoreCLR специфичной? Или код CoreCLR написан для разных путей выполнения в зависимости от текущей среды выполнения/ОС?

Это смесь. Конкретная сборка coreclr будет работать только в одной ОС, потому что она была скомпилирована для использования функций этой ОС (включая компилятор для конкретной ОС, компоновку с нужными библиотеками для конкретной ОС и запуск кода, предназначенного для работы с этой ОС). В CoreCLR также есть уровень абстракции платформы, так что разработчики могут писать код для одного API — на основе API Win32 — и уровень PAL преобразует его в правильные системные вызовы в Linux и Mac. Как указано в комментарии @HansPassant, существует большое количество #ifdefs - как на собственной, так и на управляемой стороне CoreCLR.

person omajid    schedule 21.02.2018