Какую библиотеку парсинга командной строки посоветовать студенту (не IT), разрабатывающему консольную программу для своей научной задачи (много аргументов)?

Andrei Vukolov
  ·  
659
Пользователь TheQuestion

В C++11 существует два стандартизированных вида точки входа main, в первом из них в качестве аргументов передается `int argc` (количество аргументов) и `char* argv[]` (массив указателей на аргументы в памяти), есть и платформозависимые способы получить эти данные. Опции можно легко прочитать в цикле for, пробежав от 0 до `argc-1` по `argv`.

Для большей надежности и экономии времени можно научиться работать с одной из популярных библиотек для разбора (parsing) сложной командной строки на параметры и значения. Например в ней можно задавать значения параметров в нестандартном порядке (используя имена опций=значения). Для этого нужно "определить" поддерживаемые опции и затем передать в парсер те самые argc и argv.

Для C++, самый простой путь в использовании Boost::program_options, особенно если ваш проект использует Boost, хоть на первый взгляд это может показаться муторным. Примеры кода и использования этого решения есть в официальной документации. Плюсы этого варианта в возможности автоматического определения вывода команды "help" согласно определенным в коде опциям, поддержка Unicode а так же понятный код. Минусы: большой оверхед самого буста.

Примеры boost командной строки есть мане, но еще надо отметить что поддерживаются собственные реализации парсера опции, например вот так

Другой вариант, который для меня более предпочтителен - это использование GFlags, он так же работает с environment variables помимо самой командной строки. По ссылке информации будет предостаточно. К минусам этой библиотеки можно отнести использование макросов (что всегда путает джуниоров) и построение через CMake по той же причине.

Но самое полезное это инструменты из GNU libc (хотя их можно скачать и использовать и на других компиляторах). Для этого вам предлагаются Getopt и Argparse, см. gnu.org

Три варианта позволяют работать с Unix-like командной строкой. Некоторые программисты, однако, фанатеют от старинного стиля Windows, каким, например, обладает CMD .exe. Тут проще, можно самому уложиться в 100 строк собственного парсера (если не 20).

Если советовать джуниору или студенту, я бы посоветовал (из перечисленных вариантов) использовать упомянутые Сишные библиотеки GNU. Если хочется именно pure-cpp, подключить boost к своему проекту, хоть это и неоптимальное решение ради такой мелочи. И лишь потом советую gflags. В конце концов, если аргументов реально много, целесобразнее использовать файл конфигурации в своей программе.

Я надеюсь я наглядно продемонстрировал, как на TheQuestion срочно нужен "markup"

15 января 2016  ·  < 100
Благодарю! Помогу моему студенту инсталлить и использовать GNUсные инструменты, пусть лучше сразу прочувствует... Читать дальше
Комментировать ответ...
Реклама
Вы знаете ответ на этот вопрос?
Поделитесь своим опытом и знаниями
Войти и ответить на вопрос
Читайте также

Какой язык программирования выбрать для изучения, если не планируешь строить карьеру программиста? Пока мне пригляделся Delphi 7/VB.

Попробуйте сначала выбрать проект, а потом уже язык к нему. Если нет планов стать программистом Python поможет изучить основы и программирования и перспективные техники. Javascript вообще работает в любом браузере и не требует установки. И Python и Javascript поддерживают REPL - простая интерактивная среда программирования.

3 дня назад  ·  < 100
Прочитать ещё 4 ответа

Готовы ли IT-компании взять в качестве junior после Яндекс.Практикум?

Дарья Г.  ·  42

Я, конечно, не компания - но имею такой опыт: закончила в декабре 2019 Аналитику Данных в ЯП, параллельно с дипломным проектом там ходила на собеседования уже. Меня активно звали, хотя у меня даже профильного образования нет (дипломированный гуманитарий)) - и я готовилась искать долго. Однако уже через месяц мной заинтересовались в классной практически IT компании (онлайн-кинотеатр ivi) и взяли - причём не стажёром, а в штат))) Вот вам и Практикум))) Сказали так - у вас, конечно, навыков немного не хватает для нашего уровня, но у нас есть ресурсы вас подучить. Думаю влияние сферы - всем важны навыки, а не то, где ты их получил.

