Java / الأساسي / الدرس 1
أدوات JDK والترجمة والتشغيل
تتبّع ملف Java من الترجمة إلى التنفيذ مع التمييز بين المترجم وبيئة التشغيل ومسار الأصناف ومتطلبات الإصدار.
في هذه الصفحة
أهداف الدرس
- شرح المصدر والشيفرة الوسيطة والآلة الافتراضية.
- ترجمة برنامج Java 17 كامل وتشغيله.
- تشخيص الأسماء وحدود الإصدارات.
ميّز المترجم من بيئة التشغيل
تحتوي JDK أدوات تطوير مثل javac وبيئة تشغيل Java. يتحقق javac من قواعد المصدر وينتج ملفات أصناف بشيفرة وسيطة؛ ثم يبدأ المشغل java آلة JVM ويحمل الأصناف. تنفذ الآلة البرنامج وقد تترجم الشيفرة المتكررة إلى تعليمات آلة. يثبت نجاح الترجمة اجتياز الصياغة والأنواع، لا صحة الحساب التجاري.
افحص javac -version وjava -version لأن PATH قد يختار تثبيتين مختلفين. تستخدم الدورة نقطة دخول Java 17 التقليدية دون ميزات معاينة. سجّل الإصدار المستهدف وبيئة التشغيل الفعلية مستقلاً. يستطيع مترجم أحدث استهداف إصدار أقدم بواسطة --release الذي يفحص واجهات المنصة المدعومة إضافة إلى اللغة.
اقرأ نقطة دخول كاملة
احفظ البرنامج الكامل باسم Main.java، إذ يطابق اسم الصنف العام اسم الملف. يستدعي المشغل public static void main(String[] args): تكشف public المدخل، وتربط static الدالة بالصنف، وتعني void غياب قيمة إرجاع، وتحمل args نصوص سطر الأوامر. تنشئ الكلمات عقد تشغيل ولا يلزم تكرارها في كل دالة لاحقة.
يطبع البرنامج سطراً ثم نهاية سطر. تمثل System.out الخرج القياسي وتعرض println النص. توقّع الناتج قبل التشغيل وقارن المحارف بدقة. ضع الشيفرة في مجلد مؤقت جديد كيلا تبدو ملفات أصناف قديمة من تمرين آخر نتيجة للترجمة الحالية.
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("Hello, Java 17");
}
}
Hello, Java 17
السطر حتمي ولا يتطلب إدخالاً أو ملفات أو شبكة أو مكتبة خارجية.
ميّز اسم المصدر من الاسم الثنائي
ترجم بواسطة javac --release 17 Main.java وشغّل java -cp . Main. يستقبل المترجم اسم ملف مصدر، ويستقبل المشغل اسم صنف دون .class. تعني النقطة أن المجلد الحالي جذر بحث. يستخدم الصنف داخل حزمة اسمه المؤهل وبنية مجلدات تبدأ من جذر المسار؛ ولا يغير نقل ملفه اسم الحزمة.
اقرأ أول تشخيص وموقعه قبل تعديل شيفرة غير مرتبطة. لا يبرر بناء قديم ناجح التشغيل بعد فشل ترجمة جديدة. افصل المصدر عن مخرجات البناء عندما يكبر المشروع واجعل البناء يتوقف عند الفشل. أوامر الصدفة أمثلة تفسيرية، ولا ينفذ الموقع العام شيئاً منها.
راقب معاملات سطر الأوامر كبيانات
تصل المعاملات نصوصاً لا أرقاماً محللة تلقائياً. دون معاملات تكون args.length صفراً، فتفشل قراءة args[0] مباشرة. يعرض المثال العدد ويستخدم بديلاً آمناً. هذا البديل قرار منتج صريح؛ فالأمر الذي يتطلب اسم ملف ينبغي أن يرفض غيابه لا أن يخترع اسماً.
افصل حقائق البيئة عن السلوك المحمول. يختلف نص إصدار Java حسب التثبيت ولا يصح تقديمه كناتج ثابت عام. يثبت ناتج مثال العدد عند التشغيل دون معاملات كما في تحقق الدورة. سنتحقق لاحقاً من الأنواع والمديات قبل الحساب.
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(args.length);
System.out.println(args.length == 0 ? "no input" : args[0]);
}
}
0
no input
يُشغّل التحقق البرنامج دون معاملات؛ لذلك يطبع صفراً ثم فرع البديل.
حدد الميزات اللاحقة صراحة
يدعم Java 17 السجلات والأصناف المختومة وتعبيرات switch كميزات معيارية. أصبحت الخيوط الافتراضية معيارية في Java 21 وتشرح لاحقاً بحد إصدار واضح. أصبحت الملفات المصدرية المدمجة ودوال main الكائنية الموسعة دائمة في Java 25؛ وتبقى صيغتها المختصرة خارج أمثلة Java 17. لا تتضمن هذه الحقائق توصية بأحدث إصدار.
يتضمن سجل التعلم القابل للتكرار المصدر والأمر والإصدار المستهدف والتشغيل والناتج المتوقع والمرصود. اجعل المثال الناجح كاملاً وصغيراً وعلّم الأجزاء والمقاطع المكسورة بأنها غير قابلة للتشغيل. افحص متطلبات الواجهات واللغة قبل لوم المترجم على رفض شرح أحدث.
الأخطاء الشائعة وإصلاحها
class Main is public, should be declared in a file named Main.java
- لماذا يحدث؟
- يختلف اسم الصنف العام عن الملف.
- كيف تصلحه؟
- وحّد اسم الملف والصنف.
- كيف تتجنب تكراره؟
- اعزل التمرين في مجلد باسم ملف مطابق.
Could not find or load main class Main
- لماذا يحدث؟
- الاسم الثنائي أو جذر المسار خاطئ أو فشلت الترجمة.
- كيف تصلحه؟
- أكد الترجمة وشغّل الاسم المؤهل من الجذر الصحيح.
- كيف تتجنب تكراره؟
- افصل الخطوتين وتوقف عند فشل البناء.
UnsupportedClassVersionError
- لماذا يحدث؟
- لا تدعم البيئة إصدار ملف الصنف.
- كيف تصلحه؟
- استخدم بيئة متوافقة أو أعد البناء للهدف المدعوم.
- كيف تتجنب تكراره؟
- سجّل هدف المترجم وبيئة النشر معاً.
اختبر فهمك
1. فسّر لماذا لا يكون java Main.class أمر التشغيل المعتاد.
اعرض الحل المشروح
يتوقع المشغل الاسم الثنائي Main لا مسار ملف الصنف. يستقبل javac الملف Main.java. ومع الحزمة مرر الاسم المؤهل واختر جذراً فوق مجلداتها.
2. لدى المطور javac 21 وjava 17. كيف يبني المثال لأساس 17؟
اعرض الحل المشروح
استخدم javac --release 17 Main.java وتحقق ببيئة Java 17. يفحص الخيار واجهات المنصة إضافة إلى توافق المصدر. لا تدخل واجهة خاصة بـ21 وتتوقع أن يوفرها علم الهدف.
أهم ما تعلمته
- هدف الترجمة وبيئة التشغيل حقيقتان منفصلتان.
- شغّل اسماً ثنائياً من جذر بحث صالح.
- تحتاج الميزات اللاحقة حدود إصدار واضحة.