Как настроить Visual Studio Code для C, C, Java, Python
Как настроить Visual Studio Code для C, C++, Java, Python
Visual Studio Code — популярный редактор кода, бесплатный и с открытым исходным кодом. Но я уверен: каждый из нас, кто пытался настроить Visual Studio Code для разработки приложений на C++, Java или Python, прошел через стадию: “О Боже! Почему нельзя как-нибудь попроще?” Я сам пробовал настроить VS Code пару раз и в итоге закончил тем, что использовал CodeBlocks. 🙁
Прочитав много документации, посмотрев ряд роликов на YouTube и потратив несколько дней на саму настройку VS Code, я пишу эту статью, чтобы все это не пришлось проделывать уже вам!
Сегодня я покажу, как настроить среду разработки для спортивного программирования на C++, Java и Python в VS Code с нуля. Мы также посмотрим, какие расширения больше всего пригодятся, чтобы начать работу с VS Code. В конечном счете, ваша среда разработки будет выглядеть примерно так:
Как скомпилировать программу на C/C++ в Ubuntu
Помню, когда я только начинал программировать, у меня возник вопрос: «Как скомпилировать программу на C в Ubuntu?» Для новичков это не легкая задача, как может показаться на первый взгляд.
Мой путь изучения C начался с бестселлера «Брайан Керниган, Деннис Ритчи, Язык программирования C, 2-е издание». Там рассказывается как скомпилировать программу в операционной системе Unix, но этот способ не работает в Linux. Авторы книги выкрутились, написав следующее:
Текстовый редактор gedit
Для написания первых программ подойдет обычный, используемый по умолчанию в Ubuntu, текстовый редактор с подсветкой синтаксиса — gedit.
Рис. 1. Запуск текстового редактора. |
Первой программой по традиции является «Hello, World!», выводящее приветствие на экран:
Печатаем или копируем текст программы в gedit и сохраняем в файл Hello.c , например, на рабочий стол. Не самое лучше место для сохранения, но это позволит рассмотреть случай, когда в имени директории содержится пробел.
Рис. 2. Программа hello, World. |
Компиляция программы на C
Теперь запускаем терминал, можно через Dash, а можно с помощью горячих клавиш <ctrl> + <Alt> + <T> . Здесь в начале установим инструменты сборки, куда входят необходимые компиляторы gcc для языка C и g++ для языка C++:
Для установки требуется ввести пароль, при вводе которого может сложиться впечатление, что ничего не происходит, но на самом деле терминал просто в целях безопасности не отображает символы.
Далее в терминале нам необходимо перейти в директорию, куда сохранили файл с текстом программы. Перемещение выполняется командой cd (англ. change directory — изменить каталог). Чтобы воспользоваться командой в начале пишется cd , затем через пробел путь , куда нужно перейти.
Для перехода на рабочий стол, команда будет следующей:
Обратите внимание на символ обратной косой черты в имени директории Рабочий стол . Обратная косая экранирует пробел, и сообщает команде cd , что пробел и следующие за ним символы являются частью имени. Символ
в начале пути обозначает путь до домашней папки пользователя.
Для просмотра содержимого директории применяется команда ls (сокращение от англ. list).
Рис. 3. Работа в терминале. |
Команда компиляции для программы на C выглядит следующим образом:
- gcc — компилятор для языка программирования C;
- -Wall — ключ вывода всех предупреждений компилятора;
- -o hello — с помощью ключа -o указывается имя выходного файла;
- hello.c — имя нашего исходного файла, который компилируем.
В завершение запустим hello , вводом имени программы с префиксом ./ :
Префикс ./ сообщает терминалу о необходимости выполнить программу с заданным именем в текущем каталоге. (Точка — это условное название текущего каталога.)
Рис. 4. Работа в терминале, продолжение. |
Компиляция программы на С++
Программы на C++ компилируются аналогично, как и программы на C. «Hello, World!» на C++ можно написать так:
Сохраняем текст программы в файл под именем hello2.cpp . Таким образом, команда компилирования будет иметь вид:
Для запуска результата вводим в терминале:
Заключение
Данный способ позволяет скомпилировать программу лишь из одного файла с исходным кодом. Но этого вполне достаточно, чтобы начать изучение языков программирования C/C++ по книгам или по статьям в интернете.
Добавление ссылок на внешние сборки
Давайте посмотрим, как скомпилировать приложение, в котором используются типы, определенные в отдельной сборке .NET. Если осталось неясным, каким образом компилятору C# удалось понять ссылку на тип System.Console, вспомните, что во время процесса компиляции происходит автоматическое добавление ссылки на mscorlib.dll (если по какой-то необычной причине нужно отключить эту функцию, следует передать компилятору csc.exe параметр /nostdlib).
Модифицируем приложение TestApplication так, чтобы в нем открывалось окно сообщения Windows Forms. Для этого откройте файл TestApplication.cs и измените его следующим образом:
Далее в командной строке нужно проинформировать компилятор csc.exe о том, в какой сборке содержатся используемые пространства имен. Поскольку применялся класс MessageBox из пространства имен System.Windows.Forms, значит, нужно указать компилятору на сборку System.Windows.Forms.dll, что делается с помощью флага /reference (или его сокращенной версии /r):
Если теперь снова попробовать запустить приложение, то помимо консольного вывода в нем должно появиться еще и окно с сообщением:
Кстати, как поступить, когда необходимо указать csc.exe несколько внешних сборок? Для этого нужно просто перечислить все сборки через точку с запятой. В рассматриваемом примере ссылаться на несколько сборок не требуется, но ниже приведена команда, которая иллюстрирует перечисление множества сборок:
csc /r:System.Windows.Forms.dll;System.Drawing.dll *.cs
Поддержка кириллицы в консоли
Проблема отображения кириллических символов в консоли Windows связана с тем, что консоль в этой операционной системе имеет собственную настройку кодовой страницы. Если Windows использует кодировку cp1251 (она же windows-1251), то консоль по умолчанию использует cp866 использовавшуюся в MS-DOS. Поэтому для корректного ввода и вывода кириллицы на консоль надо использовать пару функций SetConsoleCP() и SetConsoleOutputCP() соответственно. В качестве единственного параметра обеим функциям передается номер кодовой страницы – 1251. Для использования кодировки UTF-8 необходимо передать значение CP_UTF8.
Ниже показан пример программы, которая сначала просто выводит строку с кириллическими символами, а затем считывает строку и выводит ее обратно на экран.
Далее необходимо запустить программу, щёлкнуть левой кнопкой мыши по заголовку окна (где показывается путь к запущенному .exe файлу) и в контекстном меню выбрать пункт Свойства. Затем на вкладке Шрифт установить шрифт Lucida Console и выбрать удобный размер шрифта (там же можно настроить и другие параметры). После этого символы кириллицы будут корректно отображаться. Данную настройку достаточно выполнить один раз, для других программ и проектов будет достаточно установить кодовую страницу.
Следует заметить, что при использовании только функции setlocale(LC_ALL, «Russian») вывод осуществляется в cp1251, а ввод – в cp866. Это приводит к тому, что в памяти программы введённая с кириллическими символами строка хранится в другой кодировке. Наглядно это можно увидеть, если в показанном примере закомментировать вызов функции SetConsoleCP(). Строка которую выдаст программа будет отличаться от той, что ввели с клавиатуры.
Сначала посмотрим, как скомпилировать и запустить простую программу, написанную на языке Си.
Компиляция и запуск программ на C
Напишите свой код/программу в любимом редакторе CLI/GUI.
Я собираюсь написать свою программу на Си с помощью редактора nano.
Примечание. Вам необходимо использовать расширение .c для программ на Си или .cpp для программ на Си++.
Скопируйте/вставьте следующий код:
Нажмите Ctrl+O и Ctrl+X для сохранения и выхода из файла.
Чтобы скомпилировать программу, запустите:
Если в вашем коде/программе есть синтаксические или семантические ошибки, они будут отображены. Сначала необходимо их исправить, чтобы двигаться дальше. Если ошибки нет, то компилятор успешно сгенерирует исполняемый файл ostechnix в текущем рабочем каталоге.
Наконец, запустите программу с помощью команды:
Вы увидите вывод, как показано ниже:
Чтобы скомпилировать несколько исходных файлов (например, source1 и source2) в исполняемый файл, запустите:
Для разрешения предупреждений, необходима отладка символов на выходе:
Скомпилировать исходный код в инструкции ассемблера:
Скомпилировать исходный код без связывания:
Вышеприведенная команда создаст исполняемый файл под названием source.o.
Если ваша программа содержит математические функции:
За более подробной информацией обращайтесь к man-страницам (страницы руководства).
Компиляция и запуск программ на C++
Напишите вашу C++ программу в любом редакторе по вашему выбору и сохраните ее с расширением .cpp.
Пример простой C++ программы:
Чтобы скомпилировать эту программу на C++ в Linux, просто запустите:
Если ошибок не было, то можно запустить эту Си++ программу под Linux с помощью команды:
В качестве альтернативы мы можем скомпилировать приведенную выше программу на C++, используя команду «make«, как показано ниже.
Вы заметили? Я не использовал расширение .cpp в вышеприведенной команде для компиляции программы. Нет необходимости использовать расширение для компиляции Си++ программ с помощью команды make.
Юникодия v0.1 — моя энциклопедия символов
Я ещё студентом хотел сделать энциклопедию символов Юникода. И за всё это время, пока я хотел, Юникод разросся с 49 тысяч символов до 140 тысяч.
Но всё-таки я сделал, хоть и не до конца, и получилась такая себе замена Таблицы символов Windows. Вот результат 4,5 месяцев работы одного человека в нерабочее время.
Сами понимаете, ни один шрифт не покроет всего Юникода. Кто-то предлагает комплект из трёх шрифтов, покрывающий весь Юникод 13 — но этот комплект коммерческий, и качество я не проверял. А нам, опенсорсникам, приходится искать — и хорошо, что Гугл сделал проект Noto (внимание, шрифты лучше брать прямо с их Гитхаба).
Но не Noto единым: на арабский, сирийский и ККЯ (китайский, корейский, японский) они просто забили, и они давно и безнадёжно неполные. Лаосский, готский и один из грузинских алфавитов — неканоничные глифы. Венгерские руны — просто жестоко глючат. Так что поиск шрифтов был сложным делом.
Да, вот ссылка на программу. Она бесплатная и открытая, пока только для Windows.
Программа на данный момент может немного. Она покрывает всю базовую и 2-ю плоскость Юникода, изрядный кусок 1-й и примерно половину 3-й. Позволяет простейшую навигацию по этому хозяйству, копирует символы в буфер, даёт небольшую информацию по письменностям, блокам и разным терминам — вот и всё.
Название самое лобовое: Юникод+энциклопедия → Юникодия.
Думая над эмблемой, сначала я хотел стебнуться над эмблемой Юнилевера и сделать вместо «положительных» образов конфет, птичек, ДНК и прочего разные символы из Юникода.
Но потом подумал, что это уж слишком. У меня уже были мысли каким-то образом разделить письменности на Европу, Азию, Тихий океан, Америку, Африку и международные — так что возникла идея собрать букву U из разноцветных кубиков.
Эти кубики и дали идею навигации по трёмстам блокам. Азию, как видите, я дополнительно разделил на ККЯ и остальное.
ККЯ — это примерно ¾ Юникода, и ткни куда-то в середину таблицы — попадёшь в иероглиф. Потому все ККЯ, кроме часто нужных катаканы и хираганы (японских язбук), изначально свёрнуты.
Почему настольная программа? Во-первых, я настольный программист. Во-вторых, выяснилось, что веб-версии крайне тормознутые, что делу показа здоровенной таблицы не способствует. В-третьих, появилась интересная задача, исполнимая только в настольном варианте: есть символ — какие системные шрифты его поддерживают?
Что будет дальше? Показ как можно большего куска Юникода — и точно всех не-ККЯ. (Кстати, индийскую письменность нандинагари за неимением шрифта я сам как-то коряво начёркал.) Поиск, как без него — пока он «засерен», но это первое, что будет работать. Некий рубрикатор для эмодзи. Может, какие-то утилиты для китайских иероглифов — но без посторонней помощи я этого не сделаю. Утилита для показа разных начертаний жестового письма Валери Саттон — я уже знаю, какая, это просто не было приоритетом версии 0.1.
Вот «моргалы выколю» на жестовом письме Саттон.
Есть ли аналоги? Наш самый первый аналог — Таблица символов Windows. Правда, она ограничена одной задачей — поиском в шрифтах того или иного символа. А со здоровенным Юникодом часта другая задача — найти, есть ли в каком-то системном шрифте редкий символ.
Во-вторых, бесчисленное множество веб-версий баз Юникода. Их и показывать не стоит — они унылы как смерть, и ничего нового не привносят: пользуются системными шрифтами, не содержат никакой собственной информации.
Unicode-table.com — внимание, без адблокера не соваться. Автор сделал большую работу, но всё ещё много автоматических переводов и мало нетривиальной информации, к тому же сайт около года не обновляется. На самом деле мы с его автором сотрудничаем: я деру данные у него, он у меня.
BabelMap — бесплатная программа с моей же философией. Она несколько меньше, так как не тащит полные шрифты. Зато автор китаевед, и есть неплохой поиск по иероглифам.
Для чего я выложил здесь? Для пиара, как без него. Во-вторых, только пользователи подскажут, как улучшить интерфейс, какая нужна функциональность и какие неточности в описаниях.
Спасибо за внимание!
Языки программирования
Компиляция — преобразование одностороннее, нельзя восстановить исходный код.
Для того, чтобы скомпилировать программу на C++ для некоторой архитектуры X, необязательно устанавливать компилятор С++ на компьютер с архитектурой X.
Не каждая программа, написанная на компилируемом языке, переносима. Т.е. не любая программа, написанная на компилируемом языке, будет работать везде одинаково.
Плюсы и минусы компилируемости в машинный код
- эффективность: программа компилируется и оптимизируется для конкретного процессора;
- нет необходимости устанавливать сторонние приложения, такие как интерпретатор или виртуальная машина (т.е. для запуска программы, написаной на компилируемом языке, не требуется установка компилятора).
- нужно компилировать для каждой платформы (т.е. программу, написанную на языке, который компилируется в машинный код, недостаточно скомпилировать однажды чтобы её можно было запускать на любой платформе);
- сложность внесения изменения в программу — нужно перекомпилировать заново.
Общая схема
- над препроцессором;
- над непосредственно компилятором;
- и над линковщиком.
Этап 1: препроцессор
Язык препроцессора – это специальный язык программирования, встроенный в C++. Препроцессор работает с кодом на C++ как с текстом.
- #include <foo.h> — библиотечный заголовочный файл,
- #include «bar.h» — локальный заголовочный файл.
- g++ -E square.cpp -o square_preprocessed.cpp
- g++ -E main.cpp -o main_preprocessed.cpp
Этап 2: компиляция
На вход компилятору поступает код на C++ после обработки препроцессором.
Каждый файл с кодом компилируется отдельно и независимо от других файлов с кодом. Компилируется только файлы с кодом (т.е. *.cpp).
Заголовочные файлы сами по себе ни во что не компилируются, только в составе файлов с кодом.
На выходе компилятора из каждого файла с кодом получается “объектный файл” — бинарный файл со скомпилированным кодом (с расширением .o или .obj).
Если в коде C++ вы вызывает не объявленную функцию, то это ошибка этапа компиляции.
Можно «скормить» файлы с кодом непосредственно компилятору. Для компилятора g++ можно использовать ключ -c.
- g++ -c main.cpp
- g++ -c square.cpp
- main.o
- square.o
Этап 3: линковка (компоновка)
На этом этапе все объектные файлы объединяются в один исполняемый (или библиотечный) файл. При этом происходит подстановка адресов функций в места их вызова.
По каждому объектному файлу строится таблица всех функций, которые в нём определены.
На этапе компоновки важно, что каждая функция имеет уникальное имя. В C++ может быть две функции с одним именем, но разными параметрами. Имена функций искажаются (mangle) таким образом, что в их имени кодируются их параметры.
Например, компилятор GCC превратит имя функции foo
Аналогично функциям в линковке нуждаются глобальные переменные.
Точка входа — функция, вызываемая при запуске программы. По умолчанию — это функция main:
Даже для программы, состоящей всего из одного файла и из одной пустой функции int main() < return 0; >все равно требуется ликовка.
Если в коде C++ вы вызываете функцию, которая была объявлена, но не была определена, то это ошибка этапа линковки.
Для того чтобы собрать объектные файлы в один файл их нужно «скормить» компилятору и указать имя исполняемого файла:
g++ square.o main.o -o program