"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > فهم أوقات التشغيل: من C إلى اللغات الحديثة

فهم أوقات التشغيل: من C إلى اللغات الحديثة

تم النشر بتاريخ 2024-11-08
تصفح:182

Understanding Runtimes: From C to Modern Languages

في عصر تطوير البرمجيات الحديثة والبرمجة، يمكن أن يعني مصطلح "وقت التشغيل" أشياء مختلفة اعتمادًا على السياق واللغة التي تتم مناقشتها. أنا هنا لتوضيح هذه الاختلافات، مع التركيز على كيفية عمل أوقات التشغيل في لغة C مقارنة باللغات الحديثة مثل Java أو Python. أنوي إبقاء هذه المقالة مركزة على المبرمجين المبتدئين، لذلك سأتجنب الخوض في المفاهيم المعقدة.

ما هو وقت التشغيل؟

وقت التشغيل في جوهره هو برنامج يقرأ وينفذ التعليمات البرمجية التي كتبها المطور. لكن الأمر يصبح مربكًا عندما يستخدم بعض المطورين وقت التشغيل مع لغة C.

أوقات تشغيل اللغة الحديثة

في لغات مثل Java أو Python، يكون وقت التشغيل هو البرنامج نفسه الذي يقرأ ملف myfile.js الخاص بك، ولهذا السبب تقوم بتشغيل برامج Nodejs مثل: Node myfile.js وv8 Engine( هو محرك JavaScript، فهو يوزع وينفذ JavaScript code.) يدير كل شيء سواء قمت بإنشاء ملف جديد، أو قمت بتدوير عملية فرعية وما إلى ذلك، والأهم من ذلك أنه لا يمكنك فعل أي شيء لا يسمح لك الإصدار الثامن بفعله.
لكن عندما تقوم بتشغيل برنامج بلغة C فإنك لا تستخدم لغة c myfile.c، بل يتعين عليك فقط تجميعه مرة واحدة، والآن لا تحتاج إلى gcc بعد الآن، فقط قم بتشغيله مباشرة.

"وقت التشغيل" C

في لغة C، لا يوجد برنامج منفصل يعمل جنبًا إلى جنب مع التعليمات البرمجية الخاصة بك بنفس الطريقة كما هو الحال في Java أو Python. بدلاً من ذلك، فإن ما يُطلق عليه غالبًا "وقت التشغيل" C هو في الواقع مجموعة من التعليمات البرمجية والتعليمات المُدرجة بشكل ثابت والتي تمت إضافتها أثناء التجميع. إنها مجموعة بسيطة من التعليمات المضمنة في الملف الثنائي النهائي للتعامل مع بعض المهام الضرورية على مستوى وحدة المعالجة المركزية/نظام التشغيل. فهو يتعامل مع إنشاء إطار المكدس وتفكيكه لاستدعاءات الوظائف (باستخدام تعليمات مثل PUSH وPOP وCALL وRET في التجميع). وحتى ذلك يمكن تجاوزه من خلال توفير وظيفة __start الخاصة بك باستخدام التجميع المضمن، مما يمنح المطورين التحكم الكامل في نقطة دخول البرنامج وتهيئته.


void __start() {
// Custom entry point, no standard library initialization
// You have no access to argc and argv here unless you access them manually from registers
// you can create you own custom stack setup, initialization and etc here.

// Exit directly using a syscall
asm("mov $60, %rax; mov $0, %rdi; syscall"); // exit(0) syscall
}


لا يبدو هذا وكأنه وقت تشغيل على الإطلاق، فهو مجرد رمز لغة تجميع تمت إضافته بواسطة المترجم حتى لا يضطر المطورون إلى ذلك.

قوة ومسؤولية C

في لغة C، يمكنك استدعاء مكالمات النظام مباشرةً باستخدام التجميع المضمن للتفاعل مع النواة بطرق لا يسمح بها نظام التشغيل عادةً، وهذه هي الطريقة التي يتم بها إنشاء البرامج الضارة. يسمح التجميع المضمن للمطورين بكتابة تعليمات لغة التجميع ضمن كود C. يُستخدم هذا غالبًا للحصول على تعليمات برمجية مهمة للأداء أو للوصول إلى ميزات أجهزة معينة.

