JavaRush /مدونة جافا /Random-AR /مستويات لغات البرمجة
Marat Sadykov
مستوى

مستويات لغات البرمجة

نشرت في المجموعة

مقدمة

ما هي لغات البرمجة المختلفة؟ ما نوع المفاهيم المضمنة فيها؟ كيف تطوروا؟ سنتناول في هذه المقالة أنواع لغات البرمجة بناءً على ما يسمى بالمستويات – بدءًا من رموز الآلة (المستوى المنخفض، والقريبة من أجهزة الكمبيوتر) إلى لغات مثل Java أو C# (المستوى العالي). كلما قل عدد التحولات التي تمر بها قائمة النص الخاصة بالبرنامج على طول طريق التحول إلى مجموعة من الأصفار والآحاد، انخفض المستوى.
مستويات لغات البرمجة - 1
التالي سوف ننظر إلى:
  1. اللغات منخفضة المستوى (رموز الآلة والتجميع)
  2. المستوى المتوسط ​​(C، فورتران….)
  3. مستوى عالٍ (C++، Java، Python، Ruby، JavaScript...)
ويصف المستوى أيضًا مقدار التفاصيل التي يجب تفصيلها في قائمة البرنامج المستقبلي لتنفيذ التنفيذ. ما مدى سهولة هذه العملية بالنسبة للبشر؟ لا ينبغي اعتبار مستوى اللغة مؤشرا لا لبس فيه لقدراتها. لغة البرمجة هي أداة فعالة في مجال واحد وأقل فائدة في مجالات أخرى. يعمل كل من النجار والنجار بالخشب. الأول لديه أداة رئيسية - مجموعة من الأزاميل، والثاني - فأس. ومع ذلك، فإن النجار سيجعل الخزانة المنحوتة أكثر أناقة، وسيقوم النجار ببناء منزل بشكل أسرع. على الرغم من أن كل منهما قادر على القيام بعمل الآخر، إلا أنهما سيقومان بذلك بكفاءة أقل بكثير. يتم تمثيل البيانات المختلفة في جهاز الكمبيوتر كمجموعات من الأصفار والواحدات. أوامر التحكم الخاصة بمعالجتها هي نفس البيانات التي تحتوي على تعليمات تحدد مكان المعلومات الضرورية وطريقة التعديل.

لغات الآلة (المستوى الأدنى)

سيتعين علينا القيام بزيارة قصيرة من منطقة البرامج إلى منطقة الأجهزة. دعونا ننظر إليها في شكل مبسط. المعالج هو "العقل" الرئيسي للكمبيوتر. تحتوي اللوحة الأم التي تم تركيبها عليها على وحدات تحكم تُستخدم للتفاعل مع الأجهزة الأخرى عبر الناقلات (قنوات بيانات الاتصال).
مستويات لغات البرمجة - 2
يعمل بعضها بسرعة عالية (الأسهم الحمراء): يسحب المعالج الأوامر من الذاكرة ويعالج البيانات، وتستهلك بطاقة الفيديو، خاصة في الألعاب ثلاثية الأبعاد، كميات هائلة من القوام والأشكال وإحداثيات البكسل والكائنات الأخرى لبناء صورة على شاشة الشاشة . والبعض الآخر (بسبب القيود المفروضة على سرعة تبادل المعلومات) لا يحتاج إلى مثل هذه المؤشرات العالية. يتم توصيل الأجهزة الداخلية والخارجية المختلفة في الرسم التخطيطي باستخدام الأسهم الخضراء.

العالم الداخلي للمعالج

