Скомпилированный файл что это
Перейти к содержимому

Скомпилированный файл что это

  • автор:

Компиляция файлов формы и шрифта

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

Формы в AutoCAD — это объекты, используемые подобно блокам. Блоки более универсальны, и вставлять их гораздо проще, чем формы. Однако формы более эффективны для программы в отношении хранения и быстроты обработки. В тех случаях, когда достаточно простой элемент нужно вставить в разные места чертежа, удобнее использовать именно пользовательские формы.

C помощью команды ЗАГРУЗИТЬ можно загрузить в чертеж скомпилированный файл формы (SHX), содержащий определение формы. После этого можно производить вставку форм из этого файла, вызывая команду ФОРМА. При каждой вставке формы пользователь задает масштаб и угол поворота. SHP-шрифты описываются точно так же, как и формы; по сути дела, это формы специального типа.

Компиляция файлов форм/шрифтов

Формы описываются в специальном формате и хранятся в текстовых файлах с расширением . shp. Для создания файла определения формы (SHP) можно использовать любой текстовый редактор или текстовый процессор, который сохраняет тексты в формате ASCII, а затем можно скомпилировать файл с помощью команды КОМПИЛ. При компиляции файла определения формы создается файл формы (SHX) с тем же именем, что и у файла определения формы.

Если в файле описывается шрифт, то на его основе можно создать стиль текста, воспользовавшись командой СТИЛЬ. Затем в чертеж добавляется текст из символов, заданных в скомпилированном файле формы. Если в файле описываются формы, вначале необходимо загрузить его в чертеж с помощью команды ЗАГРУЗИТЬ. С помощью команды ФОРМА можно вставить заданные формы в чертеж.

Компиляция шрифтов PostScript

Шрифты Type 1 PostScript необходимо предварительно компилировать в файл форм, а затем использовать в программе. Это выполняется командой КОМПИЛ, которая принимает на вход как SHP-, так и PFB-файлы и в результате генерирует SHX-файл.

Программа не может компилировать и загружать все возможные шрифты Type 1. Процедуры работы с PostScript-шрифтами в программах на основе AutoCAD рассчитаны только на подмножество шрифтов, разработанных фирмой Adobe. Если в процессе компиляции PostScript-шрифта произошла ошибка, то вполне вероятно, что SHX-файл, если даже и будет получен, не сможет быть загружен в программу.

Подробная информация о формате шрифтов Adobe Type 1 изложена в документе Формат шрифта Adobe Type1 версии 1.1. Если эти шрифты установлены на компьютер, они становятся доступны для программы.

Примечание Следует ознакомиться со всеми ограничениями, связанными с наличием авторских прав на шрифты PostScript, и строго соблюдать их. Все эти ограничения распространяются и на полученные в результате компиляции SHX-файлы шрифтов.

Похожие задачи

Значение слова «скомпилированный»

Привет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать Карту слов. Я отлично умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!

Спасибо! Я стал чуточку лучше понимать мир эмоций.

Вопрос: европий — это что-то нейтральное, положительное или отрицательное?

Нейтральное
Положительное
Отрицательное

Синонимы к слову «скомпилированный&raquo

Предложения со словом «скомпилированный&raquo

  • Даже после появления пакетов, которые представляли собой уже скомпилированные программы, компиляция долгое время оставалась и для некоторых остаётся основным средством установки.

Понятия, связанные со словом «скомпилированный»

