Пошаговое руководство. Компиляция программы на языке C из командной строки
Средства сборки Visual Studio включают компилятор C, который можно использовать для создания всех базовых консольных программ до полных классических приложений Windows, мобильных приложений и т. д. Microsoft C/C++ (MSVC) — это компилятор C и C++, который в последних версиях соответствует некоторым из последних языковых стандартов C, включая C11 и C17.
В этом пошаговом руководстве показано, как создать простейшую программу на языке C в стиле «Hello, World» в текстовом редакторе с последующей компиляцией из командной строки. Если вы хотите работать в C++ в командной строке, см . пошаговое руководство. Компиляция собственной программы C++ в командной строке. Если вы хотите попробовать интегрированную среду разработки Visual Studio вместо использования командной строки, см . пошаговое руководство. Работа с проектами и решениями (C++) или использование интегрированной среды разработки Visual Studio для классических приложений C++.
Необходимые компоненты
Для выполнения этого пошагового руководства необходимо установить Visual Studio или средства сборки для Visual Studio и дополнительную разработку классических приложений с помощью рабочей нагрузки C++.
Visual Studio — это эффективная интегрированная среда разработки, которая поддерживает полнофункциональный редактор, диспетчеры ресурсов, отладчики и компиляторы для многих языков и платформ. Сведения об этих компонентах, а также о скачивании и установке Visual Studio, включая бесплатный выпуск Visual Studio Community, см. в этой статье.
При использовании версии Build Tools для Visual Studio устанавливаются только программы командной строки, библиотеки и компиляторы, необходимые для сборки программ на C и C++. Это идеальный вариант для создания заданий и упражнений, а установка выполняется относительно быстро. Чтобы установить только набор программ командной строки, скачайте Build Tools для Visual Studio на странице скачивания Visual Studio, а затем запустите установщик. В установщике Visual Studio выберите рабочую нагрузку C++ (в более ранних версиях Visual Studio выберите рабочую нагрузку средств сборки C++ и нажмите кнопку «Установить«.
При установке средств в командной строке используется другое средство, используемое для создания программы C или C++. MSVC имеет сложные требования к среде командной строки для поиска инструментов, заголовков и библиотек, которые он использует. Невозможно использовать MSVC в обычном окне командной строки без некоторой подготовки. Вам понадобится окно командной строки разработчика, являющееся обычным окном командной строки, в котором заданы все необходимые переменные среды. К счастью, Visual Studio устанавливает сочетания клавиш для запуска командных строк разработчика, имеющих среду, настроенную для сборок командной строки. К сожалению, имена сочетаний клавиш командной строки разработчика и их расположение отличаются практически в каждой версии Visual Studio и в разных версиях Windows. Первая задача пошагового руководства — найти нужный ярлык.
Ярлык командной строки разработчика автоматически задает правильные пути для компилятора и средств, а также для всех необходимых заголовков и библиотек. Некоторые из этих значений различаются для каждой конфигурации сборки. Если вы не используете ни один из ярлыков, эти значения среды необходимо задать самостоятельно. Дополнительные сведения см. в статье Использование набора инструментов MSVC из командной строки. Так как настраивать среду разработки сложно, настоятельно рекомендуется использовать ярлык командной строки разработчика вместо создания собственного.
Эти инструкции зависят от используемой версии Visual Studio. Чтобы ознакомиться с документацией по предпочтительной версии Visual Studio, используйте селектор Версия. Он находится в верхней части оглавления на этой странице.
Открытие командной строки разработчика в Visual Studio 2022
Если вы установили Visual Studio 2022 в Windows 10 или более поздней версии, откройте меню «Пуск» и выберите Все приложения. Прокрутите вниз и откройте папку Visual Studio 2022 (не приложение Visual Studio 2022). Выберите элемент Командная строка разработчика для VS 2022, чтобы открыть окно командной строки.
Открытие командной строки разработчика в Visual Studio 2019
Если вы установили Visual Studio 2019 в Windows 10 или более поздней версии, откройте меню «Пуск» и выберите Все приложения. Прокрутите вниз и откройте папку Visual Studio 2019 (не приложение Visual Studio 2019). Выберите элемент Командная строка разработчика для VS 2019, чтобы открыть окно командной строки.
Открытие командной строки разработчика в Visual Studio 2017
Если вы установили Visual Studio 2017 в Windows 10 или более поздней версии, откройте меню «Пуск» и выберите Все приложения. Прокрутите вниз и откройте папку Visual Studio 2017 (не приложение Visual Studio 2017). Выберите элемент Командная строка разработчика для VS 2017, чтобы открыть окно командной строки.
Открытие командной строки разработчика в Visual Studio 2015
Если вы установили Microsoft Visual C++ Build Tools 2015 в Windows 10 или более поздней версии, откройте меню «Пуск» и выберите Все приложения. Прокрутите вниз и откройте папку Microsoft Visual C++ Build Tools. Выберите элемент Командная строка Native Tools x86 Visual C++ 2015, чтобы открыть окно командной строки.
Если вы используете другую версию Windows, найдите в меню «Пуск» или на начальной странице папку средств Visual Studio, содержащую ярлык командной строки разработчика. Можно также ввести «командная строка разработчика» в строке поиска в Windows и выбрать командную строку, которая соответствует установленной версии Visual Studio. Откройте окно командной строки с помощью ярлыка.
Затем убедитесь, что командная строка разработчика настроена правильно. В окне командной строки введите cl (или CL , регистр не имеет значения для имени компилятора, но имеет значение для параметров компилятора). Результат должен выглядеть следующим образом.
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise>cl Microsoft (R) C/C++ Optimizing Compiler Version 19.10.25017 for x86 Copyright (C) Microsoft Corporation. All rights reserved. usage: cl [ option. ] filename. [ /link linkoption. ]
В зависимости от версии Visual Studio и установленных обновлений могут быть различия в текущем каталоге или номерах версий. Если приведенный выше результат похож на отображаемый, можно приступать к сборке программ C или C++ в командной строке.
Если вы получаете ошибку, например «cl», не распознается как внутренняя или внешняя команда, операблная программа или пакетный файл», ошибка C1034 или ошибка LNK1104 при выполнении команды cl, то при установке Visual Studio вы не используете командную строку разработчика или что-то не так. Для продолжения нужно будет исправить ошибку.
Если вы не можете найти ярлык командной строки разработчика или сообщение об ошибке при вводе cl , может возникнуть проблема с установкой Visual Studio. При использовании Visual Studio 2017 или более поздней версии попробуйте переустановить рабочую нагрузку Разработка классических приложений на C++ с помощью установщика Visual Studio. Подробные сведения см. в статье Справка по установке средства С++ в Visual Studio. Можно также переустановить Build Tools со страницы Загрузки Visual Studio. Не переходите к следующему разделу, пока команда cl не сработает. Дополнительные сведения об установке Visual Studio и устранении неполадок см. в статье Установка Visual Studio.
В зависимости от версии Windows, установленной на компьютере, и конфигурации системы безопасности может потребоваться правой кнопкой мыши открыть контекстное меню для ярлыка командной строки разработчика и выбрать пункт Запуск от имени администратора, чтобы успешно выполнить сборку и запуск программы, созданной в этом пошаговом руководстве.
Создание файла исходного кода на языке C и его компиляция из командной строки
- В окне командной строки разработчика введите команду cd c:\ , чтобы изменить текущий рабочий каталог на корень диска C:. Затем введите md c:\hello , чтобы создать каталог, и введите cd c:\hello , чтобы перейти к этому каталогу. В этом каталоге будут находиться исходный файл и скомпилированная программа.
- В командной строке разработчика введите команду notepad hello.c . В появившемся диалоговом окне блокнота с оповещением выберите Да, чтобы создать файл hello.c в рабочей папке.
- В окне блокнота введите следующие строки кода:
#include int main()
C:\hello>dir Volume in drive C has no label. Volume Serial Number is CC62-6545 Directory of C:\hello 10/02/2017 03:46 PM . 10/02/2017 03:46 PM .. 10/02/2017 03:36 PM 143 hello.c 1 File(s) 143 bytes 2 Dir(s) 514,900,566,016 bytes free
c:\hello>cl hello.c Microsoft (R) C/C++ Optimizing Compiler Version 19.10.25017 for x86 Copyright (C) Microsoft Corporation. All rights reserved. hello.c Microsoft (R) Incremental Linker Version 14.10.25017.0 Copyright (C) Microsoft Corporation. All rights reserved. /out:hello.exe hello.obj
Примечание. Если вы получаете сообщение об ошибке, например «cl не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл», ошибке C1034 или LNK1104, командная строка разработчика настроена неправильно. Чтобы получить сведения о том, как устранить эту проблему, вернитесь к разделу Открыть командную строку разработчика. Если вы получаете другое сообщение об ошибке или предупреждение компилятора или компоновщика, проверьте исходный код, исправьте ошибки, сохраните его и снова запустите компилятор. Для получения сведений о конкретных ошибках введите номер ошибки в поле поиска вверху этой страницы.
Hello, World! This is a native C program compiled on the command line.
Следующие шаги
Этот пример Hello, World является самой простой программой C. Реальные программы выполняют полезные действия и имеют файлы заголовков, дополнительные исходные файлы и ссылки на библиотеки.
Вы можете использовать шаги, описанные в этом пошаговом руководстве для C, для создания собственного кода, чтобы не вводить приведенный пример. Вы также можете выполнить сборку различных примеров кода на C, которые можно найти в других местах. Чтобы скомпилировать программу с большими файлами исходного кода, введите их все в командной строке:
cl file1.c file2.c file3.c
Компилятор выводит программу с именем file1.exe . Чтобы изменить имя program1.exe , добавьте параметр компоновщика /out :
cl file1.c file2.c file3.c /link /out:program1.exe
Чтобы автоматически перехватывать другие ошибки программирования, рекомендуется выполнить компиляцию с помощью порога предупреждений /W3 или /W4:
cl /W4 file1.c file2.c file3.c /link /out:program1.exe
Компилятор cl.exe имеет множество других параметров, которые можно применять для создания, оптимизации, отладки и анализа кода. Чтобы просмотреть краткий список, введите cl /? в командной строке разработчика. Можно также выполнять компиляцию и компоновку отдельно и применять параметры компоновщика в более сложных сценариях сборки. Дополнительные сведения о параметрах и использовании компилятора и компоновщика см. в справочнике по сборке для C/C++.
Для настройки и создания более сложных проектов в командной строке можно использовать NMAKE и файлы makefile либо MSBuild и файлы проекта. Дополнительные сведения об использовании этих средств см. в разделах Справочник по NMAKE и MSBuild.
Языки C и C++ похожи, но имеют различия. Компилятор Microsoft C/C++ (MSVC) использует простое правило для определения языка, используемого при компиляции кода. По умолчанию компилятор MSVC рассматривает все файлы с расширением .c как исходные коды на языке С, а файлы с расширением .cpp как исходные коды на языке С++. Если указан параметр компилятора /TC, компилятор будет рассматривать все файлы как исходные коды на языке С вне зависимости от расширения.
По умолчанию MSVC совместима со стандартами ANSI C89 и ISO C99, но не строго соответствует. В большинстве случаев переносимый код на языке C будет компилироваться и выполняться должным образом. Компилятор обеспечивает дополнительную поддержку изменений в ISO C11/C17. Чтобы выполнить компиляцию с поддержкой C11/C17, используйте флаг компилятора /std:c11 или /std:c17 . Для поддержки C11 и C17 требуется Windows SDK 10.0.20201.0 или более поздняя версия. Рекомендуется использовать Windows SDK 10.0.22000.0 или более позднюю версию. Последнюю версию пакета можно скачать на странице Windows SDK. Дополнительные сведения и инструкции по установке и использованию этого пакета SDK для разработки на языке C см. в статье Установка поддержки C11 и C17 в Visual Studio.
Некоторые функции библиотеки и имена функций POSIX являются нерекомендуемыми в компиляторе MSVC. Функции поддерживаются, но предпочтительные имена изменились. Дополнительные сведения см. в статьях Функции безопасности в CRT и Предупреждение компилятора (уровень 3) C4996.
Командная строка — Основы командной строки
Для работы с командной строкой понадобятся две вещи: терминал и командная оболочка. В этом уроке вы узнаете, как они работают и чем отличаются друг от друга.
Терминал
Терминалом называют программу, которая эмулирует поведение железного терминала, состоящего из клавиатуры и монитора. В простейшем случае — это просто окошко с командной строкой внутри:
Хороший терминал все же не ограничивается одним окном, а позволяет открывать новые терминалы в табах — по такому же принципу, как работают вкладки в браузере.
Некоторые терминалы позволяют делать сплиты, то есть разделять окно на части. Этот довольно удобный механизм есть, например, в iterm2 :
Хорошие терминалы также умеют восстанавливать завершенную сессию, создавать профили под разные задачи и многое другое.
Командная оболочка
Командная оболочка — программа, через которую пользователь или администратор управляет операционной системой и установленными программами, используя командную строку. У этого понятия множество синонимов — shell, командный интерпретатор и командный процессор.
Оболочка — это лишь средство для выполнения определенных задач, а не сама задача. Этим она отличается от многих других программ.
Внутри терминала пользователь передает системе строки:
Каждая строка — это команда, которую система должна выполнить. После ввода команды обязательно нажать Enter , только в этом случае команда отправится на исполнение. После нажатия Enter отредактировать команду уже нельзя.
Оболочка запускается внутри терминала и приглашает ко вводу команд:
Рассмотрим фрагмент кода подробнее. Мы видим:
- Символ $ — он используется как разделитель
- Слева от $ — настраиваемое сообщение для вывода, обычно это текущая директория
- Справа от $ — команда, которую вводит пользователь
Все примеры в дальнейшем будут демонстрироваться без этого сообщения и символа. Рассмотрим для примера команду date , которая выводит текущую дату:
date Sun Aug 26 14:02:59 CEST 2018 █
Другой пример команды — комментарии. Как и в любых языках программирования, они ни на что не влияют. С их помощью мы просто описываем происходящее:
# Комментарий █
Командная оболочка позволяет запускать на выполнение установленные программы. Но это далеко не все, на что она способна. Для комфортной работы полезно иметь:
- Автоматическое завершение имен программ и файлов
- Историю введенных команд
- Возможность перемещаться по файловой системе
- Удобные горячие клавиши
- Поддержку скриптов
Далее в курсе мы раскроем многие из этих аспектов.
Командные оболочки и терминалы бывают разные, хотя по умолчанию в большинстве операционных систем стоит Bash .
Отдельно скажем, что командная оболочка и терминал — не одно и то же. Терминал — это программа, которая запускает командную оболочку внутри себя:
Как вы увидите далее, командная оболочка — это полноценная среда программирования. Многие команды являются стандартными конструкциями любого языка программирования: переменными, циклами или условиями. Кроме того, некоторые команды являются программами, а некоторые — нет. В ближайших уроках для простоты мы будем говорить слово «команда», но потом объясним разницу.
Командную оболочку нередко называют реплом от английского REPL (Read-Eval-Print-Loop). Это сокращение отражает способ взаимодействия командной оболочки с пользователем:
- Read — оболочка ждет ввода команды от пользователя
- Eval — исполняет введенную команду
- Print — выводит результат
- Loop — возвращаемся к первому пункту
Этот процесс называется интерактивной сессией: после загрузки командная оболочка ждет ввода команды, исполняет ее, выводит результат и снова ждет ввода команды. Так происходит до тех пор, пока не будет дана команда на выход из терминала или выключение компьютера.
REPL — широко распространенный способ взаимодействия с пользователем. В следующих курсах вы увидите, что он есть и у баз данных, и у языков программирования.
Чтобы вам было удобнее выполнять задания к урокам, в среде Хекслета сразу запущено два терминала. Терминалы доступны в нижних вкладках под именами Terminal 1 и Terminal 2.
Во время изучения и экспериментов достаточно легко допустить ошибки. Всегда внимательно читайте вывод, в случае паники переоткройте терминал. Это позволит начать все с чистого листа.
Самостоятельная работа
Чтобы научиться работать в командной строке, нужно как можно больше практиковаться в терминале на вашем компьютере.
Сначала нужно установить терминал. Установка зависит от вашей операционной системы:
- Если вы используете Linux или MacOS, в вашей операционной системе уже есть установленный терминал. Можете использовать его или скачать более продвинутую версию — например, iTerm2 для MacOS и Tilix для Linux
- Если вы работаете с ОС Windows, вам потребуется использовать WSL Далее убедитесь, что внутри терминала можно запустить bash-сессию. Откройте терминал и введите такой текст:
echo $SHELL /bin/bash # Это вывод команды, которую вы ввели выше
Дополнительные материалы
![]()
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар « Как самостоятельно учиться »
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Зачем уметь работать в командной строке?

Сегодня мы поговорим о том, зачем учить операционную систему GNU/Linux, о преимуществах работы в командной строке и о том, как это все связано с философией Unix.
Это не перевод, а мой авторский текст, появившийся в результате долгих чтений комментариев на хабре и других всевозможных интернет ресурсов. Я не ставил целью задеть чьи-то чувства или оскорбить, а любые совпадения случайны. Прошу отнестись с пониманием.
В мире десктопных операционных систем, вроде той же Windows, понятие программы сильно специализировано. Если вам нужна программа для просмотра видео, вы идете и скачиваете конкретную программу, которая была специально написана для этой цели. Если хотите слушать музыку, для вас также существует целый спектр программ, которые решают эту задачу. В общем, для любой типовой задачи уже написаны и распространяются под разного рода условиями огромное количество программ под разные цели.
Как правило, эти программы весят довольно много, предоставляют дополнительные интеграции и функции, которые вам могут быть вообще не нужны. Порой доходит до абсурда и приходится скачивать и устанавливать гигабайтные пакеты только лишь для того, чтобы иметь возможность редактировать текст. К примеру, для того, чтобы время от времени показывать вам рекламу, разработчики интегрируют в программы код полноценных браузеров, вроде Chromе. Или, если необходимо проигрывать видеоролики внутри приложения, вместо того, чтобы интегрировать свой код со стандартными программами, уже установленными в системе, встраивают внутрь своего продукта полноценные видео-проигрыватели с кучей лишнего кода, которые будут без причины тормозить вашу систему и сжирать драгоценную память.
Проблема с таким подходом начинает вырисовываться тогда, когда вам необходимо решить довольно специфичную задачу, и вы не можете найти уже готовую программу, которая реализует нужную логику.
“Как я запущу Фотошоп на этом вашем Линуксе? Мне же нужно работать, а не заниматься ерундой.”
Поймите меня правильно, такой подход весьма удачно работает, когда речь заходит о профессиональных пакетах: инженерных, творческих, например, AutoCAD, MATLAB, Adobe Photoshop, Blender и многих других. Эти большие и довольно раздутые программные решения позволяют миллионам людей по всему миру осваивать полезные профессии и создавать потрясающие продукты, перенимая лучшие практики и стандартизируя рабочий процесс.
В другой крайности нам пришлось бы осваивать программирование только лишь для того, чтобы каждый раз реализовывать необходимый функционал. А это превратилось бы в безумную трату времени для огромного количества людей, заставляя их погружаться в не профильные для них направления.
Между этими двумя крайностями существует некий промежуточный уровень, который позволяет решать нестандартные задачи, программ для решения которых явным образом не предусматривается. Но тем не менее использовать для этого некие относительно крупные готовые строительные блоки. Мы уже избавлены от необходимости писать программный код, но все еще имеем достаточно гибкую систему удобных утилит, при объединении которых в цепочки можем создавать необходимую нам логику.
Эти строительные блоки являются простыми программами, утилитами, которые сами по себе могут быть довольно бесполезными, но изначально спроектированными для использования в связке с другими. В операционной системе GNU/Linux около сотни таких базовых утилит, доступных из коробки в любом типовом дистрибутиве. Еще тысячи, как правило, находятся в стандартных репозиториях и могут быть установлены при желании одной командой. Многие из этих утилит можно запускать в разных режимах, используя стандартизированную систему флагов. Благодаря этой гибкости мы имеем по-настоящему безграничное поле для экспериментов, где ваши возможности может ограничить только ваша фантазия.
А склейкой для этих утилит является простой текст, который они принимают на стандартный ввод, модифицируют в рамках своей работы и передают дальше следующим утилитам. Получается своего рода конвеер данных. Простой, без проблем читаемый людьми текст и является тем универсальным интерфейсом передачи информации.
Если бы систему Unix создавали сегодня, я полагаю, такой подход просто не одобрили бы. К примеру, ввели бы систему объектов, как это сделано Майкрософтом в PowerShell, либо навязали бы использовать для обмена данными некий сериализованный формат данных, вроде JSON или YAML. Несомненно, использовали бы шифрование, сертификаты для подписывания пакетов данных, протокол был бы бинарным и не читаемым без использования специальных утилит. А работа с файловой системой и с ядром из пространства пользователя напоминала бы работу с базой данных.
Однако, на наше счастье, все эти традиции к переусложнению появились гораздо позже, и отцы-основатели системы Unix этим не слишком грешили. И, конечно, поступили мудро.
“Я вообще Python учу, за ним будущее, а этот ваш баш — это какая-то устаревшая жесть”
Может такие создаваемые на коленке конвеерные цепочки и не будут претендовать на полноценное и долговременное решение, которое будет красиво оформленным и оптимально реализованым, но это все компенсируется простотой использования, возможностью быстро набросать черновой вариант и поиграться с данными одними только стандартными средствами операционной системы. А уже найдя правильный подход, можно и скрипт на Питоне написать, коль будет у вас такое желание.
Особенно бесценным этот опыт будет для инженеров, которые часто вынуждены работать в очень стеснённых условиях, и поэтому им просто необходимо использовать любые возможности для автоматизации и упрощения своей работы.
“Линукс нужно допиливать напильником, чтобы выглядел достойно. Вот мои конфиги.”
Если вы программист, то, как правило, ваш мир ограничен только одним вашим персональным компьютером, куда вы можете устанавливать любые программы для повышения эффективности своей работы. Поэтому на вашей машине наверняка будут установлены десятки дополнительных утилит, а стандартный Bash будет заменен на продвинутый Zsh. Конфигурационные файлы многих программ будут подстроены под себя, и множество “алиасов” под часто запускаемые сценарии создадут тот комфортный язык общения с компьютером, который будете понимать только вы. Вы даже можете использовать какой-либо экзотический графический интерфейс, вроде тайлового менеджера i3, со своими настройками и горячими клавишами.
Доведя этот процесс до предела, ваше виртуальное рабочее место по навороченности и технологичности может напоминать кабину космического аппарата из научно-фантастического фильма.
“И это правильно, я меньше чем с тремя экранами не работаю. И только с механической клавиатурой.”
Однако, что же делать тем специалистам, которые строят и администрируют комплексные системы, состоящие из тысяч серверов? У них просто нет возможности установить на все машины удобные утилиты и подстроить все под себя. Зачастую нет даже возможности физически установить что-либо, так как выход в интернет на продакшен-сервере может быть и вовсе заблокирован. А часть виртуальных машин будут настолько древними или настолько важными, что вы и дышать на них будете бояться, чтобы случайно что-то не сломать.
Приходится довольствоваться тем, что есть под рукой. И тут умение работать в стандартных окружениях, в командной строке, умноженное на огромный потенциал, который заложен в саму операционную систему, будет являтся моментом истины, отличающим хорошего специалиста от посредственного. Вам ничем не помогут знания о новомодных хайповых тенденциях, современных поделках, расширяющих функционал стандартных утилит, и якобы делающие их более удобными. Все эти знания будут полностью бесполезны в реальной работе и будут только отвлекать. Также будут полностью бесполезны знания о графических столах и чем они отличаются друг от друга.
Я еще раз повторяю, интерфейс графического стола или мобильного телефона не хуже и не лучше интерфейса командной строки. Нужно просто понимать сильные и слабые стороны обоих подходов и использовать каждый из них там, где он более уместен.
“А я работаю с Remote Desktop к моей рабочей машине и пишу код. Все шустро работает.”
Представте, что вы работаете из дома, подключаясь к своему офисному компьютеру через зашифрованный VPN-шлюз. Компания решила, что напрямую подключаться к продакшен-системе вы не можете, а можете только из подсети вашего офисного компьютера. Поэтому мы подключаемся к этому компьютеру, чтобы затем уже с него переподключиться к удаленному серверу в интернете. Однако этот сервер — это всего лишь контролирующий сервер, который еще иногда называется Bastion Host, у которого один сетевой интерфейс подключен к всемирной сети, а второй к внутренней защищенной сети, где расположены все самые важные сервера. Поэтому уже через него мы должны переподключиться непосредственно к тому серверу, с которым изначально хотели работать.
Согласитесь, что графический интерфейс просто не сможет адекватно работать в таких условиях. Передавать изображение на такие растояния, через такое количество промежуточных узлов можно, но это будет крайне не удобно. Получаемая картинка не будет обновляться в реальном времени, создавая в лучшем случае постоянные задержки, в худшем — постоянные разрывы соединения. Да и задержка порой такая, что работать просто не возможно.
Однако, даже если между вашим компьютером и конечным сервером пропускная способность сети всего несколько килобайт в секунду, а такое бывает довольно часто, подключаться к виртуальному терминалу по SSH все еще может быть достаточно комфортно. Используя интерфейс командной строки, вы сможете сделать любое изменение, проверить и устранить любую неисправность, протестировать приложение, проверить систему на безопасность, проверить логи системы и многое другое. Все, что от вас требуется, это знать, какие команды запускать и в каком порядке. А система отзывчиво сделает все, о чем вы ее просите, без лишних вопросов. Так, словно вы работаете не на удаленном сервере, расположенном на другой стороне Земли, а на своей домашней станции. Это происходит потому, что передать короткую текстовую команду во много раз проще, чем непрерывный видео поток.
«Все же как-то странно в 21-м веке пялиться в черный экран, графический интерфейс лучше”
К тому же, в отличии от графических интерфейсов, при работе с интерфейсом командной строки информация, с которой вы работаете, всегда однозначна и сконцентрированна. Вы всегда видите текст ровно там, где ожидаете его увидеть, а не размазанную палитру цветов, между которыми где-то должны скрываться разбросанные по всему экрану буквы. Понятно, что, приложив некоторые усилия, можно создавать хорошо продуманные и качественные графические интерфейсы, но до стандартизации там очень далеко. Каждая программа часто стремится предоставлять свой неповторимый пользовательский опыт, который и выделяет ее среди конкурентов. Но согласовываться эти визуальные компоненты в общей гамме приложений, запущенных у вас на компьютере, совсем не обязаны.
Можно сколько угодно кричать о старомодности, об устаревании и о том, что работа в консоли не удобна, но факт остается в том, что в мире IT работа в терминале является главным и часто единственным возможным способом работы со сложными информационными системами.
И, конечно, никто не запрещает вам работать с интерфейсом командной строки и при этом использовать тот же самый графический интерфейс, открывая в множестве вкладок виртуального терминала необходимые сессии, и в то же время держать отрытыми в браузере десятки страниц с нужной документацией.
“Мне достаточно Windows. Много лет с ним работаю и меня все устраивает. А для игр у меня PlayStation”
Понятно, что если вы используете компьютер для развлечений, то, скорее всего, вы используете операционную систему, вроде Microsoft Windows или MacOS, и вполне довольны этим. Если ваша профессия просто не оставляет иного выбора, вы будете использовать то программное обеспечение, что используют ваши коллеги и никаких проблем при этом не испытывать.
Однако, давайте посмотрим на это шире. Что, если вы используете свой компьютер для задач, для которых не существует единого и общепринятого инструментария? Представьте себе сотни серверов, разбросанных по разным точкам земного шара, десятки сложных систем, вроде Kubernetes, реляционных и документо-ориентированных баз данных, брокеров сообщений, различной вспомогательной инфраструктуры. В сложных микросервисных архитектурах, состоящих из сотен взаимодействующих друг с другом сервисов, ежедневно приходится иметь дело с множеством абстракций и условностей, которые и запомнить-то не просто, не то, что с ними работать. Программисты, системные администраторы, DevOps инженеры, специалисты по сетевой безопасности, аналитики данных — все эти профессии требуют разных инструментов, разных навыков и подходов. Да и среди одних и тех же программистов есть те, кто разрабатывают прикладное программное обеспечение, другие разрабатывают сайты или мобильные приложения. Есть те, кто больше специализируется на фронтенде или на бекенде. Но не нужно забывать и о тех, кто работает близко к железу и пишет драйвера устройств или разрабатывает встроенные системы. И это только некоторые из возможных направлений.
Вы просто не напишете графических приложений для всего многообразия задач, которые возникают ежедневно перед людьми, создающими и эксплуатирующими такие системы. Напротив, эти потребности часто естественным образом покрываются взаимодействием простых утилит, которые входят в базовую сборку любого дистрибутива GNU/Linux.
Да, возможно, не так красиво, не так презентативно, но, с точки зрения инженера, командная строка полностью покрывает потребности и позволяет не отвлекаться и сосредоточиться непосредственно на самой задаче.
Поэтому сама постановка вопроса “что лучше” лишена смысла. Для решения тех задач, которые ставит перед нами профессия в ранее перечисленных специальностях, командная строка — это лучший возможный интерфейс, который за счет своей простоты может использоваться в любых приложениях даже для решения тех задач, для которых не создавался.
“Да кто вообще использует эту операционную систему. Мак лучше”
Обыватели склонны преувеличивать значение операционных систем от Майкрософт и Apple, считая их за некий общемировой стандарт, поскольку в ежедневной деятельности у них нет возможности убедиться в том, что может быть как-то иначе. Да, сегодня операционные системы на базе ядра Linux не могут занять достойное место в ряду десктопных систем, хотя фактически ничем им не уступают. Однако, давайте будем честны и не забудем упомянуть, что по какой-то причине те же корпорации полностью проиграли на рынке серверных решений. И сегодня операционная система GNU/Linux и отчасти системы семейства BSD полностью доминируют в этом сегменте.
Они используются сегодня не только в классических серверах, расположенных в датацентрах по всему миру, но и в мобильных телефонах, маршрутизатах, суперкомпьютерах, всевозможной бытовой технике, автомобилях, видеокамерах и многих других приложениях. И я не удивлюсь, если даже в космических аппаратах и лунных модулях, там, где нет особых требований к железу, все работает примерно так же, как у вас на домашнем компьютере.
Все те социальные сети и мессенджеры, а также многочисленные интернет-ресурсы, без которых мы не мыслим нашу жизнь сегодня, с подавляющей долей вероятности используют Unix-подобные операционные системы для своего функционирования. И во всех этих и многих других приложениях ваши знания будут актуальны и не устареют ещё очень долгое время.
“Стойте, а как же .Net? Это же очень популярная технология”
И да, я знаю, что .Net и некоторые другие решения активно используются на бекенде многих уважаемых компаний. Однако, это скорее отклонение от нормы, и мировые тенденции скорее говорят об обратном. Доминирование таких платформ, как Java, они пошатнуть не в состоянии, а та же Java прекрасно себя чувствует на серверах с GNU/Linux и OpenJDK на борту. Даже если сами разработчики используют в своей работе систему от Майкрософт и Linux в глаза не видели.
Не имеет значения, какой фреймворк и какой язык программирования современнее, быстрее или удачнее с точки зрения архитектурных решений, если большие корпорации все равно отдают предочтение Java по бизнес причинам.
Сам факт существования таких систем, как Mono, делающей разработку на .Net кросплатформенной и WSL, позволяющей использовать Linux внутри Windows, говорят о том, как шатко сегодня положение Windows в этом сегменте рынка.
“Я вообще писатель и зачем мне может потребоваться погружаться во все это?”
Даже если вы не инженер и непосредственно с вашей деятельностью это перекликается слабо, у операционной системы GNU/Linux в запасе много интересных и полезных инструментов, которые имеют не только специфичное “айтишное” применение, но и являются частью всемирного наследия. К таковым, например, можно отнести систему контроля версий Git и систему компьютерной верстки текста TeX.
Я еще раз хочу подчеркнуть, что нет необходимости воспринимать так называемую философию Unix как истину в последней инстанции. Это всего лишь абстракция, идея, которая в некоторых случаях может быть удобна, в других не достаточна. Однако тот факт, что она вот уже столько лет активно используется и за это время никаких реальных альтернатив придумано не было, заставляет признать, что испытание временем она выдержала и никуда уходить не собирается.
“Линукс полностью устарел, и все нужно переписывать. Там вообще весь код из семидесятых, максимум девяностых.”
Однако, среди всего многообразия мнений переодически встречается и такое, что весь этот подход устарел и его необходимо полностью пересмотреть. Все эти утилиты операционной системы, вроде текстового редактора vim, командной оболочки bash, системы инициализации systemd и многих других (нужное подчеркнуть) используются только потому, что все еще по старинке предустановлены в большинстве дистрибутивов и только поэтому все еще популярны. Если бы не этот сдерживающий прогресс фактор, не оставляющий шансов молодому поколению в их стремлении “сделать мир лучше”, мы бы уже давно пользовались удобными инструментами, а не были бы заложниками этого исторического хлама.
К сожалению, такой подход часто можно встретить в различных обсуждениях, а значит подобное убеждение плотно засело в головах у множества людей. Нет ничего проще, чем выдрать из исторического контекста некоторое утверждение и возвести его в абсолют. Что же, позвольте продолжить такую линию рассуждений и поговорить о том, что и само ядро Linux полностью устарело хотя бы потому, что является монолитным. Давайте перепишем и его и перейдем на более “прогрессивную” микроядерную архитектуру, как это сделано, например, в операционной системе Minix.
Не забудем также, что и архитектура процессоров, которые мы сегодня используем, полностью устарела, так как тянет за собой десятилетия обратной совместимости с уже не существующими технологиями. Давайте срочно создавать новую архитектуру, которая будет лишена всего этого наследия, и использовать исключительно ее. Затем подготовим под эту технологическую базу миллионы специалистов, чтобы быть способными внедрить ее на всех производствах и серверных мощностях по всему миру. Да и заводы не забудем полностью перестроить под новый технологический процесс, так как нам понадобится в кратчайший срок заменить весь мировой серверный парк.
На все это потребуется в лучшем случае сотни миллиардов долларов и годы усилий на международном уровне. Но что это по сравнению с мнением некоторых экспертов, правда?
Конечно, необходимо разрабатывать новые операционные системы, языки программирования, инструменты и библиотеки. Прогресс ни в коем случае не стоит останавливать. Новые и прогрессивные тенденции, сколь слабыми они ни были бы в момент своего появления, имеют все шансы окрепнуть и заменить собой устаревшие подходы и практики. Однако, было бы очень странным ожидать, что то, что используется сейчас, полностью исчезнет из истории без всякого следа. Скорее всего, элементы идей и программного кода, который мы используем сегодня, останутся для будущих поколений множественными рудиментами и анахронизмами, с которыми они будут вынуждены сосуществовать. В том числе с теми технологиями, которые мы на данном этапе считаем передовыми и наиболее удачными, но которые, несомненно, станут устаревшими в новых исторических реалиях.
Поэтому, пока кто-то ждёт и страдает, мы будем изучать и использовать то, что есть и понимать, что за всеми этими технологиями стоят десятилетия тяжелого эволюционного процесса, состоящего из труда и усилий миллионов людей. Среди них есть как хорошие, так и плохие специалисты, принимающие хорошие и плохие решения. Эти люди могут работать в стеснённых условиях согласно общему корпоративному плану, над которым не властны, или вольных художников, работающих в свое свободное время над тем, что им действительно интересно.
Поэтому давайте не забывать о принципе историзма и строить наши карьеры и жизни, исходя из этого понимания. А также не забывать о том, что мы, если и можем чего-то добиться, то это только потому, что, вне всякого сомнения, стоим на плечах гигантов.
Учебники. Программирование для начинающих.
Programm.ws — это сайт, на котором вы можете почитать литературу по языкам программирования , а так-же посмотреть примеры работающих программ на С++, ассемблере, паскале и много другого..
Программирование — в обычном понимании, это процесс создания компьютерных программ.
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.
Программирование на языке С++
Часть 6. Расширенные возможности C++
Урок 36. Использование аргументов командной строки
Как вы знаете, большинство команд, вводимых вами в ответ на системную подсказку, позволяют включать дополнительную информацию, такую как имя файла. Например, при использовании команды MS-DOS COPY для копирования содержимого одного файла во второй файл вы указываете в командной строке имена обоих файлов. Аналогично, если ваш компилятор основан на командной строке, вы должны включать имя вашего исходного файла при вызове компилятора. В этом уроке рассмотрены способы, с помощью которых ваши программы на C++ обращаются к аргументам командной строки. К концу данного урока вы освоите следующие основные концепции:
- Программы на C++ трактуют аргументы командной строки как параметры функцииmain.
- По традиции C++ передает два (иногда три) параметра вmain, которые в большинстве программ называютсяargc иargv.
- Параметрargc содержит количество аргументов командной строки, передаваемых в вашу программу.
- Параметрargv представляет собой массив указателей на символьные строки, каждая из которых соответствует одному параметру командной строки.
- В зависимости от компилятора ваши программы могут получить доступ к третьему параметру с именемenv, который представляет собой массив указателей на символьные строки, указывающих на переменные среды.
Способность программ обращаться к аргументам командной строки повышает количество способов, которыми вы можете использовать одну и ту же программу. Например, вы можете создать свою собственную программу, используемую для копирования любого исходного файла, который вы указываете в качестве первого аргумента командной строки, в целевой файл, который вы указываете в качестве второго аргумента командной строки.
ДОСТУП Кargv Иargc
Если вы запускаете программу из системной подсказки, командная строка, которую вы вводите, становится вашей командной строкой:
В данном случае командная строка указывает команду (COPY) и два аргумента (имя файлов SOURCE. DOC и TARGET. DOC). Чтобы разрешить вашей программе доступ к командной строке, C++ передает два параметра в функциюmain:
Первый параметр argc содержит количество элементов в массивеargv. Например, в случае предыдущей команды COPY параметрargc должен содержать значение 3 (он включает имя команды и два аргумента). Следующая программа SHOWARGC.CPP использует параметрargc для вывода количества аргументов командной строки:
Выберите время для эксперимента с этой программой, вызывая ее с разным количеством параметров, как показано ниже:
С:> SHOWARGC А В С
Количество аргументов командной строки равно 4
В зависимости от типа компилятор может рассматривать аргументы, которые группируются внутри двойных кавычек, в качестве одного аргумента:
С:> SHOWARGC «Это один аргумент»
Количество аргументов командной строки равно 2
Рис. 36. Массивargv указывает аргументы командной строки.
Второй параметр функцииmain с именемargv представляет собой массив указателей на символьные строки, которые содержат индивидуальные части командной строки. Например, рис. 36 иллюстрирует, как элементы массива argv могли бы указывать записи командной строки.
Следующая программа SHOWARGV.CPP использует операторfor для вывода элементов массиваargv (командная строка программы). Программа запускается с первого элемента массива (имя программы) и затем выводит каждый элемент, пока значение переменной цикла не станет больше, чемargc:
Откомпилируйте и запустите эту программу, используя командную строку, подобную следующей:
С:> SHOWARGV А В С
argv[0] содержит SHOWARGV.EXE
argv[l] содержит А
argv[2] содержит В
argv[3] содержит С
Доступ к аргументам командной строки
Для увеличения количества задач, выполняемых программой, C++ позволяет вашей программе обращаться к аргументам командной строки, используя два параметра, которые C++ передает вmain. Первый параметрargc содержит количество аргументов командной строки (включая имя программы). Второй параметрargv представляет собой массив указателей на символьные строки. Каждая символьная строка соответствует аргументу командной строки. Чтобы обратиться к аргументам командной строки, измените заголовок функцииmain, как показано ниже:
void main(int argc, char *argv[])
ВЫПОЛНЕНИЕ ЦИКЛА, ПОКАargv НЕ СОДЕРЖИТ NULL
Как вы уже знаете, программы C++ используют символ NULL для завершения символьной строки. Подобным способом C++ использует символ NULL, чтобы отметить последний элемент массиваargv. Следующая программа ARGVNULL.CPP изменяет оператор for предыдущей программы, чтобы выполнять цикл по элементамargv, пока текущий элементargv не будет равен NULL:
ТРАКТОВКА argv КАК УКАЗАТЕЛЯ
Как вы уже знаете, C++ позволяет вам обращаться к элементам массивов, используя указатели. Следующая программа ARGVPTR.CPP трактуетargv как указатель на указатель символьной строки (другими словами, указатель на указатель), чтобы вывести содержимое командной строки:
Выберите время, чтобы проанализировать объявление параметраargvв main:
Первая звездочка в объявлении сообщает компилятору C++, чтоargv представляет собой указатель. Вторая звездочка сообщает компилятору, чтоargv представляет собой указатель на указатель — в данном случае указатель на указатель типаchar. Представьтеargv как массив указателей. Каждый элемент массива в данном случае указывает на массив типаchar.
ИСПОЛЬЗОВАНИЕ АРГУМЕНТОВ КОМАНДНОЙ СТРОКИ
Следующая программа FILESHOW.CPP использует аргументы командной строки для вывода содержимого указанного пользователем файла на экран. Например, чтобы использовать программу FILESHOW для вывода содержимого файла AUTOEXEC.BAT из корневого каталога, ваша командная строка становится следующей:
Следующие операторы реализуют программу FILESHOW.CPP. Эта программа начинается с проверки параметраargc, чтобы убедиться, что пользователь указал файл в командной строке. Если пользователь включает имя файла параметрargc будет содержать значение 2. Далее программа открывает и выводит содержимое файла, используя методы, которые вы изучали в уроке 34. Как видите, если программа не может открыть указанный файл, она выводит сообщение об ошибке и завершается:
ДОСТУП К ПЕРЕМЕННЫМ СРЕДЫ ОПЕРАЦИОННОЙ СИСТЕМЫ
Как вы знаете, большинство операционных систем позволяют вам определять переменные среды, к которым ваши программы могут обращаться для определения разных параметров, таких как командный путь. Например, если вы используете среду MS-DOS, вы устанавливаете или выводите переменные среды с помощью команды SET. В зависимости от типа вашего компилятора вы можете обращаться к переменным среды из вашей программы, используя третий параметрmain с именемenv. Подобно параметруargv, параметрenv представляет собой указатель на массив указателей на символьные строки. Также, подобноargv, C++ завершает этот массив символом NULL. Если ваш компилятор поддерживает параметрenv, вы можете изменить заголовок функцииmain, как показано ниже:
void main(int argc, char *argv[], char *env[])
Следующая программа SHOWENV.CPP выполняет цикл по элементам массиваenv для вывода переменных среды программы:
Как видите, программа просто выполняет цикл по элементам массиваenv, пока не встретит указатель NULL, который указывает последнюю запись массива. Если вы откомпилируете и запустите эту программу, она выведет ваши переменные среды, как показано ниже:
С:> SHOWENV
ТЕМР=С:WINDOWSTEMP
PROMPT=$p$g
COMSPEC=C:WINDOWSCOMMAND.СОМ
РАТН=С:WINDOWS;С:DOS
Доступ к переменным среды
В зависимости от типа компилятора, ваши программы могут обращаться к переменным среды операционной системы, используя третий параметр функцииmain с именемenv. Подобно параметруargv, параметрenv представляет собой массив указателей на символьные строки, каждый из которых указывает переменную среды. Чтобы обратиться к переменным среды, используя параметрenv, измените заголовок функцииmain следующим образом:
void main(int argc, char *argv[], char *env[])
ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ
Чтобы увеличить количество приложений, поддерживаемых вашей программой, C++ позволяет использовать аргументы командной строки. Из урока 37 вы узнаете, как с помощью макрокоманд и констант можно упростить вашепрограммирование или создать более удобочитаемый код. Однако, прежде чем перейти к уроку 37, убедитесь, что вы освоили следующие основные концепции:
- Когда вы запускаете программу из системной подсказки, информация которую вы вводите, становится командной строкой программы.
- Чтобы позволить вашим программам обращаться к командной строке C++ передает функцииmain два параметра:argc иargv.
- Параметрargc содержит количество аргументов командной строки.
- Параметрargv представляет собой массив указателей на символьные строки, каждая из которых содержит аргумент командной строки.
- В зависимости от вашего компилятора программа может обращаться к третьему параметруmain с именемenv, который представляет собой массив указателей на символьные строки, содержащие переменные среды.