ایمان ریحانیان

دست خط یک برنامه نویس

ایمان ریحانیان

دست خط یک برنامه نویس

ایمان ریحانیان

زکات علم یاد دادن آن به دیگران است، کمک کنیم که علم گسترش یابد.

طبقه بندی موضوعی

۵ مطلب با موضوع «جاوا» ثبت شده است

به نام خدا

 

تقریبا همه برنامه نویسان جاوا میدانند که Bytecode ها به وسیله (JRE (Java Runtime Environment اجرا میشوند. میتوان یکی از مهمترین اجزای JRE را ماشین مجازی جاوا یا همان Java Virtual Machine ) JVM ) در نظر گرفت که وظیفه آنالیز کردن و اجرا کردنBytecode ها را برعهده دارد، معمولا برنامه نویسان احتیاج ندارند که بدانند که JVM چگونه کار میکند. بنابراین برنامه ها و کتابخانه های زیادی نوشته شده است بدون اینکه برنامه نویسان آن اطلاعی عمیقی از JVM داشته باشند.
بهرحال اگر یک برنامه نویس جاوا ساختار JVM را بشناسد اساسا جاوا را بهتر شناخته است و بهتر میتواند مشکلات را حل کرده و تصمیم گیری کند.
من در این مقاله قصد دارم ساختار JVM و نحوه اجرا کردن Bytecode ها را توضیح بدهم، امیدوارم که مفید باشه.


میتوان اجزای تشکیل دهنده ی JRE را Java API و JVM در نظر گرفت که نقش JVM خواندن Bytecode  های داخل کلاس ها (که نتیجه کامپایل شدن کد جاوا است) و از طریق Class Loader ها آنها را بارگذاری کردن در نتیجه اجرا کردن آنها بوسیله Java API است.

ماشین مجازی (Virtual Machine)
ماشین مجازی (VM) یک نرم افزار پیاده سازی شده از یک ماشین (مثلا یک رایانه) است که برنامه ها را مانند یک ماشین مجزا اجرا میکند، جاوا بر اساس ساختار ماشین مجازی طراحی شده است که بتواند ساختار WORA یعنی Write Once Run Anywhere  را پیاده سازی کند، ساختار و معماری مهمی که معمولا نادیده گرفته میشود، بنابراین ماشین مجازی جاوا (JVM) میتواند کدی را که یکبار نوشته شده است و به Bytecode تبدیل شده است را بدون تغییر در هر ماشینی که JVM  بر روی آن نصب میشود اجرا کند.
میتوان از موارد زیر به عنوان ویژگیهای JVM یاد کرد :
ماشین مجازی بر اساس ساختار استک : با توجه به برخی از معماری مشهور رایانه ای  مانند Intel x86 و ARM که بر اساس ساختار داده ای رجستر میباشند. ولی همیشه JVM بر اساس ساختار داده استک اجرا میشود.
گربیج کالکشن (Garbage Collection) : ترجمه فارسی این کلمه را دوست  ندارم برای همین معادل تلفظ انگلیسیشو به فارسی نوشتم، باتوجه به کد نوشته شده و کتابخانه های اضافه شده به برنامه بطور مداوم اشیا مختلف ساخته میشود که به وسیله GC پاک میشوند و از بین میروند.
تضمین کردن مستقل بودن از پلتفرم با تعریف داده ساختارهای اولیه (Primitive Data Type) : در بعضی از زبانهای برنامه نویسی مانند C باتوجه به پلتفرم در حال اجرا سایزهای مختلفی برای متغییر ها در نظر گرفته میشود. ولی JVM بطور واضح داده ساختار های اولیه یا Primitive Data Type ها را تعریف میکند که همیشه و در هر پلتفرمی سایز مشخصی را میگیرند. (مثلا همیشه int چهار بایت فضا میگیرد)

جاوا توسط شرکت سان مایکروسیستمز طراحی و پیاده سازی و توسعه پیدا کرده است (که این شرکت توسط شرکت اوراکل خریداری شد) و هر کسی میتواند با رعایت کردن استانداردهای ماشین مجازی جاوا آنرا پیاده سازی کند و ماشن مجازی جدیدی پیاده سازی کند همانطور که ماشین های مجازی زیادی وجود دارد که میتوان به Oracle HotSpot JVM و IBM J9 و Dalvik VM که توسط شرکت گوگل برای سیستم عامل اندروید استفاده میشود اشاره کرد، ولی برخلاف بقیه ی ماشین های مجازی جاوا که از ساختار استک استفاده میکنند Dalvik VM از ساختار رجیستر استفاده میکند.