Интерпретируемый язык программирования — язык программирования, исходный код на котором выполняется методом интерпретации. Классифицируя языки программирования по способу исполнения, к группе интерпретируемых относят языки, в которых операторы программы друг за другом отдельно транслируются и сразу выполняются (интерпретируются) с помощью специальной программы-интерпретатора (что противопоставляется компилируемым языкам, в которых все операторы программы заранее оттранслированы в объектный код.

Компоновщик (также редактор связей, от англ. link editor, linker) — инструментальная программа, которая производит компоновку («линковку»): принимает на вход один или несколько объектных модулей и собирает по ним исполнимый модуль.

Байт-код (байтко́д; англ. bytecode, также иногда p-код, p-code от portable code) — стандартное промежуточное представление, в которое может быть переведена компьютерная программа автоматическими средствами. По сравнению с исходным кодом, удобным для создания и чтения человеком, байт-код — это компактное представление программы, уже прошедшей синтаксический и семантический анализ. В нём в явном виде закодированы типы, области видимости и другие конструкции. С технической точки зрения, байт-код представляет.

Исполняемый файл (англ. executable file, также выполняемый, реже исполнимый, выполнимый) — файл, содержащий программу в виде, в котором она может быть исполнена компьютером. Перед исполнением программа загружается в память, и выполняются некоторые подготовительные операции (настройка окружения, загрузка библиотек).

Библиоте́ка (от англ. library) в программировании — сборник подпрограмм или объектов, используемых для разработки программного обеспечения (ПО).

Отправить комментарий

Дополнительно

  • Как правильно пишется слово «скомпилированный»
  • Разбор по составу слова «скомпилированный» (морфемный разбор)
  • Цитаты со словом «скомпилированный» (подборка цитат)
  • Перевод слова «скомпилированный» и примеры предложений (английский язык)
  • Definition of «compile&raquo at WordTools.ai (английский язык)

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

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

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

Компиляторы являются сложными программами: они должны понимать язык программирования гораздо детальнее и глубже, чем средний программист. Кроме того, они должны понимать внутреннюю организацию работы компьютера. В итоге, с годами они были дополнены многочисленными опциями для настройки процесса компиляции и конечной программы, которая будет собрана.

Но основы достаточно просты. Возьмём компилятор gfortran, входящий в состав GNU compiler collection (набор компиляторов GNU). Чтобы скомпилировать простую программу, как приведённая выше, состоящую из одного файла исходного кода, вы выполняете следующую команду, предполагая, что исходный код сохранён в файле «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.

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

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

so the DOM is not blocked —>

© Copyright 2020-2022, Fortran Community.

Процесс компиляции программ на C++

В данной статье я хочу рассказать о том, как происходит компиляция программ, написанных на языке C++, и описать каждый этап компиляции. Я не преследую цель рассказать обо всем подробно в деталях, а только дать общее видение. Также данная статья — это необходимое введение перед следующей статьей про статические и динамические библиотеки, так как процесс компиляции крайне важен для понимания перед дальнейшим повествованием о библиотеках.

Все действия будут производиться на Ubuntu версии 16.04.
Используя компилятор g++ версии:

$ g++ --version g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

Состав компилятора g++

Мы не будем вызывать данные компоненты напрямую, так как для того, чтобы работать с C++ кодом, требуются дополнительные библиотеки, позволив все необходимые подгрузки делать основному компоненту компилятора — g++.

Зачем нужно компилировать исходные файлы?

Исходный C++ файл — это всего лишь код, но его невозможно запустить как программу или использовать как библиотеку. Поэтому каждый исходный файл требуется скомпилировать в исполняемый файл, динамическую или статическую библиотеки (данные библиотеки будут рассмотрены в следующей статье).

Этапы компиляции:

Перед тем, как приступать, давайте создадим исходный .cpp файл, с которым и будем работать в дальнейшем.

driver.cpp:

#include using namespace std; #define RETURN return 0 int main()

1) Препроцессинг

Самая первая стадия компиляции программы.

Препроцессор — это макро процессор, который преобразовывает вашу программу для дальнейшего компилирования. На данной стадии происходит происходит работа с препроцессорными директивами. Например, препроцессор добавляет хэдеры в код (#include), убирает комментирования, заменяет макросы (#define) их значениями, выбирает нужные куски кода в соответствии с условиями #if, #ifdef и #ifndef.

Хэдеры, включенные в программу с помощью директивы #include, рекурсивно проходят стадию препроцессинга и включаются в выпускаемый файл. Однако, каждый хэдер может быть открыт во время препроцессинга несколько раз, поэтому, обычно, используются специальные препроцессорные директивы, предохраняющие от циклической зависимости.

Получим препроцессированный код в выходной файл driver.ii (прошедшие через стадию препроцессинга C++ файлы имеют расширение .ii), используя флаг -E, который сообщает компилятору, что компилировать (об этом далее) файл не нужно, а только провести его препроцессинг:

g++ -E driver.cpp -o driver.ii

Взглянув на тело функции main в новом сгенерированном файле, можно заметить, что макрос RETURN был заменен:

int main()

В новом сгенерированном файле также можно увидеть огромное количество новых строк, это различные библиотеки и хэдер iostream.

2) Компиляция

