Jak dokładnie określa się przenośność takiego języka jak C? Nauczyłem się, że kompilatory są specyficzne dla ISA. Jeśli to prawda, w jaki sposób C jest przenośny? A może tylko kod źródłowy napisany w C jest przenośny, ale nie pliki wykonywalne? Czy pliki wykonywalne ISA nie są specyficzne dla przykładów aplikacji dla x86 są oddzielne od aplikacji dla Apple (zakładając, że Apple używa mikroprocesora Motorola / PowerPC)?
10
Nie dotyczy tylko ISA. Na przykład pytasz:
Tak, mimo że Apple używa sprzętu x86. Pliki binarne C są specyficzne dla architektury i systemu operacyjnego.
źródło
Dokładnie. Musisz ponownie skompilować swój program C na każdej platformie. Kompilatory C generują kod maszynowy, który jest przenośny tylko w bardzo ograniczonym zakresie, między komputerami o tym samym procesorze / architekturze pamięci i systemie operacyjnym. Dlatego widzisz różne dystrybucje binarne aplikacji wieloplatformowych (np. Przeglądarek), takich jak „Linux 64-bit Intel” lub „Mac OS X 32-bit PowerPC” (OK, ostatnia jest tylko ilustracją, wiem, że Apple przełączył się do Intela kilka lat temu :-).
źródło
Odpowiedzi na większość pytań, ale chciałbym dodać, że trwałość to kolejna rzecz, którą możesz wziąć pod uwagę.
Na przykład JAVA można napisać raz i uruchomić na dowolnej platformie, na której maszyna wirtualna (dziś nazywa się to „Runtime Environment”). Ale kolejną zaletą jest to, że możesz uruchomić kod Java 1.1 z 1995 roku na komputerze z 2011 roku. Nie jest to możliwe, jeśli kod został skompilowany na i386 i spróbujesz uruchomić go na architekturze AMD64.
Otrzymujesz również ulepszenia samej maszyny wirtualnej.
Następnie powiedziałbym, że ogólnie, przechodząc od najmniej przenośnych do bardziej przenośnych języków, jakie posiadasz: asembler, język kompilowany na niskim poziomie, taki jak C, następnie C ++, a następnie języki interpretowane lub te, które działają na maszynie wirtualnej.
Tak naprawdę nie jestem obrońcą Javy, przynajmniej nie dla języka ani społeczności, na przykład, ale jest to droga, jeśli szukasz przenośności i najmniejszej utraty wydajności w porównaniu do C.
źródło
Dobre odpowiedzi na temat pisania po kompilacji w dowolnym miejscu.
Ludzie lubią myśleć o C jako przenośnym języku ze względu na jego popularność i duże prawdopodobieństwo, że kompilator C będzie dostępny dla przyszłych platform docelowych. Kolejnym czynnikiem jest standardowa biblioteka, która pomaga w wykonywaniu typowych zadań programistycznych w sposób niezależny od platformy.
Powiedziałbym więc, że przenośność języka zależy od:
Realistycznie, choć prawie każda złożona aplikacja C wymaga przeniesienia na nową platformę z powodu zależności sprzętowych lub systemowych. Ten proces nazywa się przenoszeniem.
źródło
„Przenośność” ma wiele znaczeń. W odniesieniu do C oznacza to:
Kompilatory zostały zaimplementowane dla C dla szerokiej gamy platform sprzętowych i systemowych, co było wielką sprawą na początku lat 70-tych;
Istnieje uniwersalnie uzgodniony standard dla samego języka, w przeciwieństwie do każdej implementacji kompilatora, która rozpoznaje nieco inny wariant języka (ponownie, wielka sprawa, kiedy zaprojektowano C, ponieważ istniało wiele wariantów języków, takich jak Pascal i BASIC które nie były powszechnie uznawane);
Z powodu tego standardu zgodny kod spowoduje takie samo zachowanie, gdy zostanie skompilowany na różnych platformach.
Kod źródłowy jest przenośny, ale nowy binarny musi być generowane dla każdego celu.
Należy jednak pamiętać, że źródło C rzadko jest „trywialnie” przenośne; większość aplikacji wymaga wykroczenia poza to, co jest zdefiniowane w standardzie językowym, przy użyciu rozszerzeń unikatowych dla konkretnej platformy, więc w praktyce kod źródłowy nie jest w 100% przenośny.
Zauważ jednak, że C pozostawia wiele do implementacji. Dokładne rozmiary różnych typów danych, zachowanie przy przepełnieniu itp. Zależą od implementacji; standard określa minimalne wymagania, które musi spełniać implementacja, ale implementacja może przekroczyć te ograniczenia.
źródło
Czymkolwiek jest ISA, C nie jest specyficzne dla ISA. Zakładam, że nie masz na myśli przestarzałego gniazda na karty rozszerzeń PC.
Istnieją kompilatory C zgodne ze standardami na bardzo wielu platformach i dopóki używasz w języku źródłowym funkcji w pełni zdefiniowanych przez standardy, powinieneś być w stanie skompilować je na dowolnym kompilatorze C dla dowolnej platformy.
Jednak jedną z nich jest to, że standard C pozostawia wiele zachowań funkcji, zarówno jako implementacja zdefiniowana, jak i zachowanie niezdefiniowane. Ma to na celu uczynienie języka C bardziej ogólnie przydatnym do programowania niskopoziomowego, unikając przypadków, w których niektóre dokładnie zdefiniowane zachowania nie pasują do tego, co sprzęt obsługuje na niektórych platformach. Jednak utrudnia to pisanie programów przenośnych.
Ponadto, w przeciwieństwie do niektórych języków, C nie jest dostarczany z ogromną biblioteką tego rodzaju, którą zapewniają Java lub C #. Możesz uzyskać bardzo przenośne biblioteki do robienia wszystkiego, ale musisz trochę popracować, aby je zbudować i zmusić do współpracy.
C ma oczywiście standardową bibliotekę, ale jej zakres jest stosunkowo ograniczony w porównaniu z Javą, C #, Pythonem itp.
źródło