مما تتكون لغة جافا؟ لغة برمجة جافا

13.04.2019

تم إنشاء لغة Java في عام 1995، وعلى مدار 22 عامًا من وجودها، فازت بقلوب الملايين من المبرمجين. كيف فعلها؟ لماذا لم يظهر بديل واحد يستحق خلال هذا الوقت؟ لفهم ذلك، دعونا نتحدث عن ميزات لغة جافا.

عند إطلاق اللغة، وضعت شركة Sun Microsystems خمسة نماذج للنجاح المحتمل:

  1. البساطة والتوجيه الموضوعي وسهولة الفهم؛
  2. الموثوقية والسلامة.
  3. قابلية النقل واستقلالية النظام الأساسي؛
  4. أداء عالي؛
  5. قابلية التفسير والتدفق والديناميكية.

دعونا ننظر إلى كل واحد منهم بمزيد من التفصيل.

بساطة

تم توريث بناء جملة اللغة من C++. اليوم، مقارنة بـ Python أو Groove أو Go، من الصعب وصفها بأنها بسيطة، ولكن مظهرها التطوري جعل من الممكن جذب انتباه مطوري لغة C.

يبدو برنامج Hello World القياسي كما يلي:

الفراغ العام الثابت الرئيسي (وسائط السلسلة)
{
System.out.println("مرحبا بالعالم");
}

هذا النوع من البناء لا يزيد من سرعة الكتابة، لكنه سهل القراءة والفهم وإعادة الإنتاج.

مصداقية

يتم ضمان الموثوقية من خلال مبدأين:

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

بالإضافة إلى ذلك، كان المقصود من Java في الأصل منع الوصول المباشر إلى الذاكرة، مما قد يؤدي أيضًا إلى زيادة الموثوقية. لكن المطورين تركوا العديد من الثغرات، على سبيل المثال الباب الخلفي sun.misc.Unsafe، الذي يتجاوز هذا الحظر.

أمان

بالإضافة إلى الحفاظ على الشكل العام للبنيات، فقدت Java رسميًا خطرين محتملين، مقارنةً بـ C++: المؤشرات والوراثة المتعددة. في الواقع، يتم الحفاظ على كلتا الوظيفتين، ولكن يتم تقديمهما في شكل مختلف: يتم استخدام القيم بدلاً من المؤشرات، وتشارك الواجهات، بدلاً من الفئات، في الميراث المتعدد. ومع ذلك، فإن هذه الميزة في برمجة جافا تقضي تقريبًا على الضرر المحتمل الناتج عن إهمال المطور.

راحة

يبدو مفهوم Java حرفيًا مثل: "اكتب مرة واحدة، وقم بالتشغيل في أي مكان". أي أن قابلية تنفيذ التعليمات البرمجية لا تعتمد على نظام التشغيل المستخدم أو البرنامج المثبت. يتم تحقيق ذلك من خلال الترجمة إلى رمز بايت بواسطة الجهاز الظاهري JVM.

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

أداء

إن خصوصية Java المرتبطة بالترجمة إلى كود ثانوي لها أيضًا تأثير إيجابي على أداء المنتجات النهائية. من حيث سرعة التنفيذ، فإن البرامج المماثلة في Java تكون أقل بمقدار 1.5-2 مرة من البرامج في C/C++، بينما تتفوق على JavaScript وRuby وPython.

النظام البيئي المتطور

على مدى 22 عاما من الحياة، اكتسبت اللغة العشرات من IDEs والأطر، ومئات المجتمعات والمنتديات، وآلاف المكتبات والمكونات الإضافية. كل هذا له تأثير مفيد على عتبة الدخول إلى المهنة والطلب وجودة المنتجات المنتجة باستخدام Java.

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

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

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

من المحتمل أنك سمعت مصطلح "برنامج مكتوب لنظام التشغيل Windows أو Linux أو Unix" أكثر من مرة. الحقيقة هي أن بيئات البرمجة عند ترجمة لغة البرمجة إلى كود الآلة يمكن أن تكون من نوعين - المترجمين والمترجمين الفوريين. يحدد تجميع البرنامج أو تفسيره كيفية استمرار تنفيذ البرنامج على الجهاز. البرامج المكتوبة بلغة Java تعمل دائمًا على أساس التفسير، بينما يتم تجميع البرامج المكتوبة بلغة C/C++. ما هو الفرق بين هاتين الطريقتين؟

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

