إنشاء أدوات CLI بلغة C++: من الفكرة إلى الأداة الجاهزة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا تعتبر لغة C++ اللغة المثالية لأدوات CLI؟

عندما يتعلق الأمر بإنشاء أدوات CLI بلغة C++، يهز العديد من المطورين أكتافهم: "لماذا؟ هناك Python و Go و Rust". لكن دعونا نواجه الحقيقة. إذا كنت بحاجة إلى سرعة فائقة، واستهلاك ضئيل للذاكرة، وتحكم كامل في العتاد - فإن C++ لا منافس لها. لا يزال مسؤولو الأنظمة ومهندسو DevOps ومطورو الأنظمة المدمجة يكتبون أدواتهم الطرفية بهذه اللغة. وهل تعلم؟ هذا صحيح.

اليوم سنقوم بتحليل إنشاء أداة CLI بلغة C++ من الصفر - من تحليل الوسائط إلى بناء الملف الثنائي. ستتعلم كيفية كتابة أداة حقيقية ومفيدة لا تخجل من نشرها على GitHub. هيا بنا.



الأدوات: ما سنحتاجه

للعمل المريح سنحتاج إلى:

  • مترجم C++17/20 - GCC (MinGW على Windows) أو Clang. أنا شخصياً أوصي بـ GCC 11+.
  • محرر نصوص أو بيئة تطوير متكاملة - VS Code مع إضافة C++، CLion، أو حتى Vim (للمتحدين).
  • CMake - للبناء المريح. على الرغم من أنه يمكن استخدام Makefile، إلا أن CMake هو المعيار الحديث.
  • Git - أين نحن بدون التحكم في الإصدارات.

سنحتاج أيضاً إلى مكتبة لتحليل وسائط سطر الأوامر. لن نعيد اختراع العجلة وسنستخدم الأسطورية getopt (الموجودة في أنظمة POSIX) أو سنكتب محللنا البسيط الخاص بنا. الخيار الثاني أكثر إثارة للاهتمام - ستفهم كيف يعمل "تحت الغطاء".



هيكل المشروع

قبل كتابة الكود، دعونا نحدد ما ننشئه بالضبط. دعها تكون أداة fileutils - أداة طرفية للعمل مع الملفات. ستكون قادرة على:

  • حساب عدد الأسطر والكلمات والأحرف في الملف (مشابه لـ wc).
  • البحث عن سلسلة وفقاً لنمط (مشابه لـ grep بشكل بسيط).
  • عرض المساعدة (--help).

هيكل المجلدات:

fileutils/├── src/│   ├── main.cpp│   ├── parser.cpp│   └── parser.h├── CMakeLists.txt└── README.md


الخطوة 1: محلل الوسائط الخاص بنا

سنكتب محللاً بسيطاً ولكنه عملي. سيعالج الأعلام الطويلة (--lines، --words) والوسائط الموضعية (اسم الملف).



ملف parser.h

#ifndef PARSER_H#define PARSER_H

#include <string>#include <vector>#include <map>

struct Args { bool show_lines = false; bool show_words = false; bool show_chars = false; std::string pattern; std::vector<std::string> files;};

Args parse_args(int argc, char* argv[]);

#endif


ملف parser.cpp

#include "parser.h"#include <iostream>

Args parse_args(int argc, char* argv[]) { Args args; for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; if (arg == "--help" || arg == "-h") { std::cout << "Usage: fileutils [OPTIONS] FILE..." << "Options:" << " --lines, -l Print line count" << " --words, -w Print word count" << " --chars, -c Print character count" << " --search PAT Search for pattern" << " --help, -h Show this help"; exit(0); } else if (arg == "--lines" || arg == "-l") { args.show_lines = true; } else if (arg == "--words" || arg == "-w") { args.show_words = true; } else if (arg == "--chars" || arg == "-c") { args.show_chars = true; } else if (arg == "--search" && i + 1 < argc) { args.pattern = argv[++i];

المدونات

توصيات الكتب