Вы находитесь на странице: 1из 37

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ПЕТРА ВЕЛИКОГО»
Институт компьютерных наук и технологий
Высшая школа программной инженерии

Отчет о прохождении ознакомительной практики

Феллер Галина Мирославовна

1 курс, в5130904/30022

09.03.04 «Программная инженерия»

Место прохождения практики: ФГАОУ ВО «СПбПУ», ИКНТ, ВШПИ,

СПб, ул.Политехническая, 29

Сроки практики: 01.09.23-16.12.23

Руководитель практики от ФГАОУ ВО «СПбПУ»:

Фёдоров Станислав Алексеевич, старший преподаватель ВШПИ ИКНТ

Руководитель практики от профильной организации: -

Оценка: зачтено
Руководитель практики
от ФГАОУ ВО «СПбПУ»: / Фёдоров С. А. /

Руководитель практики
от профильной организации: -

Обучающийся: / Феллер Г. М. /

Дата: 16.12.23
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ПЕТРА ВЕЛИКОГО»
Институт компьютерных наук и технологий
Высшая школа программной инженерии

ИНДИВИДУАЛЬНЫЙ ПЛАН (ЗАДАНИЕ И ГРАФИК)


ПРОВЕДЕНИЯ ПРАКТИКИ
Феллер Галина Мирославовна

Направление подготовки (код/наименование) 09.03.04 «Программная инженерия»


Профиль (код/наименование)
Вид практики ознакомительная
Тип практики распределённая
Место прохождения практики ФГАОУ ВО «СПбПУ», ИКНТ, ВШПИ, СПб,
ул.Политехническая, 29

Руководитель практической подготовки от ФГАОУ ВО «СПбПУ»:

Фёдоров Станислав Алексеевич, старший преподаватель ВШПИ ИКНТ

Руководитель практической подготовки от профильной организации: -

Рабочий график проведения практики

Сроки практики: с 01.09.23 по 16.12.23

Сроки
№ Этапы (периоды) прохождения этапа
Вид работ
п/п практики (периода)
практики
1 Организационный Установочная лекция для разъяснения целей, задач,
этап содержания и порядка прохождения практики, 01.09.23
инструктаж по технике безопасности, выдача
сопроводительных документов по практике
2 Основной Создание инструментальной платформы на 02.09.23-15.12.23
этап базе GNU/Lunux. Работа с менеджером
пакетов. Установка свежих версий
инструментов LaTex. Профессиональная
работа в менеджере окон. Эффективная работа
в текстовом процессоре Vim. Создание
инструментальной среды разработки.
3 Заключительный Защита отчета по практике 16.12.23
этап

Обучающийся / Феллер Г. М. /
Руководитель практической подготовки
от ФГАОУ ВО «СПбПУ» / Фёдоров С. А. /
Оглавление
ОГЛАВЛЕНИЕ ................................................................................................................................. 3
ВВЕДЕНИЕ....................................................................................................................................... 4
ГЛАВА 1. СОЗДАНИЕ ИНСТРУМЕНТАЛЬНОЙ ПЛАТФОРМЫ НА БАЗЕ GNU/LINUX................... 5
1.1 УСТАНОВКА ОС LINUX....................................................................................................................... 5
1.2 АППАРАТНОЕ ОБЕСПЕЧЕНИЕ ............................................................................................................... 5
1.3 ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ИСПОЛЬЗУЕМОЕ В ПРАКТИЧЕСКОЙ РАБОТЕ ................................................ 7
1.4 СЛОЖНОСТИ, ВОЗНИКШИЕ ПРИ СОЗДАНИИ ИНСТРУМЕНТАЛЬНОЙ ПЛАТФОРМЫ И ИХ РЕШЕНИЕ.................... 8
ГЛАВА 2. РАБОТА С МЕНЕДЖЕРОМ ПАКЕТОВ ............................................................................ 9
ГЛАВА 3. УСТАНОВКА СВЕЖИХ ВЕРСИЙ ИНСТРУМЕНТОВ LATEX ........................................ 13
ГЛАВА 4. ПРОФЕССИОНАЛЬНАЯ РАБОТА В МЕНЕДЖЕРЕ ОКОН ............................................ 15
1.1 УСТАНОВКА МЕНЕДЖЕРА ОКОН AWESOME .......................................................................................... 15
1.2 НАСТРОЙКА МЕНЕДЖЕРА ОКОН ......................................................................................................... 15
ГЛАВА 5. ЭФФЕКТИВНАЯ РАБОТА В ТЕКСТОВОМ ПРОЦЕССОРЕ VIM ................................... 16
1.1 УСТАНОВКА ТЕКСТОВОГО ПРОЦЕССОРА VIM: ...................................................................................... 16
1.2 НАВЫКИ ЭФФЕКТИВНОЙ РАБОТЫ С ТЕКСТОВЫМ ПРОЦЕССОРОМ VIM ..................................................... 16
ГЛАВА 6. СОЗДАНИЕ ИНСТРУМЕНТАЛЬНОЙ СРЕДЫ РАЗРАБОТКИ ........................................ 19
1.1 УСТАНОВКА КОМПИЛЯТОРА .............................................................................................................. 19
1.2 НАСТРОЙКА ТЕКСТОВОГО ПРОЦЕССОРА VIM КАК ИНСТРУМЕНТАЛЬНОЙ СРЕДЫ РАЗРАБОТКИ..................... 20
ЗАКЛЮЧЕНИЕ .............................................................................................................................. 21
ПРИЛОЖЕНИЕ 1. ЛАБОРАТОРНЫЕ РАБОТЫ ПО ПРЕДМЕТУ «ВВЕДЕНИЕ В
ПРОФЕССИОНАЛЬНУЮ ДЕЯТЕЛЬНОСТЬ» ................................................................................ 22
1.1 ЛАБОРАТОРНАЯ РАБОТА №1.............................................................................................................. 22
1.2 ЛАБОРАТОРНАЯ РАБОТА №2.............................................................................................................. 22
1.3 ЛАБОРАТОРНАЯ РАБОТА №2.2 ........................................................................................................... 24
1.3 ЛАБОРАТОРНАЯ РАБОТА №3.............................................................................................................. 24
1.4 ЛАБОРАТОРНАЯ РАБОТА №4.............................................................................................................. 26
1.5 ЛАБОРАТОРНАЯ РАБОТА №4.2 ........................................................................................................... 31
1.6 ЛАБОРАТОРНАЯ РАБОТА №5.............................................................................................................. 32
1.7 ЛАБОРАТОРНАЯ РАБОТА №5.2 ........................................................................................................... 33
Введение
Цель практики – персональная инструментальная платформа на базе GNU/Linux и
инструментальная среда разработки на базе Vim.
Задачи, решаемые для достижения этой цели:
1. Создание инструментальной платформы на базе GNU/Linux
2. Изучение работы с менеджером пакетов
3. Установка свежих версий инструментов LaTeX
4. Изучение работы в плиточном менеджере окон
5. Изучение эффективной работы в текстовом процессоре Vim
6. Создание инструментальной среды
Глава 1. Создание инструментальной платформы на базе GNU/Linux
1.1 Установка ОС Linux
Для установки ОС Linux была использована среда виртуализации VirtualBox, так как
нет возможности использовать выделенную рабочую станцию для установки ОС Linux в
качестве основной или дополнительной системы. Использование виртуальной машины
(далее – ВМ) отличается от персонального компьютера (сервера) тем, что для ВМ
выделяются ресурсы гипервизора, что приводит к уменьшению производительности
системы. Для решения задач, поставленных в рамках данной практики, ресурсы и
возможности ВМ достаточны.