البرمجة الشيئية

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

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

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

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

الطبقات

جوهر جميع برامج Java هو الفئات التي تعتمد عليها البرمجة الشيئية. أنت تعرف بالفعل ما هي الفصول الدراسية، لكنك لا تدرك ذلك بعد. تحدثنا في القسم السابق عن الكائنات، باستخدام بنية الكمبيوتر بأكمله كمثال. كل كائن يتم تجميع الكمبيوتر منه هو ممثل لفئته. على سبيل المثال، تعمل فئة Monitor على توحيد جميع الشاشات، بغض النظر عن أنواعها وأحجامها وقدراتها، وتكون شاشة واحدة معينة موضوعة على مكتبك بمثابة كائن من فئة الشاشة.

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

طُرق

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

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

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

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

بناء الجملة ودلالات لغة جافا

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

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

هاتف الطبقة
{
تمكين () الأسلوب
{
// عمليات تشغيل الهاتف
}
طريقة تعطيل ().
{
// عمليات لإيقاف تشغيل الهاتف
}
}

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

الآن دعونا نكتب نفس الفصل في جافا فقط.

هاتف الطبقة
{
باطل على ()
{
// نص طريقة on()
}
باطل ()
{
// نص طريقة الإيقاف ().
}
}

تعلن الكلمة الأساسية فئة في لغة Java عن فئة متبوعة باسم الفئة نفسها. في حالتنا، هذا هو الهاتف. بضع كلمات فقط حول سجل التسجيل. في جميع لغات البرمجة تقريبًا، من المهم حفظ الأسماء في السجل الذي كتبت فيه. إذا كتبت Telefon، فإن التهجئة مثل telefon أو TELEfoN ستؤدي إلى حدوث خطأ أثناء التجميع. كما كتبنا في البداية، هذه هي الطريقة التي يجب أن نستمر في الكتابة بها.

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

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

تحتوي كلتا الطريقتين على أقواس () يمكن كتابة المعلمات من خلالها، مثل on(int time) أو on(int time, int time1). بمساعدة المعلمات، هناك نوع من الاتصال بين الأساليب والعالم الخارجي. يُقال إن طريقة on(int time) تأخذ معلمة زمنية. لما هذا؟ على سبيل المثال، تريد تشغيل هاتفك في وقت معين. بعد ذلك، سيتم تمرير القيمة الصحيحة في معلمة الوقت إلى نص الطريقة، وبناءً على البيانات المستلمة، سيتم تشغيل الهاتف. إذا كانت الأقواس فارغة، فإن الطريقة لا تقبل أي معلمات.

تعليقات

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

التعليقات في Java يمكن أن تكون من ثلاثة أنواع:

//، /*…*/ و /**…*/

التعليقات المكتوبة باستخدام عامل التشغيل // يجب أن تظهر في سطر واحد:

// خط واحد
!!! خطأ! لا يمكنك لفه على السطر الثاني!
// السطر الأول
// السطر الثاني
// …
// الخط الأخير

يمكن للتعليقات التي تستخدم عوامل التشغيل /*…*/ أن تمتد إلى عدة أسطر. في بداية تعليقك ضع /*، وفي النهاية عند الانتهاء من تعليق الكود ضع المعامل */. يتم استخدام النوع الأخير من التعليق /**…*/ عند توثيق التعليمات البرمجية ويمكن أيضًا وضعه على أي عدد من الأسطر.

أنواع بيانات جافا

لتعيين قيمة عشوائية، تحتوي Java على أنواع بيانات. في فئة Telefon قمنا بإنشاء طريقتين. لم يكن لدى كلتا الطريقتين أي معلمات، ولكن عندما تم تقديم مثال طريقة on(int time) مع معلمة زمنية، تحدثوا عن تمرير قيمة إلى الطريقة. تشير هذه القيمة إلى الوقت الذي من المفترض أن يتم تشغيل الهاتف فيه. يحدد محدد int نوع القيمة الزمنية. هناك ستة أنواع من البيانات في Java 2 ME.

