Как пишут программы под линукс

Время на прочтение
5 мин

Количество просмотров 42K

Введение

Добрый день. Этот материал рассчитан на людей, будущих программистов, которые только начинают разбираться в программировании под ОС Linux. Я попробую здесь показать прямое руководство к действию на примере тех простых инструментов, которые использовал некогда сам при изучении Си в процессе знакомства с Linux. На самом деле, с теми или иными поправками, это руководство можно использовать в большинстве дистрибутивов. Руководство однозначно подходит для всех deb-based дистрибутивов.

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

Итак: у Вас сейчас установлен дистрибутив ОС, как говорится, «из коробки». Перед глазами пособие для разработчика/учебник/просто_хорошая_книга по «Языку программирования Си». И никакой вменяемой, полноценной подробной информации о том, как же собственно откомпилировать и выполнить, написанный в книге, исходный код. Быстрый осмотр тематических ресурсов уже показал Вам, что, необходимо установить компилятор Си, запустить его с нужными параметрами и потом запустить компилированный бинарный код. Примерно с этого момента мы и начнём.

Установка компилятора

Я имею ввиду, что Вы скорее всего (бывший) пользователь ОС Windows и действия в чёрном/синем окошке при помощи клавиатуры оканчивались где-то на команде ping, кажутся неким таинством. Однако отмечу, что всё банально просто и текстовой интерфейс предоставляет намного более гибкие возможности (скорее всего Вы неоднократно Вы слышали это ранее). Приступим:

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

На этом этапе всё будет очень быстро и просто. Открываем терминал и пишем:

sudo apt install gcc

(На всякий случай: вставка в gnome-terminal ctrl+shift+v)

Сразу поясню, что текст слева от курсора — это приглашение командного интерпретатора и оно выглядит следующим образом:

ИМЯ_ПОЛЬЗОВАТЕЛЯ@ИМЯ_КОМПЬЮТЕРА:ТЕКУЩИЙ_КАТАЛОГ$

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

Данная строка «говорит» интерпретатору: «от имени суперпользователя запустить менеджер пакетов для установки пакета gcc».

Система попросит Вас ввести пароль суперпользователя и приступит к установке компилятора.

Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Предлагаемые пакеты:
  gcc-multilib gcc-doc
Следующие НОВЫЕ пакеты будут установлены:
  gcc
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 44 пакетов не обновлено.
Необходимо скачать 5 208 B архивов.
После данной операции объём занятого дискового пространства возрастёт на 51,2 kB.
Пол:1 http://ru.archive.ubuntu.com/ubuntu focal/main amd64 gcc amd64 4:9.3.0-1ubuntu2 [5 208 B]
Получено 5 208 B за 0с (34,6 kB/s)  
Выбор ранее не выбранного пакета gcc.
(Чтение базы данных … на данный момент установлено 371769 файлов и каталогов.)
Подготовка к распаковке …/gcc_4%3a9.3.0-1ubuntu2_amd64.deb …
Распаковывается gcc (4:9.3.0-1ubuntu2) …
Настраивается пакет gcc (4:9.3.0-1ubuntu2) …
Обрабатываются триггеры для man-db (2.9.1-1) …

Если же он уже установлен, то менеджер пакетов apt просто укажет на это примерно следующим образом:

Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Уже установлен пакет gcc самой новой версии (4:9.3.0-1ubuntu2).

Установка редактора

Обычно с дистрибутивом Ubuntu поставляется весьма интересный текстовой редактор gedit. Однако в других дистрибутивах возможно придётся установить этот редактор:

sudo apt install gedit

Создание файла с исходным кодом

Теперь пришло то самое время нашего классического «hello world»! Давайте сделаем это в стиле linux. Просто наберите в консоли:

gedit ~/hello_world.c

Более подробно Вы обязательно прочитайте в профильных ресурсах и в документации, я только отмечу, что символ «тильда» возвращает полный путь к домашнему каталогу пользователя ОС. Соответственно будет создан файл в вашем домашнем каталоге с указанным именем.

И далее наш программный код на языке Си в редакторе:

#include "stdio.h"
int main()
{
	printf ("nHello world)n");
	for (int c=0; c<10;c++)
	{
		for (int i =0;i<c;i++) 
			printf("#");
		printf ("n");
	}
	return 0;
}

(Стоит отметить, что в редакторе gedit есть подсветка синтаксиса для различных языков программирования. Переключить режимы подсветки можно в нижней части окна редактора.)

Не забываем сохранить изменения нажатием ctrl+s. Обратите внимание, что вопросов об имени файла не последовало, так как имя было уже указано параметром при запуске редактора из командной строки терминала.

Компиляция и запуск

Закрываем окно редактора нажатием Alt+F4 и запустим же то сокровенное ради чего все тут и собрались:

gcc ./hello_world.c

И в ответ только новое приглашение. В отличие от стиля в ОС Windows, когда консоль, жутко подробно по-умолчанию, комментирует выполняемые действия — большинство программ в ОС семейства *nix сообщают только об исключительных ситуациях, ошибках и тому подобных вещах. То есть если «в ответ тишина» — то всё прошло хорошо.

Теперь в домашнем каталоге у нас появился файл a.out — он и есть файл с исполнимым кодом.

Для запуска этого файла на исполнение — назначим ему атрибут: «исполнимый»:

chmod +x a.out

и теперь запустим получившееся приложение:

./a.out

(Для запуска исполнимого файла интерпретатору требуется указать полный путь к файлу. Как в случае с «тильдой» символ «точка» возвращает полный путь к текущему каталогу. В данном конкретном случае правомерно так же запустить через ~/a.out Это не имеет значения здесь, так как файл создан в домашнем каталоге пользователя.)