Порядок установки ОС Linux на виртуальной машине:

1. Скачать и установить программное обеспечение виртуализации – VirtualBox


2. Скачать дистрибутив операционной системы – Ubuntu 20.04 LTS
3. Создать ВМ и подключить iso образ
4. Загрузить с iso, произвести установку операционной системы
5. Настроить сеть для доступа к ВМ с хоста и доступа с ВМ в Интернет – Bridged
Adapter

1.2 Аппаратное обеспечение


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

1. Модель процессора: Intel Core i5-7360U


2. Техпроцесс: 14нм
3. Архитектура: Kaby Lake
4. Микроархитектура: Kaby Lake
5. Кодовое имя микроархитектуры: KBL
6. Последний расширенный набор инструкций, поддерживаемый процессором: Intel
AVX2
7. Число ядер: 2 (Hyper-Threading)
a. Производительных: 2
b. Число потоков, обрабатываемых на производительных ядрах: 4
c. Эффективных: 2
d. Число потоков, обрабатываемых на эффективных ядрах: 2
8. Объем СОЗУ (кэш-памяти) каждого уровня:
a. L1: кэш данных – 2х32Кб на ядро, кэш инструкций – 2х32Кб на ядро
b. L2: 256Кб на ядро
c. L3: 4Мб
9. Связность кэш-памяти последнего уровня: общая для 2 ядер
10. Диаграмма всех уровней кэш-памяти:

Рис.1 Диаграмма кэш-памяти гипервизора


11. Процессор: чистый многоядерный
12. Объем ОЗУ: 16Гб
13. Число каналов ОЗУ и на какой объем ОЗУ оно распространяется: 2, 34.1Гб/с
Для ВМ выделены ресурсы:

• CPU: 2
• hdd: 25Гб
• Memory: 2Гб

Рис.2 Диаграмма кэш-памяти ВМ

1.3 Программное обеспечение используемое в практической работе


Таблица 1. Используемое ПО
Название Версия
Операционная система Ubuntu 20.04 LTS
Менеджер окон awesome
Текстовый редактор Vim Vi IMproved 8.1
Компилятор gcc
1.4 Сложности, возникшие при создании инструментальной платформы и их
решение
При создании инструментальной платформы не возникло сложностей, так как
операционная система установлена на виртуальной машине и не затрагивает основную
операционную систему рабочей станции. В связи с этим не нужно вносить изменения в
загрузчик (grub) и выход из строя ВМ не влечет за собой сбои в работе гипервизора.
Глава 2. Работа с менеджером пакетов
В Ubuntu используется менеджер пакетов apt (Advanced Package Tool).
Лабораторные работы по предмету «Введение в профессиональную деятельность»
приведены в Приложении 1.

1. Добавление репозитория

a. Файл с информацией о репозитории

galina@galina-VirtualBox:~$ cat /etc/apt/sources.list


deb http://ru.archive.ubuntu.com/ubuntu/ focal main restricted
# deb-src http://ru.archive.ubuntu.com/ubuntu/ focal main restricted
b. Команда add-apt-repository

sudo add-apt-repository deb http://example.com/repo stable main


2. Обновить список доступных пакетов

galina@galina-VirtualBox:~$ sudo apt update


[sudo] password for galina:
Hit:1 http://ru.archive.ubuntu.com/ubuntu focal InRelease
Get:2 http://ru.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Hit:3 http://security.ubuntu.com/ubuntu focal-security InRelease
Hit:4 http://ru.archive.ubuntu.com/ubuntu focal-backports InRelease
Get:5 http://ru.archive.ubuntu.com/ubuntu focal-updates/restricted amd64
Packages [2 579 kB]
Get:6 http://ru.archive.ubuntu.com/ubuntu focal-updates/restricted i386
Packages [36,8 kB]
Get:7 http://ru.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64
Packages [26,1 kB]
Fetched 2 756 kB in 2s (1 604 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
3. Установка пакета

galina@galina-VirtualBox:~$ sudo apt install vim


Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
ctags vim-doc vim-scripts
The following NEW packages will be installed:
vim
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 1 243 kB of archives.
After this operation, 3 121 kB of additional disk space will be used.
Get:1 http://ru.archive.ubuntu.com/ubuntu focal-updates/main amd64 vim amd64
2:8.1.2269-1ubuntu5.21 [1 243 kB]
Fetched 1 243 kB in 0s (2 737 kB/s)
Selecting previously unselected package vim.
(Reading database ... 193071 files and directories currently installed.)
Preparing to unpack .../vim_2%3a8.1.2269-1ubuntu5.21_amd64.deb ...
Unpacking vim (2:8.1.2269-1ubuntu5.21) ...
Setting up vim (2:8.1.2269-1ubuntu5.21) ...
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vim (vim)
in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vimdiff
(vimdiff) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/rvim (rvim)
in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/rview
(rview) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vi (vi) in
auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/view (view)
in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/ex (ex) in
auto mode
galina@galina-VirtualBox:~$
4. Удаление пакета

galina@galina-VirtualBox:~$ sudo apt remove vim


Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
vim-runtime
Use 'sudo apt autoremove' to remove it.
The following packages will be REMOVED:
vim
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 3 121 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 193080 files and directories currently installed.)
Removing vim (2:8.1.2269-1ubuntu5.21) ...
update-alternatives: using /usr/bin/vim.tiny to provide /usr/bin/vi (vi) in
auto mode
update-alternatives: using /usr/bin/vim.tiny to provide /usr/bin/view (view)
in auto mode
update-alternatives: using /usr/bin/vim.tiny to provide /usr/bin/ex (ex) in
auto mode
update-alternatives: using /usr/bin/vim.tiny to provide /usr/bin/rview
(rview) in auto mode
galina@galina-VirtualBox:~$
5. Удаление пакета с конфигурационными файлами