البايت – قيمة عددية صغيرة من -128 إلى 128؛
short - قيمة عددية قصيرة في النطاق من -32768 إلى 32767؛
int - يحتوي على أي قيمة عددية من -2147483648 إلى 2147483647؛
طويلة - قيمة عددية كبيرة جدًا، من -922337203685475808 إلى 9223372036854775807؛
char هو ثابت أحرف Unicode. يتراوح نطاق هذا التنسيق من 0 إلى 65536، أي ما يعادل 256 حرفًا. يجب كتابة أي حرف من هذا النوع بين علامتي اقتباس مفردتين، على سبيل المثال: 'G'؛
boolean هو نوع منطقي له قيمتان فقط: false و true. غالبا ما يستخدم هذا النوع في الحلقات، والتي سيتم مناقشتها لاحقا. المعنى بسيط للغاية - إذا كان لديك أموال في جيبك، فمن المفترض أن يكون هذا صحيحًا، وإذا لم يكن الأمر كذلك، فهو خطأ. وبالتالي، إذا كان لدينا مال، نذهب إلى المتجر لشراء الخبز أو البيرة (ضع خطًا تحت ما هو مناسب)، وإذا لم يكن هناك مال، نبقى في المنزل. أي أن هذه قيمة منطقية تساهم في اختيار الإجراءات الإضافية لبرنامجك.

للإعلان عن بعض القيمة الضرورية، استخدم الإدخال التالي:

الوقت الحقيقي؛
BigTime طويل؛
كلمة شار؛

مطلوب عامل الفاصلة المنقوطة بعد الإدخالات ويتم وضعه في نهاية السطر. يمكنك الجمع بين عدة تصريحات من نفس النوع، مفصولة بفواصل:

وقت الجبل، الوقت 1، الوقت 2؛

الآن دعونا نحسن فئة Telefon الخاصة بنا عن طريق إضافة بعض القيم إليها. لم نعد بحاجة إلى التابعين on() و off()؛ فلنضيف أساليب جديدة يمكنها بالفعل حل مشكلات معينة.

هاتف الطبقة
{
//S - منطقة العرض
// ث - عرض العرض
// ح - ارتفاع العرض
كثافة العمليات ث، ح، S؛
// الطريقة التي تحسب مساحة العرض
منطقة فورد ()
{
S = ث * ح؛
}
}

لذلك، لدينا ثلاثة متغيرات S وw وh، وهي المسؤولة، على التوالي، عن مساحة الشاشة وعرضها وارتفاعها بالبكسل. تقوم طريقة Area () بحساب مساحة شاشة الهاتف بالبكسل. العملية غير مجدية، ولكنها توضيحية للغاية وسهلة الفهم. لقد وجد نص طريقة Area() نفسه وله النموذج S = w*h. في هذه الطريقة، نقوم ببساطة بضرب العرض في الارتفاع وتعيين أو، كما يقولون، تخزين النتيجة في المتغير S. سيحتوي هذا المتغير على قيم مساحة العرض لهذا الهاتف.

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

العمليات الحسابية

جميع العوامل الحسابية بسيطة جدًا وتشبه عوامل الضرب "*" والقسمة "/" والجمع "+" والطرح "-" المستخدمة في الرياضيات. هناك عامل تقسيم modulo "%" وحالة مربكة قليلاً للوهلة الأولى مع عامل التشغيل المتساوي "=". يُسمى عامل التساوي بعامل التعيين في لغات البرمجة:

هنا تقوم بتعيين القيمة 3 للمتغير x، ويتوافق المعامل "يساوي" في لغات البرمجة مع كتابة عاملين "متساويين" متتاليين: "==". دعونا نلقي نظرة على مثال لما يمكن أن تفعله العوامل الحسابية المختلفة.

إنت س، ص، ض؛
س = 5؛
ص = 3؛
ض = 0؛
ض = س + ص؛

في هذه الحالة، سيكون لـ z قيمة مجموع x وy، أي 8.

المتغير x كان له القيمة 5، ولكن بعد هذا التسجيل يتم فقدان القيمة السابقة ويتم كتابة المنتج z*x (8*5)، وهو ما يساوي 40. الآن، إذا واصلنا الكود الخاص بنا، ستبدو المتغيرات مثله:

// س = 40؛
// ص = 3؛
// ض = 8؛

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

إن عوامل التناقص "--" والزيادة "++" محددة جدًا، ولكنها بسيطة جدًا. في البرمجة، غالبًا ما تكون هناك أوقات تحتاج فيها إلى زيادة القيمة أو تقليلها بمقدار واحد. يحدث هذا غالبًا في دورات. عملية الزيادة تزيد المتغير بمقدار واحد.