И мы получаем вывод в терминале:

Hello world)

#
##
###
####
#####
######
#######
########
#########

Для выполнения всех повторных действий: изменение кода и снова компиляция, — Вы можете не вводить все эти команды каждый раз заново, а использовать стрелки вверх и вниз, для быстрого выбора команд из истории. И, кстати, вывод списка истории всех введённых команд можно выполнить командой (на самом деле программой) history.

Минутка автоматизации

Теперь приступим к очень интересному моменту связанному с творчеством в духе *nix. Каждый раз вводить много скучных команд неинтересно, возможно, даже вредно. Мы расширим функционал редактора gedit и доработаем его «напильником» до состояния примитивной среды разработки: запустим gedit и откроем меню параметров,

Главное меню gedit

Главное меню gedit

где на вкладке «Расширения» добавляем «Внешние инструменты»

"Настройки" - "Расширения"

«Настройки» — «Расширения»

И затем, из того же главного меню gedit выбираем «Управление внешними инструментами».

"Управление внешними инструментами"

«Управление внешними инструментами»

Как Вы уже поняли — здесь можно выполнить доработку функциональности текстового редактора. Создадим новый инструмент: «Компиляция и запуск», В качестве вывода используем нижнюю область редактора. Инструмент назначим для файлов C и C++. Назначим клавишу F5 (дело вкуса) на применение инструмента и собственно сам код инструмента в виде скрипта bash:

#!/bin/bash
gcc -o a.out $GEDIT_CURRENT_DOCUMENT_NAME
chmod +x ./a.out
./a.out
rm ./a.out

Разберёмся в том, что тут происходит:

#!/bin/bash — указание командного интерпретатора для выполнения скрипта.

gcc -o a.out $GEDIT_CURRENT_DOCUMENT_NAME - здесь мы запускаем компилятор, где в параметре -o указываем имя выходного файла. Пускай он будет таким же как и по-умолчанию.

$GEDIT_CURRENT_DOCUMENT_NAME — через эту переменную gedit передаёт имя файла.

Дальше Вы уже знаете — назначение атрибута «исполнения», запуск файла и потом:

rm ./a.out — удаление созданного исполнимого файла.

Попробуем инструмент в деле:

Теперь можно продолжать изучать пособие для разработчика/учебник/просто_хорошую_книгу по «Языку программирования Си» на практике.

Заключение

На самом деле в ОС Linux полно возможностей по доработке и использованию различного ПО. Само ПО является максимально гибким. Необязательно использовать предложенные мною средства, скорее методы, разработки.

В дальнейшем Вам обязательно понадобятся более серьёзные средства. А на первое время Вы можете дополнительно посмотреть другие редакторы, вплоть до больших и серьёзных сред разработки. Однако обязательно обратите внимание на редактор vim.

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

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

1. На чем пишут программы?

Исторически сложилось так, что ядро Unix было написано на языке Си. Даже более того, этот язык был создан для написания ядра Unix. Поскольку ядро Linux было основано на ядре Minix (версии Unix), то оно тоже было написано на Си. Поэтому можно сказать, что основной язык программирования для Linux это Си и С++. Такая тенденция сохранялась на протяжении долгого времени.

А вообще, писать программы для Linux можно почти на любом языке начиная от Java и Python и заканчивая С# и даже Pascal. Для всех языков есть компиляторы и интерпретаторы. Писать программы на С++ сложно, а Си многими уже считается устаревшим, поэтому множество программистов используют другие языки для написания программ. Например, множество системных инструментов написаны на Python или Perl. Большинство программ от команды Linux Mint, установщик Ubuntu и некоторые скрипты apt написаны на Python. Множество скриптов, в том числе простые скрипты оптимизации написаны на Perl. Иногда для скриптов используется Ruby. Это скрипты OpenShift или, например, фреймворк Metasploit. Некоторые разработчики кроссплатформенных программ используют Java. Но основные компоненты системы написаны все же на Си.

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

Зачем учить Си:

2. Библиотеки

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

Библиотеки делятся на два типа:

  • Статические — они связываются с программой на этапе компиляции, они связываются и после этого все функции библиотеки доступны в программе как родные. Такие библиотеки имеют расширение .a;
  • Динамические — такие библиотеки встречаются намного чаще, они загружены в оперативную память, и связываются с программной динамически. Когда программе нужна какая-либо библиотека, она просто вызывает ее по известному адресу в оперативной памяти. Это позволяет экономить память. Расширение этих библиотек — .so, которое походит от Shared Object.

Таким образом, для любой программы на Си нужно подключать библиотеки, и все программы используют какие-либо библиотеки. Также важно заметить, на каком языке бы вы не надумали писать, в конечном итоге все будет сведено к системным библиотекам Си. Например, вы пишите программу на Python, используете стандартные возможности этого языка, а сам интерпретатор уже является программой на Си/С++, которая использует системные библиотеки для доступа к основным возможностям. Поэтому важно понимать как работают программы на Си. Конечно, есть языки, вроде Go, которые сразу переводятся на ассемблер, но там используются принципы те же, что и здесь. К тому же  системное программирование linux, в основном, это Си или С++.

3. Процесс сборки программы

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

Каждая серьезная программа состоит из множества файлов, это файлы исходников с расширением .c и заголовочные файлы с расширением .h. Такие заголовочные файлы содержат функции, которые импортируются в программу из библиотек или других файлов .с. Перед тем. как компилятор сможет собрать программу и подготовить ее к работе, ему нужно проверить действительно ли все функции реализованы, доступны ли все статические библиотеки и собрать ее в один файл. Поэтому, первым делом выполняется препроцессор, который собирает исходный файл, выполняются такие инструкции, как include для включения кода заголовочных файлов.

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

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

