LLVM IR może być wieloplatformowy, z oczywistymi wyjątkami wymienionymi przez inne. Jednak nie oznacza to, że Clang generuje kod wieloplatformowy. Jak zauważyliście, preprocesor jest prawie powszechnie używany do przekazywania części kodu do kompilatora C/C++, w zależności od platformy. Nawet jeśli nie jest to zrobione w kodzie użytkownika, wiele nagłówków systemowych zawiera trochę lub dwa specyficzne dla platformy, takie jak typedef
s. Na przykład, jeśli skompilujesz kod C używając size_t
do LLVM IR na platformie, gdzie size_t
jest 32-bitowy, LLVM IR używa teraz do tego celu i32
, i nie ma sposobu, żebyś mógł to inżynier odwrócić, aby to naprawić.
Projekt Google (Portable Native Client) (dziękuję @willglynn za link), jeśli rozumiem go poprawnie, osiąga mobilność przez ustalenie ABI dla wszystkich docelowych platform. W tym sensie nie rozwiązuje to wyżej wymienionych problemów: LLVM IR nie jest przenośny dla platformy z innym ABI. Jedynym powodem, dla którego jest to bardziej przenośne, jest to, że klienci dostarczają warstwę, która pasuje do ABA PNaCl do rzeczywistego ABI. Innymi słowy, kod PNaCl nie jest przenośny dla wielu platform, "PNaCl VM" jest.
Najważniejsze: jeśli jesteś bardzo ostrożny, możesz korzystać z LLVM IR na wielu platformach, ale nie bez wykonywania dodatkowej pracy (której Clang nie robi) w celu usunięcia różnic ABI.
Jeśli obiekt jest całkowicie samowystarczalny, może być interpretowany na innej platformie. Ale ponieważ ABI będzie inny, będzie miał trudności z wykorzystaniem reszty systemu. –
Zakładam, że http://llvm.org/docs/LangRef.html byłoby całkowicie niezależne od platformy. Co masz na myśli mówiąc "czas gry z resztą systemu"? – Tim
@Tim - Czy kod będzie używał wywołań systemu operacyjnego? Jak są przenośne? –