بایت کد ها (Java Bytecode)
برای پیاده سازی WORA ، ماشین مجازی جاوا از بایت کدها استفاده میکند، یک زبان میانی بین زبان جاوا و زبان ماشین است.
کامپایلر جاوا برخلاف زبان برنامه نویسی مانند c که مستقیما کد به زبان ماشین تبدیل میشود، در معماری جاوا ابتدا با Bytecode و سپس از طریق JVM به ساختار ماشین تبدیل میشود. سایز کد کامپایل شده و تبدیل شده به Bytecode معمولا با سایز کد جاوا که توسط برنامه نویس نوشته شده است (Source Code) یکسان است و به راحتی قابل انتقال میباشد.
کد جاوا پس از کامپایل شدن به کلاس فایل (class.) تبدیل میشود که یک فایل binary میباشد که همان Byteocde ها هستند و برای انسان قابل خواندن نیست، برای خواندن این فایل ها بصورت قابل فهم و تبدیل به کد جاوا میتوان از برنامه ای به نام javap که ماشین مجازی جاوا ارائه میدهد استفاده کرد. نتیجه استفاده از javap را Java assemply مینامند.  

معماری ماشین مجازی جاوا (JVM)
کد نوشته شده در جاوا با روند زیر اجرا میشود :
 


برای بارگذاری بایت کدها  Class Loader ها  این کلاسهای شامل بایت کدهارا در یک منطقه ای به اسم Runtime Data Areas قرار میدهد و موتور اجرا کننده (Execution Engine) بایت کد ها را اجرا میکند.


Class Loader :
جاوا دارای قابلیت بارگذاری پویا میباشد، یعنی در زمان اجرای یک برنامه وقتی که به یک کلاس احتیاج میشود آنرا بارگذاری میکند. که میتوان اصطلاحا Lazy Loading هم نامید که در OR/M هایی مثل Hibernate هم استفاده میشود.


میتوان از قابلیت های کلاس لودر اشاره کرد به :
ساختار سلسله مراتبی : کلاس لودرها در جاوا در یک ساختار سلسله مراتبی میباشند که شامل ساختار پدر و فرزندی میباشد. که بالاتر از همه آنها Bootrstrap Class Loader قرار دارد.
معدل معاوضه ای : بر اساس ساختار سلسله مراتبی بارگذاری شدن کلاس ها  بین کلاس لودر ها واگذار میشود یعنی وقتی یک کلاس بارگذاری میشود بررسی میشود که آیا همچین کلاسی در کلاس پدروجود داد یا نه اگر این کلاس وجود داشته باشد و قبلا بارگذاری شده باشد از همان استفاده میکند و در غیر اینصورت یک کلاس جدید بارگذاری میکند.
محدودیت در دسترس بودن : یک کلاس لودر فرزند میتواند در کلاس لودر پدر دردسترس باشد ولی کلاس لودر پدر نمیتواند در کلاس لودر فرزند در دسترس باشد.
کلاس لودر ها فقط میتوانند کلاس ها را بارگذاری کنند :یک کلاس لودر میتواند کلاس هارا بارگذاری کند ولی نمیتواند آنها را خالی (unload) کند و بجای خالی کردن آنها کلاس ها حذف میشوند و کلاس جدید بارگذاری میشود.
هر کلاس لودری فضای دارد که نام کلاس های بارگذاری شده را بر اساس FQCN یعنی Fully Qualified Class Name در آن ذخیره میکند. زمانیکه یک کلاس لودر میخواهد که کلاس ها را بارگذاری کند بر اساس FQCN در نامهای ذخیره شده بررسی میکند که آیا کلاس درخواست شده در حال حاضر بارگذاری شده است یا خیر ؟  حتی اگر کلاس درخواستی در فضای دیگری که مربوط به یک کلاس لودر دیگر است ذخیره شده باشد، آنرا به عنوان کلاسی متفاوت در نظر میگیرد.
ساختار زیر بیانگر ساختار سلسله مراتبی کلاس لودر ها میباشد.

 