А теперь, давайте рассмотрим весь єтот процесс на практике с использованием компилятора GCC.

4. Как собрать программу

Для сборки программ в Linux используется два типа компиляторов, это Gcc и Clang. Пока что GCC более распространен, поэтому рассматривать мы будем именно его. Обычно, программа уже установлена в вашей системе, если же нет, вы можете выполнить для установки в Ubuntu:

sudo apt install gcc

Перед тем как мы перейдем к написанию и сборке программы, давайте рассмотрим синтаксис и опции компилятора:

$ gcc опции исходный_файл_1.с -o готовый_файл

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

  • -o — записать результат в файл для вывода;
  • -c — создать объектный файл;
  • -x — указать тип файла;
  • -l — загрузить статическую библиотеку.

Собственно, это все самое основное, что нам понадобится. Теперь создадим нашу первую программу. Она будет выводить строку текста на экран и чтобы было интереснее, считать квадратный корень из числа 9. Вот исходный код:

include <stdio.h>
#include <math.h>

int main(){
printf(«losst.pron»);
printf(«Корень: %fn», sqrt(9));
return 0;
}

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

gcc -c program.c -o program.o

Это этап компиляции, если в программе нет ошибок, то он пройдет успешно. Если исходных файлов несколько, то такая команда выполняется для каждого из них. Далее выполняем линковку:

gcc -lm program.o -o program

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

./program

Конечно, все эти действия могут быть выполнены и с помощью различных графических сред, но выполняя все вручную, вы можете лучше понять как все работает. С помощью команды ldd вы можете посмотреть какие библиотеки использует наша программа:

ldd ./program

Это две библиотеки загрузчика, стандартная libc и libm, которую мы подключили.

5. Автоматизация сборки

Когда мы рассматриваем программирование под Linux невозможно не отметить систему автоматизации сборки программ. Дело в том, что когда исходных файлов программы много, вы не будете вручную вводить команды для их компиляции. Можно записать их один раз, а затем использовать везде. Для этого существует утилита make и файлы Makefile. Этот файл состоит из целей и имеет такой синтаксис:

цель: зависимости
<Tab> команда

В качестве зависимости цели может быть файл или другая цель, основная цель — all, а команда выполняет необходимые действия по сборке. Например, для нашей программы Makefile может выглядеть вот так:

all: program

program: program.o
gcc -lm program.o -o program

program.o: program.c
gcc -c program.c -o program.o

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

make

Программа снова готова и вы можете ее запустить.

Выводы

Создание программ Linux очень интересно и увлекательно. Вы сами убедитесь в этом, когда немного освоитесь в этом деле. Сложно охватить все в такой небольшой статье, но мы рассмотрели самые основы и они должны дать вам базу. В этой статье мы рассмотрели основы программирования в linux, если у вас остались вопросы, спрашивайте в комментариях!

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

Курс программирования на Си под Linux:

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

*nix, Программирование, Отладка, Ненормальное программирование, Assembler


Рекомендация: подборка платных и бесплатных курсов Python — https://katalog-kursov.ru/

Всем привет. Я давно хотел прикоснуться к этой теме и написать что-то подобное, но никак руки не доходили. Сегодня я решился, и мы с вами разберем структуру ELF-файла (исполняемый файл на *nix-подобных системах), и напишем простую программу под x86 Linux в машинных кодах, которая выведет сообщение на экран. Но тут не все так однозначно, поверьте мне.

Начать бы я хотел с конца. А именно с того, что будет делать наша программа. Наша программа — не что иное, как куча машинного кода, который, впоследствии, будет исполняться системой. В качестве заместителя системы счисления Hex я буду использовать «Wct», ибо он гораздо удобнее, потому что имеется онлайн компилятор и возможность вставлять строки на ходу и использовать десятичные числа. У нас она будет выводить одну строку текста на экран.

image

Вообще, ELF — формат двоичных файлов, используемый во многих современных UNIX-подобных операционных системах, таких как FreeBSD, Linux, Solaris и др. Но, как говорится, лучше один раз увидеть, чем много раз услышать. Прошу, ниже Вы можете лицезреть разбор исполняемого файла для ОС «Linux».

Сразу оговорюсь, таблицу оп-кодов для архитектуры x86 вы можете найти здесь.
Перед тем, как мы с вами погрузимся с головой в эту «няшу» (в прямом и переносном смысле), я хотел бы предупредить вас, что данная статья может вынести ваш мозг, или же частично его повредить. Вы предупреждены. Если же вы отважитесь читать далее — прошу.

Как я уже говорил ранее, ELF представляет из себя тип исполняемых файлов под *nix-подобные системы. Но как же система будет определять, является ли исполняемый файл подходящим под неё, а также, как система определяет, что это именно ELF-структура, а не PE, допустим?

Все предельно просто, в самом начале ставится синхробайт «Ho», после чего следует последовательность ASCII-символов «ELF», что помогает оси разобраться, что же это за зверь такой, наш файл.

		// Заголовок исполняемого файла
Ho "ELF"	// Подпись .ELF, где "Ho" - специальный символ, а
		// "ELF" - ASCII символы

Важно — байт «Ho» — нулевой байт. Это надо знать наизусть, ибо можно сбиться со счета, и потеряться.

Итак, поздравляю, мы повстречали такую часть программы, как «заголовок». В нём содержится важная информация для исполнения файла, такая, как — разрядность системы, версия ELF-структуры файла, OS ABI… но об этих странных словах мы поговорим чуть позднее.