galina@galina-VirtualBox:~$ sudo apt purge vim


Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
vim-runtime
Use 'sudo apt autoremove' to remove it.
The following packages will be REMOVED:
vim*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] y
(Reading database ... 193071 files and directories currently installed.)
Purging configuration files for vim (2:8.1.2269-1ubuntu5.21) ...
galina@galina-VirtualBox:~$
6. Обновление установленных пакетов

galina@galina-VirtualBox:~$ sudo apt upgrade


Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
galina@galina-VirtualBox:~$
7. Обновление системы

galina@galina-VirtualBox:~$ sudo apt dist-upgrade


Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
galina@galina-VirtualBox:~$
8. Поиск пакета по ключевому слову

galina@galina-VirtualBox:~$ sudo apt search cowsay


Sorting... Done
Full Text Search... Done
cowsay/focal,focal 3.03+dfsg2-7 all
configurable talking cow

cowsay-off/focal,focal 3.03+dfsg2-7 all


configurable talking cow (offensive cows)

presentty/focal,focal 0.2.1-1.1 all


Console-based presentation software

xcowsay/focal 1.5-1 amd64


Graphical configurable talking cow

galina@galina-VirtualBox:~$
9. Получение подробной информации о пакете

galina@galina-VirtualBox:~$ sudo apt show cowsay


Package: cowsay
Version: 3.03+dfsg2-7
Priority: optional
Section: universe/games
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: James McDonald <james@jamesmcdonald.com>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 93,2 kB
Depends: libtext-charwidth-perl, perl:any
Suggests: filters, cowsay-off
Homepage:
https://web.archive.org/web/20120527202447/http://www.nog.net/~tony/warez/cow
say.shtml
Download-Size: 18,5 kB
APT-Sources: http://ru.archive.ubuntu.com/ubuntu focal/universe amd64
Packages
Description: configurable talking cow
Cowsay (or cowthink) will turn text into happy ASCII cows, with
speech (or thought) balloons. If you don't like cows, ASCII art is
available to replace it with some other creatures (Tux, the BSD
daemon, dragons, and a plethora of animals, from a turkey to
an elephant in a snake).

galina@galina-VirtualBox:~$
10. Установка всех необходимых зависимостей

galina@galina-VirtualBox:~$ sudo apt-get -f install vim


Reading package lists... Done
Building dependency tree
Reading state information... Done
vim is already the newest version (2:8.1.2269-1ubuntu5.21).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
galina@galina-VirtualBox:~$
Глава 3. Установка свежих версий инструментов LaTeX
Отчеты по лабораторным работам по LaTeX приложены к данному отчету о
прохождении ознакомительной практики отдельным архивом.

Установка пакета LaTeX:

galina@galina-VirtualBox:~$ sudo apt install texlive-latex-extra


Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
python3-pygments icc-profiles libfile-which-perl libspreadsheet-parseexcel-
perl texlive-latex-extra-doc
The following NEW packages will be installed:
texlive-latex-extra
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 12,5 MB of archives.
After this operation, 58,5 MB of additional disk space will be used.
Get:1 http://ru.archive.ubuntu.com/ubuntu focal/universe amd64 texlive-latex-
extra all 2019.202000218-1 [12,5 MB]
Fetched 12,5 MB in 1s (9 390 kB/s)
Selecting previously unselected package texlive-latex-extra.
(Reading database ... 187210 files and directories currently installed.)
Preparing to unpack .../texlive-latex-extra_2019.202000218-1_all.deb ...
Unpacking texlive-latex-extra (2019.202000218-1) ...
Setting up texlive-latex-extra (2019.202000218-1) ...
Processing triggers for tex-common (6.13) ...
Running mktexlsr. This may take some time... done.
Running updmap-sys. This may take some time... done.
Running mktexlsr /var/lib/texmf ... done.
Building format(s) --all.
This may take some time... done.
Processing triggers for man-db (2.9.1-1) ...
galina@galina-VirtualBox:~$

Создание документа LaTeX:


galina@galina-VirtualBox:~$ vim test.tex
galina@galina-VirtualBox:~$ cat test.tex
\documentclass{article}
\begin{document}
Hello World! \LaTeX
\end{document}
galina@galina-VirtualBox:~$

Компиляция PDF документа:


galina@galina-VirtualBox:~$ pdflatex test.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian)
(preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2020-02-02> patch level 2
L3 programming layer <2020-02-14>
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2019/12/20 v1.4l Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def)
(./test.aux) [1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}]
(./test.aux
) )</usr/share/texlive/texmf-
dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></us
r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb>
Output written on test.pdf (1 page, 20006 bytes).
Transcript written on test.log.
galina@galina-VirtualBox:~$

Просмотр PDF:
galina@galina-VirtualBox:~$ evince test.pdf

Рис.3 Просмотр PDF, скомпилированного в LaTeX


Глава 4. Профессиональная работа в менеджере окон
1.1 Установка менеджера окон awesome
apt-get install awesome awesome-extra

После установки менеджера окон awesome необходимо выйти из сессии


пользователя. Выбор менеджера окон будет доступен в окне ввода пароля.

1.2 Настройка менеджера окон

Параметры менеджера окон настраиваются в файле конфигураций:


/etc/xdg/awesome/rc.lua

Чтобы скрыть панель над каждым клиентом, следует закомментировать строки:


{ rule_any = {type = { "normal", "dialog" }
}, properties = { titlebars_enabled = true }
},

Добавить разделители между параллельно открытыми программами:


beautiful.useless_gap=5

Увеличить контекстное меню:


beautiful.menu_height=20
beautiful.menu_width=200
Глава 5. Эффективная работа в текстовом процессоре Vim
1.1 Установка текстового процессора Vim:
root@galina-VirtualBox:~# apt install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done
vim is already the newest version (2:8.1.2269-1ubuntu5.21).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

1.2 Навыки эффективной работы с текстовым процессором Vim

1. Открыть два файла в одной вкладке и один – в другой вкладке


vim -p first.txt second.txt
2. Удостовериться, что по умолчанию включена нумерация строк.
Чтобы проверить, включена ли автоматическая нумерация строк, нужно в открытом
окне vim выполнить команду:
:set number?
Если нумерация выключена, то будет вывод number (или nonumber, если отключена).
Для того, чтобы явно включить нумерацию строк:
:set number

Явно отключить нумерацию строк:


:set nonumber
Чтобы сохранить эти настройки в конфигурационном файле Vim (например,
~/.vimrc), нужно добавить соответствующую команду. Например:
echo 'set number' >> ~/.vimrc

3. Сделать шрифт крупнее в 3 раза, используя функционал терминала, в котором запущен


текстовый процессор.

Нажать сочетание Ctrl + + до увеличения размера шрифта до требуемого.

4. Продемонстрировать переключение между вкладками текстового процессора.

