Чтобы включить режим цветовых выделений, откройте файл ~/.emacs
и вставьте в него такую строку:
(global-font-lock-mode t)
Сохраните файл, выйдите из Emacs и перезапустите редактор. Теперь можете открыть нужный исходный файл и наслаждаться!
Внимательные читатели, возможно, обратили внимание на то, что строка, вставленная в файл .emacs
, выглядит написанной на языке LISP. Это и есть LISP! Большая часть редактора Emacs реализована именно на этом языке. На нем же можно писать расширения к редактору.
Компилятор превращает исходный текст программы, понятный человеку, в объектный код. исполняемый компьютером. Компиляторы, доступные в Linux-системах, являются честью коллекции GNU-компиляторов, известной как GCC (GNU Compiler Collection). [4] Дополнительную информацию о GCC можно получить по адресу http://gcc.gnu.org .
В нее входят компиляторы языков С, C++, Java, Objective-C, Fortran и Chill. В этой книге нас будут интересовать лишь первые два.
Предположим, имеется проект, в который входят два исходных файла: один написан на С ( main.c
; листинг 1.1), а другой — на C++ ( reciprocal.cpp
; листинг 1.2). После компиляции оба файла компонуются вместе, образуя программу reciprocal
, [5] В Windows исполняемые файлы обычно имеют расширение .exe , а в Linux - вообще не имеют его. Поэтому в Windows эквивалент данной программы будет, скорее всего, называться reciprocal.exe .
которая вычисляет обратное заданного целого числа.
Листинг 1.1. ( main.c ) Исходный файл на языке С
#include
#include "reciprocal.hpp"
int main(int argc, char **argv) {
int i;
i = atoi(argv[1]);
printf("The reciprocal of %d is %g\n", i, reciprocal(i));
return 0;
}
Листинг 1.2. ( reciprocal.cpp ) Исходный файл на языке C++
#include
#include "reciprocal.hpp"
double reciprocal (int i) {
// Аргумент не должен быть равен нулю
assert(i != 0);
return 1.0/i;
}
Есть также файл заголовков, который называется reciprocal.hpp
(листинг 1.3).
Листинг 1.3. ( reciprocal.hpp ) Файл заголовков
#ifdef __cplusplus
extern "С" {
#endif
extern double reciprocal(int i);
#ifdef __cplusplus
}
#endif
Первый шаг заключается в превращении исходных файлов в объектный код.
1.2.1. Компиляция одного исходного файла
Компилятор языка С называется gcc
. При компиляции исходного файла нужно указывать опцию -с
. Вот как, например, в режиме командной строки компилируется файл main.с
:
% gcc -с main.с
Полученный объектный файл будет называться main.o
.
Компилятор языка C++ называется g++
. Он работает почти так же, как и gcc
. Следующая команда предназначена для компиляции файла reciprocal.cpp
:
% g++ -c reciprocal.cpp
Опция -с
говорит компилятору о необходимости получить на выходе объектный файл (он будет называться reciprocal.o
). Без неё компилятор g++
попытается скомпоновать программу и создать исполняемый файл.
В процессе написания любой более-менее крупной программы обычно задействуется ряд дополнительных опций. К примеру, опция -I
сообщает компилятору о том, где искать файлы заголовков. По умолчанию компиляторы GCC просматривают текущий каталог, а также каталоги, где установлены файлы стандартных библиотек. Предположим, наш проект состоит из двух каталогов: src
и include
. Следующая команда даст компилятору g++
указание дополнительно искать файл reciprocal.hpp
в каталоге ../include
:
% g++ -с -I ../include reciprocal.cpp
Иногда требуется задать макроконстанты в командной строке. Например, в коммерческой версии программы нет необходимости осуществлять избыточную проверку утверждения в файле reciprocal.cpp
; она нужна лишь в целях отладки. Эта проверка отключается путем определения макроконстанты NDEBUG
. Можно, конечно, явно добавить в файл директиву #define
, но это означает изменение исходного текста программы. Проще сделать то же самое в командной строке:
% g++ -c -D NDEBUG reciprocal.cpp
Аналогичным образом можно задать конкретный уровень отладки:
% g++ -с -D NDEBUG=3 reciprocal.cpp
При написании коммерческих программ оказываются полезными средства оптимизации кода, имеющиеся в компиляторах GCC. Есть несколько уровней оптимизации; для большинства программ подходит второй. Следующая команда компилирует файл reciprocal.cpp
с включенным режимом оптимизации второго уровня:
% g++ -с -O2 reciprocal.cpp
Читать дальше