إنت س = 5؛
س++;
// هنا x يساوي بالفعل 6

عملية التخفيض تقلل المتغير بمقدار واحد.

إنت س = 5؛
س--;
// س يساوي 4

يمكن أن تكون عمليات الزيادة والنقصان لاحقة وبادئة:

إنت س = 5؛
كثافة العمليات ص = 0؛
ص = س++;

في السطر الأخير من الكود، يتم تعيين القيمة x أولاً إلى y، وهي القيمة 5، وبعد ذلك فقط يتم زيادة المتغير x بمقدار واحد. لقد أتضح أن:

زيادة البادئة لها الشكل:

إنت س = 3؛
كثافة العمليات ص = 0؛
ص = ++x;

وفي هذه الحالة، يتم أولاً زيادة المتغير x بمقدار واحد، ثم يقوم بتعيين القيمة المتزايدة بالفعل إلى y.

العوامل العلاقية

تسمح لك العوامل العلائقية باختبار ما إذا كان كلا جانبي التعبير متساويين. يوجد عامل مساواة "=="، عوامل تشغيل أقل من "<» и больше «>"، أقل أو متساوية "<=» и больше или равно «>="، بالإضافة إلى عامل النفي "! =".
9 == 10;

هذا التعبير غير صحيح، تسعة لا يساوي عشرة، وبالتالي فإن قيمة هذا التعبير خاطئة.

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

العوامل المنطقية

هناك نوعان من العوامل المنطقية. عامل التشغيل "AND"، يُشار إليه بالرمزين "&&" وعامل التشغيل "OR"، يُشار إليه بخطين مائلين للأمام "||". على سبيل المثال، هناك تعبير:

أ*ب &&ب*ج؛

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

أ*ب || قبل الميلاد؛

إذا كان أي جزء من التعبير صحيحا، فإن التعبير بأكمله صحيح. يمكن دمج كلا العاملين في تعبير واحد، على سبيل المثال:

أ*ب || ب*ج &&ج*د || ب*أ؛

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

, ., (),
!، ~، ++، – –، + (أحادي)، – (أحادي)، جديد،
*, /, %,
+, –,
<<, >>, >>>,
<, <=, >, >=,
= =, !=,
&, ^, |,
&&,
||,
?:,
=, +=, –=, *=, /=, %=, |=, ^=, <<=, >>=, >>>=.

يتبع ترابط العوامل في القائمة من اليسار إلى اليمين ومن الأعلى إلى الأسفل. أي أن كل ما هو عن اليسار فما فوق هو أعلى مرتبة وأهم.

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

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

من المحتمل أنك سمعت مصطلح "برنامج مكتوب لنظام التشغيل Windows أو Linux أو Unix" أكثر من مرة. الحقيقة هي أن بيئات البرمجة عند ترجمة لغة البرمجة إلى كود الآلة يمكن أن تكون من نوعين - المترجمين والمترجمين الفوريين. يحدد تجميع البرنامج أو تفسيره كيفية استمرار تنفيذ البرنامج على الجهاز. البرامج المكتوبة بلغة Java تعمل دائمًا على أساس التفسير، بينما يتم تجميع البرامج المكتوبة بلغة C/C++. ما هو الفرق بين هاتين الطريقتين؟

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

البرمجة الشيئية

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

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

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

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

الطبقات

جوهر جميع برامج Java هو الفئات التي تعتمد عليها البرمجة الشيئية. أنت تعرف بالفعل ما هي الفصول الدراسية، لكنك لا تدرك ذلك بعد. تحدثنا في القسم السابق عن الكائنات، باستخدام بنية الكمبيوتر بأكمله كمثال. كل كائن يتم تجميع الكمبيوتر منه هو ممثل لفئته. على سبيل المثال، تعمل فئة Monitor على توحيد جميع الشاشات، بغض النظر عن أنواعها وأحجامها وقدراتها، وتكون شاشة واحدة معينة موضوعة على مكتبك بمثابة كائن من فئة الشاشة.

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

طُرق

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

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

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