В Vim вкладки называются буферами.

Переключиться на следующий буфер:


:bnext или :bn

Переключиться на предыдущий буфер:


:bprev или :bp
Список открытых буферов:
:ls
Переключиться на определенный буфер (где N - номер буфера):
:bN
5. Продемонстрировать изменение ширины двух отображаемых файлов.

Разделить окно на два вертикальных окна:


:vsplit

Горизонтальное изменение высоты:


Ctrl + W +
Ctrl + W -
Вертикальное изменение ширины:
Ctrl + W >
Ctrl + W <

6. Продемонстрировать переход между файлами.

Перейти к следующему файлу:


:next
Перейти к предыдущему файлу:
:prev

Также можно использовать сокращения: :n для :next и :N для :prev.

7. Продемонстрировать копирование строк из одного файла и вставку его в другой откры-


тый.

В первом файле нажать `v` для выделения нужного диапазона строк. Нажать `y` для
копирования в буфер обмена. Перейти в файл и переместить курсор на позицию, куда
нужно вставить скопированные строки, нажать клавишу `i` для перехода на режим вставки.
Нажать `Ctrl + Shift + v` для вставки из буфера обмена.

8. Продемонстрировать комментирование и раскомментирование указанного диапазона


строк, а также их сдвиг на желаемое число столбцов влево и вправо.

1. Закомментировать строки vi/vim в Unix/Linux.

Нажать Ctrl+V и выделить нужный кусок текста. Нажать Shift+i, потом пишем сим-
волы коммента (#, //, ; и так далее). Потом нажать Esc.

2. Раскомментировать строки vi/vim в Unix/Linux

Нажать Ctrl-V и выделить закомментированные строки (Если нажать shift+G то пе-


рейдем в самый низ). После чего нажать клавишу «x».

Сдвиг строк влево:

Перейти в режим визуального выделения строк. Нажать < (клавиша "меньше").

Сдвиг строк вправо:


Перейти в режим визуального выделения строк. Нажать > (клавиша "больше").

9. Продемонстрировать замену слова на другое слово в указанном диапазоне строк.

:[начало_диапазона],[конец_диапазона]s/старое_слово/новое_слово/g
Глава 6. Создание инструментальной среды разработки
1.1 Установка компилятора
root@galina-VirtualBox:~# apt install gcc build-essential
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
binutils binutils-common binutils-x86-64-linux-gnu dpkg-dev fakeroot g++
g++-9 gcc-9 libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-
merge-perl libasan5 libbinutils
libc-dev-bin libc6-dev libcrypt-dev libctf-nobfd0 libctf0 libfakeroot
libgcc-9-dev libitm1 liblsan0 libquadmath0 libstdc++-9-dev libtsan0 libubsan1
linux-libc-dev make manpages-dev
Suggested packages:
binutils-doc debian-keyring g++-multilib g++-9-multilib gcc-9-doc gcc-
multilib autoconf automake libtool flex bison gcc-doc gcc-9-multilib gcc-9-
locales glibc-doc libstdc++-9-doc
make-doc
The following NEW packages will be installed:
binutils binutils-common binutils-x86-64-linux-gnu build-essential dpkg-dev
fakeroot g++ g++-9 gcc gcc-9 libalgorithm-diff-perl libalgorithm-diff-xs-perl
libalgorithm-merge-perl
libasan5 libbinutils libc-dev-bin libc6-dev libcrypt-dev libctf-nobfd0
libctf0 libfakeroot libgcc-9-dev libitm1 liblsan0 libquadmath0 libstdc++-9-
dev libtsan0 libubsan1
linux-libc-dev make manpages-dev
0 upgraded, 31 newly installed, 0 to remove and 0 not upgraded.
Need to get 36,8 MB of archives.
After this operation, 170 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

root@galina-VirtualBox:~# apt install git


Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer
required:
linux-headers-5.15.0-67-generic linux-hwe-5.15-headers-5.15.0-67 linux-
image-5.15.0-67-generic linux-modules-5.15.0-67-generic linux-modules-extra-
5.15.0-67-generic
Use 'apt autoremove' to remove them.
The following additional packages will be installed:
git-man liberror-perl
Suggested packages:
git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk
gitweb git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
git git-man liberror-perl
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 5 518 kB of archives.
After this operation, 38,7 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Установка NERDTree
git clone https://github.com/preservim/nerdtree.git
~/.vim/pack/vendor/start/nerdtree
vim -u NONE -c "helptags ~/.vim/pack/vendor/start/nerdtree/doc" -c q
1.2 Настройка текстового процессора Vim как инструментальной среды разра-
ботки
Файл конфигурации нужно скопировать с /etc/vim/vimrc
root@galina-VirtualBox:~# cp /etc/vim/vimrc ~/.vimrc
Добавить параметры:
filetype plugin indent on
let fortran_do_enddo=1
set smartindent
set autoindent
set expandtab
set tabstop=3
set shiftwidth=3
set nu
"" Считать текущей директорией директорию открытого файла.
autocmd BufEnter * silent! lcd %:p:h/../
" Перейти к первой ошибке.
map <F4> :1000cp<Cr>zvzz:cc<Cr>
" Перейти к предыдущей ошибке.
map <F5> :cp<Cr>zvzz:cc<Cr>
" Перейти к следующей ошибке.
map <F6> :cn<Cr>zvzz:cc<Cr>
" Сохранить все файлы и собрать проект (цель all в Makefile).
map <F7> :wall \| make all<Cr>
" Запустить проект (цель run в Makefile).
map <F8> :make run<Cr>
" запускать панель NERDTree по горячей клавише
map <C-n> :NERDTreeToggle<CR>
" закрывать NERDTree, если открыт только он (добавить в ~/.vimrc):
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") &&
b:NERDTree.isTabTree()) | q | endif

1.3 Запуск сборки кода


