2012-10-16 18 views
9

Objective-C ma środowisko wykonawcze, które tłumaczy jego składnię na funkcje, które są zorganizowane i skompilowane. Czy C ma bibliotekę uruchomieniową? Ponadto, jeśli ktoś może odpowiedzieć na pytanie, jakie kroki podejmuje GCC podczas kompilacji C? na przykład main.c >> main.s >> main.binCzy język programowania C ma środowisko uruchomieniowe?

+3

http://pl.wikipedia.org/wiki/C_runtime –

+0

Microsoft nazywa to runtime. http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.110).aspx –

+2

Wydaje się, że nie wiesz, co robi system runtime. Nie "tłumaczy [...] składni na funkcje"; to jest praca kompilatora. Środowisko wykonawcze w ObjC zapewnia przede wszystkim infrastrukturę obiektową: tworzenie klas, wysyłanie wiadomości i tak dalej. (Oczywiście są też inne elementy.) –

Odpowiedz

4

Tak, język C ma standardową bibliotekę; to jest wiele standardowych makr, procedur i typów, których można używać w jego programach, z wyjątkiem innych w samym języku podstawowym.

W popularnych implementacjach istnieje osobny plik biblioteki zawierający kod biblioteki standardowej C. Na przykład w środowiskach GNU/Linux biblioteka GNU C (libc) jest prawie zawsze obecna. Firma Microsoft udostępnia bibliotekę środowiska wykonawczego msvcrt.dll dla systemu Windows i tak dalej.

Ponadto standardowa biblioteka C może nie być dostępna w wolnostojących implementacjach. Czasami możliwe jest skompilowanie programu bez łączenia ze standardową biblioteką C z twojego systemu. Przykładowo, Windows API znany jest z tego, że zachowuje się jak wolnostojące środowisko programowania C (chociaż może być konieczne połączenie z innymi bibliotekami systemowymi specyficznymi dla systemu Windows).

odniesieniu do GCC, dodaje się na krótko zilustrowano przetwarzanie potokowe kompilacji:

  1. źródłem jest obróbce wstępnej GNU cpp, w wyniku czego jednostki translacji. (Faktycznie, jak Basile podkreślił, obecnie nie cpp proces jest tworzony; cała praca przerób odbywa się w ciągu cc1 Niemniej otrzymany zachowanie jest najprawdopodobniej taka sama jak z cpp.).
  2. Jednostka tłumaczenie jest następnie interpretowany i skompilowane do źródła zestawu z GCC cc1;
  3. Źródło zespołu jest następnie składane do kodu wynikowego za pomocą GNU as;
  4. Wreszcie, pliki obiektów i biblioteki są połączone razem w celu utworzenia obrazu binarnego z GNU ld.

Oczywiście każdy z tych kroków może zostać zmieniony lub w ogóle nie wykonany, w zależności od opcji sterownika; powyższe stanowi jedynie przybliżone wyjaśnienie całego procesu.

+0

To jest złe dzisiaj: z niedawnym GCC (nawet GCC z początku 2000), wstępne przetwarzanie i kompilacja odbywa się przez 'cc1' i nie ma już żadnego procesu' cpp' –

+0

Dzięki za wyjaśnienie. Poprawię informacje. – alecov

1

C ma biblioteki standardowej (np strlen, malloc itd)

Kroki są: skompilować kod, który używa biblioteki standardowej, a następnie połącz swój kod z biblioteką standardową. libc może znajdować się w bibliotece statycznej lub dynamicznej, w zależności od; zazwyczaj oba są dostępne.

1

C posiada standardową bibliotekę (libc na Linuksie, który zapewnia standardowe funkcje, takie jak w <stdio.h> takich jak fprintf aw <stdlib.h> takich jak malloc a także wszystkich wywołań systemowych), a nawet podczas korzystania gcc w wolnym trybie stałego z gcc -ffreestanding (np. Aby skompilować libc lub niektóre jądro) łączy małą bibliotekę libgcc, która zapewnia funkcjonalność wbudowaną w język (np. Dodanie 64 bitów na 32-bitowych platformach).

Aby dowiedzieć się, co robi komenda gcc, należy przekazać jej flagę -v.(Nie zapomnij przyjąć nawyku, aby zawsze kompilować się z -Wall, aby uzyskać ostrzeżenia i -g, aby uzyskać informacje o debugowaniu), np.

% gcc -v -g -Wall hello.c -o hello 
Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-4' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.7.2 (Debian 4.7.2-4) 
COLLECT_GCC_OPTIONS='-v' '-g' '-Wall' '-o' 'hello' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -quiet -v -imultiarch x86_64-linux-gnu hello.c -quiet -dumpbase hello.c -mtune=generic -march=x86-64 -auxbase hello -g -Wall -version -o /tmp/ccsWt3UC.s 
GNU C (Debian 4.7.2-4) version 4.7.2 (x86_64-linux-gnu) 
    compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.1.0-p10, MPC version 0.9 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" 
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc/x86_64-linux-gnu/4.7/include 
/usr/local/include 
/usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed 
/usr/include/x86_64-linux-gnu 
/usr/include 
End of search list. 
GNU C (Debian 4.7.2-4) version 4.7.2 (x86_64-linux-gnu) 
    compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.1.0-p10, MPC version 0.9 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
Compiler executable checksum: c5f63dedeacd449634699df94fe3d914 
COLLECT_GCC_OPTIONS='-v' '-g' '-Wall' '-o' 'hello' '-mtune=generic' '-march=x86-64' 
as -v --64 -o /tmp/ccO5i3pU.o /tmp/ccsWt3UC.s 
GNU assembler version 2.22 (x86_64-linux-gnu) using BFD version (GNU Binutils for Debian) 2.22 
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.7/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../:/lib/:/usr/lib/ 
COLLECT_GCC_OPTIONS='-v' '-g' '-Wall' '-o' 'hello' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 --sysroot=/ --build-id --no-add-needed --eh-frame-hdr -m elf_x86_64 --hash-style=both -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. /tmp/ccO5i3pU.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.7/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o 

Uwaga, collect2 jest łącznik owinięty zrobić dodatkowe rzeczy, i że libc.so przyzwyczaja prawie każdy Linux wykonywalnego (bo jest owijanie syscalls).

Powiązane problemy