Так, ну и раз мы используем Wct, давайте я расскажу, что и к чему.
Всего в Wct используется 16 символов — A B C D E F G H I J K L M N P O, где O идет после P, это сбивает новичков с толку, но со временем привыкаешь. Кстати, аббревиатура «Wct» расшифровывается как «Weird Coding Tool» — странная вещь для программирования, кодинга. Да-да, и Wct я использую лишь потому, что он легче запоминается и удобнее используется — вставки десятичных чисел это удобно, не правда ли?

Итак, мы ступили на землю зла. Мы продолжаем исследовать наш файл.
Далее идет разрядность системы, которая представляет из себя один байт, который может быть либо «B», либо «C», где «B» указывает на то, что система 32-х разрядна, а C — 64-х разрядна. Это очень важно, потому что в дальнейшем нам нужно будет использовать таблицу заголовка либо для 32-х разрядной системы, либо для 64-х разрядной, и они кардинально отличаются друг от друга.

Ab		// или 01, где 1 (B) - 32-х битная архитектура,
		// а 2 (C) - 64-х битная, думаю, что это уж точно понятно

Ну хорошо, хорошо. Да, разрядность системы — важный аргумент, но нам ещё нужно знать, какую последовательность байтов мы будем использовать — Little Endian, или Big Endian. В чем же заключается их отличие, да и вообще, что это такое?

Little Endian — это порядок байтов, в данном случае — от младшего к старшему, тобишь так — Ab aa aa aa, и это будет число «Bw», то есть, единица. В случае Big Endian все с точностью, да наоборот — это порядок от старшего к младшему или (англ. big-endian, дословно: «тупоконечный»): An — Ao, запись начинается со старшего и заканчивается младшим. Кстати, про Little-Endian и Big-Endian уже писали на «Хабрахабре» тут.

Ab		// B = Little Endian, C = Big Endian
		// Это порядок байтов. В нашем случае -
		// Little Endian, или же, порядок от младшего
		// к старшему, тобишь - Ao - An...

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

Ab		// Версия ELF-структуры файла

Мы используем оригинальную версию ELF-структуры файла, так что просто оставим «B».
А вот теперь мы дошли до «OS ABI».

Двоичный (бинарный) интерфейс приложений — это набор соглашений между программами, библиотеками и операционной системой, обеспечивающих взаимодействие этих компонентов на низком уровне на данной платформе. Он нужен для предоставления разрядности типов данных, формата передачи аргументов и возвращаемого значения при вызове ф-ции, состав и формат системных вызовов и файлов. Мы будем использовать «System V» ABI для написания программы на линуксе, ведь ABI, с точки зрения программы — ни что иное, как операционная система, ведь полностью реализовав ABI той или иной операционной системы в своей системе, вы сможете выполнять «неродные» программы так, как они выполняются на «родной» платформе.

Ad		// Это у нас "OS ABI" - двоичный интерфейс приложений,
		// набор соглашений между программами, библиотеками
		// и операционной системой, обеспечивающих взаимодействие
		// этих компонентов на низком уровне на данной платформе.
		// В данном случае - ABI для 32-х битного линукса.

Дальше идут зарезервированные байты, которые используются для «пэддинга», или же не используются вообще.

Aa aa aa aa	// Не используется...
aa aa aa aa	// В любом случае, оно для чего-то нужно

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

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

Ac aa		// Тип исполняемого файла, где
	        	// B = изменяемый, C = исполняемый, D = общий, E = ядро

Очень интересная часть — набор инструкций. Набор инструкций — это то, чем будет пользоваться процессор при исполнении программы. В данном случае, будет использоваться этот набор инструкций для архитектуры x86.
Мы увидим команды для процессора в самом конце, где будет располагаться код программы.

Памятка.
Чтобы использовать набор инструкций для x86 — надо указать «Ad» первым байтом, чтобы x86_64 — «Dp», ARM — «Ci», и так далее.

Ad aa		// Набор инструкций. Сейчас мы работаем с набором
		// инструкций процессора типа "x86", но если захотим
		// писать программу для другого проца, то и сет инструкций
		// там будет другой.

Мы добрались до точки входа в программу. Точка входа в программу — указатель, который показывает системе на то место, где заканчиваются заголовки и начинается программа. У нас программа начинается с помещения числа «Ae» (4) в EAX, но об этом чуть позднее.

Ab aa aa aa	// Повтор версии ELF структуры...
He IA AE	// Точка входа в программу. Одна из важнейших
		// частей в программе.Ab aa aa aa	// Повтор версии ELF структуры...
He IA AE	// Точка входа в программу. Одна из важнейших
		// частей в программе.
Ai DE AA	// Расположение таблицы заголовков секций	>———————¬
		//							¦
Aa aa aa aa aa	//							¦
Aa aa aa aa aa	//						      	¦
		//						      	¦
De aa		// Размер заголовка					¦
Ca aa		// Размер таблицы заголовков программы			¦
Ac aa		// Кол-во записей в таблице заголовка программы		¦
Ci aa		// Размер записи в таблице заголовков			¦
Aa aa		// Кол-во записей в таблице раздела заголовков		¦
Aa aa		// Список в разделе "таблицы заголовков" с именами	¦
		//							¦
/*		//							¦
		//							¦
Часть 2 -								¦
Заголовок программы							¦
									¦
*/		//							¦
		//							¦
Ab aa aa aa 	// Тип сегмента, у нас - B, значит		<———————-
		// байты p_memsz по адресу p_vaddr будут
		// очищены, после чего будет произведено
		// копирование байтов p_filesz со смещением		>———————————————¬
		// p_offset в p_vaddr...						¦
		//									¦