Java هي لغة برمجة تم تطويرها بواسطة SunMicrosystems. يتم عادةً تجميع تطبيقات Java إلى رمز بايت مخصص حتى يمكن تشغيلها على أي جهاز Java ظاهري (JVM)، بغض النظر عن بنية الكمبيوتر. تاريخ الإصدار الرسمي: 23 مايو 1995. توفر تقنية Java اليوم الأدوات اللازمة لتحويل صفحات الويب الثابتة إلى مستندات تفاعلية وديناميكية وإنشاء تطبيقات موزعة ومستقلة عن النظام الأساسي.

تتم ترجمة برامج Java إلى رمز بايت، والذي يتم تنفيذه بواسطة Java Virtual Machine (JVM)، وهو برنامج يعالج الرمز الثانوي ويمرر التعليمات إلى الجهاز كمترجم.

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

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

تطبيق تقنية ترجمة البايت كود إلى كود الآلة مباشرة أثناء تشغيل البرنامج (تقنية JIT) مع إمكانية حفظ إصدارات الفئة في كود الآلة،

الاستخدام الواسع النطاق للتعليمات البرمجية الموجهة نحو النظام الأساسي (الكود الأصلي) في المكتبات القياسية،

الأجهزة التي توفر معالجة سريعة للرمز الثانوي (على سبيل المثال، تقنية Jazelle، المدعومة من قبل بعض معالجات ARM).



ميزات اللغة الرئيسية:

إدارة الذاكرة التلقائية.

قدرات موسعة للتعامل مع المواقف الاستثنائية؛

مجموعة غنية من أدوات تصفية الإدخال/الإخراج؛

مجموعة من المجموعات القياسية، مثل المصفوفة والقائمة والمكدس وما إلى ذلك؛

توافر أدوات بسيطة لإنشاء تطبيقات الشبكة (بما في ذلك استخدام بروتوكول RMI)؛

توفر الفئات التي تسمح لك بتقديم طلبات HTTP ومعالجة الاستجابات؛

أدوات لغة مدمجة لإنشاء تطبيقات متعددة الخيوط؛

الوصول الموحد إلى قواعد البيانات:

على مستوى استعلامات SQL الفردية - بناءً على JDBC، SQLJ؛

على مستوى مفهوم الكائنات التي لديها القدرة على تخزينها في قاعدة بيانات - بناءً على كائنات بيانات Java وJava Persistence API؛

دعم القالب (بدءًا من الإصدار 1.5)؛

التنفيذ الموازي للبرامج.

1.4.3 لغة البرمجة C#

في يونيو 2000، أصبح معروفًا عن لغة برمجة جديدة ولدت في أعماق مايكروسوفت. لقد أصبح جزءًا من تقنية Microsoft جديدة تسمى .NET (اقرأ "Dot Net"). توفر هذه التقنية بيئة تنفيذ موحدة للبرامج (Common Language Runtime, CLR) المكتوبة بلغات برمجة مختلفة. إحدى هذه اللغات، وهي اللغة الرئيسية في هذه البيئة، هي لغة C# (C#، اقرأ "C Sharp"). اسم اللغة بالطبع أراد التأكيد على علاقتها بـ C++، لأن # عبارة عن إيجابيتين متقاطعتين. ولكن الأهم من ذلك كله أن اللغة الجديدة تشبه لغة Java. ولا شك أن أحد أسباب ظهورها كان رغبة مايكروسوفت في الرد على تحدي صن.

على الرغم من عدم ذكر أسماء مؤلفي لغة C# رسميًا، فإن صفحة العنوان لإحدى الإصدارات الأولية لمراجع اللغة تسرد أندرس هيجلسبيرج، مبتكر Turbo Pascal وDelphi، الذي انتقل إلى Microsoft في عام 1996، وسكوت ويلتاموث.

تعتمد بيئة تنفيذ البرنامج الموحدة على استخدام اللغة المتوسطة IL (اللغة المتوسطة)، والتي تلعب تقريبًا نفس الدور الذي يلعبه الرمز الثانوي لجهاز Java الظاهري. تقوم المترجمات المستخدمة ضمن تقنية .NET من لغات مختلفة بترجمة البرامج إلى كود IL. مثل Java bytecode، يمثل كود IL تعليمات على جهاز كمبيوتر افتراضي قائم على المكدس. ولكن هناك أيضًا اختلاف في تصميم واستخدام IL.

