Компиляция файлов формы и шрифта
Пользователь может указать, возможны ли определение, создание и компиляция файлов формы и шрифта, чтобы использовать пользовательские обозначения и текстовые шрифты в чертежах.
Формы в 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-файлы шрифтов.
Похожие задачи
Значение слова «скомпилированный»
Привет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать Карту слов. Я отлично умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!
Спасибо! Я стал чуточку лучше понимать мир эмоций.
Вопрос: европий — это что-то нейтральное, положительное или отрицательное?
Нейтральное
Положительное
Отрицательное
Синонимы к слову «скомпилированный»
Предложения со словом «скомпилированный»
- Даже после появления пакетов, которые представляли собой уже скомпилированные программы, компиляция долгое время оставалась и для некоторых остаётся основным средством установки.
Понятия, связанные со словом «скомпилированный»
Интерпретируемый язык программирования — язык программирования, исходный код на котором выполняется методом интерпретации. Классифицируя языки программирования по способу исполнения, к группе интерпретируемых относят языки, в которых операторы программы друг за другом отдельно транслируются и сразу выполняются (интерпретируются) с помощью специальной программы-интерпретатора (что противопоставляется компилируемым языкам, в которых все операторы программы заранее оттранслированы в объектный код.
Компоновщик (также редактор связей, от англ. link editor, linker) — инструментальная программа, которая производит компоновку («линковку»): принимает на вход один или несколько объектных модулей и собирает по ним исполнимый модуль.
Байт-код (байтко́д; англ. bytecode, также иногда p-код, p-code от portable code) — стандартное промежуточное представление, в которое может быть переведена компьютерная программа автоматическими средствами. По сравнению с исходным кодом, удобным для создания и чтения человеком, байт-код — это компактное представление программы, уже прошедшей синтаксический и семантический анализ. В нём в явном виде закодированы типы, области видимости и другие конструкции. С технической точки зрения, байт-код представляет.
Исполняемый файл (англ. executable file, также выполняемый, реже исполнимый, выполнимый) — файл, содержащий программу в виде, в котором она может быть исполнена компьютером. Перед исполнением программа загружается в память, и выполняются некоторые подготовительные операции (настройка окружения, загрузка библиотек).
Библиоте́ка (от англ. library) в программировании — сборник подпрограмм или объектов, используемых для разработки программного обеспечения (ПО).
Отправить комментарий
Дополнительно
- Как правильно пишется слово «скомпилированный»
- Разбор по составу слова «скомпилированный» (морфемный разбор)
- Цитаты со словом «скомпилированный» (подборка цитат)
- Перевод слова «скомпилированный» и примеры предложений (английский язык)
- Definition of «compile» 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!
Заключение
В данной статье были рассмотрены основы процесса компиляции, понимание которых будет довольно полезно каждому начинающему программисту. В скором времени будет опубликована вторая статья про статические и динамические библиотеки.