Unix как IDE: Компиляция
Под Unix существует множество компиляторов и интерпретаторов, но здесь мы будем обсуждать лишь gcc как средство компиляции C-кода, и коротко коснемся использования perl в качестве примера интерпретатора.
GCC
GCC — это набор компиляторов, обладающий очень почтенным возрастом и распространяемый под лицензией GPL. Он известен как инструмент работы с программами на C и C++. Свободная лицензия и повсеместная распространенность на Unix-подобных системах стали залогом его неизменной популярности, хотя есть и более современные альтернативы, использующие инфраструктуру LLVM, такие как Clang.
Основной исполняемый файл gcc лучше представлять не как компилятор в привычном понимании, а слой абстракции над множеством отдельных инструментов программирования, выполняющих парсинг кода, компиляцию, линковку и другие действия. Это значит, что с его помощью можно не просто получить работающий бинарник из кода на C, но детально исследовать все шаги этого сложного процесса, и при необходимости подстроить его под свои нужды.
Здесь я не буду обсуждать использование make-файлов, хотя они наверняка понадобятся для любого проекта сложнее, чем в один файл. Make-файлов я коснусь в следующей статье о средствах автоматизации сборки.
Компиляция и сборка объектного кода
Объектный код компилируется вот такой командой:
$ gcc -c example.c -o example.o
Если код верен, будет создан нелинкованный двоичный объектный файл под именем example.o в текущей папке, или выведены сообщения о проблемах. Заглянуть внутрь полученного файла и увидеть его содержимое на языке ассемблера можно так:
$ objdump -D example.o
Как вариант, можно попросить gcc сразу показать итоговый ассемблерный код при помощи параметра -S:
$ gcc -c -S example.c -o example.s
Вывод ассемблерного кода может быть полезно совместить с выводом самого исходника, чего можно добиться, набрав:
$ gcc -c -g -Wa,-a,-ad example.c > example.lst
Препроцессор
Препроцессор C (cpp) обычно используется для подключения заголовочных файлов и определения макросов. Это стандартная часть процесса компиляции gcc, но можно просмотреть генерируемый им код, вызвав cpp напрямую:
$ cpp example.c
Исходный код будет выведен в конечном виде, готовым к компиляции, с замененными макросами и подстановкой включаемых внешних файлов.
Связывание объектов
Один или несколько объектных файлов могут быть связаны в соответствующий исполняемый файл:
$ gcc example.o -o example
В этом примере gcc просто вызывает ld, линковщик GNU. Команда создаст исполняемый файл по имени example .
Компиляция, сборка и связывание
Все вышеперечисленное может быть выполнено в один шаг при помощи команды:
$ gcc example.c -o example
Этот способ проще, но компиляция объектов по отдельности дает некоторый выигрыш в производительности: не нужно компилировать не изменявшийся код, но об этом мы поговорим в следующей статье.
Включение внешних файлов и связывание
Файлы C и заголовочные файлы могу быть явно включены в компиляцию при помощи параметра -l:
$ gcc -I/usr/include/somelib.h example.c -o example
Аналогично, если код нужно динамически связать с уже скомпилированной системной библиотекой, доступной в одной из системных папок ( /lib или /usr/lib ), например, ncurses, этого можно добиться использованием ключа -l:
$ gcc -lncurses example.c -o example
Если в процессе компиляции внешних связей много, имеет смысл внести их в переменные окружения:
$ export CFLAGS=-I/usr/include/somelib.h $ export CLIBS=-lncurses $ gcc $CFLAGS $CLIBS example.c -o example
Кстати, Makefile затем и создан, чтобы избавить нас от беспокойства о таких мелочах.
План компиляции
Чтобы посмотреть подробности внутренней кухни gcc, можно добавить ключ -v, и план компиляции будет выведен в стандартный поток вывода ошибок:
$ gcc -v -c example.c -o example.o
Если нет нужды генерировать объектные или исполняемые файлы, то для аккуратности можно использовать -###:
$ gcc -### -c example.c -o example.o
Очень полезно посмотреть, какие действия gcc предпринимает без нашего ведома, кроме того, так мы можем выявить нежелательные шаги при компиляции.
Расширенный вывод сообщений об ошибках
Существует возможность добавить ключи -Wall и/или -pedantic, чтобы gcc предупреждал нас о случаях, которые не обязательно являются ошибками, но могут ими быть:
$ gcc -Wall -pedantic -c example.c -o example.o
Удобно включать такие опции в Makefile или в определении makeprg для Vim, так как они отлично сочетаются с окном quickfix, и помогают писать читабельный, совместимый и безошибочный код.
Профилирование процесса компиляции
Вы можете включить опцию -time, чтобы gcc отображал в тексте вывода время выполения каждого из шагов:
$ gcc -time -c example.c -o example.o
Оптимизация
Gcc имеет ключи оптимизации, указав которые можно попросить его создавать более эффективный объектный код и связанные бинарники за счет увеличения времени компиляции. Я считаю -O2 золотой серединой для выпускаемого кода:
gcc -O1 gcc -O2 gcc -O3
Подобно любой команде Bash, все это можно вызывать прямо из Vim:
:!gcc % -o example
Интерпретаторы
Подход к интерпретируемому коду в Unix-системах иной. В своих примерах я буду использовать Perl, но те же принципы применимы для кода, например, на Python или Ruby.
Inline-код
Можно строку Perl-кода прямо на исполнение интерпретатору любым из перечисленных ниже способов Первый, наверное, самый простой и общеупотребительный способ работы с Perl; второй использует синтаксис heredoc, а третий — это классический конвейер Unix.
$ perl -e 'print "Hello world.\n";' $ perl
Конечно, в будничной жизни мы храним код в файле, который можно вызвать прямо вот так:
$ perl hello.pl
Можно проверить синтаксис кода без его выполнения с помощью ключа -c:
$ perl -c hello.pl
Порой хочется использовать скрипт подобно любому исполняемому бинарнику, не беспокоясь о том, что он из себя представляет. Для этого в скрипт добавляют первой строкой так называемый "shebang", указывающий путь к интерпретатору, которому следует передать на исполнение данный файл.
#!/usr/bin/env perl print "Hello, world.\n";
Скрипту после этого можно ставить атрибут исполняемого файла вызовом chmod. Также хорошим тоном считается переименовать файл, убрав расширения, поскольку он теперь считается почти настоящим исполняемым файлом:
$ mv hello $ chmod +x hello
Затем файл можно вызывать напрямую, без указания интерпретатора:
$ ./hello
Вся эта кухня так здорово работает, что многие стандартные утилиты Linux-систем, такие как adduser, в действительности являются скриптами на Perl или Python.
В следующей публикации я расскажу о методах работы с make для сборки проектов, сравнимых с привычными IDE.
Продолжение следует.
Для чего необходимо скомпилировать программу?
У нас есть 20 ответов на вопрос Для чего необходимо скомпилировать программу? Скорее всего, этого будет достаточно, чтобы вы получили ответ на ваш вопрос.
Содержание
- Зачем нужна компиляция программы?
- Что значит компилировать программу?
- Что происходит при компиляции программы?
- Что значит скомпилировать файл?
- Что значит скомпилированный файл?
- Для чего необходимо скомпилировать программу? Ответы пользователей
- Для чего необходимо скомпилировать программу? Видео-ответы
Отвечает Сергей Щербинин
Программу на Паскале надо предварительно скомпилировать. Компиляция означает перевод исходной программы с языка Pascal в объектную программу – на язык компьютера. При запуске программы, вычисления производятся по программе в объектном коде, а не по исходной программе.
Зачем нужна компиляция программы?
Для того, чтобы процессор понимал, какие команды записаны в программе, программисты создали компилятор — программу, которая преобразует программный код в машинный.
Что значит компилировать программу?
Компиляция (программирование) — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера), выполняемая компилятором.
Что происходит при компиляции программы?
Результатом компиляции является объектный код. Объектный код — это программа на языке машинных кодов с частичным сохранением символьной информации, необходимой в процессе сборки. При отладочной сборке возможно сохранение большого количества символьной информации (идентификаторов переменных, функций, а также типов).
Что значит скомпилировать файл?
(сов. скомпилировать). Писать, сочинять что-л., заимствуя все данные (материалы, результаты наблюдений и т.
Что значит скомпилированный файл?
executable file, также выполняемый, реже исполнимый, выполнимый) — файл, содержащий программу в виде, в котором она может быть исполнена компьютером.
Для чего необходимо скомпилировать программу? Ответы пользователей
Отвечает Лёха Марков
Далее следует скомпилировать программу, т.е. перевести в исполнимый код. Для этого выполним следующую команду. gcc ex1.c. Если программа написана без ошибок .
Отвечает Мария Кондра
Поэтому каждый исходный файл требуется скомпилировать в исполняемый . команды на бинарном коде, необходимо перевести ассемблерный код в .
Отвечает Андрей Бадуров
Одним из наиболее популярных компиляторов является GNU C Compiler (gcc). Для того, чтобы скомпилировать программу на С, необходимо сохранить ее в файле с .
Отвечает Артём Соболев
Далее следует скомпилировать программу, т.е. перевести в исполнимый код. Для этого выполним следующую команду. gcc ex1.c. Если программа написана без ошибок .
Отвечает Андрей Пономарёв
Если обнаружена ошибка, объектный файл не создается, ошибку следует устранить, а затем вновь скомпилировать программу. Если компиляция завершилась успешно, на .
Отвечает Яночка Шурубор
Трансляция программы, составленной на исходном языке, в объектный модуль. Осуществляется компилятором. Компилировать — проводить трансляцию машинной программы с .
Отвечает Анастасия Рафикова
This is a native C program compiled on the command line. Поздравляем! Вы скомпилировали и запустили программу на C с помощью командной строки.
Отвечает Александр Сироткин
Тут следует отметить, что не все современные программы проходят компиляцию в её традиционном смысле. Некоторые языки программирования, такие, например, как PHP, .
Отвечает Вера Болтова-Ефимова
Чтобы можно было воспользоваться GNU-отладчиком, необходимо скомпилировать программу с включением в нее отладочной информации. Этой цели служит опция -g .
Что такое скомпилировать программу?
У нас есть 20 ответов на вопрос Что такое скомпилировать программу? Скорее всего, этого будет достаточно, чтобы вы получили ответ на ваш вопрос.
Содержание
- Что значит скомпилировать в программировании?
- Для чего необходимо скомпилировать программу?
- Что значит компилировать?
- Что такое Скомпилированное?
- Как выполняется компиляция?
- Что такое скомпилировать программу? Ответы пользователей
- Что такое скомпилировать программу? Видео-ответы
Отвечает Николай Лазарев
Компилировать — проводить трансляцию машинной программы с проблемно-ориентированного языка на машинно-ориентированный язык.
Что значит скомпилировать в программировании?
Компиляция -- процесс перевода исходного кода программы, написанного на языке более высокого уровня, в код на языке более низкого уровня или вообще в машинный код (ниже некуда). Скомпилировать -- значит "провести компиляцию", обычно это делается с помощью специальной прорагммы -- компилятора.
Для чего необходимо скомпилировать программу?
Программу на Паскале надо предварительно скомпилировать. Компиляция означает перевод исходной программы с языка Pascal в объектную программу – на язык компьютера. При запуске программы, вычисления производятся по программе в объектном коде, а не по исходной программе.
Что значит компилировать?
компилировать; составление какого-либо текста, произведения путём использования чужих текстов, трудов без самостоятельной обработки источников и без ссылок на авторов ◆ Удалось сделать удачную компиляцию многих источников и добавить немало своих наблюдений.
Что такое Скомпилированное?
скомпилированный — скомпонованный, списанный, содранный, составленный Словарь русских синонимов.
Как выполняется компиляция?
Процесс компиляции состоит из следующих этапов:Лексический анализ. Последовательность символов исходного файла преобразуется в последовательность лексем.Синтаксический анализ. Последовательность лексем преобразуется в дерево разбора.Семантический анализ. . Оптимизация. . Генерация кода.
Что такое скомпилировать программу? Ответы пользователей
Отвечает Любовь Милославская
Компилировать программу - значит: Например, какой-нибудь программист написал на языке программирования, например, Quick Basic программу.
Отвечает Николай Белов
Далее следует скомпилировать программу, т.е. перевести в исполнимый код. Для этого выполним следующую команду. gcc ex1.c. Если программа написана без ошибок .
Отвечает Дмитрий Василюк
This is a native C program compiled on the command line. Поздравляем! Вы скомпилировали и запустили программу на C с помощью командной строки.
Отвечает Екатерина Мозолина
Одним из наиболее популярных компиляторов является GNU C Compiler (gcc). Для того, чтобы скомпилировать программу на С, необходимо сохранить ее в файле с .
Отвечает Алексей Басков
Зачем нужно компилировать исходные файлы? Исходный C++ файл — это всего лишь код, но его невозможно запустить как программу или использовать .
Отвечает Гульнара Смирнова
Тогда ваше консольное окно будет выглядеть следующим образом: Готово! Мы научились компилировать программу в Visual Studio. Пользователям Code::Blocks. Чтобы .
Отвечает Ванёк Степанов
Компилировать – это переиначивать код программы, чтобы он стал более универсальным. Например, программист создал свою программу на конкретном языке, однако как .
Отвечает Эмилия Пяткова
Далее следует скомпилировать программу, т.е. перевести в исполнимый код. Для этого выполним следующую команду. gcc ex1.c. Если программа написана без ошибок .
Отвечает Евгений Куторев
При переводе и исполнении программ возможно и такое сочетание компиляции с . компиляцию и выполнение и просто выполнение уже скомпилированных программ .
При подготовке материала использовались источники:
https://habr.com/ru/articles/151314/
https://querybase.ru/dlya-chego-neobhodimo-skompilirovat-programmu/
https://querybase.ru/chto-takoe-skompilirovat-programmu/