أولاً، على عكس JVM، لا ترتبط IL بلغة برمجة واحدة. تتضمن إصدارات ما قبل النشر من Microsoft.NET برامج التحويل البرمجي لـ C++ وC# وVisual Basic. يمكن للمطورين المستقلين إضافة لغات أخرى عن طريق إنشاء مترجمين من تلك اللغات إلى كود IL.

ثانيًا، IL ليس مخصصًا لتفسير البرامج، ولكن للتجميع اللاحق في كود الآلة. يتيح لك ذلك تحقيق أداء أعلى بكثير للبرنامج. تحتوي الملفات التي تحتوي على كود IL على معلومات كافية لتشغيل المترجم الأمثل.

"C# هي لغة بسيطة وحديثة وموجهة للكائنات وآمنة للنوع تنحدر من C وC++. ستكون لغة C# ملائمة ومفهومة للمبرمجين الذين يعرفون لغة C وC++. تجمع لغة #C بين إنتاجية Visual Basic وقوة لغة C++." تبدأ هذه الكلمات في وصف لغة C#.

دعونا نلقي نظرة على الميزات التقنية للغة:

وحدة الترجمة هي ملف (كما في C، C++، Java). قد يحتوي الملف على وصف واحد أو أكثر للأنواع: الفئات (الفئة)، والواجهات (الواجهة)، والهياكل (البنية)، والتعدادات (التعداد)، وأنواع المفوضين (المفوضين) مع (أو بدون) الإشارة إلى توزيعها عبر مساحات الأسماء؛

تنظم مساحات الأسماء رؤية كائنات البرنامج (كما هو الحال في C++). يمكن أن تكون متداخلة مساحات الأسماء. يُسمح باستخدام كائنات البرنامج دون تحديد مساحة الاسم التي ينتمي إليها هذا الكائن بشكل صريح. يكفي مجرد ذكر عام لاستخدام مساحة الاسم هذه في توجيه الاستخدام (كما في Turbo Pascal). هناك أسماء مستعارة لأسماء مساحة الاسم في توجيه الاستخدام (كما هو الحال في لغة أوبيرون)؛

أنواع البيانات الأولية: 8 بت (sbyte، byte)، 16 بت (short، ushort)، 32 بت (int، uint) و64 بت (long، ulong) أعداد صحيحة موقعة وغير موقعة، float ) ودقة مزدوجة، أحرف Unicode (char)، والنوع المنطقي (bool، غير متوافق مع الأعداد الصحيحة)، والنوع العشري الذي يوفر دقة تصل إلى 28 رقمًا مهمًا (عشري)؛

الأنواع المنظمة: الفئات والواجهات (كما في Java)، والمصفوفات أحادية البعد ومتعددة الأبعاد (على عكس Java)، والسلاسل، والهياكل (تقريبًا مثل الفئات، ولكن غير مخصصة في الكومة وبدون وراثة)، والتعدادات، غير المتوافقة مع الأعداد الصحيحة ( كما في باسكال)؛

أنواع المفوضين أو ببساطة "المندوبين" (على غرار الأنواع الإجرائية في Modula-2 وOberon، ومؤشرات الوظائف في C وC++)؛

تنقسم الأنواع إلى أنواع مرجعية (الفئات، الواجهات، المصفوفات، المندوبين) وأنواع القيمة (الأنواع الأولية، التعدادات، الهياكل). توجد كائنات الأنواع المرجعية في الذاكرة الديناميكية (الكومة)، ومتغيرات الأنواع المرجعية هي في الواقع مؤشرات إلى هذه الكائنات. مع أنواع القيم، لا تعد المتغيرات مؤشرات، بل القيم نفسها. يُسمح بتحويلات النوع الضمنية فقط عندما لا تنتهك أمان النوع أو تؤدي إلى فقدان المعلومات. جميع الأنواع، بما في ذلك الأنواع البدائية، متوافقة مع نوع الكائن، وهو الفئة الأساسية لجميع الأنواع الأخرى. هناك تحويل ضمني لأنواع القيمة إلى نوع الكائن، يسمى boxing، وتحويل عكسي صريح - unboxing؛

جمع البيانات المهملة تلقائيًا (كما هو الحال في Oberon وJava)؛

مجموعة واسعة من العمليات مع 14 مستوى أولوية. إعادة تعريف العمليات (كما في ALGOL-68، Ada، C++). يمكن استخدام العوامل المحددة وغير المحددة للتحكم في التحكم في الفائض عند إجراء العمليات على الأعداد الصحيحة؛