تأتي كافة أوامر المعالج من الذاكرة ليتم تنفيذها في شكل ثنائي. يعتمد التنسيق والرقم والمجموعة الفرعية من التعليمات على بنيتها. معظمهم غير متوافقين مع بعضهم البعض ويتبعون أيديولوجيات مختلفة. وأيضًا يعتمد نوع الأمر بشدة على الوضع (8/16/32... عمق البت) ومصدر البيانات (الذاكرة، التسجيل، المكدس...) الذي يعمل به المعالج. يمكن تمثيل نفس الإجراء بتعليمات مختلفة. يحتوي المعالج على تعليمات لإضافة معاملين (ADD X,Y) وإضافة واحد إلى المعامل المحدد (INC X). يمكن إضافة ثلاثية إلى المعامل باستخدام ADD X,3 أو عن طريق استدعاء INC X ثلاث مرات. وبالنسبة للمعالجات المختلفة، فمن المستحيل التنبؤ بأي من هذه الطرق سيكون الأمثل من حيث السرعة أو مساحة الذاكرة. للراحة، يتم كتابة المعلومات الثنائية في شكل سداسي عشري. لنفكر في جزء من برنامج مألوف (لغة C، التي يشبه تركيبها لغة Java)
int func() {
    int i = getData("7") ;
    return ++i;
   ...
}
كود ينفذ نفس الإجراءات في شكل سلسلة من التعليمات للمعالج: ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... هذا ما تبدو عليه بالفعل لغة البرمجة منخفضة المستوى لمعالج Intel. جزء يستدعي طريقة ذات وسيطة ويعيد النتيجة زيادة بمقدار واحد. هذه هي لغة الآلة (الكود) التي يتم نقلها مباشرة، دون تحويلات، إلى المعالج للتنفيذ. الايجابيات:
  • نحن أسياد الموقف تمامًا، ولدينا أوسع الإمكانيات لاستخدام المعالج وأجهزة الكمبيوتر.
  • جميع الخيارات لتنظيم وتحسين التعليمات البرمجية متاحة لنا.
السلبيات:
  • من الضروري أن تكون لديك معرفة واسعة بعمل المعالجات وأن تأخذ في الاعتبار عددًا كبيرًا من عوامل الأجهزة عند تنفيذ التعليمات البرمجية.
  • يؤدي إنشاء برامج أكثر تعقيدًا قليلًا من المثال الموضح إلى زيادة حادة في الوقت المستغرق في كتابة التعليمات البرمجية وتصحيح أخطائها.
  • الاعتماد على النظام الأساسي: البرنامج الذي تم إنشاؤه لمعالج واحد لن يعمل عمومًا على المعالجات الأخرى. من الممكن أن يتطلب هذا المعالج في أوضاع تشغيله الأخرى تحرير التعليمات البرمجية.
تم استخدام رموز الآلة على نطاق واسع في فجر الكمبيوتر، ولم تكن هناك طرق أخرى للبرمجة في عصر رواد الكمبيوتر. حاليًا، يتم استخدامها أحيانًا من قبل مهندسي الإلكترونيات الدقيقة عند تطوير المعالجات أو اختبارها على مستوى منخفض.

لغة التجميع (مستوى منخفض)

على عكس الكمبيوتر، ندرك أنا وأنت المعلومات بشكل أفضل في شكل نص/دلالي بدلاً من شكلها الرقمي. يمكنك بسهولة تسمية خمسين اسمًا لجهات اتصال على هاتفك الذكي، ولكن من غير المرجح أن تتمكن من كتابة أرقام هواتفهم المقابلة عن ظهر قلب. إنه نفس الشيء مع البرمجة. ننتقل إلى أعلى سلم النوع من خلال اتخاذ ثلاث خطوات أساسية:
  • دعونا نربط تعليمة رمزية واحدة بمجموعات من تعليمات المعالج الرقمي التي تؤدي الإجراءات المقابلة.
  • دعنا نسلط الضوء على وسيطات تعليمات المعالج بشكل منفصل.
  • دعونا نقدم القدرة على تسمية مناطق الذاكرة والمتغيرات وموقع الأوامر الفردية.