انواع مختلف کلاس لودر ها به شرح زیر میباشند:
Bootstrap Class Loader : این کلاس لودر که در ساختار سلسله مراتبی کلاس لودر ها در بالاترین مرحله قرار دارد و به عنوان پدر همه کلاس لودر ها است زمانی ساخته میشود که JVM اجرا شده و وظیفه آن بارگذاری کردن Java API ها و اشیای ابتدایی جاوا میبشاد و برخلاف بقیه ی کلاس لودر ها بجای جاوا با زبان ماشین پیاده سازی شده است.
Extenstion CLass Loader : وظیفه این کلاس لودر بارگذاری کردن برخی extenstion ها جاوا است مانند Security Extention
Sytem Class Loader : وظیفه این کلاس لودر بارگذاری کردن کلاس های برنامه است و همچنین بارگذاری کردن کلاسهای موجود در CLASSPATH$ که توسط کاربر مشخص میشود است.
User-Defined Class Loader : وظیفه این کلاس لودر اجرا کردن کلاس هایی است که کاربر میسازد و میتوان بصورت پویا در حال اجرای برنامه این کلاس ها را اضافه و یا حذف کرد.
البته framework هایی مثل WAS-Web Application Server برنامه وب را از برنامه اصلی بصورت مستقل اجرا میکند و یا به عبارت دیگر از کلاس لودر های مجزا برای اجرا کردن هر یک از قسمت های وب و منطق برنامه استفاده میکند.
وقتیکه یک کلاس لودر میخواهد کلاسی را براگذاری کند، مراحل زیر انجام میشود :


که شرح آنها به این صورت میباشد :
Loading : کلاس مورد نظر در JVM بارگذاری میشود.
ٰVerifying : در این قسمت بررسی میشود که آیا کلاس بارگذاری شده از مقررات و ساختار جاوا و JVM پیروی میکند یا نه، این قسمت زمان بر ترین و مشکل ترین قسمت لود کلاس ها است که اجازه ی اجرا شدن کلاس را میدهد و یکی از قویترین ویژگیهای جاوا میباشد، چون کد نوشته شده در این قسمت بررسی میشود که مخرب نباشد.
Preparing : حافظه مورد نیاز را به کلاس ها و فیلدها و متدها و ایترفیس تعریف شده در کلاس ها را اختصاص میدهد.
Resolving : تمام مرجع های استفاده شده در این کلاس را به بارگذاری میکند.
Inittializing : متغییر ها استفاده شده در این کلاس  را مقدار دهی میکند.

 

ادامه این بحث را در قسمت دوم ادامه خواهم داد ...

۵ موافقین ۰ مخالفین ۰ ۰۲ آبان ۹۱ ، ۱۴:۰۹
ایمان ریحانیان

به نام خدا

 

بالاخره پس از یک هفته دور بودن از زندگی برنامه نویسی و تجربه کردن چهره های دیگر زندگی امروز به زندگی برنامه نویسی برگشتم، به قول یه فیلسوفی میگفت که در هر چیزی نکته ای یادگرفتنی وجود دارد و چه نکاتی که باید آموخت ...

امروز میخواهم راجع به یکی از نقاط قوت جاوا و همچنین یکی از علایق خودم به نام RMI بنویسیم.

 

RMI (Remote Method Invocation)

میتوان آنرا به فراخانی متد راه دور ترجمه کرد، یک رابط برنامه نویسی (API) در جاوا است که وظیفه آن فراخوانی یک متد در یک شی (Object) که در ماشین دیگری قرار دارد است، این یک تعریف کلی بود و اگر بخواهیم جزئی تر به مطلب بپردازیم میتوانیم یک مدل کلاینت/سرور را در نظر بگیریم که در أن سرور ماشینی است که متد قابل فرخوانی در آن وجود دارد و کلاینت ماشینی است که متدی را از سرور فراخوانی میکند.

 

سرور - ماشینی است که وظیفه انجام دادن یک عمل (Task) را بر اساس یک درخواست دارد.

کلاینت - ماشینی است که درخواستی را به ماشین سرور میفرستد.

 

اگر شما میخواهید که یک متد را از یک کلاس فراخوانی کنید اولا باید بتوانید در ماشین سرور از آن کلاس یک شی بسازید ثانیا آن کلاس باید قابل دسترس باشد.

در RMI، کلاسی که قرار است متدی از آن فرخوانی بشود فقط و فقط در ماشین سرور وجود دارد و کلاینت قرار است که درخواستی به سرور بفرستد تا سرور آن کار را انجام دهد. برای این کار نیاز به RMI registry داریم.

RMI registry چیست : RMI registry را مانند یک کتاب در نظر بگیرید که در آن اشیا مورد نیاز کلاینتها از طرف سرورها با یک نام مشخص (که میتواند RMI url باشد) در آن ثبت شده است و کلاینتها میتوانند با استفاده از نام اشیا که در هنگام ثبت در RMI registry به آن اختصاص داده شده است، آن شی را از RMI registry فراخوانی میکنند.

 