Сборку кода можно запустить нажатием горячей клавиши F7. Запуск кода нажатием
горячей клавиши F8.
Очистить результат – команда make clean (определена в файле Makefile):
clean:
rm -rf obj/*
rm -rf bin/*
Заключение
В результате выполненной практики была успешно достигнута основная цель –
создание персональной инструментальной платформы на основе GNU/Linux с
использованием Vim в качестве текстового процессора. Изучение менеджера пакетов,
установка свежих версий инструментов LaTeX, а также освоение плиточного менеджера
окон способствовали созданию эффективной инструментальной среды. В результате
практики были приобретены навыки, способствующие оптимизации рабочего процесса и
повышению производительности.
Приложение 1. Лабораторные работы по предмету «Введение в
профессиональную деятельность»
1.1 Лабораторная работа №1

Используя find написать команду,

• которая будет удалять, из домашнего каталога пользователя, все файлы к которым


не было обращений за последние 100 дней.

find ~/ -mindepth 1 -mtime +100 -type f -delete

заменить -delete на -depth -print для теста, что выведет команда

• которая будет удалять, из домашнего каталога пользователя, все файлы к которым


не было обращений за последние 100 дней, выводя запрос удаления. (Подсказка –
Необходимо воспользоваться опцией -exec)

find ~/ -type f -mtime +100 -exec rm -i {} \\\\;

• которая будет копировать в указанный каталог все файлы в формате «png»,


содержащиеся в домашнем каталоге пользователя.

find ~/ -type f -name "*.png" -exec cp {} /opt/ \\\\;

• которая будет перемещать в указанный каталог все файлы в формате «png»,


содержащиеся в домашнем каталоге пользователя.

find ~/ -type f -name "*.png" -exec mv {} /opt/ \\\\;

• которая будет искать в домашнем каталоге пользователя файлы содержащие фразу


«hello» и выводить путь к этим файлам.

1.2 Лабораторная работа №2


1. Создать пять текстовых файлов
root@sc-stage-galina:~/lab2# touch file{01..05}.txt
root@sc-stage-galina:~/lab2# ll
total 8
drwxrwxr-x 2 root root 4096 Oct 27 14:08 ./
drwxr-xr-x 5 root root 4096 Oct 27 14:06 ../
-rw-rw-r-- 1 root root 0 Oct 27 14:08 file01.txt
-rw-rw-r-- 1 root root 0 Oct 27 14:08 file02.txt
-rw-rw-r-- 1 root root 0 Oct 27 14:08 file03.txt
-rw-rw-r-- 1 root root 0 Oct 27 14:08 file04.txt
-rw-rw-r-- 1 root root 0 Oct 27 14:08 file05.txt

2. Поместить в них адреса электронной почты вида name@domain.domain и любую


другую информацию
root@sc-stage-galina:~/lab2# cat << EOF >> file01.txt
> test etskglkj dkklm
> dsvnj admin@test.net
> sdnmjk sdkmnks
> test@test.com
> test@test.net
> user1@domain.com
> EOF
root@sc-stage-galina:~/lab2#
root@sc-stage-galina:~/lab2# cat file01.txt
test etskglkj dkklm
dsvnj admin@test.net
sdnmjk sdkmnks
test@test.com
test@test.net
user1@domain.com

3. Создайте файл задания user.job в домашнем каталоге.


root@sc-stage-galina:~/lab2# vim user.job

4. Используя утилиту grep и регулярные выражения напишите в файле user.job


команду задания, выводящего отсортированный список уникальных адресов электронной
почты в файл allemails.lst.

Пример допустимых: ◦ name1@ya.ru ◦ na-m.e2@ya.ru («-» и «.» несколько раз, но не


идут подряд) ◦ name3@ya1.ya-2.ru (несколько под-доменов) Пример не допустимых: ◦
1not@ya.ru (начинается с цифры) ◦ no.-t2@ya.ru («-» и «.» идут подряд) ◦ #abc@cde.ef&
(стечение обстоятельств; адреса должны иметь правильный начальный и конечный
символы) Допустимым начальным символом адреса являются: пробел, табуляция, начало
строки, «(», «:». Допустимыми конечными символами адреса являются: пробел, табуляция,
конец cтроки, «)».

galina.fel@sc-stage-galina:~/lab2$ cat emails.txt


name1@ya.ru
#abc@cde.ef&
#abc@cde.ef&
na-m.e2@ya.ru
na-m.e2@ya.ru
name3@ya1.ya-2.ru
ddv name3@ya1.ya-2.ru
no.-t2@ya.ru
#abc@cde.ef&
lkjjdgk na-m.e3@ya.ru dfjkdg
skjdhjkfs na-m.e4@ya.ru ksvms
skjfsjfks(na-m.e5@ya.ru
jkfjkjvfj+na-m.e2@ya.ru)

galina.fel@sc-stage-galina:~/lab2$ grep -Eoi '([[:space:]:(,]|^)[a-z]+([._-


]?[a-z0-9])+@([a-z]([._-]?[a-z0-9])*\\.[a-z]{2,})([[:space:])]|$)' emails.txt
| sed -E 's/^[[:space:]:(]*//; s/[[:space:])]*$//' | sort -u > allemails.lst
galina.fel@sc-stage-galina:~/lab2$ cat allemails.lst
na-m.e2@ya.ru
na-m.e3@ya.ru
na-m.e4@ya.ru
na-m.e5@ya.ru
name1@ya.ru
name3@ya1.ya-2.ru
-E - расширенные регулярные выражения
-h - вывод строки без имени файла
-o - вывод совпадения, а не всю строку
-i - без учета регистра
5. Поставьте на выполнение это задание (user.job) через одну минуту с помощью at.

root@sc-stage-galina:~/lab2# at -f user.job now + 1 minutes


warning: commands will be executed using /bin/sh
job 2 at Fri Oct 27 15:13:00 2023
root@sc-stage-galina:~/lab2# cat allemails.lsti
admin7@test.net
admin@test.net
test2@test.net
test3@test.net
test4@domain.com
test4@test.com
test@test.com
test@test.net
user1@domain.com
user2@domain.com
user2@test.com
user3@domain.net
user5@test.com

1.3 Лабораторная работа №2.2


Вариант 3. Выбрать последовательность не повторяющихся символов в алфавитном
порядке. Пробелы нужно игнорировать. Примеры: abcdefghijk — Да abbc — Нет

sed 's/ //g' 2.txt | grep -E


'a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?' | grep -vE '([a-
z]).*\1'
sed 's/ //g' - удаляет пробелы

grep -E '^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?$' -
проверяет, что символы в алфавитном порядке
grep -vE '([a-z]).*\1' - исключает последовательности с повторяющимися
символами
galina.fel@sc-stage-galina:~/lab2.2$ cat 1.txt
fghi jk
galina.fel@sc-stage-galina:~/lab2.2$ cat 2.txt
abccbb
galina.fel@sc-stage-galina:~/lab2.2$ sed 's/ //g' 1.txt | grep -E
'a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?' | grep -vE '([a-
z]).*\1'
fghijk
galina.fel@sc-stage-galina:~/lab2.2$ sed 's/ //g' 2.txt | grep -E
'a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?' | grep -vE '([a-
z]).*\1'
galina.fel@sc-stage-galina:~/lab2.2$

1.3 Лабораторная работа №3

Есть файл, example.txt, содержащий следующие слова:

Bat
Goat
Apple
Dog
First
Eat
Hide

Необходимо вывести на экран строчки содержащие символ “a”, но в обратном


порядке.

grep -i a example.txt | tac

Опишите, что делает команда: ls -y >> logfile 2>&1