طرق مع معلمات القيمة والمعلمات المرجعية (المرجع) ومعلمات الإخراج (الخارج). يجب كتابة الكلمتين ref وout قبل المعلمة، ليس فقط في وصف الطريقة، ولكن أيضًا عند الاتصال. يتيح لك وجود معلمات الإخراج التحكم في تنفيذ المهام المحددة. وفقًا لقواعد اللغة، يجب ضمان أن يكون لأي متغير قيمة قبل محاولة استخدامه؛

عبارات التحكم: if، Switch، while، do، for،break، continue (كما هو الحال في C وC++ وJava). عبارة foreach، التي تتكرر عبر كل عنصر من عناصر "المجموعة"، والعديد من الأشكال المختلفة لعامل goto؛

معالجة الاستثناءات (كما في Java)؛

الخصائص هي عناصر من الفئات (الكائنات)، والتي يتم الوصول إليها بنفس طريقة الوصول إلى الحقول (يمكنك تعيين قيمة أو الحصول عليها)، ولكن يتم تنفيذها من خلال إجراءات تسمى ضمنيًا الحصول على وتعيين (كما هو الحال في Object Pascal، لغة الإدخال في دلفي نظام)؛

المفهرسات هي عناصر من الفئات (الكائنات) التي تسمح لك بالوصول إلى الكائنات بنفس طريقة المصفوفات (عن طريق تحديد الفهرس بين قوسين مربعين). يتم تنفيذها من خلال إجراءات تسمى ضمنيًا الحصول على وتعيين. على سبيل المثال، يمكن الوصول إلى (قراءة) الأحرف الموجودة في سلسلة كما لو كانت عناصر في مصفوفة نظرًا لأن فئة السلسلة القياسية لديها مفهرس تم تنفيذه؛

الأحداث هي عناصر فئات (حقول أو خصائص) من النوع الإجرائي (المفوضين)، والتي، خارج الفئة التي تم تعريفها فيها، تنطبق عليها فقط العمليات += و-=، مما يسمح لك بإضافة أو إزالة أساليب معالج الأحداث لـ كائنات من هذه الفئة؛

يتم ترجمة التعليمات البرمجية غير الآمنة التي تستخدم المؤشرات وحسابات العناوين في أجزاء من البرنامج المميزة بالمعدل غير الآمن؛

معالج أولي، على عكس C وC++، يوفر أدوات الترجمة الشرطية فقط.

بالطبع، فإن عيوب لغة C# التي تمت مناقشتها لا تحرم اللغة من آفاقها على الإطلاق. إنه أفضل من C++ في كثير من النواحي. يعد عدم الرضا العام عن لغة C++، والتي يعد الاعتراف بها مظهرًا للغة الجديدة، أحد المتطلبات الأساسية لنجاح C#.

بمقارنة C# مع Java، يمكنك رؤية العديد من أوجه التشابه. صحيح، إذا كانت أنظمة Java متعددة المنصات، فإن تطبيق C# موجود فقط لنظام التشغيل Windows ونظام تشغيل واحد فقط. ولكن، على الرغم من ثقلها، يمكننا أن نتوقع أن يتم تطبيق اللغة على أنظمة أخرى. بالإضافة إلى ذلك، يمكن توسيع نظام Microsoft .NET نفسه مع بيئة تنفيذ البرامج الموحدة ليشمل بنيات بديلة، خاصة أنظمة UNIX.

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

وبطبيعة الحال، فإن آفاق C# ترتبط في المقام الأول بالجهود التي ستبذلها مايكروسوفت، بالطبع، للترويج لها.

لغة برمجة جافاهي لغة برمجة موجهة للكائنات تم إنشاؤها بواسطة جيمس جوسلينج ومهندسين آخرين في شركة صن مايكروسيستمز. تم تطويره في عام 1991 كجزء من "المشروع الأخضر"، وتم الإعلان عنه رسميًا في 23 مايو 1995، في SunWorld، وتم إصداره في نوفمبر. تم تطوير Java في الأصل كبديل لـ C++ (على الرغم من أن مجموعة الميزات تشبه Objective C) والمعروفة باسم البلوط (على اسم الشجرة الموجودة خارج مكتب جوسلينج). يمكن العثور على مزيد من المعلومات حول تاريخ Java في المقالة حول نظام Java الأساسي، والذي يتضمن اللغة وJava Virtual Machine وJava API. Java مملوكة لشركة Sun Microsystems؛ جافا هي علامة تجارية لشركة صن مايكروسيستمز.