دعونا نقارن أجزاء البرنامج السابق في كود الآلة (في الوسط) وفي لغة التجميع (على اليمين):
2004b0     48 83 ec 08      sub    $0x8,%rsp
2004b4     bf bc 05 20 00   mov    $0x2005bc,%edi
2004b9     31 c0            xor    %eax,%eax
2004bb     e8 e8 fe ff ff   callq  getData
2004c0     48 83 c4 08      add    $0x8,%rsp
2004c4     83 c0 01         add    $0x1,%eax
كما ترون، تم تبسيط عملية كتابة البرنامج: ليست هناك حاجة لاستخدام الكتب المرجعية لتوليد قيم الأوامر الرقمية، وحساب أطوال الانتقال، وتوزيع البيانات في الذاكرة عبر خلاياها، وغيرها من ميزات المعالج. نقوم بوصف الإجراء المطلوب من مجموعة من الأوامر الرمزية والوسائط اللازمة لمنطق التنفيذ، ومن ثم يقوم برنامج المترجم بترجمة الملف النصي إلى مجموعة من الأصفار والآحاد المفهومة للمعالج. الايجابيات:
  • تم تبسيط عملية كتابة وتعديل التعليمات البرمجية.
  • تم الحفاظ على السيطرة على جميع موارد الأجهزة.
  • من الأسهل نسبيًا نقل البرنامج إلى منصات أخرى، ولكنها تتطلب تعديلًا اعتمادًا على توافق الأجهزة.
السلبيات:
  • لغة التجميع هي لغة برمجة منخفضة المستوى. من الصعب إنشاء أقسام صغيرة من التعليمات البرمجية. بالإضافة إلى ذلك، من الضروري أيضًا مراعاة التشغيل المحدد للمعدات.
  • الاعتماد على المنصة.
المثال التجريبي الأكثر شيوعًا لجافا:
public static void main(String[] args) {
    System.out.println("Hello World!");
}
سيبدو (بناء جملة NASM، باستخدام Windows API وkernel32.lib) كما يلي:
global _main
	extern  _GetStdHandle@4
	extern  _WriteFile@20
	extern  _ExitProcess@4

	section .text
_main:
	; DWORD  bytes;
	mov 	ebp, esp
	sub 	esp, 4

	; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
	push	-11
	call	_GetStdHandle@4
	mov 	ebx, eax

	; WriteFile( hstdOut, message, length(message), &bytes, 0);
    push	0
	lea 	eax, [ebp-4]
	push	eax
	push	(message_end - message)
	push	message
	push	ebx
	call	_WriteFile@20

	; ExitProcess(0)
	push	0
	call	_ExitProcess@4

	; never here
	hlt
message:
	db  	'Hello, World', 10
message_end:
مثل رموز الآلة، يتم استخدام لغة التجميع في كثير من الأحيان من قبل المهندسين ومبرمجي الأنظمة. يتم استخدامه لكتابة الأجزاء المعتمدة على الأجهزة من نواة نظام التشغيل والتي تعتبر ذات أهمية زمنية أو حاسمة لميزات تنفيذ برامج التشغيل لمختلف الأجهزة الطرفية. لكن في الآونة الأخيرة أصبح اللجوء إليها أقل فأقل، لأن استخدامه يقلل بشكل كبير من إمكانية نقل البرامج إلى منصات أخرى. في بعض الأحيان يستخدمون عملية التفكيك - حيث يقومون بإنشاء قائمة تجميع لبرنامج من الرموز الرقمية لتحليل منطق تنفيذ الأجزاء الصغيرة. في حالات نادرة، في حالة عدم توفر الكود الأصلي عالي المستوى: تحليل الفيروسات لمكافحتها أو فقدان كود المصدر. تعتبر لغة التجميع هي الجيل الأول/الثاني (لن نفكر في الرموز الزائفة بشكل منفصل قبل ظهور المجمع واختلافه عن الأوامر الرمزية). أود أن أسلط الضوء على استخدام المجمع في Demo Scene: مزيج من الفن والرياضيات والبرمجة منخفضة المستوى، يجسد الأفكار الفنية لمبدعيها في شكل برامج تولد مقاطع فيديو محدودة الموارد. في كثير من الأحيان، يجب ألا يتجاوز الحجم الإجمالي للبرنامج وملف البيانات 256 بايت (تنسيق 4/64 كيلو بايت شائع أيضًا). فيما يلي مثال لبرنامج بحجم 4 كيلو بايت:

لغات المجموعة C/فورتران (المستوى المتوسط/العالي)

مع تطور قدرات تكنولوجيا الكمبيوتر، لم يعد مقدار الوظائف وتوقيت تنفيذ التعليمات البرمجية في المجمع مرضيا. زادت تكاليف كتابة البرامج واختبارها وصيانتها بمعدل أسرع من قدراتها. وكان من الضروري تقليل المتطلبات من المبرمج من حيث المعرفة بعمل المعدات، لمنحه أداة تسمح له بالكتابة بلغات قريبة من المنطق البشري. الانتقال إلى مستوى جديد من أنواع لغات البرمجة. توفير القدرة على الانقسام إلى وحدات مختلفة مع مزيد من الاتصال المتسلسل (نموذج البرمجة الإجرائية)، وتوفير أنواع مختلفة من البيانات مع القدرة على بنائها، وما إلى ذلك. بالإضافة إلى ذلك، أدت هذه التدابير إلى تحسين إمكانية نقل التعليمات البرمجية إلى منصات أخرى، وتنظيم أكثر راحة العمل بروح الفريق الواحد. إحدى اللغات الأولى التي دعمت كل ما سبق كانت لغة فورتران، والتي تم تطويرها في الخمسينيات من القرن الماضي . إن القدرة على الإنشاء في شكل نصي مع وصف لمنطق التنفيذ باستخدام الحلقات والفروع والإجراءات الفرعية والعمل مع المصفوفات وتقديم البيانات في شكل أرقام حقيقية وعدد صحيح ومعقد أسعدت المهندسين والعلماء. وفي وقت قصير تم إنشاء "الأطر" والمكتبات العلمية. كل هذا كان نتيجة لحقيقة أن فورتران لا يزال ذا صلة اليوم، على الرغم من أنه في بيئة علمية ضيقة، ويتطور، نظرا لأن أمتعة التطورات كبيرة جدا، فإن مكتبة IMSL وحدها تتطور بنشاط منذ عام 1970 (!) هل يمكنك تذكر العديد من البرامج المماثلة ذات الصلة؟ فرع آخر من فروع تطوير اللغات في هذا المستوى هو C. إذا أصبحت Fortran أداة للعلماء، فقد تم إنشاء لغة C لمساعدة المبرمجين في إنشاء برامج تطبيقية: أنظمة التشغيل وبرامج التشغيل وما إلى ذلك. تتيح لك اللغة التحكم يدويًا في تخصيص الذاكرة وتمنحك الوصول المباشر إلى موارد الأجهزة. يتعين على مبرمجي لغة C التحكم في الكيانات ذات المستوى المنخفض، لذلك يرى الكثيرون أن لغة C هي لغة تجميع متقدمة وغالبًا ما يطلق عليها لغة "متوسطة المستوى". بعد إدخال كتابة البيانات في المجمع، وعناصر البرمجة الإجرائية والوحداتية، لا تزال لغة C واحدة من اللغات الرئيسية لبرمجة النظام، والتي يتم تسهيلها أيضًا من خلال التطور السريع للإلكترونيات الدقيقة في السنوات الأخيرة. تحتاج جميع أنواع الأدوات الذكية ووحدات التحكم والشبكات والأجهزة الأخرى إلى برامج تشغيل وتنفيذ بروتوكولات للتعاون وغيرها من البرامج ذات المستوى المنخفض نسبيًا لتنفيذ التفاعل مع المعدات. كل ما سبق يساهم في الطلب على اللغة اليوم. تم تطوير المبادئ الموجهة للكائنات والمبادئ الوظيفية بشكل أكبر في شكل C++، C#، Java، مع أخذ الكثير من بناء جملة C.
  • تبسيط عملية إنشاء الكود: إدخال الأنواع، والتقسيم إلى وحدات، وتقليل قوائم البرامج.
  • Прозрачная логика заложенного алгоритма вследствие ухода от машинных codeов к более понятным для человека командам в семантически описательном стиле.
  • Переносимость. Стало достаточно перекомпorровать текст программы для выполнения на другой платформе (возможно, с небольшой модификацией).
  • Скорость откомпorрованных программ.