>> - вывод команды записывается в logfile (не удаляя содержимое, а


дозаписывая)
2>&1 - стандартный вывод и ошибки записываются в файл

Напишите сценарий позволяющий вывести N строк файла начиная с заданной


строки. Номер заданной строки и их количество являются входными параметрами. Задачу
следует решать, используя стандартные утилиты и перенаправление ввода вывода.

root@sc-stage-galina:~/lab3# cat lines.sh


#!/bin/bash

# Проверка наличия аргументов


if [ $# -ne 3 ]; then
echo "Использование: $0 <файл> <начальная_строка> <количество_строк>"
exit 1
fi

# Извлечение аргументов
file="$1"
start_line="$2"
num_lines="$3"

# Проверка существования файла


if [ ! -f "$file" ]; then
echo "Файл '$file' не существует."
exit 1
fi

# Проверка, что начальная строка и количество строк положительны


if [ "$start_line" -le 0 ] || [ "$num_lines" -le 0 ]; then
echo "Начальная строка и количество строк должны быть положительными
числами."
exit 1
fi

# Используем утилиту sed для выборки нужных строк и вывода их в стандартный


вывод
sed -n "$start_line,$(($start_line + $num_lines - 1))p" "$file"

root@sc-stage-galina:~/lab3# chmod +x lines.sh


root@sc-stage-galina:~/lab3# ./lines.sh example.txt 2 2
Goat
Apple
Дана команда: ls file1 file2. Файл file1 существует, файл file2 не существует.
Перенаправьте только стандартную ошибку в конвейер, одновременно записывая номера
строк и перенаправьте вывод в файл. Стандартный вывод должен отображаться на экране.

root@sc-stage-galina:~/lab3# ls file1 file2


ls: cannot access 'file2': No such file or directory
file1
root@sc-stage-galina:~/lab3# ls file1 file2 3>&2 2>&1 1>&3 | nl > output.txt
file1
root@sc-stage-galina:~/lab3# cat output.txt
ls: cannot access 'file2': No such file or directory
- ls file1 file2 выполняет команду ls для файлов file1 и file2

- 3>&2 создает новый файловый дескриптор 3, который указывает туда, куда


указывает файловый дескриптор 2 (стандартный вывод ошибок)

- 2>&1 перенаправляет стандартную ошибку (дескриптор 2) в стандартный вывод


(дескриптор 1)

- 1>&3 перенаправляет стандартный вывод (файловый дескриптор 1) туда, куда


указывает файловый дескриптор 3, что соответствует тому месту, куда изначально был
направлен стандартный вывод ошибок (файловый дескриптор 2)

- | создает конвейер, который отправляет результаты ls на вход команды nl

- nl = cat -n c нумерацией строк

- > output.txt записывает данные, полученные от ls, в файл output.txt

1.4 Лабораторная работа №4

Цель работы — сценарий, вычисляющий неограниченное арифметическое


выражение без учёта приоритетов операций.

Задание 1. Разработайте сценарий, принимающий целочисленное выражение как 3


аргумента командной строки и вычисляющий его. Поддерживаемые операции: +
(сложение), - (вычитание), x и Х (умножение), / (деление). Проверяйте число введённых
аргументов и деление на 0.

Пример работы сценария:


./script.sh 20 / 3
6
#!/bin/bash

is_integer () {
[[ $1 =~ ^[0-9]+$ || $1 =~ ^[-][0-9]+$ ]]
}

calculator() {

# Проверка, что аргументы целочисленные


if ! is_integer "$1" || ! is_integer "$3"; then
echo "Error: Arguments must be integer" >&2
exit 1
fi

case $2 in
"+")
result=$(( $1 + $3 ))
;;
"-")
result=$(( $1 - $3 ))
;;
"x" | "X")
result=$(( $1 * $3 ))
;;
"/")
if [ "$3" -eq 0 ]; then
echo "Error: Division by zero is not allowed" >&2
exit 1
fi
result=$(( $1 / $3))
;;
*)
echo "Error: Unsupported operator: $2" >&2
exit 1
;;
esac

echo "$result"
}

# Проверка числа введенных аргументов


if [ "$#" -ne 3 ]; then
echo "Usage: $0 <int1> <operator> <int2>"
exit 1
fi

calculator "$1" "$2" "$3"

Проводите вычисления для вещественных переменных, используя калькулятор с


неограниченной̆ точностью:

var='bc <<< “scale=6;$1 + $2”

или
var='echo “scale=6;$1 + $2” | bc'
#!/bin/bash

is_integer () {
[[ $1 =~ ^[0-9]+$ || $1 =~ ^[-][0-9]+$ ]]
}

is_float () {
[[ $1 =~ ^[0-9]+(\.[0-9]+)?$ || $1 =~ ^[-][0-9]+(\.[0-9]+)?$ ]]
}

calculator() {

if is_integer "$1" && is_integer "$3"; then


case $2 in
"+")
result=$(( $1 + $3 ))
;;
"-")
result=$(( $1 - $3 ))
;;
"x" | "X")
result=$(( $1 * $3 ))
;;
"/")
if [ "$3" -eq 0 ]; then
echo "Error: Division by zero is not allowed" >&2
exit 1
fi
result=$(( $1 / $3))
;;
*)
echo "Error: Unsupported operator: $2" >&2
exit 1
;;
esac
elif is_float "$1" || is_float "$3"; then
case $2 in
"+")
result=$(bc <<< "scale=6; $1 + $3")
;;
"-")
result=$(bc <<< "scale=6; $1 - $3")
;;
"x" | "X")
result=$(bc <<< "scale=6; $1 * $3")
;;
"/")
if [[ "$3" == 0.0 || "$3" == 0 ]]; then
echo "Error: Division by zero is not allowed" >&2
exit 1
fi
result=$(echo "scale=6; $1 / $3" | bc -l | awk '{printf
"%.6f\n", $0}')
;;
*)
echo "Error: Unsupported operator: $2" >&2
exit 1
;;
esac
else
echo "Error: Arguments must be integer or float" >&2
exit 1
fi
echo "$result"
}

# Проверка числа введенных аргументов


if [ "$#" -ne 3 ]; then
echo "Usage: $0 <int1> <operator> <int2>"
exit 1
fi

calculator "$1" "$2" "$3"

Проводите проверку при делении на вещественный̆ 0.0.

"/")
if [ $(echo "$operand == 0" | bc -l) -eq 1 ]; then
echo "Error: Division by zero is not allowed" >&2
exit 1
fi
result=$(echo "scale=6; $1 / $3" | bc -l | awk '{printf "%.6f\n", $0}')
;;

Добавьте поддержку арифметического выражения любой̆ длины без учёта