He aa aa aa	// Смещение в файле, по которому могжет быть	>———————¬		¦
		// найдена информация для данного сегмента (p_offset)	¦		¦
		//							¦		¦
He ia ae ai		// Место, где этот сегмент должен	>———————+———————¬	¦
			// размещаться в виртуальной памяти (p_vaddr)	¦	¦	¦
		//							¦	¦	¦
He ia ae ai	// UNDEFINED для системы V ABI				¦	¦	¦
Bo aa aa aa	// Размер сегмента в файле (p_filesz)		<———————+———————+———————-
Bo aa aa aa	// Размер сегмента в памяти (p_memsz)			¦	¦
		//							¦	¦
Af aa aa aa aa	// Флаги - EXECUTABLE WRITEABLE READABLE		¦	¦
Ba aa aa	// Необходимое выравнивание для данного раздела		¦	¦
			//						¦	¦
			// Необходимая системе информация		¦	¦
ABAAAAAAJDAAAAAA	// Просто без этого не работает..		¦	¦
JDJAAEAIJDJAAEAI	// На самом деле, тут содержатся		¦	¦
ANAAAAAAANAAAAAA	// p_* директивы.				¦	¦
AGAAAAAAAABAAAAA	//					<———————+———————-

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

Чтобы выполнить какие-либо функции при помощи машинного кода, нужно знать, что такое регистры и прерывания. Объясню наглядно. Регистры хранят в себе произвольные значения и результаты выполнения каких-либо функций, а прерывания — это целая история. Современные процессоры выполняют программный код очень быстро, а на таком низком уровне, как машинный код — все и построено. Смотрите, команды выполняются последовательно, то есть, друг за другом. А в ОСи, в нашем случае — в Linux-е, произвольный код выполняется «вклиниваясь» в общий поток команд, прерывая их выполнение.

Тобишь, прерывание приостанавливает выполнение процессором текущей программы и вызывает подпрограмму, которая выполняется, завершается и работа системы возобновляется. Если быть точнее, то это сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код.

Чтобы выполнить какую-либо функцию из таблицы прерываний линукса, нам надо поместить номер функции, которую мы хотим выполнить, в регистр EAX (eXtended AX — расширенный регистр AX, 32-х битный), а в другие регистры (EBX, ECX и EDX) — другую необходимую для выполнения функции информацию.

Таким образом, получаем:

Li AE aa aa aa		// Помещаем число 4 (AE) в регистр EAX
Ll AB aa aa aa		// В регистр EBX помещаем число 1 (AB)

Lj JD ja ae ai		// В регистр ECX кладем адрес нашего сообщения
Lk AN aa aa aa		// В регистр EDX - размер сообщения 13 (N)

Mn IA			// Выполняем прерывание IA.. Зачем?			
			// Чтобы выполнить определенную функцию.		
			// У нас в EAX - 4, значит мы будем выполнять		
			// действие "вывод строки на экран", где -		
			// EAX - номер функции. После выполнения прерывания	
			// "IA" будет выведена строка "Wct One Love"		
			//							
Li AB aa aa aa		// И опять в EAX кладем единичку			
			//							
Db NL			// Обнуляем регистр EAX					
Mn IA			// Знакомое нам прерывание IA..				
			// Кстати, так звали ослика из мульта "Винни Пух", только тогда "IA-IA"	
			// Я думаю, что вы знаете, про что я говорю		

Ну и завершающим этапом для написания нашей программы является объявление данных, у нас — текста.
Для написания текста можно использовать кавычки, либо таблицу ASCII-символов.
«Ca» = пробел, если что.

"Wct" Ca "One" Ca "Love"	// "Wct One Love"
Ak				// Конец...

А ниже вы можете лицезреть результат работы нашей программы:

image

Ну вот и все. Боюсь, что в тексте я мог допустить какие-либо ошибки, ошибки в объяснениях, и т.д… Прошу простить меня, я пишу это поздно вечером, уставший. Если вы обнаружите ошибки, будьте добры, сообщите мне, я обязательно исправлю! Спасибо за то, что ты уделил внимание к моей статье! Воспользуйтесь онлайн компилятором для сборки исходника. Всего наилучшего тебе, дружище.

Скачать исходник.
Онлайн компилятор.
Ресурсы.
Группа ВКонтакте.

По всем вопросам пишите на e-mail — mihip@yandex.ru.

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

Опубликовано 22.09.2022

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

Для компиляции простой программы на языке C мы используем инструмент командной строки Linux — терминал. Чтобы открыть терминал, вы можете использовать Ubuntu Dash или комбинацию клавиш Ctrl+Alt+T.

Содержание

  1. Шаг 1: Установите необходимые для сборки пакеты
  2. Шаг 2: Напишите простую программу на языке C
  3. Шаг 3: Скомпилируйте программу на языке C с помощью компилятора gcc
  4. Шаг 4: Запуск программы

Шаг 1: Установите необходимые для сборки пакеты

Для компиляции и выполнения программы на языке C необходимо, чтобы в вашей системе были установлены необходимые пакеты. Введите следующую команду от имени root в терминале Linux:

sudo apt-get install build-essential

Установка пакетов build-essential с помощью apt

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

Шаг 2: Напишите простую программу на языке C

После установки необходимых пакетов, давайте напишем простую программу на языке C.

Откройте графический текстовый редактор Ubuntu и напишите или скопируйте в него следующий пример программы:

#include<stdio.h>

int main()
{
printf("n Пример программы на Cnn");
return 0;
}

Затем сохраните файл. В этом примере я назвал свою программу на языке Си как sampleProgram.c

Пример программы на Си

Шаг 3: Скомпилируйте программу на языке C с помощью компилятора gcc

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

