Kompilowanie kodu źródłowego#

Pierwszym krokiem procesu tworzenia programów jest skompilowane kodu źródłowego. Wynikiem tego kroku jest stworzenie pliku obiektowego - zawierającego zbiór instrukcji dla komputera wygenerowanego z kodu źródłowego czytelnego dla człowieka. Różne kompilatory mogą tworzyć różne pliki obiektowe z tego samego kodu źródłowego. Ponadto, nazewnictwo pomiędzy nimi również może się różnić.

Konsekwencje:

  • If you use a particular compiler for one source file, you need to use that same compiler (or a compatible one) for all other pieces. After all, a program may be built from many different source files and the compiled pieces have to cooperate.

  • Każdy plik źródłowy będzie skompilowany, a rezultat przechowywany w pliku o rozszerzeniu „.o” lub „.obj”. Te pliki będą również danymi wejściowymi dla następnego kroku: procesu konsolidacji (ang. the link process).

Compilers are complex pieces of software: they have to understand the language in much more detail and depth than the average programmer. They also need to understand the inner workings of the computer. And then, over the years they have been extended with numerous options to customise the compilation process and the final program that will be built.

But the basics are simple enough. Take the gfortran compiler, part of the GNU compiler collection. To compile a simple program like the one above, that consists of one source file, you run the following command, assuming the source code is stored in the file „hello.f90”:

$ gfortran -c hello.f90

Wyniki w pliku „hello.o” (kompilator gfortran używa „.o” jako rozszerzenia plików obiektowych).

Opcja „-c” oznacza: skompiluj tylko pliki źródłowe. W wypadku nie zastosowania tej opcji, domyślnie kompilator skompilował by plik źródłowy oraz zainicjował program łączący, aby zbudował właściwy wykonywalny program. Komenda:

$ gfortran hello.f90

będzie skutkowała stworzeniem pliku wykonywalnego , „a.out” na systemie operacyjnym Linux lub „a.exe” na Windowsie.

Kilka uwag:

  • Kompilator może zwracać uwagę na zawartość plików źródłowych jeśli znajdzie w nim jakiś błąd - np. literówkę lub nieznane słowo kluczowe. W tym przypadku proces kompilacji jest zakończony, a rezultatem nie będzie stworzenie żadnego pliku obiektowego lub wykonywalnego programu. Na przykład, jeśli słowo „program” zostało przez przypadek zapisane jako „prgoram”:

$ gfortran hello3.f90
hello.f90:1:0:

    1 | prgoram hello
      |
Error: Unclassifiable statement at (1)
hello3.f90:3:17:

    3 | end program hello
      |                 1
Error: Syntax error in END PROGRAM statement at (1)
f951: Error: Unexpected end of file in 'hello.f90'

Używając tego raportu z kompilacji możesz poprawić kod źródłowy i spróbować jeszcze raz skompilować program.

  • Komenda kompilacji bez „-c” może zadziałać tylko jeśli plik źródłowy zawiera główny program - charakteryzujący się instrukcją program w Fortranie. W innym przypadku zainicjowany program łączący będzie skarżył się na brakujący „symbol”. Może to wyglądać następująco:

$ gfortran hello2.f90
/usr/lib/../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

Plik „hello2.f90” jest praktycznie taki sam jak plik „hello.f90”, z wyjątkiem tego, że słowo kluczowe program zostało zastąpione słowem kluczowym subroutine.

Powyższe przykłady wyników kompilatora będą się różniły w zależności od kompilatora oraz platformy, na której działa. Te przykłady pochodzą z kompilatora gfortran działającego w środowisku Cygwin na systemie Windows.

Kompilatory różnią się również pod względem obsługiwanych opcji, jednak ogólnie rzecz biorąc:

  • Opcje optymalizowania kodu - skutkujące szybszymi programami i mniejszym zużyciem pamięci;

  • Opcję sprawdzania kodu źródłowego - na przykład sprawdzanie czy zmienna nie jest użyta zanim nadana jest jej wartość lub sprawdzanie czy jakieś rozszerzenie języka jest użyte;

  • Opcje dotyczące lokalizacji plików lub modułów załączanych, zobacz poniżej;

  • Opcje debugowania.