Минусы:
  • Отсутствие автоматического управления памятью и необходимость постоянного её контроля.
  • Отсутствие реализации концепций an objectно-ориентированного и функционального программирования.

Развитие языков высокого уровня

بدأت لغات البرمجة عالية المستوى، من حيث إنشاء البرمجيات، بشكل متزايد في الابتعاد عن رموز الآلة وتنفيذ نماذج برمجة مختلفة بالإضافة إلى النماذج الإجرائية. وتشمل هذه أيضًا تنفيذ المبادئ الموجهة للكائنات. C++، Java، Python، JavaScript، Ruby... - مجموعة اللغات من هذا النوع هي الأكثر شيوعًا والطلبًا اليوم. إنها توفر المزيد من الفرص لتنفيذ مجموعة متنوعة من البرامج ومن المستحيل تحديد "تخصص" كل منها بوضوح. لكن شعبية التطبيق في المجالات ذات الصلة ترجع إلى المكتبات/أطر العمل للعمل معها، على سبيل المثال: JavaScript - Frontend. تم تصميم اللغة للتفاعل بين متصفح الويب الخاص بالعميل والمستخدم والخادم البعيد. المكتبات الأكثر شعبية هي Angular وReact وVUE. حاليًا، يتم استخدامه بشكل نشط نسبيًا على الويب والخوادم الأخرى (الواجهة الخلفية)، ويحظى Node.js بشعبية خاصة. روبي - الواجهة الخلفية. يتم استخدامه لإنشاء البرامج النصية (ملفات الخدمة) وعلى خوادم الويب. الإطار الرئيسي هو Ruby On Rails. بايثون هو مجال علمي وهندسي (يتجاوز نطاق الويب). إنه بديل للحوسبة القياسية والحزم الرياضية (Mathematica، Octave، MatLab...)، ولكنه يحتوي على دلالات اللغة المعتادة وعدد كبير من المكتبات. له العديد من المعجبين في مجال أنظمة التعلم الآلي والإحصاء والذكاء الاصطناعي. تشمل المكتبات المستخدمة بشكل متكرر Django، وnumpy، وpandas، وtensorflow. C++ - تطوير عالمي وتطوري للغة C. يوفر إمكانات برمجة وظيفية وموجهة للكائنات دون فقدان القدرة على التفاعل مع الأجهزة ذات المستوى المنخفض. ونتيجة لهذا، يتم تحقيق الإنتاجية والمرونة عند إنشاء البرامج، ولكن السعر يتوافق أيضًا: حاجز كبير أمام الدخول بسبب المواصفات المعقدة للغة، والحاجة إلى التحكم المستقل في الموارد عند تنفيذ البرنامج. تتم كتابة العديد من برامج المستخدم الفردي وبرامج النظام باستخدامه: وحدات نظام التشغيل (Windows، Symbian...)، الألعاب، المحررات (Adobe Photoshop، Autodesk Maya...)، قواعد البيانات (MSSQL، Oracle...)، المشغلات ( WinAmp...)، إلخ. تجدر الإشارة إلى أن البرمجيات الحديثة هي منتج معقد، يستخدم في تطويره عدة لغات برمجة في وقت واحد، وقد يكون من الصعب جدًا تحديد درجة مشاركة كل منها في النتيجة الإجمالية.