Синтаксис:

gcc [ИмяФайла].c -o [ИмяПрограммы]

Пример:

gcc sampleProgram.c -o sampleProgram

Шаг 4: Запуск программы

Последний шаг — запуск скомпилированной программы на языке C. Для этого используйте следующий синтаксис:

Пример:

Запуск нашей скомпилированной программы

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

Из этой статьи вы узнали, как написать, скомпилировать и запустить простую программу на языке C в Linux.

Введение

Добрый день. Этот материал рассчитан на людей, будущих программистов, которые только начинают разбираться в программировании под ОС Linux. Я попробую здесь показать прямое руководство к действию на примере тех простых инструментов, которые использовал некогда сам при изучении Си в процессе знакомства с Linux. На самом деле, с теми или иными поправками, это руководство можно использовать в большинстве дистрибутивов. Руководство однозначно подходит для всех deb-based дистрибутивов.

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

Итак: у Вас сейчас установлен дистрибутив ОС, как говорится, «из коробки». Перед глазами пособие для разработчика/учебник/просто_хорошая_книга по «Языку программирования Си». И никакой вменяемой, полноценной подробной информации о том, как же собственно откомпилировать и выполнить, написанный в книге, исходный код. Быстрый осмотр тематических ресурсов уже показал Вам, что, необходимо установить компилятор Си, запустить его с нужными параметрами и потом запустить компилированный бинарный код. Примерно с этого момента мы и начнём.

Установка компилятора

Я имею ввиду, что Вы скорее всего (бывший) пользователь ОС Windows и действия в чёрном/синем окошке при помощи клавиатуры оканчивались где-то на команде ping, кажутся неким таинством. Однако отмечу, что всё банально просто и текстовой интерфейс предоставляет намного более гибкие возможности (скорее всего Вы неоднократно Вы слышали это ранее). Приступим:

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

На этом этапе всё будет очень быстро и просто. Открываем терминал и пишем:

sudo apt install gcc

(На всякий случай: вставка в gnome-terminal ctrl+shift+v)

Сразу поясню, что текст слева от курсора — это приглашение командного интерпретатора и оно выглядит следующим образом:

ИМЯ_ПОЛЬЗОВАТЕЛЯ@ИМЯ_КОМПЬЮТЕРА:ТЕКУЩИЙ_КАТАЛОГ$

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

Данная строка «говорит» интерпретатору: «от имени суперпользователя запустить менеджер пакетов для установки пакета gcc».

Система попросит Вас ввести пароль суперпользователя и приступит к установке компилятора.

Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Предлагаемые пакеты:
  gcc-multilib gcc-doc
Следующие НОВЫЕ пакеты будут установлены:
  gcc
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 44 пакетов не обновлено.
Необходимо скачать 5 208 B архивов.
После данной операции объём занятого дискового пространства возрастёт на 51,2 kB.
Пол:1 http://ru.archive.ubuntu.com/ubuntu focal/main amd64 gcc amd64 4:9.3.0-1ubuntu2 [5 208 B]
Получено 5 208 B за 0с (34,6 kB/s)  
Выбор ранее не выбранного пакета gcc.
(Чтение базы данных … на данный момент установлено 371769 файлов и каталогов.)
Подготовка к распаковке …/gcc_4%3a9.3.0-1ubuntu2_amd64.deb …
Распаковывается gcc (4:9.3.0-1ubuntu2) …
Настраивается пакет gcc (4:9.3.0-1ubuntu2) …
Обрабатываются триггеры для man-db (2.9.1-1) …

Если же он уже установлен, то менеджер пакетов apt просто укажет на это примерно следующим образом:

Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Уже установлен пакет gcc самой новой версии (4:9.3.0-1ubuntu2).

Установка редактора

Обычно с дистрибутивом Ubuntu поставляется весьма интересный текстовой редактор gedit. Однако в других дистрибутивах возможно придётся установить этот редактор:

sudo apt install gedit

Создание файла с исходным кодом

Теперь пришло то самое время нашего классического «hello world»! Давайте сделаем это в стиле linux. Просто наберите в консоли:

gedit ~/hello_world.c

Более подробно Вы обязательно прочитайте в профильных ресурсах и в документации, я только отмечу, что символ «тильда» возвращает полный путь к домашнему каталогу пользователя ОС. Соответственно будет создан файл в вашем домашнем каталоге с указанным именем.

И далее наш программный код на языке Си в редакторе:

#include "stdio.h"
int main()
{
	printf ("nHello world)n");
	for (int c=0; c<10;c++)
	{
		for (int i =0;i<c;i++) 
			printf("#");
		printf ("n");
	}
	return 0;
}

(Стоит отметить, что в редакторе gedit есть подсветка синтаксиса для различных языков программирования. Переключить режимы подсветки можно в нижней части окна редактора.)

Не забываем сохранить изменения нажатием ctrl+s. Обратите внимание, что вопросов об имени файла не последовало, так как имя было уже указано параметром при запуске редактора из командной строки терминала.

Компиляция и запуск

Закрываем окно редактора нажатием Alt+F4 и запустим же то сокровенное ради чего все тут и собрались:

gcc ./hello_world.c

И в ответ только новое приглашение. В отличие от стиля в ОС Windows, когда консоль, жутко подробно по-умолчанию, комментирует выполняемые действия — большинство программ в ОС семейства *nix сообщают только об исключительных ситуациях, ошибках и тому подобных вещах. То есть если «в ответ тишина» — то всё прошло хорошо.

Теперь в домашнем каталоге у нас появился файл a.out — он и есть файл с исполнимым кодом.