اگر بخواهیم یک متدی داشته باشیم که بتوان این متد  را فراخوانی کنیم باید این متد را در یک interface که از remote interface ارث برده است معرفی کنیم.

برای مثال  :

import java.rmi.*;
public interface NameCollections extends Remote //Remote Interface{
    public String getName(int index)throws RemoteException;//Remotely Accessible Method
}

و کلاسی که این ایترفیس را پیاده سازی میکند مانند زیر است :

import java.rmi.*;
import java.util.*;
import java.rmi.server.*;


class NameStorage extends UnicastRemoteObject implements NameCollections { //A Class  That Implements The Remote Interface

private Map name;
public NameStorage()throws RemoteException{
   name=new HashMap();
   name.put(1,"iman");
   name.put(2,"reihanian");
}

public String getName(int index)throws RemoteException{
   String str=name.get(new Integer(index));
   return str;
}

در ادامه پیاده سازی RMI در سرور :

import java.rmi.*;
import javax.naming.*;
class NameServer {
public static void main(String args[]) throws RemoteException,NamingException {
   Context ictxt=new InitialContext();
   NameStorage store=new NameStorage();
   ictxt.bind("rmi:Storage",store);//Binding The Remote Object(store) With A Name(storage)
   System.out.println("Clients can invoke the methods....");
   }
}

و در قسمت کلاینت :

import java.rmi.*;
import java.util.*;
import javax.naming.*;

class NameClient {
public static void main(String args[])throws NamingException,RemoteException {
    Context itxt=new InitialContext(); //Searching For The Remote Object In The RMI registry  
    NameCollections coll= (NameCollections) itxt.lookup("rmi://localhost/Storage");
    String n1=coll.getName(2);// Invoking The Remote Method
    System.out.println("Name Obtained from the server:" + n1);
    }
} 

اینطور به نظر میرسد که متد از سرور فراخوانی شده است در حالیکه فقط اینطور به نظر میرسد و واقعا اینطور نیست، کلاینت متدی را که در شی stub است فرخوانی کرده است و این شی stub متد سرور را فراخوانی کرده است و نتیجه را از سرور به کلاینت بر میگرداند.

stub چیست ؟ stub را میتوان به عنوان یک cache از اشیا remote در نظر گرفت که در کلاینت وجود دارند.

 

میتوان شکل کلی RMI را بصورت زیر رسم کرد :

۰ موافقین ۰ مخالفین ۰ ۲۴ مهر ۹۱ ، ۱۰:۲۵
ایمان ریحانیان

سلام

 

شاید بروز بودن و به قول برنامه نویس ها Update بودن اطلاعات دغدغه مهم برای تمام رشته ها و  برنامه نویس ها باشد تا حدی که میتوان این دغدغه را قسمت مهمی از تخصص یک برنامه نویس دانست، همچنین با رشد لحظه ای دانش مخصوصا در زمینه تکنولوژی و برنامه نویسی این امر بسیار حیاتی و سخت تر میشود، یعنی به همان اندازه که اطلاعات قبلی مورد استفاده قرار میگیرد باید اطلاعات جدید را آموخت و هر روز نسبت به اطلاعات جدید آموخته شده تصمیم گرفت، روشهای مختلفی برای بروزرسانی کردن اطلاعات وجود دارد، مثل انجمن های مرتبط، تالارهای گفتگو، وبلاگ ها، پادکست ها و ...

مدتی است که چندین پادکست مناسب برای جاوا را دنبال میکنم که به نظرم پادکست های خوبی هستند، که آنها را در این پست قرار میدهم، امیدوارم که مطلب مفید واقع شود.

 

The Java Posse

 

 

The Java Spotlight Podcast

 

 

Java Pub House

 

 

Sun Developer Network

 

 

IBM Developer Works

 

 

InformIT

۱ موافقین ۱ مخالفین ۰ ۲۵ شهریور ۹۱ ، ۱۵:۱۵
ایمان ریحانیان

سلام

 

در این پست میخواهم در مورد دو نوع مولفه (Component) در Swing که در برای ساخت برنامه های گرافیکی تحت سیستم عامل در جاوا استفاده میشود بنویسم،

در Swing جاوا دو نوع مولفه وجود دارد : مولفه های سنگین وزن (Heavyweight Component) و مولفه های سبک وزن (Lightweight Component)، مولفه های سنگین وزن قبل از معرفی swing برای ساخت برنامه های گرافیکی دسکتاپی استفاده میشد و Swing مخلوطی از مولفه های سنگین وزن و سبک وزن میباشد.
مولفه های سنگین وزن (Heavyweight Component) : مولفه های گرافیکی هستند مانند JFrame،JDialog و JWindow که از مولفه های گرافیکی سیستم برای نمایش استفاده میکند و وابسته به سیستم عامل مورد استفاده است پس در سیستم عامل های مختلف شکل ظاهری نمایش آنها متفاوت است و تمام مولفه های AWT سنگین وزن میباشند.
مولفه های سبک وزن (Lightweight Component) : این گروه از مولفه ها آنهایی هستند که از کتابخانه های سیستم عامل برای ساخت و نمایش کامپوننت های گرافیکی استفاده نمیکنند. و مستقیما از Java2D برای نمایش اشکار گرافیکی استفاده میکنند به همین دلیل شکل ظاهری آنها مستقل از سیستم عامل میباشد و به نسبت کارایی بیشتری دارند مثلا میتوان آنها را با هم ترکیب کرد و ظاهر آنها را تغییر داد و تنظیمات مختلفی را به آنها اعمال کرد، از جمله این مولفه ها میتوان به مولفه های Swing به غیر از چند مورد که در بالا اشاره شد، اشاره کرد.

۰ موافقین ۰ مخالفین ۰ ۲۳ شهریور ۹۱ ، ۱۰:۲۲
ایمان ریحانیان

به نام خدا

 

زبان های برنامه نویسی زیادی وجود داره که بعضی از آنها منسوخ شده اند و بعضی فقط یرای هدف خاصی بوجود آمده اند بعضی ها هم هنوز ابتدا راه هستتد، یک نمودار در مورد ریشه های پیدایش زبانهای برنامه نویسی و منسوخ شدن یا فعال بودن آنها که کلا اطلاعات بسیار مفیدی داره.

 

 

البته بعضی از این زبانها از زمان پیدایش از نظر محبوبیت و تعداد کاربرها در رقابت بوده اند، که نمودار زیر این مقایسه را نشان میدهد:

 

البته مطالب جالبی هم در این مورد در این وبسایت نوشته شده است.

البته میتوان گفت که هز زبان برنامه نویسی در جایگاه خودش قابلیتی داره که شاید زبانهای برنامه نویسی دیگه نداشته باشند و بستگی به جایگاه استفاده از آن داره، بعضی از این زبان ها تقریبا همیشه در اوج محبوبیت بوده اند مثل C و جاوا، که به نوعی جاوا نیز الهام گرفته شده از زبان قدرتمند C میباشد.

جاوا چیست:

جاوا یک زبان برنامه نویسی فوق العاده قدرتمند و شی گرا هست، که به نظر من بیش از یک زبان برنامه نویسی و یک طرز تفکر هست. که میتوان از ویژگیهای آن به :