На данном шаге g++ выполняет свою главную задачу — компилирует, то есть преобразует полученный на прошлом шаге код без директив в ассемблерный код. Это промежуточный шаг между высокоуровневым языком и машинным (бинарным) кодом.

Ассемблерный код — это доступное для понимания человеком представление машинного кода.

Используя флаг -S, который сообщает компилятору остановиться после стадии компиляции, получим ассемблерный код в выходном файле driver.s:

$ g++ -S driver.ii -o driver.s

driver.s

 .file "driver.cpp" .local _ZStL8__ioinit .comm _ZStL8__ioinit,1,1 .section .rodata .LC0: .string "Hello, world!" .text .globl main .type main, @function main: .LFB1021: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %esi movl $_ZSt4cout, %edi call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc movl $_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, %esi movq %rax, %rdi call _ZNSolsEPFRSoS_E movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1021: .size main, .-main .type _Z41__static_initialization_and_destruction_0ii, @function _Z41__static_initialization_and_destruction_0ii: .LFB1030: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp movl %edi, -4(%rbp) movl %esi, -8(%rbp) cmpl $1, -4(%rbp) jne .L5 cmpl $65535, -8(%rbp) jne .L5 movl $_ZStL8__ioinit, %edi call _ZNSt8ios_base4InitC1Ev movl $__dso_handle, %edx movl $_ZStL8__ioinit, %esi movl $_ZNSt8ios_base4InitD1Ev, %edi call __cxa_atexit .L5: nop leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1030: .size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii .type _GLOBAL__sub_I_main, @function _GLOBAL__sub_I_main: .LFB1031: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $65535, %esi movl $1, %edi call _Z41__static_initialization_and_destruction_0ii popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1031: .size _GLOBAL__sub_I_main, .-_GLOBAL__sub_I_main .section .init_array,"aw" .align 8 .quad _GLOBAL__sub_I_main .hidden __dso_handle .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609" .section .note.GNU-stack,"",@progbits

Мы можем все также посмотреть и прочесть полученный результат. Но для того, чтобы машина поняла наш код, требуется преобразовать его в машинный код, который мы и получим на следующем шаге.

3) Ассемблирование

Так как x86 процессоры исполняют команды на бинарном коде, необходимо перевести ассемблерный код в машинный с помощью ассемблера.

Ассемблер преобразовывает ассемблерный код в машинный код, сохраняя его в объектном файле.

Объектный файл — это созданный ассемблером промежуточный файл, хранящий кусок машинного кода. Этот кусок машинного кода, который еще не был связан вместе с другими кусками машинного кода в конечную выполняемую программу, называется объектным кодом.

Далее возможно сохранение данного объектного кода в статические библиотеки для того, чтобы не компилировать данный код снова.

Получим машинный код с помощью ассемблера (as) в выходной объектный файл driver.o:

$ as driver.s -o driver.o

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

4) Компоновка

Компоновщик (линкер) связывает все объектные файлы и статические библиотеки в единый исполняемый файл, который мы и сможем запустить в дальнейшем. Для того, чтобы понять как происходит связка, следует рассказать о таблице символов.

Таблица символов — это структура данных, создаваемая самим компилятором и хранящаяся в самих объектных файлах. Таблица символов хранит имена переменных, функций, классов, объектов и т.д., где каждому идентификатору (символу) соотносится его тип, область видимости. Также таблица символов хранит адреса ссылок на данные и процедуры в других объектных файлах.
Именно с помощью таблицы символов и хранящихся в них ссылок линкер будет способен в дальнейшем построить связи между данными среди множества других объектных файлов и создать единый исполняемый файл из них.

Получим исполняемый файл driver:

$ g++ driver.o -o driver // также тут можно добавить и другие объектные файлы и библиотеки

5) Загрузка

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

Запустим нашу программу:

$ ./driver // Hello, world!

Заключение

В данной статье были рассмотрены основы процесса компиляции, понимание которых будет довольно полезно каждому начинающему программисту. В скором времени будет опубликована вторая статья про статические и динамические библиотеки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *