هل يمكنني كتابة البرامج النصية في C ++؟


اضطررت مؤخرًا إلى الانغماس مرة أخرى / مرة أخرى في عالم برمجة نصوص Linux الرائع. من حيث المبدأ ، الأمر ليس صعبًا للغاية ، ولكن نظرًا لأنني لا أواجه مثل هذه المهام في كثير من الأحيان ، فإنني أدرسها مرة أخرى في كل مرة. أعلم بالتأكيد أنني سأنسى غدًا كثيرًا وفي غضون شهر ، سأقوم جوجل مرة أخرى بكيفية القيام بذلك أو ذاك. لا تزال المشكلة تتضح أنك غالبًا لا تكتب النص البرمجي مرة أخرى ، لكنك تعدل النص الموجود الذي كتبه بالفعل شخص ما. وقد لا يكون باش ، ولكن sh أو أي شيء آخر ... هناك اختلافات في بناء الجملة ، ما يعمل في sh يجب أن يعمل في bash ، ولكن ليس دائمًا بالعكس. وإذا كان هناك اندفاعة أو رماد؟ لا أعلم ... لا تزال هناك اختلافات في لغات البرمجة النصية هذه ، وهي مربكة. وبالطبع ، بالنسبة لي شخصيًا ، الكرز على الكعكة عندما يسمي البرنامج النصي ببعض السخف أو الصدم ، وهناك مثل هذه المعلمات في سطر الأوامر التي تنظر إليها وتتساءل.من الواضح أن كل هذا يعتمد على مؤهلات المبرمج ، ولكن ليس كل شيء يناسب رأسي. والآن ذهب صبرى وظننت أنه من الآن فصاعدا أريد أن أحاول كتابة نصوص بلغة ++ c ...

أفهم أنه بالنسبة لمسؤول النظام الحقيقي ، قد يبدو تفكيري مثيرًا للفتنة. لكن لما لا؟

لذا فإن الفكرة بسيطة للغاية. أريد أن أكتب سكربتات c ++ بنفس طريقة كتابة السكربتات العادية ، أي أن السطر الأول من النص البرمجي يجب أن يحتوي على shebang وإشارة إلى المسار إلى "مترجم":

#!/bin/c++

ستكون الأسطر اللاحقة من البرنامج النصي مجرد برنامج c ++ عادي.

لا بد لي من إعداد "مترجم" النصي سي + +. يمكنك كتابتها على أي شيء ، على الأقل على باش (هذه هي المرة الأخيرة ، وإن لم تكن بالضبط). بالطبع ، لن يكون مترجمًا ، بل مترجمًا.

هذا ما فعلته:

#!/bin/bash

msg_file=/dev/null
#msg_file=/dev/stdout

tmp_path=$HOME"/.cache/c++/"
mkdir -p $tmp_path
tmp_file=$1".c++"
exe_file=$1".bin"
if test $1 -nt  $tmp_path$exe_file; then
    echo "Need to recompile.." > $msg_file
    tail -n +2 $1 > $tmp_path$tmp_file
    eval "g++ -o $tmp_path$exe_file $tmp_path$tmp_file > /dev/null 2>&1"
    if [ $? -eq 0 ]
    then
	echo "Compiled ok" > $msg_file
    else
	echo "Compile error" > $msg_file
	exit 255
    fi
fi
eval "$tmp_path$exe_file $@1"

هذا البرنامج النصي يفعل كل ما تحتاجه. كمجلد مؤقت ، اخترت المجلد ~ / .cache / c ++. سيتم نسخ البرنامج النصي الأصلي إلى هذا المجلد ، ولكن بدون السطر الأول مع shebang. يتم ذلك عن طريق الأمر الذيل. سيكون اسم الملف الجديد مثل البرنامج النصي الأصلي ، ولكن مع الامتداد c ++. سيتم جمع الملف الثنائي مع الملحق .bin في نفس المجلد. ولكن أولاً ، بالطبع ، يتم إجراء فحص "اختبار" في الوقت الذي يتم فيه إنشاء الثنائي. يحدث التجميع فقط إذا كان الثنائي الموجود قديمًا في الوقت المناسب فيما يتعلق بـ "البرنامج النصي" الأصلي. يتم تشغيل الثنائي باستخدام الأمر Eval ويتم تمرير جميع المعلمات الأولية إليه.

يجب نسخ ملف c ++ هذا إلى مجلد / bin وجعله قابلاً للتنفيذ (chmod a + x).

سأحاول أن أكتب "سكربت" c ++ الأول:

#!/bin/c++

#include <stdio.h>
#include <iostream>

using namespace std;

int main( int argc, char *argv[] )
{
    cout << "hello world!\n";
    for( int i=0; i<argc; i++)
    {
	cout << "Param" << i <<  " is " << argv[i] << "\n";
    }
    return 60+argc;
}

يقوم هذا البرنامج ببساطة بطباعة قائمة من معلمات الإدخال وإرجاع الرقم + 60. أقوم
بتشغيل "البرنامج النصي" الخاص بي:



يعمل !!!

إذا قمت بخطأ في كود c ++ ، فلن يبدأ البرنامج ، لأنه لن يترجم ، ولكن صدى $؟ سيعود 255. ولكن هذا كان المقصود.

يوفر استخدام C ++ فرصًا هائلة. أولا ، بناء الجملة المألوف. ثانيًا ، الفئات القياسية مثل std :: vector أو std :: map أو std :: string وغيرها هي أشياء لا يمكن استبدالها. نفس الخط - أياً كان ما تريد فعله به ، انظر في السطر ، وقم بتقسيمه إلى سلاسل فرعية ، وافصله وقهره ، واحصل على المصفوفات. ولست بحاجة إلى سيد أو awk. ثالثًا ، المصحح - الله! يا لها من نعمة! لدي مصحح gdb للبرنامج النصي! علاوة على ذلك ، يمكنك استخدام std :: filesystem (إذا سمح المترجم). يمكنك الذهاب على ...

لسوء الحظ ، غالبًا ما يحدث لي أنني سأفعل ذلك أولاً ، ثم سأفكر: "ماذا لو فعل شخص ما هذا بالفعل؟" وفي الحقيقة ، لست أول من توصل إلى فكرة القيام بنفس الشيء. هنا مثال: https://github.com/dimgel/cpp-linux-scripts الفكرة هي نفسها ، التنفيذ مختلف. ثم اتضح أن هناك تطبيقات أخرى .

بشكل عام ، عانيت من خيبة أمل طفيفة في عدم حصري. ومع ذلك ، بحثت عن هبر - لم أجد واحدة مماثلة. ربما شخص يبدو فضوليا على الأقل؟

All Articles