Для запуска этого файла на исполнение — назначим ему атрибут: «исполнимый»:

chmod +x a.out

и теперь запустим получившееся приложение:

./a.out

(Для запуска исполнимого файла интерпретатору требуется указать полный путь к файлу. Как в случае с «тильдой» символ «точка» возвращает полный путь к текущему каталогу. В данном конкретном случае правомерно так же запустить через ~/a.out Это не имеет значения здесь, так как файл создан в домашнем каталоге пользователя.)

И мы получаем вывод в терминале:

Hello world)

#
##
###
####
#####
######
#######
########
#########

Для выполнения всех повторных действий: изменение кода и снова компиляция, — Вы можете не вводить все эти команды каждый раз заново, а использовать стрелки вверх и вниз, для быстрого выбора команд из истории. И, кстати, вывод списка истории всех введённых команд можно выполнить командой (на самом деле программой) history.

Минутка автоматизации

Теперь приступим к очень интересному моменту связанному с творчеством в духе *nix. Каждый раз вводить много скучных команд неинтересно, возможно, даже вредно. Мы расширим функционал редактора gedit и доработаем его «напильником» до состояния примитивной среды разработки: запустим gedit и откроем меню параметров,

Главное меню gedit

Главное меню gedit

где на вкладке «Расширения» добавляем «Внешние инструменты»

"Настройки" - "Расширения"

«Настройки» — «Расширения»

И затем, из того же главного меню gedit выбираем «Управление внешними инструментами».

"Управление внешними инструментами"

«Управление внешними инструментами»

Как Вы уже поняли — здесь можно выполнить доработку функциональности текстового редактора. Создадим новый инструмент: «Компиляция и запуск», В качестве вывода используем нижнюю область редактора. Инструмент назначим для файлов C и C++. Назначим клавишу F5 (дело вкуса) на применение инструмента и собственно сам код инструмента в виде скрипта bash:

#!/bin/bash
gcc -o a.out $GEDIT_CURRENT_DOCUMENT_NAME
chmod +x ./a.out
./a.out
rm ./a.out

Разберёмся в том, что тут происходит:

#!/bin/bash — указание командного интерпретатора для выполнения скрипта.

gcc -o a.out $GEDIT_CURRENT_DOCUMENT_NAME - здесь мы запускаем компилятор, где в параметре -o указываем имя выходного файла. Пускай он будет таким же как и по-умолчанию.

$GEDIT_CURRENT_DOCUMENT_NAME — через эту переменную gedit передаёт имя файла.

Дальше Вы уже знаете — назначение атрибута «исполнения», запуск файла и потом:

rm ./a.out — удаление созданного исполнимого файла.

Попробуем инструмент в деле:

Теперь можно продолжать изучать пособие для разработчика/учебник/просто_хорошую_книгу по «Языку программирования Си» на практике.

Заключение

На самом деле в ОС Linux полно возможностей по доработке и использованию различного ПО. Само ПО является максимально гибким. Необязательно использовать предложенные мною средства, скорее методы, разработки.

В дальнейшем Вам обязательно понадобятся более серьёзные средства. А на первое время Вы можете дополнительно посмотреть другие редакторы, вплоть до больших и серьёзных сред разработки. Однако обязательно обратите внимание на редактор vim.

Полезности |

создано:
9/18/2022
|
опубликовано:
9/18/2022
|
обновлено:
2/20/2023
|
просмотров:
5005

Довольно часто возникает вопрос «как можно писать приложения для Linux используя .NET». Кажется, пришло время ответить на этот вопрос. Тем более, выход MAUI лишь добавил непонятностей в эту тему.

Пишем на C# приложение с GUI для Linux

Довольно часто возникает вопрос «как можно писать приложения для Linux используя .NET». Кажется, пришло время ответить на этот вопрос. Тем более, выход в MAUI лишь добавил непонятностей в эту тему.

Сколько вариантов?

Вариантов, на самом деле, не один, и даже не два, а немного больше. Я насчитал четыре: Avalonia, Uno, MAUI, Blazor. Причем, некоторые из перечисленных вариантов представляют собой «полноценные» приложения, которые очень похожи на Windows-приложения, то есть графическим интерфейсом (GUI). Другие — это Single Page Application (SPA), то есть работают как frontend + backend. Где frontend это и есть SPA на базе Blazor (Blazor WebAssembly или Blazor Server). А роли backend может выступать, например, Web API, опять же написанный на C#.NET.

Не могу не отменить, что в роли frontend может выступать любой SPA-фреймворк, такие как React, Vue.js, AngularJS, BackBoneJS, Aurelia, EmberJS, Svelte и т.д. и т.п. Просто если мы говорим о возможности писать на C#, то я не беру JavaScript-фреймворки во внимание.

А теперь, давайте про каждый немного подробнее.

Avalonia

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

Avalonia — это кроссплатформенный фреймворк пользовательского интерфейса для dotnet, обеспечивающий гибкую систему стилизации и поддерживающий широкий спектр операционных систем, таких как Windows, Linux, macOS. Авалония зрелая и готова к производству. У нас также есть поддержка бета-версии для iOS, Android и на ранних стадиях поддержка браузера через WASM.

Avalonia поддерживается Visual Studio через плагин, а также можно использовать Rider.

Uno

Еще один вариант, писать под Linux, используя C# — это платформа Uno. Вот про нее говорится на сайте разработчика.

https://platform.uno/ — Платформа пользовательского интерфейса с открытым исходным кодом для создания приложений с одной кодовой базой для Windows, iOS, Android, WebAssembly, macOS и Linux

Зрелый, готовый к применению фреймворк и даже, наверное, платформа.

MAUI

