Ой, сложный вопрос ...
Эта первая часть, о том, может ли C++ соответствовать C++
Все это предполагает один и тот же чип /abi. Если у нас нет этого совпадения, мы вообще не будем совместимы. Нам нужен 32-битный код x86, соответствующий 32-битному коду x86, или 64-битный код AMD64, соответствующий коду AMD64.
1) Для объектов C (мы начнем с простого, поговорим о C++ позже), вывод для разных компиляторов совместим с другими компиляторами. Есть нечто, называемое чипом ABI, который поддерживает последовательность. Мы сопоставляем то, как мы настраиваем стек, как мы настраиваем регистры и т.д. Очень рано, была некоторая несовместимость из-за длины символа, но это было решено в течение многих лет.
Это работает, потому что C относительно прост. Что мы должны синхронизировать? имена функций и вызовы функций. Это все в ABI
2) для C++ у нас есть много кнопок для настройки. Как нам выложить объект? Как / когда мы называем статические конструкторы / деструкторы? Как нам выложить объект для наследования? Или множественное наследование? Виртуальные функции? Даже такие "простые" вещи, как, как мы "искажаем" имена функций (как мы переименовываем символ, чтобы функции имели типы аргументов в имени символа). У нас есть множество решений, которые нужно принять, множество разных путей, по которым мы могли бы пойти.
В начале производители компиляторов C++ делали то, что, по их мнению, лучше всего было здесь. Это можно прочитать: они делали все, что хотели, и заботились о совместимости, поэтому их не было. Позже они поняли, что это сделало невозможным легкую продажу библиотек - вам нужно было скомпилировать библиотеку C++ для КАЖДОЙ версии компилятора (или, по крайней мере, большого подмножества версий).
В конце концов они придумали стандартный C++ ABI. Это позволило объединить код из нескольких компиляторов. Это более плотный список макетов и имен и тому подобное, чтобы код мог правильно вызывать друг друга.
Ура! Все современные компиляторы по стандарту! Все сделано! Правильно?
На самом деле, нет.... Во-первых, если вы переходите на новый ABI, это означает, что вы не совместимы со старым ABI. Во-вторых, вы кодируете спецификацию, но не гарантируете, что вы поняли это правильно. В начале G++, пытаясь соответствовать спецификации, они несколько раз ошибались.
Итак, подведем итоги для C++:
Существует спецификация, которая должна сделать его совместимым с кодом C++ для всех компиляторов. но это зависит от того, были ли компиляторы закодированы в спецификации, и правильно ли они получили спецификацию. Для современных компиляторов (что угодно за последние 5 лет) это должно быть правдой.
Теперь о C++ и C # ....
C++ предназначен для работы на чипе. Прямо на X86 или AMD64, что угодно. Как таковой, он имеет коды операций для этих конкретных чипов. Чип читает число, понимает, какую команду он представляет, и выполняет то, к чему он обращается.
C # предназначен для работы на виртуальной машине, называемой CLI. Как таковой, он имеет разные команды, и номера не совпадают. Это как заставить человека, который знает только английский, читать инструкции по настройке автомобиля на французском языке. Это просто не сработает.