كانت هناك أربعة أهداف رئيسية عند إنشاء لغة جافا:

  • لغة كائنية التوجه.
  • النظام الأساسي المستهدف مستقل (أكثر أو أقل).
  • يجب أن يحتوي على كائنات ومكتبات للعمل على الشبكة.
  • وهو مصمم لتنفيذ التعليمات البرمجية من مصادر بعيدة بشكل آمن.

اتجاه الكائن
السمة الأولى، كائنية التوجه ("OO")، تشير إلى طريقة البرمجة للدمى وتصميم اللغة. الفكرة الأساسية لـ OO هي أن تصميم البرمجيات هو كل "الأشياء" (أي الكائنات) التي يمكن التلاعب بها، بدلاً من الإجراءات التي يجب تنفيذها. يعتمد هذا على حقيقة أن (الأشياء) السابقة تتغير بشكل أقل تكرارًا وأكثر جذرية من الأفعال، مما يجعل مثل هذه الأشياء (في الواقع الأشياء التي تحتوي على بيانات) أساسًا أكثر استقرارًا لتطوير البرمجيات. الهدف هو جعل مشاريع البرمجيات الكبيرة قابلة للإدارة بسهولة، وبالتالي زيادة الجودة وتقليل عدد مشاريع البرمجة الفاشلة للمبتدئين.

منصة مستقلة

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

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

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

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

ومع ذلك، أصبحت Java المستقلة عن النظام الأساسي ناجحة جدًا لخوادم التطبيقات مثل خدمات الويب أو servlets أو Enterprise Java Beans.

تأمين تنفيذ التعليمات البرمجية عن بعد

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

وفقًا لمعظم الناس، فإن تقنية Java مناسبة تمامًا لجميع هذه الأغراض. لكن اللغة لا تخلو من عيوبها.

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

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

هناك أشخاص يعتقدون أنه بالنسبة لبعض المشاريع، فإن النهج الموجه للكائنات يجعل العمل أكثر صعوبة، وبالنسبة للآخرين يكون أسهل. هذه الشكوى ليست فريدة من نوعها للغة Java لأنها تمتد إلى لغات أخرى موجهة للكائنات.

مثال لبرنامج "hello World" في Java:

فئة عامة HelloWorld ( public static void main(String args) ( System.out.println("Hello World!"); ) )

تعليمات التحكم:
دورات
بينما (تعبير منطقي) (بيان (عبارات) ) do ( بيان (عبارات) ) بينما (تعبير منطقي)؛ for (التهيئة ؛ شرط الإنهاء ؛ زيادة expr) (البيان (البيانات))
العوامل الشرطية
إذا (تعبير منطقي) (بيان (عبارات) ) إذا (تعبير منطقي) (بيان (عبارات) ) آخر (بيان (عبارات) )
خيار
إذا (تعبير منطقي) (بيان (عبارات) ) آخر إذا (تعبير منطقي) (بيان (عبارات) ) آخر إذا (تعبير منطقي) (بيان (بيانات) ) آخر (بيان (عبارات) ) تبديل (تعبير عدد صحيح) (حالة الحالة ثابتة عدد صحيح expr: فاصل البيان (البيانات) ... الافتراضي: فاصل البيان (البيانات)
اصطياد الأخطاء
حاول (البيان (البيانات) ) قبض (نوع الاستثناء) (البيان (البيانات) ) قبض (نوع الاستثناء) (البيان (البيانات) ) أخيرًا (البيان (البيانات) )
أنواع البيانات الأساسية

يمكن تخزين الأحرف بتشفير Unicode 16 بت. قد يحتوي مثل هذا الحرف على جميع الأحرف المعتادة، ولكنه يتضمن أيضًا مجموعات أحرف للعديد من اللغات غير الإنجليزية، بما في ذلك اليونانية والسيريلية والصينية والعربية وغيرها. يمكن لبرامج Java استخدام كل هذه الأحرف، على الرغم من أن معظم المحررين لا يملكون دعمًا مدمجًا لمجموعات الأحرف التي تختلف عن أحرف ASCII العادية. المصفوفات والسلاسل ليست أنواعًا بدائية: إنها كائنات.