приоритетов. Например, можно сперва запомнить первый̆ операнд, а потом сделать сдвиг
аргументов командной̆ строки:

res=$1
shift 1

Дальнейшие действия проводить в цикле, работая с $res (накопленный результат),


$1 (очередная операция), $2 (очередной̆ операнд). Заканчивать каждую итерацию цикла
нужно сдвигом очередных двух аргументов shift 2, пока аргументы ещё есть ($#).

#!/bin/bash

is_integer () {
[[ $1 =~ ^[-]?[0-9]+$ ]]
}

is_float () {
[[ $1 =~ ^[-]?[0-9]+(\.[0-9]+)?$ ]]
}

calculator() {

result=$1
shift

while [ "$#" -gt 0 ]; do


operator=$1
operand=$2

if is_integer "$result" && is_integer "$operand"; then


case $operator in
"+")
result=$(( $result + $operand ))
;;
"-")
result=$(( $result - $operand ))
;;
"x" | "X")
result=$(( $result * $operand ))
;;
"/")
if [ $(echo "$operand == 0" | bc -l) -eq 1 ]; then
echo "Error: Division by zero is not allowed" >&2
exit 1
fi
result=$(( $result / $operand))
;;
*)
echo "Error: Unsupported operator: $operator" >&2
exit 1
;;
esac
elif is_float "$result" || is_float "$operand"; then
case $operator in
"+")
result=$(bc <<< "scale=6; $result + $operand")
;;
"-")
result=$(bc <<< "scale=6; $result - $operand")
;;
"x" | "X")
result=$(bc <<< "scale=6; $result * $operand")
;;
"/")
if [ $(echo "$operand == 0" | bc -l) -eq 1 ]; then
echo "Error: Division by zero is not allowed" >&2
exit 1
fi
result=$(echo "scale=6; $result / $operand" | bc -l | awk
'{printf "%.6f\n", $0}')
;;
*)
echo "Error: Unsupported operator: $operator" >&2
exit 1
;;
esac
else
echo "Error: Arguments must be integer or float" >&2
exit 1
fi
shift 2
done

echo "$result"
}

# Проверка числа введенных аргументов


if [ "$#" -lt 3 ]; then
echo "Usage: $0 <operand1> <operator1> <operand2> [<operator>
<operand>]..."
exit 1
fi

echo $(calculator "$@")

Задание 2. Напишите сценарий, определяющий, существует ли указанный файл. Имя


файла указывается, как параметр командной строки, проверьте его наличие.