التجميع المضمن في C

  • يسمح التجميع المضمن للمطورين بكتابة تعليمات لغة التجميع ضمن كود C. يُستخدم هذا غالبًا للحصول على تعليمات برمجية مهمة للأداء أو للوصول إلى ميزات أجهزة معينة.
  • يوفر طريقة لتنفيذ تعليمات وحدة المعالجة المركزية مباشرة.

التفاعل المباشر مع النواة

  • باستخدام التجميع المضمن، يمكن للمبرمج استدعاء استدعاءات النظام مباشرة دون المرور عبر المكتبات ذات المستوى الأعلى.
  • على سبيل المثال، يمكننا استخدام التجميع المضمن لإعداد السجلات باستخدام المعلمات المناسبة لاستدعاء النظام ثم تشغيله.
  • بما أن التجميع المضمن يسمح بالتحكم على مستوى منخفض في موارد النظام، فيمكن استخدامه لتجاوز آليات الأمان أو التعامل مع النواة مباشرة. هذه هي الطريقة التي يمكن بها للبرامج الضارة تنفيذ إجراءات غير مصرح بها، مثل الوصول إلى الذاكرة المحمية، أو اعتراض مكالمات النظام، أو معالجة العمليات وذاكرتها.
  • يمكن للبرامج الضارة استغلال الثغرات الأمنية في نظام التشغيل أو استخدام هذه التفاعلات ذات المستوى المنخفض لتنفيذ مهام مثل تسجيل لوحة المفاتيح أو تصعيد الامتيازات أو عمليات التخفي.

في نظام التشغيل Linux C، يوجد علامة FLAG تسمح لك بكتابة بيانات الملف مباشرة إلى جهاز تخزين، وتجاوز بعض آليات التخزين المؤقت للنواة، وتسمى علامة O_DIRECT والتي يتم استخدامها مع استدعاءات النظام المفتوحة والكتابة. تضمن هذه العلامة عدم تخزين البيانات مؤقتًا في ذاكرة الوصول العشوائي (RAM) أو إدارتها بواسطة kernel في مساحة kernel، مما يؤدي إلى كتابة البيانات مباشرة إلى القرص الصلب، ولن يسمح لك JVM بذلك، وهذا مجرد مثال واحد بسيط.
إليك مثال بسيط:


asm volatile (
"syscall"
: "=a" (written)
: "0" (1),
"D" (fd),
"S" (buffer),
"d" (BLOCK_SIZE)
: "rcx", "r11", "memory"
);


*ملاحظة: * (مكتوب) هو متغير تم إنشاؤه داخل main()، (1) هو رقم syscall للكتابة، (fd) هو المكان الذي سيتم كتابة الملف فيه، أي int fs = open("path .log"،O_WRONLY; (BLOCK_SIZE) هو اسم متغير آخر. إنه أكثر تعقيدًا من ذلك.

تطور أوقات التشغيل

من المهم أن نفهم أن مفهوم وقت التشغيل قد تطور على مر السنين. يختلف "وقت تشغيل" لغة C في السبعينيات تمامًا عن بيئات التشغيل القوية التي نراها في اللغات منذ العقد الأول من القرن الحادي والعشرين. يمكن أن يؤدي هذا التطور إلى حدوث ارتباك عند مناقشة أوقات التشغيل، خاصة بين المطورين المطلعين على عصور البرمجة المختلفة.

خاتمة

أعتقد أن الناس يقارنون الآن وقت التشغيل في السبعينيات مع أوقات التشغيل في العقد الأول من القرن الحادي والعشرين، مما يؤدي إلى الخلط بين المطورين الجدد والمطورين القدامى.
حل مشكلة معينة هو المهمة الرئيسية لأي لغة برمجة، ولا ترغب في كتابة إطار عمل كامل لإنشاء واجهات برمجة التطبيقات في لغة C، فلدينا عقدة Nodejs وهي جيدة في ذلك ولا تحتاج إلى كتابة تعليمات برمجية معدنية في جافا سكريبت لأننا لديك بالفعل لغة C وهي رائعة في ذلك. لماذا نعيد اختراع العجلة، فلنستخدمها ونصنع سيارة رائعة، إلا إذا كنت لا ترغب في قيادتها على المريخ.

بيان الافراج هذه المقالة مستنسخة على: https://dev.to/bossysmaxx/understanding-runtimes-from-c-to-modern-languages-3fkj?1​ إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] للحذف هو - هي
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3