24 апреля  ·  2,1 K

Насколько большой разрыв в уровне навыков между программистом-самоучкой и программистом, получившим высшее образование?

Senior fullstack developer (c#, Java, php, js).  ·  vk.com/gamedevpub

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

Программист с ВО: пользовался Паскалем, Бейсиком, Слышал про блок-схемы. Подозревает, что существуют алгоритмы.

Как говорится, в каждой шутке есть доля шутки. Если человек в институте подходил с умом к образованию (что редкость), то он прекрасно знает, что он делает и плюс у него есть корочка в подтверждение.

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

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

Разрабатываем игры и хотим, чтобы таких как мы было больше.
3 дня назад  ·  17,0 K
Прочитать ещё 15 ответов

С чего начать самостоятельное изучение IT? В инете полно статей, но много разного пишут. Так я читал, что лучше начать с turbo pascal и изучить базу. Какие именно хорошие книги посоветуете?

Alm  ·  192

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

Если хочется совсем базу, то начинать надо с книг "Искусство программирования" Дональд Кнут и "Структура и интерпретация компьютерных программ" Гарольд Абельсон и Джералд Джей Сассман. Там, конечно, тоже в качестве примера используются языки, которые толком не имеют распространения в реальном мире (ассемблер для вымышленного процессора у Кнута и язык Scheme в СИКП), но зато указанные книги считается очень хорошей базой для толкового программиста.

С другой стороны, программирование - это по большей части ремесленничество, типа починки ботинок. Чем больше пишешь - тем лучше ты программист, иначе это не работает.

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

Рейтинг TIOBE говорит нам, что сейчас популярны языки Java, C, Python, JavaScript, C#.

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

Мне очень нравятся книги серии Head First. Не все со мной согласны, не всем нравится такой неформальный подход, а меня они развлекают.

Head First "Изучаем SQL" Линн Бейли

Head First "Изучаем Java" Кэти Сьерра, Берт Бейтс

Head First "Изучаем JavaScript" Эрик Фримен, Элизабет Робсон

5 февраля 2019  ·  < 100

Какой смысл в python и других некомпилируемых языках, если их нельзя запустить без интерпретатора?

программист

На самом деле, необходимость интерпретатора - это не такая уж и большая проблема. В большинстве случаев это вообще не проблема: устанавливаешь интерпретатор и радуешься жизни. Более того, можно написать программу на C или C++, внутрь которой будет "вкомпилирован" интерпретатор python, который будет выполнять код, написанный на python. Таким образом, мы можем часть программы написать на одном языке, а часть - на другом. Главный же недостаток интерпретируемых языков - медленная (но в своей сфере применения - удовлетворительная) скорость работы по сравнению с компилируемыми. В чём же преимущества? Вот некоторые:

  • Не надо компилировать! Это экономит массу времени во время разработки, а скорость разработки - это очень серьёзный фактор в наши дни. Кто раньше выпустит продукт на рынок, тот и сорвёт куш.

  • Выразительность. В том же python есть всякие крутые штуки, которых нет в C++: сопрограммы, класс (именно сам класс, а не объект этого класса) можно присвоить в переменную или передать в качестве параметра в функцию, интроспекция (то есть объекты "знают" о том, из чего они состоят). Реализовать такие штуки в компилируемом языке бывает затруднительно.

  • Интерпретируемые языки проще портировать на разные аппаратные платформы. Интерпретатор в данном случае выступает промежуточным слоем абстракции между программой и "железом". Здесь уместно сказать о т. н. "виртуальных машинах". Виртуальная машина - это грубо говоря интерпретатор некоего промежуточного языка, в который "компилируется" исходная программа, то есть некий компромиссный вариант между двумя подходами. Насколько я понимаю, именно виртуальная машина, портируемая на любую платформу, позволила языку Java занять огромную долю на рынке ПО.

Прочитать ещё 2 ответа