Компиляция исходного кода#

Первым шагом в процессе сборки является компиляция исходного кода. Результатом этого действия обычно является получение объектного кода – набора инструкций для компьютера, сгенерированных из человекочитаемого исходного кода. Разные компиляторы создают разный объектный код из одного и того же исходного кода и соглашения об именовании у них отличаются.

Последствия:

  • 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.

  • Каждый файл исходного кода будет скомпилирован и результат будет сохранён в файл с расширением «.o» или «.obj». Именно эти файлы объектного кода являются входными данными для следующего этапа: процесса компоновки.

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

Выполнение этой команды приведёт к созданию файла «hello.o» (так как компилятор gfortran использует расширение «.o\ в качестве расширения для объектных файлов).

Опция компилятора «-c» означает: только компилировать файлы исходного кода. Если её не указать, то по умолчанию компилятор будет компилировать файлы исходного кода и запускать компоновщик для создания исполняемого файла программы. Выполнение команды:

$ gfortran hello.f90

приведёт к созданию исполняемого файла «a.out» в системах Linux или «a.exe» в системе Windows.

Некоторые замечания:

  • Компилятор может пожаловаться на содержимое файла исходного кода, если обнаружит в нём что-то неправильное, например, опечатку или неизвестное ключевое слово. В этом случае процесс компиляции прерывается и вы не получите ни объектного файла, ни исполняемого файла программы. Например, если слово «program» по ошибке было набрано как «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'

Используя этот отчёт компилятора об ошибках, вы можете исправить текст исходного кода программы и повторить попытку компиляции.

  • Выполнение шага сборки без опции «-c» может быть успешным, только если файл исходного кода содержит основную программу, обозначаемую в тексте программы оператором program языка Fortran. В противном случае компоновщик пожалуется на отсутствующий «символ» («symbol») сообщением примерно следующего содержания:

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

Файл «hello2.f90» почти такой же как и файл «hello.f90», за исключением того, что ключевое слово program было заменено на ключевое слово subroutine.

Приведённые выше примеры вывода сообщений компилятора будут отличаться в зависимости от используемых компилятора и платформы, на которых он работает. Рассмотренные примеры взяты для компилятора gfortran, работающего в среде Cygwin в Windows.

Компиляторы также отличаются по поддерживаемым ими опциям, но в целом они все имеют:

  • Опции для оптимизации кода – в результате их использования программы работают быстрее или занимают меньше памяти;

  • Опции для проверки исходного кода – например, проверяется, не используется ли переменная до присвоения ей значения, или проверяется, не используется ли какое-либо расширение языка программирования;

  • Опции для указания места расположения подключаемых файлов или файлов модулей, см. далее;

  • Опции для отладки.