Изначально предполагалось, что MAUI даст возможность писать код на .NET, а значит и на C# и для платформы linux. MAUI станет следующей вехой в развитии Xamarin.Forms, которые после выхода MAUI должны были перейти в режим «поддержки и исправления ошибок». То есть MAUI была призвана заменить Xamarin.Forms.

Но, когда вышла финальная версия MAUI, оказалось, что поддержки Linux просто нет. Более того, насколько я понял, поддержка платформы Linux не планируется. Печально…

Но мир не без добрых людей. Существует .NET Multi-platform App UI (.NET MAUI), которая создана и поддерживается сообществом разработчиков и доступна в виде Open-source. Вот что про нее написано в github.com:

NET Multi-platform App UI (.NET MAUI) — это кроссплатформенная платформа для создания собственных мобильных и классических приложений на C# и XAML. Используя .NET MAUI, вы можете разрабатывать приложения, которые могут работать на Android, iOS, iPadOS, macOS и Windows из одной общей кодовой базы.

Blazor

Это, как я уже говорил ранее, не совсем GUI. Это уже другой тип разработки основанный на Web-разработке. То есть когда есть frontend и backend

Заключение

В качестве заключения хочется ответить, что возможность писать для Linux на .NET платформе не ограничивается перечисленными мной вариантами. Существуют и другие менее распространенные способы, например, GtkSharp, Qml.Net, mono, ImGui.NET и даже ElectronJs (хотя это уже снова не .NET, а JavaScript).

Писать под Linux на NET можно! Выбирать вам!

На чтение 5 мин. Опубликовано 21.02.2021

В последнее время операционная система Linux приобрела особую популярность. Появилось большое количество приложений, которые стали на ней доступны. В настоящее время операционная система стала по-настоящему конкурентоспособной на серверном рынке. Свою известность она приобрела благодаря предшественникам: Unix и программному обеспечению GNU.

Изначально ядро Unix было написано на языке Си. Точнее этот язык был специально создан для Юникс. Так как ядро Линукс создано на ядре Minix, версии Юникс, оно также написано на языке Си. Соответственно, главный язык для программирования Си и С плюс плюс. Тем не менее, Си – сложный язык и программисту потребуется прочитать не одну книгу и большое количество времени практиковаться, чтобы понять его основы.

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

Обучение с++. Что если начать на Linux?

Сначала необходимо создать cpp-файл. Для этого стоит открыть домашнюю папку в файловом менеджере Nautilus и одновременно стоит открыть консоль alt+ctrl+t. Там стоит написать команду touch helloworld.cpp. Команда touch создаст файл с необходимым наименованием. Далее, стоит свернуть терминал и сосредоточить внимание на Nautilus’e. Нужно открыть созданный файл и написать распространенный на земном шаре код:

#include <iostream>
using namespace std;
int main(){
cout << «Hello world!»;
return 0;
}

Далее, стоит закрыть его и сохранить. Следующим этапом считается компиляция и запуск. Для этого необходимо открыть терминал и вызвать компилятор командой g++ -lm -o output helloworld.cpp. g++ — наш компилятор, -lm и -o это параметры-ключи, с которыми его запускают. output — является именем файла вывода, куда помещается итог компиляции и следом за ним наименование cpp-файла. Нажимается enter, если программа правильная, то сообщения будут отсутствовать.

Теперь, чтобы запустить программу необходимо ввести в терминале: ./output и нажать enter. На экране появится итог: «Hello world!».

Программирование в Linux с нуля

В первую очередь необходимо скачать с официального сайта ubuntu.ru установочный файл Линукс. Устанавливается либо на жесткий диск либо на виртуальную машину. Записывается либо при помощи Нэро либо ImgBurn образ на диск.

Первая программа на Linux. Компилятор g++

Создать первую программу на Линукс можно в среде Ubuntu. Большинство дистрибутивов Линукс изначально содержат компилятор g++, который можно сразу применять. Если он отсутствует, его можно установить в терминале с помощью команды sudo apt-get install g++.

Если применять для компиляции компилятор g++, то все будет также как для создания программы на Виндовс.  Далее, необходимо определить в файловой системе каталог для исходных файлов с кодом на С++ и создать в нем новый файл hello.cpp с кодом:

#include <iostream> подключаем заголовочный файл iostream

int main() определяем функцию main
{ начало функции
std::cout << «Hello World!»; выводим строку на консоль
return 0; выходим из функции
} конец функции

Чтобы вывести строку на консоль, необходимо подключить необходимый функционал. С этой целью в начале файла идет строка #include <iostream>

Строка позволяет подключить библиотеку iostream, необходимую для вывода строки на консоль. Следующий этап – функция main, необходимая для любой программы С++, с нее начинают создавать приложение. Тело функции имеет следующий вид:

{
std::cout << «Hello World!n»;
return 0;
}

Что в Linux интересного?

Сначала, при работе, пользователь захочет вернуться обратно к старой ОС, но далее все же решит узнать поближе Линукс. Большинство действий необходимо делать через консольную строку.

А почему всё-таки linux так хорош?

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

Как Linux связан с освоением других дисциплин?

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

Зачем сейчас нужно уметь обращаться с Linux?

Многие устройства на Андроиде в настоящее время перешли на Linux. Помимо этого, большое количество серверов применяют данную операционную систему. Особая потребность в Линукс возникает при работе с большим объемом данных – сложные вычисления над огромными массивами данных быстрее всего делаются именно с ней. Windows и Mас OS X заметно уступают.

Как проверять решение задач на курсе по linux?

Добавить новый тип задач на платформе Stepis – подключение к удаленному серверу и открытию «терминала», напрямую в окне браузера.

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