#!/bin/bash
if [ $# -eq 0 ]; then
echo "Please provide the file name as an argument"
else
file_name=$1

if [ -f "$file_name" ]; then
echo "the file exists"
else
echo "the file does not exists"
fi
fi

1.5 Лабораторная работа №4.2

Вариант 1. Напишите, сценарий, принимающий нечётное целое число N и


выводящий на экран ромб, выполненный в псевдографике с помощью N строк. Число
символов в строке равно номеру строки (до середины). Для N = 3:

*
* *
* * *
* *
*

#!/bin/bash

read -p "Enter an odd integer: " num

# Проверка, что число нечетное


if [ $((num % 2)) -eq 0 ]; then
echo "Please enter an odd integer."
exit 1
fi

# Вывод пробелов
print_spaces() {
for ((i = 0; i < $1; i++)); do
echo -n " "
done
}

# Вывод звездочек
print_stars() {
for ((i = 0; i < $1; i++)); do
echo -n "* "
done
echo
}

# Верхняя часть ромба


for ((i = 1; i <= num; i++)); do
spaces=$((num - i))
print_spaces $spaces
print_stars $((num - spaces))
done

# Нижняя часть ромба


for ((j = num - 1; j >= 1; j--)); do
print_spaces $((num - j))
print_stars $j
done

1.6 Лабораторная работа №5


На основе примера, демонстрирующего различные уровни оптимизации, написать
сценарий, выполняющий следующие действия:

• Вычисление времени выполнения программы


• Вычисление занимаемого исполняемым файлом дискового пространства(в
байтах)

Сценарий должен принимать следующие параметры командной строки:

• Имя исходного файла программы


• Требуемые ключи оптимизации, если таковые нужны

Вывод программы должен содержать следующую информацию:

• Текущие ключи оптимизации


• Время затраченное программой на выполнение
• Занимаемое программой дисковое пространство

#!/bin/bash

# Проверяем переданные аргументы


if [ "$#" -lt 1 ]; then
echo "Usage: $0 <program_name> [optimisation_level]"
exit 1
fi

file_name="$1"
optimisation="$2"

# Компиляция в зависимости от того, задан ключ оптимизации или нет


if [ -n "$optimisation" ]; then
gcc "$optimisation" "$file_name" -o result
echo "Optimisation level: $optimisation"
else
gcc "$file_name" -o result
echo "Optimisation level not defined"
fi

if [ $? -eq 0 ]; then

# Вывод времени выполнения


real_time=$( { time ./result; } 2>&1 | grep "real" | awk '{print $2}' )
echo "Real time of executing: $real_time"
#Занимаемое дисковое пространство
disk_space=$(du -h result | awk '{print $1}')
echo "Disk space occupied by executable file: $disk_space"

else
# Компиляция завершена с ошибкой
echo "Compilation failed"
exit 1
fi

galina.fel@sc-stage-galina:~/lab5/powern$ ./script.sh main.c


Optimisation level not defined
Real time of executing: 0m1.233s
Disk space occupied by executable file: 20K

galina.fel@sc-stage-galina:~/lab5/powern$ ./script.sh main.c -O1


Optimisation level: -O1
Real time of executing: 0m0.273s
Disk space occupied by executable file: 20K

galina.fel@sc-stage-galina:~/lab5/powern$ ./script.sh main.c -O2


Optimisation level: -O2
Real time of executing: 0m0.238s
Disk space occupied by executable file: 20K

galina.fel@sc-stage-galina:~/lab5/powern$ ./script.sh main.c -O3


Optimisation level: -O3
Real time of executing: 0m0.241s
Disk space occupied by executable file: 20K

1.7 Лабораторная работа №5.2


Выбор подходящего уровня оптимизации. На основе примера, демонстрирующего
различные уровни оптимизации, написать первый сценарий, выполняющий следующие
действия в цикле:
• Компиляцию вашего приложения, не интерактивно обрабатывающего
данные, на языке C/C++/Fortran/Objective C/Objective C++/Ada с ключами оптимизации:
o O0
o Os
o O1
o O2
o O3
o O2 -march=native
o O3 -march=native
o O2 -march=native -funroll-loops
o O3 -march=native -funroll-loops
• Вычисление времени выполнения программы (time). Приложение без
оптимизации должно работать по меньшей мере 20 с.
• Вычисление занимаемого исполняемым файлом дискового пространства (в
байтах) (du).

Сценарий должен принимать только имя исходного файла программы.

Вывод сценария должен содержать следующую информацию:

• Текущие опции оптимизации.


• Время, затраченное программой на выполнение.
• Занимаемое программой дисковое пространство.

#include <stdio.h>
#include <time.h>
unsigned long long performComputation(unsigned long long n) {
unsigned long long sum = 0;
for (unsigned long long i = 1; i <= 10 * n; ++i) { // Увеличиваем
количество итераций
sum += i;
}
return sum;
}

int main() {
unsigned long long n = 1000000000;

unsigned long long result = performComputation(n);

printf("Результат: %llu\n", result);

return 0;
}

#!/bin/bash

# Проверка введенных аргументов


if [ $# -ne 1 ]; then
echo "Usage: $0 <source_file>"
exit 1
fi

# Имя исходного файла программы


source_file=$1

# Список опций оптимизации


optimisation=(
"-O0"
"-Os"
"-O1"
"-O2"
"-O3"
"-O2 -march=native"
"-O3 -march=native"
"-O2 -march=native -funroll-loops"
"-O3 -march=native -funroll-loops"
)

# Функция для выполнения компиляции без оптимизации и с различными ключами


оптимизации
compile_and_measure() {
local flags="$@" # Сохраняем аргументы в локальном массиве функции

gcc "$source_file" -o result $flags

if [ $? -eq 0 ]; then

echo "Execution time:"

time ./result

# Измерение занимаемого исполняемым файлом дискового пространства


echo "Disk space occupied by executable (bytes):"
du -hb ./result | awk '{print $1}'

# Удаление временного исполняемого файла


rm result

else
echo "Compilation failed"
exit 1
fi
}

# Выполнение программы с каждым ключем оптимизации (и без оптимизации)


for opt in "${optimisation[@]}"; do
echo
"==================================================================="
echo "Optimisation level and parameters: $opt"
echo
"==================================================================="
compile_and_measure "$opt"
done

galina.fel@sc-stage-galina:~/lab5/sleep$ ./part1.sh test.c


===================================================================
Optimisation level and parameters: -O0
===================================================================
Execution time:
Результат: 13106511857580896768

real 0m29.756s
user 0m29.729s
sys 0m0.000s
Disk space occupied by executable (bytes):
16744
===================================================================
Optimisation level and parameters: -Os
===================================================================
Execution time:
Результат: 13106511857580896768

real 0m4.126s
user 0m4.122s
sys 0m0.000s
Disk space occupied by executable (bytes):
16744
===================================================================
Optimisation level and parameters: -O1
===================================================================
Execution time:
Результат: 13106511857580896768

real 0m4.220s
user 0m4.212s
sys 0m0.004s
Disk space occupied by executable (bytes):
16744
===================================================================
Optimisation level and parameters: -O2
===================================================================
Execution time:
Результат: 13106511857580896768

real 0m4.243s
user 0m4.240s
sys 0m0.000s
Disk space occupied by executable (bytes):
16744
===================================================================
Optimisation level and parameters: -O3
===================================================================
Execution time:
Результат: 13106511857580896768

real 0m4.077s
user 0m4.072s
sys 0m0.004s
Disk space occupied by executable (bytes):
16744
===================================================================
Optimisation level and parameters: -O2 -march=native
===================================================================
Execution time:
Результат: 13106511857580896768

real 0m4.122s
user 0m4.114s
sys 0m0.004s
Disk space occupied by executable (bytes):
16744
===================================================================
Optimisation level and parameters: -O3 -march=native
===================================================================
Execution time:
Результат: 13106511857580896768

real 0m1.287s
user 0m1.282s
sys 0m0.000s
Disk space occupied by executable (bytes):
16744
===================================================================
Optimisation level and parameters: -O2 -march=native -funroll-loops
===================================================================
Execution time:
Результат: 13106511857580896768

real 0m1.513s
user 0m1.506s
sys 0m0.004s
Disk space occupied by executable (bytes):
16744
===================================================================
Optimisation level and parameters: -O3 -march=native -funroll-loops
===================================================================
Execution time:
Результат: 13106511857580896768

real 0m1.048s
user 0m1.047s
sys 0m0.000s
Disk space occupied by executable (bytes):
16744

Выбор системного метода оптимизации. Выберите вариант оптимизации, дающий


наибольшую производительность для вашего приложения (оптимальная опция).
galina.fel@sc-stage-galina:~/lab5/sleep$ gcc -O3 test.c -o result
galina.fel@sc-stage-galina:~/lab5/sleep$ time ./result
Результат: 13106511857580896768
real 0m4.171s
user 0m4.154s
sys 0m0.008s

Проведите оптимизацию с оптимальной опцией, межпроцедурной оптимизацией


(см. серию опций -fipa-*) и оптимизацией времени компоновки (-flto). Определите
время работы приложения.

galina.fel@sc-stage-galina:~/lab5/sleep$ gcc -O3 -fipa-icf-functions -flto


test.c -o result
galina.fel@sc-stage-galina:~/lab5/sleep$ time ./result
Результат: 13106511857580896768

real 0m4.099s
user 0m4.098s
sys 0m0.001s
-fipa-icf-functions: Эта опция управляет уровнем интенсивности идентификации

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


пытаться сокращать повторяющиеся фрагменты кода.

Проведите оптимизацию с оптимальной опцией и с оптимизацией с обратной связью


(-fprofile-generate/-fprofile-use). Определите время работы приложения.

galina.fel@sc-stage-galina:~/lab5/sleep$ gcc -O3 -fprofile-generate test.c -o


result
galina.fel@sc-stage-galina:~/lab5/sleep$ ./result
galina.fel@sc-stage-galina:~/lab5/sleep$ gcc -O3 -fprofile-use test.c -o
result
galina.fel@sc-stage-galina:~/lab5/sleep$ time ./result
Результат: 13106511857580896768

real 0m1.517s
user 0m1.517s
sys 0m0.001s

Проведите оптимизацию с оптимальной опцией, межпроцедурной оптимизацией,


оптимизацией времени компоновки и с оптимизацией̆ с обратной̆ связью. Определите время
работы приложения.

galina.fel@sc-stage-galina:~/lab5/sleep$ gcc -O3 -fipa-icf-functions -flto -


fprofile-generate test.c -o result
galina.fel@sc-stage-galina:~/lab5/sleep$ ./result
galina.fel@sc-stage-galina:~/lab5/sleep$ gcc -O3 -fipa-icf-functions -flto -
fprofile-use test.c -o result
galina.fel@sc-stage-galina:~/lab5/sleep$ time ./result
Результат: 13106511857580896768

real 0m1.514s
user 0m1.514s
sys 0m0.000s

Вам также может понравиться