6.7 لغة البرمجة جافا
مقدمة
جافا هي لغة قياسية (يوجد معايير صارمة تحكمها) وكأي مقاييس
يوجد عدة إصدارات من عدة شركات ومنظمات شأنها في ذلك شأن سي
ما يكتب في أحدها يعمل في كل الباقية، وضعت تلك المعايير شركة Sun Microsystems
على شكل برامج مفتوحة المصدر ووثائق المحددات specifications متوفرة على موقعهم
وفق رخصة SCSL (بالنسبة لجافا 2 وليس 1 فالقديمة بقية على الرخصة القديمة)
ولكنها ليست حرة بل وتضر بالبرامج الحرة لذا فكر أكثر من مرة قبل أن توافق
عليها أو تنزل تلك البرمجيات راجع البند الثامن من فصل
1.1 الملكية الفكرية وصناعة الإبداع أو الفصل 2.3 من الأسئلة الأكثر تكراراً في ديبيان عن جافا
Debian Java FAQ لمؤلفه Javier Fernandez-Sanguino Pena.
وكأي لغة تفسيرية الهدف منها هو أن تكتب البرنامج مرة واحدة
وتنفذه أينما شئت "write once run every where" ولكنها تختلف
عن اللغات التفسيرية السابقة أنها لا تسمى script أي لا تنفذ كما هي
مباشرة وهي على شكل نص بل يجب القيام بعملية تصنيف أولية
لعمل ملف ثنائي byte code يوفر المزيد من السرعة
مقارنة بالملفات النصية في اللغات الأخرى.
وكأي لغة تفسيرية أخرى يعيبها انخفاض الأداء(السرعة) إلى حد كبير
لأن هذا الملف المصنف ليس بلغة الآلة (الحقيقية) بل بلغة الآلة الافتراضية
التي يحاكيها مفسر اللغة.
تلميح
توفر gnu أداة gcj لتصنيف ملفات جافا وتحويلها لملف تنفيذي حقيقي بلغة الآلة
وليس byte code مما يجعلها تقترب من أداء لغة السي
إلى حد جيد.
تأتي جافا مع مكتبة لعمل برامج ذات واجهة رسومية
مبيتة فيها وملازمة لها ،لا فكاك منها على عكس اللغات التفسيرية
الأخرى (perl و python) التي تضاف هذه على شكل وحدات خارجية
تضاف وقت اللزوم دون إلزامك بمكتبة دون اخرى، مما
يجعل لغة جافا متفوقة في هذا المجال حيث تكون هذه المكتبة
نفسها متوفرة(كجزء من جافا) في كافة الأنظمة دون أن تكترث
لخطوات إضافية، ولكن من جهة أخرى فهي تقلل من
المرونة حيث تلزمك بها دون غيرها.
ومن مزايا لغة جافا التي ربما تنفرد بها هي كونها
موجهة للكائنات object orieneted
صرفة وليست هجينة مثل سي++ أي أنه لكتابة
البرنامج الرسالة الترحيبية الشهير "hello world"
سيكون هناك كائنات!
هناك إصداران من محددات جافا، الأولى Java 1 يقابله
حزمة أدوات تطوير جافا من Sun وتسمى تلك الحزمة JDK 1.1،
والثانية Java 2 وتسمى حزمة تطويرها JDK 1.2 أو أكثر،
لتشغيل ملفات Byte code المصنفة(الجاهزة وتكون .class أو .jar)
الخاصة ببرامج جافا يلزمك آلة افتراضية java virtual machine وهي مفسر
لتلك الملفات المصنفة، ويمكن عرض بريمجات جافا داخل متصفحات
الويب java applet viewer التي توفره java runtime enironment،
أما من أجل التطوير فيلزمك تحويل ملفات .java
النصية المصدرية إلى ملفات .class المصنفة بواسطة مصنّف java compiler،
وهناك بعض المصنفات الخاصة التي تستطيع التصنيف إلى لغة الآلة
الحقيقية وليس الافتراضية (أي تنتج ملف تنفيذي خاص بتلك المنصة - نظام التشغيل والمعالج)
تسمى JIT أي Just in time compilers.
ديبيان يسمي تلك الحزم على الترتيب
java-virtual-machine و java1-runtime (أو java2-runtime للإصدار الثاني)
و java-compiler (أو java2-compiler للإصدار الثاني)
وهذه مجرد حزم تشير لحزم أخرى من مصادر مختلفة بناءً على رغبة المستخدم.
قبل الحصول على جافا
أولا عليك اختيار أيها تريد
توجد قوائم بهذا على مواقع مختلفة منها:
www.lists.deus.net/mailman/listinfo/free-java و
www.gnu.org/software/java
تسرد فقط تلك الحرة، هناك جافا من واضعي جافا
أي شركة sun وتسمى j2sdk للإصدار الثاني من محددات جافا
يمكنك تنزيلها من موقعهم http://java.sun.com/linux
أو من الأقراص المرفقة مع الكتب ولك هذا سيمنعك من المساهمة في تطوير
مشاريع جافا المنافسة (حسب الرخصة بتنزيل الملفات أنت تحصل على وثائق محمية
قد تسربها للمنافسين على الرغم من أنها مفتوحة المصدر)،
أو تكتفِ بالإصدار الأول منها jdk1.1 من Sun كما نقلتها إلى لينكس
Blackdown (انظر www.blackdown.org)
أقوى البدائل الحرة هو Kaffe (وليس coffe هذه الأخيرة من شركة symantec)
المتوفر على أقراص ماندريك وديبيان، حيث توفر java virtual machine
kaffe java compiler (للاختصار kjc) و appletviewer
وهو للإصدار الأول فقط من معايير جافا
(قرروا عدم المضي في الثاني لأسباب قانونية وعدم رضاهم عن الرخصة الجديدة)
كاملة المزايا وأجزاء كبيرة من مكتبات Java2 foundation libraries
ومتعددة الصنوف بما في ذلك RMI، ولدينا Japhar (انظر www.japhar.org
و www.hungry.com/products/japhar) كمتج حر آخر
لا مانع لديهم من تحدي Sun في الاصدار الثاني من حيث المبدأ،
لا ننسى JDK من IBM. حزم أدوات التطوير تحتوي على كافة الأدوات ويوجد
مصنفات متفرقة مثل مصنف جافا من منظمة غنو المعروفة
gnu-java (قد يكون اسم الحزمة gcc-java أو gcj)
www.gnu.org/software/java
وتأتي هذه مع معظم التوزيعات تقوم بتركيبها كما تفعل مع أي حزمة أخرى،
وهو مصنف يحول ملفات .java إلى .class أو حتى ملفات تفيذية حقيقية.
لدينا مصنفات أخرى مثل jikes السريع جداً ومصنف Kopi الأقل سرعة
لأنه مكتوب بلغة جافا (يجب أن تملك VM لتتمكن من تشغيله)
أما tya فهو مصنف بطريقة JIT.
إذا كنت بحاجة مكتبة صنوف قياسية حرة أكبر من تلك الموجودة مع ما لديك
هناك مشروع classpath (
انظر www.classpath.org و
www.gnu.org/software/classpath)
الذي يتحدى رخصة SCSL بتطبيق أجزاء من الإصدار الثاي لمحددات جافا 2
حيث تحتوي كل شيء باستثناء Swing و RMI،
مشروع ninjarmi (انظر www.cs.berkeley.edu/~mdw/proj/ninja/ninjarmi.html)
يوفر صنوف RMI.
هناك الكثير من الحزم ذات الصلة مثل j2re (للمتصفحات حتى تتمكن من عرض applets).
باختصار إذا كت تريد بيئة حرة صرفة استعمل kaffe و gcj جنباً إلى جنب.
من بين الحزم التي تساعدك على تطوير برامج جافا
jde وهو إضافة في emacs تدمج به كواجهة مصغرة بها خيارات مثل تلون النص وقائمة لتنفيذ
البرنامج الذي تحرره.
في المقابل هناك الكثير من البرامج التي لا تكون حرة (ولكن ربما مجانية)
مثل أدوات التطوير jdk-1.2 SE Standard Edition من Sun
(انظر www.javasoft.com/products/jdk/1.2/download-linux.html)
و jbuilder3 وهو بيئة تطوير متكاملة (واجهة) من Inprise
كتب بلغة Java نفسها (أي تحتاج VM لتشغيله)
تجده في ftp://ftp.inprise.com/pub/jbuilder/jb3foundation/sol_linux/
وبرنامج netbeans وهو الآخر مكتوب بلغة جافا
يتميز بسهولة تصميم برمجيات جافا الرسومية www.netbeans.com
أو حتى vajava (انظر http://software.ibm.com/ah/vajava) من IBM.
يمكن أن تعمل java كما لغات CGI على خادم الويب
تسمى خادمات جافا الصغيرة java servlets
تأتي على حزم مثل
tomcat (انظر http://jakarta.apache.org/tomcat)
أو apache jserv (http://java.apache.org/jserv)
أو servletapi أو حتى GNUJSP.
حزمة ant توفر طريقة مستقلة لكل المنصات لتطوير جافا (مثل makefile)،
الأداة FastJar تعمل أرشيفات JAR المضغوطة.
توفر biss-awt و swing واجهات رسومية لبرامج جافا ولكن الأخيرة غير حرة.
وهناك حزم لا أعرف ماذا تفعل مثل
ejb مثل Jonas من Bull الفرنسية، و struts و bcel و jaf وغيرها الكثير
إذا كنت ستستعمل j2sdk من Sun قم بتركيبها في مجلد معين
مثلاً في مجلد j2sdk داخل الدليل البيت
ولكن إذا أردت أن يستعملها كل المستخدمين
اختر المجلد /opt/j2sdk وأنت جذر
ثم أضف المجلدbin في حالتنا الأخيرة
/opt/j2sdk/bin إلى متغير المسارات
PATH وذلك بكتابة وأنت جذر
bash# PATH=$PATH:/opt/j2sdk/bin
bash# echo "PATH=$PATH:/opt/j2sdk/bin" >> /etc/profile
لتتمكن من تنفيذ برامجها دون كتابة المسار.
وبنفس الطريقة CLASSPATH ليشير إلى ملفات zip أو jar التي تحتوي الصنوف classes.
أحياناً تحتاج JAVA_HOME وهو المسار دون bin.
أما إذا كنت ستستمل kaffe فنظام حزم rpm أو apt سيتكفل بكل شيء.
من بين برامج غنو العظيمة هناك واحد آخر يهمك
هو gcj فهو يتجاوز عيب
جافا الأكبر وهو قلة السرعة وذلك بأنه يصنف برنامج
java إلى لغة الآلة الحقيقية!! فتحصل على أداء حقيقي.
نعم ستحصل على برنامج تنفيذي يقترب من قوة سي
(ولا يصل إليها).
فتستفيد جافا من مزايا اللغات التصنيفية والتفسيرية.
العيب الوحيد له هو أنه لم يكتمل ولكنه يعمل.
تجده غالباً مع أقراص توزيعتك.
أساسيات اللغة
في أي محرر نصي اكتب اكتب البرنامج التالي
وخزنه باسم hello.java
/*
* Hello.java: traditional "Hello, world!" console program
*
*/
class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
الآن ومن المجلد الموجود به اكتب الأمران التاليان
في سطر الأوامر
bash$ javac hello.java
bash$ java hello
Hello, World.
السطر الأول قمنا باستدعاء مصنف لغة جافا java compiler
ليحول الملف النصي hello.java لملف ثنائي byte code
اسمه hello.class
السطر الثاني قمنا بتنفيذ البرنامج الذي كتبنها
باستدعاء الآلة الافتراضية على ملف hello.class
لاحظ أنك لا تكتب .class عند استدعاء الآلة الافتراضية.
(وفي لينكس يمكنك أن تكتفي بتنفيذ البرنامج ./hello.class إذا قمت بحيلة معينة)
يمكنك تحويل ملف .java المصدري أو المنصف .class إلى ملف تفيذي بواسطة gcj كما يلي
bash$ gcj --main=hello -o hello hello.java
bash$ ./hello
Hello, World.
لغة جافا قريبة من لغة سي++ لدرجة كبيرة
حيث تشترك معها في أغلب الكلمات المفتاحية
والصيغة syntax وتختلف في الوظائف المكتبية اختلافاً جذرياً.
لاحظ في المثال السابق استعمال /* */ للإحاطة بالتعليقات
كما ويجوز استعمال // لتسبق التعليقات إلى نهاية السطر،
والحاصرة { } للإحاطة بوحدة من الكود
الخاص بالوظائف واستعمال الأقواس المربعة [ ]
للتحديد عنصر من منظومة
.والفاصلة المنقوطة بعد كل تعليمة تنفيذية
وكما قلنا لغة جافا لغة كينونية صرفة
لذا لن نجد وظيفة main بل نعرفة صنف class
يحتوي هذه الوظيفة ويجب أن تكون عامة لأنها ستستدعى
عند تنفيذ البرنامج من خارج الصنف
في الغالب يكون اسم الصنف على اسم الملف
كما تلاحظ لا يوجد وظائف دون كائنات حتى تلك
التي تطبع سطر println أي print line فهي
عضو من الكائن out الذي هو عضو من
System
/*
* CLike.java: Java is a C/C++ like language
*
*/
class CLike{
public static void main(String[] args) {
int i,j;
double a=0.0;
System.out.println("Welcome to Java");
for (i=0,j=0;i<10;++i) {
j+=i;
System.out.println(i);
}
System.out.println("Sum from 0 to 9");
System.out.println(j);
}
}
في جافا نسمي المكتبات حزم
وهذه الحزم تكون متصلة في ما بينها بشجرة هرمية
نعبر عنها بوضع نقطة X.Y أي الفرع Y
من الأصل X
نستطيع تحميل هذه الحزم ب import
ثم اسم الحزمة ويمكنك تحميل كل الحزم المتفرعة
بوضع * مكان الفروع مثلاً import java.applet.*;
import java.awt.*;
import java.applet.*;
public class WindowTestApplet {
public void init() {
Frame Win1=new Frame("MyWinTitle");
Win1.setSize(255,255);
Win1.add(new TextArea(10,10),"Center");
Button b=new Button("MyButtonLabel");
Win1.add(b);
Choice c=new Choice();
c.addItem("Item Number One");
c.addItem("Item Number Two");
Win1.add(c);
Win1.show(true);
}
}
مواقع ذات صلة
java sites:
http://java.sun.com/
java blackdown pages
http://www.blackdown.org/
Linux Journal Magazine
http://www.linuxjournal.com/lj-issues/issue66/3119.html
http://www.linuxjournal.com/lj-issues/issue66/3224.html
http://www.linuxdoc.org/LDP/LG/issue45/gibbs/Linux_java.html
http://www.linuxdoc.org/LDP/LG/issue33/burtch.html
http://www.linuxdoc.org/LDP/LG/issue32/rojansky.html
http://www.linuxdoc.org/LDP/LG/issue29/hamilton.html
Tutorials
http://metalab.unc.edu/javafaq/javatutorial.html
http://javaboutique.internet.com/javasource.html
http://members.tripod.com/~mpTOOLS/ring.html
Others
http://www.linuxdoc.org/HOWTO/Java-CGI-HOWTO.html
http://linuxusers.webprovider.com/
http://www.javalobby.org/
http://www.geocities.com/SiliconValley/Platform/8187/java/Linux_java.html
|