  • متن باز بوده (Open Source) و نیازی به خریداری ندارد.
  • وابسته به معماری کامپیوتر نبوده و قابل انتقال باشد و مبتوان برنامه نوشته شده جاوا را بدون تغییر در هر پلتفرم اجرا کرد.
  • زبانی ساده و شی گرا دارد.
  • مطمئن و بدون خطا باشد با سیستم کنترل خطا قدرتمند.
  • IDE هاای بسیار قوی و کارآمد آزاد و تجاری دارد.
  • کنترل حافظه جاوا بر عهده پلتفرم آن میباشد و برنامه نویسی را درگیر نمیکند.
  • API ها و Framework های بسیار زیادی دارد که از این لحاظ در میان زبانهای برنامه نویسی مشهور میباشد و میتوان گفت تقریبا برای هر مسئله ای چندیدن انتخاب برای برنامه نویس وجود دارد.
  • کاربردهای بسیار زیادی دارد مثل : Desktop Application ، برنامه نویسی تحت وب ، برنامه نویسی تلفن همراه، در لوازم خانگی و ....
  • بسیار امن میباشد و موجب آسیب سخت افزار نمیشود.
  • و ...

میتوان از ویژگیهای این زبان صفحه ها نوشت که هرچقدر با این ساختار بیشتر آشنا میشوید با ویژگیهای بیشتر و کاملتری آشنا میشوید.

 

 

۲ موافقین ۰ مخالفین ۰ ۲۴ تیر ۹۱ ، ۱۵:۳۳
ایمان ریحانیان