مزيد من التقدم

في الآونة الأخيرة، اكتسب نوع آخر من البرمجة شعبية - وظيفية (مزيد من التطوير لمستوى اللغة) . إليك نوع آخر من التجريد للحسابات - الدوال التي تأخذ مجموعة من الدوال كوسيطات وترجع واحدة أخرى. يتم لعب دور المتغيرات بواسطة نفس الوظائف (المتغيرات المألوفة بالنسبة لنا هي ببساطة تعبيرات ثابتة، تشبه التعبير النهائي قبل إعلان النوع في Java). الوظيفة نفسها مغلقة في نطاقها، ونتيجة عملها تعتمد فقط على الوسائط التي تم تمريرها. ويترتب على ذلك خاصيتان رائعتان:
  • للاختبار، نحتاج فقط إلى وسيطات الدالة (نتيجة العمل لا تعتمد على المتغيرات الخارجية، وما إلى ذلك).
  • يعد البرنامج ذو النمط الوظيفي جاهزًا للتزامن بأعجوبة: يمكن إصدار استدعاءات الوظائف المتسلسلة في سلاسل الرسائل المجاورة (نظرًا لأنها لا تتأثر بالعوامل الخارجية) ولا تتطلب أقفالًا (أي لا توجد مشكلات في المزامنة). حافز جيد لتخصيص الوقت لهذا الموضوع، نظرا لاعتماد المعالجات متعددة النواة على نطاق واسع.
ومع ذلك، فإن عتبة الإدخال أعلى من OOP: للحصول على تعليمات برمجية فعالة، من الضروري بناء برنامج يصف خوارزمية التنفيذ في شكل وظائف. ولكن أيضًا بالنسبة للأسلوب الوظيفي البحت، سيكون من الجيد معرفة أساسيات المنطق ونظرية الفئة. الأكثر شعبية هي هاسكل، سكالا، F#. لكن لا تخف، فقد ظهرت عناصر البرمجة الوظيفية في Java (وكذلك في لغات الجيل الثالث الحديثة الأخرى) ويمكن دمجها مع OOP. سوف تتعرف على كل هذه التفاصيل بمزيد من التفاصيل في تدريب JavaRush عبر الإنترنت. لم يجد مجال البرمجة المنطقية (المستوى التالي من اللغات) تطبيقًا عمليًا واسعًا بعد بسبب انخفاض الطلب عليه. يتطلب بناء البرامج معرفة أساسيات الرياضيات المنفصلة والمنطق المسند وأدوات القيد والفروع الأخرى للمنطق الرياضي. اللغة النشطة الأكثر شعبية هي Prolog.

خاتمة

اللغات الأكثر شيوعًا حاليًا هي OOP. Java، منذ بدايتها، كانت دائمًا في المقدمة، وعادةً في المراكز الثلاثة الأولى بين اللغات الشائعة. بالإضافة إلى OOP، فهو يحتوي على عناصر البرمجة الوظيفية، ويمكنك الجمع بين أنماط مختلفة لكتابة برامجك. نطاق تطبيقات Java واسع جدًا - هذه هي المهام التجارية، وتنفيذ خوادم الويب (الواجهة الخلفية)، واللغة الرئيسية لإنشاء تطبيقات Android، وبيئات البرمجة وأماكن العمل عبر الأنظمة الأساسية (IDE/AWM) والنمذجة، وغير ذلك الكثير. . إن مكانة Java قوية بشكل خاص في قطاع المؤسسات - وهو مجال برامج الشركات الذي يتطلب تعليمات برمجية عالية الجودة وطويلة العمر وتنفيذ منطق الأعمال الأكثر تعقيدًا.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION