لینوکس، عشق، برنامه نویسی

لینوکس، عشق، برنامه نویسی

در این وبلاگ مطالبی درباره سیستم عامل لینوکس و همچنین درمورد برنامه نویسی و کامپیوتر مینویسم.

 

فصل پنجم: مفهوم کامپایل و اجرا در جاوا

 

در این فصل، خیلی کوتاه و مختصر به مفهوم کامپایل و اجرای برنامه های جاوا می پردازیم.

 

همانطور که در فصل های قبلی اشاره کردم،  زبان برنامه نویسی جاوا، هم یک زبان compiled language هست و هم یک زبان interpreted language. به عبارت دیگر، زبان برنامه نویسی جاوا هم دارای کامپایلر هست و هم دارای مفسر(یا interpreter)، درست بر خلاف زبان های دیگر که یا فقط کامپایلر دارند (مانند C ) و یا مفسر دارند (مانند پایتون).

 

در واقع وقتی به زبان جاوا برنامه نویسی می کنیم، ابتدا سورس کدهای ما ( ینی فایل های java. )،  توسط کامپایلر به بایت کد تبدیل می شوند (یعنی به فایل های class. )

و سپس interpreter یا مفسر جاوا میاد و فایل های class. رو اجرا می کنه و پروژه ی ما اجرا میشه.

 

زمانی که شما از IDEها (مثل eclipse ) استفاده می کنید، نه کامپایلر رو می بینید و نه مفسر رو. در واقع اکلیپس در پشت پرده از کامپایلر جاوا استفاده کرده و سورس کد را کامپایل، و سپس فایل های class. تولید شده را با استفاده از مفسر جاوا اجرا می کند.

 

تمام مطالبی که در این پنج فصل خواندیم، برای این بود که بتوانیم همه ی این کار ها را بصورت دستی و بدون نیاز به eclipse انجام بدیم.

برای این منظور نیاز هست که بتوانیم ابزار javac (کامپایلر جاوا)  و ابزار java (مفسر جاوا)  را  در شل اجرا کنیم و با فلگ های انها به خوبی اشنا باشیم.

 

در فصل بعد میریم سراغ javacwink

 

بازگشت به فهرست اصلی

 

 

۰ نظر ۳۰ بهمن ۰۰ ، ۰۰:۵۰
Linux-Geek

 

فصل چهارم

مفهوم current working directory

 

در این فصل، به مفهوم current working direcctory (من بهش میگم آدرس فعلیcheeky) در شل لینوکس و همچنین شل ویندوز (command prompt) می پردازیم. دانستن این مساله به کامپایل سورس های جاوا کمک میکنه

 

خیلی خلاصه بخوام بگم، current working directory، به ادرسی گفته می شود که شل ما در حال حاضر در آن قرار دارد. در دنیای لینوکس، عموما توزیع های لینوکسی از شل bash استفاده می کنند و برای دیدن آدرس فعلی، از دستور pwd استفاده می کنیم.

 

ترمینال رو باز میکنم و دستور pwd رو می زنم و خروجی پایین رو به من نشون میده.

 
[linuxgeek@linux-hp ~]$ pwd
/home/linuxgeek
 

این خروجی نشون میده که شل بش در حال حاضر در آدرس home/linuxgeek/ قرار داره. یعنی current working directory ما این هست home/linuxgeek/

 

حالا فرض کنید من توی هوم، یک پوشه دارم به نام video

 

حالا با دستور cd video وارد دایرکتوری ویدیو میشم.  حالا دوباره دستور pwd رو میزنم و خروجی زیر رو نشون میده:

 

  
[linuxgeek@linux-hp video]$ pwd
/home/linuxgeek/video
 

همونطور که می بینید، آدرس دایرکتوری فعلی من شد این home/linuxgeek/video/

 

حالا این مساله چه ربطی به جاوا داره؟
زمانی که ما بخوایم پروژه ای رو بصورت دستی کامپایل کنیم، باید کامپایلر جاوا رو از طریق شل اجرا کنیم و کامپایلر جاوا، مقدار بعضی فلگ هاش رو برابر با current working directory قرار میده. بنابراین مهمه که بدونیم بدونیم ادرس فعلی ما در شل چی هست و از کدام آدرس داریم کامپایلر رو اجرا میکنیم. در فصل های بعدی بیشتر توضیح میدم.

 

بازگشت به فهرست اصلی

 

 

۰ نظر ۳۰ بهمن ۰۰ ، ۰۰:۳۴
Linux-Geek

 

فصل سوم

 

مفهوم پکیج در جاوا

 

 

پکیج در جاوا چیست؟

در فصل سوم، ضروری هست که به مفهوم دقیق پکیج در جاوا بپردازیم و ببینیم پکیج دقیقا چی هست.

 

طبق تعریفی که در سایت خود اوراکل اومده:

"A package is a namespace that organizes a set of related classes and interfaces"

 

یعنی پکیج، یک فصای نام (namespace) است که یک گروهی از کلاس ها و اینترفیس ها را سازماندهی می کند. به زبان خودمانی اگر بخوام بگم، در داخل یک پکیج، مجوعه ای از کلاس ها و اینترفیس های مرتبط قرار می گیرد.

 

خب نحوه ی نام گذاری پکیج ها رو هم همه می دونید که با نقطه از هم جدا می شن. مثلا به این شکل   com.blog.linuxgeek  

 

اما نکته ی مهمی که باید بدونید این هست که پکیج های جاوا در واقع همان پوشه ی (folder) معمولی هستند!

 

برای مثال، وقتی میگیم که داخل پوشه ی src یک پکیج به نام com.second.packege می سازیم، معنیش این هست که

۱- داخل پوشه ی src ابتدا یک پوشه می سازیم به نام com

۲- سپس داخل پوشه ی com یک پوشه ی دیگر می سازیم به نام second

۳- و سپس داخل پوشه ی second یک پوشه ی دیگه می سازیم به نام packege

در واقع، اکلیپس و سایر ideها هم همینکار رو می کنند، اگر در اکلیپس، پکیج بالایی را درست کنید و سپس، از طریق فایل منیجر سیستم عامل، برید به پوشه ی src، می بینید که یک پوشه درست شده به نام com، سپس در داخل آن یک پوشه درست شده به نام second، و سپس در داخل اون یک پوشه درست شده به نام package

 

نکته ی دیگری که باید بدونید این هست که، در فرهنگ برنامه نویسی جاوا مرسوم هست که تمام پکیج ها در داخل پوشه ی src قرار می گیرند، اما چنین چیزی به هیچ وجه اجباری نیست. یعنی شما می توانید یک پکیج را در دایرکتوری هوم قرار دهید و پکیج دیگر را در دسکتاپ ( به همین ترتیب در ویندوز می توانید یک پکیج را در درایو D قرار دهید و پکیج دیگر را در درایو F )

بنابراین، قرارگیری پکیج های یک پروژه در داخل پوشه ی src اجباری نیست ( اما همانطور که گفتم مرسوم است).

 

اما اینکه اگر پکیج های یک پروژه در مکان های مختلف قرار بگیرند در آن صورت پروژه چگونه کامپایل و اجرا خواهد شد؟ این نکته ای هست که در فصل های بعد به آن خواهیم پرداخت.

 

 

package root directory   چیست؟

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

 

مثلا فرض کنید که ما یک پروژه داریم به نام myproject و ادرس آن چنین است:

home/manjaro-user/myproject/src/

و پکیج com.blog.linuxgeek در  داخل پوشه ی src قرار دارد. 

 

حالا اگر برید به ادرس home/manjaro-user/myproject/src/ می بینید که در داخل پوشه ی src :

یک پوشه هست به نام com

و در داخل پوشه ی com یک پوشه هست به نام blog

و در داخل پوشه ی blog یک پوشه هست به نام linuxgeek

و در داخل پوشه ی linuxgeek کلاس های ما قرار دارند.

 

حالا، پکیج روت دایرکتوری ما میشه پوشه ی src و ادرس اون میشه home/manjaro-user/myproject/src/

 

چرا پکیج روت دایرکتوری ما میشه پوشه ی src ؟  برای اینکه پکیج های پروژه داخل اون هستند.

 

حالا اگر ما پکیج های پروژه رو هرکدام رو در جایی قرار بدیم چی؟  در ان صورت ما چندین پکیج روت دایرکتوری داریم و موقع کامپایل باید ادرس همه ی پکیج روت دایرکتوری ها رو بدیم به کامپایلر! (در فصل بعد میگم)

 

کاربرد package root directory چیست و چرا لازم است؟

در واقع، وقتی پکیج روت دایرکتوری را به کامپایلر می دهیم،  کامپایلر از اون ادرس شروع میکنه به گشتن و پیداکردن پکیج ها و کلاس ها! (در فصل های بعدی اینو بازم بیشتر توضیج میدم)

 

 

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

 

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

 

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

 

همانطور که در عکس های زیر می بینید، ما یک کلاس Main ساختیم و داخل هیچ پکیجی قرار ندادیم و اکلیپس اتوماتیک ان را داخل default package قرار داد.

 

 

 

 

 

 

و سوالی که پیش میاد این است که وقتی کلاسی در داخل دیفالت پکیج قرار بگیرد، در کجای سیستم عامل و در کدام پوشه جا می گیرد؟

جواب: اگر منظورتون در اکلیپس هست، اکلیپس اون رو در داخل پوشه ی src می سازه، و اکلیپس (از طریق تنظیماتش)، موقع کامپایل کردن پروژه، ادرس پوشه ی src رو به عنوان "پکیج روت دایرکتوری" میده به کامپایلر.  اما اگر شما خودتون پروژه رو بصورت دستی ایجاد کنید، عملا می توانید این کلاس را در هر کجای سیستم قرار بدید. فقط موقع کامپایل، باید ادرسش رو بدید به کامپایلر تا آن را کامپایل کند، ولی عملا این کلاس به درد شما نخواهد خورد!! چرا؟ چون همانطور که در بالا هم گفتم، از داخل کلاس هایی که درون یک پکیج قرار دارند، نمی توانید این کلاس را import کنید، پس عملا یعنی نمی توانید از این کلاس و متد هایش بهره ای ببرید!smiley

 

خب، فکر میکنم هرآنچه را که لازم بود، درباره پکیج ها در جاوا دونستیم . بریم فصل بعدیsmiley

 

 

بازگشت به فهرست اصلی

۰ نظر ۳۰ بهمن ۰۰ ، ۰۰:۳۲
Linux-Geek

 

فصل دوم

 

Java Development kit (یا به اختصار jdk) چیست؟

 

همانطور که خیلی از شماها، بهتر از من می دانید،  زبان جاوا، بطور همزمان، هم یک زبان کامپایل شدنی هست، و هم یک زبان تفسیر شونده. به عبارت دیگر، زبان جاوا هم دارای کامپایلر می باشد و هم دارای مفسر. حالا در این فصل می خواهیم به مفهوم java development kit یا به اختصار JDK بپردازیم و ببینیم که کامپایلر  و مفسر جاوا در کجا قرار دارند.

 

واقعیت این است که زبان برنامه نویسی جاوا فقط یک کامپایلر تنها نیست، بلکه مجموعه ای از ابزار ها(نرم افزار ها) هست که در کنار هم قرار میگیرند و java development kit را تشکیل میدهند. اصلا مفهوم واژه ی کیت یعنی مجموعه ای از ابزارها.

 

در داخل jdk ابزار های (نرم افزار های) مختلفی قرار دارند که هر کدام نقشی را در ساختن و اجرا کردن و منتشر کردن برنامه های جاوا ایفا می کنند. برای مثال، ابزار javac  وظیفه ی کامپایل کردن سورس کد رو برعهده داره، و یا ابزار java وظیفه ی اجرای برنامه های جاوا رو بر عهده داره.

یا مثلا ابزار javadoc وظیفه ی خواندن داکیومنت ها از سورس کد و تولید داکیومنت رو برعهده داره. یعنی ما می توانیم مجموعه ی از سورس کد ها رو به این ابزار بدیم، و این ابزار میتونه تمام داکیومنتیشن های داخل سورس هارو استخراج کنه و یک فایل html به عنوان داکیومنت برای ما تولید کنه.

 

و یا مثلا ابزار jar یکی دیگه از ابزارهایی هست که داخل jdk قرار داره و ما بوسیله ی این ابزار میتونیم از پروژه ی خودمون یک فایل jar تولید بکنیم.

 

حالا، مجموعه ی این ابزار ها(نرم افزارها) در کنار هم قرار می گیرند و jdk رو تشکیل می دهند.

 

و در پایان، مهمترین نکته ای که باید بدونید این هست که:

وقتی میگم ابزار، منظور من همون نرم افزار هست. یعنی هر کدوم از این ابزار ها در واقع یک نرم افزار مستقل هستند (یعنی یک فایل اجرایی هستند) که به زبان C نوشته شدن!! به عبارت دیگر می شود گفت که  زبان جاوا رو با C نوشتن! 

این نرم افزار ها، GUI یا رابط گرافیکی ندارند و برای استفاده از اون ها نیاز به ترمینال (در لینوکس) و کامند پرامپت (در ویندوز) دارید. 

 

سوالی که پیش میاد اینه: این ابزار هارو کجا میشه دید؟

جواب: داخل پوشه ی JDK

 

باید برید به داخل پوشه ی jdk و سپس برید به داخل پوشه ی bin

bin مخفف binary هست و در پوشه ی bin شما میتونید فایل اجرایی تمام ابزار های jdk (از جمله فایل اجرایی کامپایلر و مفسر جاوا) رو ببینید که با زبان C نوشته شده اند.

 

ذکر این نکته لازم است که jdk که در عکس می بینید ورژن 1.8 می باشد

 

 

 

خب همونطور که در عکس میبینید، jdk ابزار های زیادی داره، همانطور که در بالا هم گفتم، هر کدوم از این ابزار ها در واقع یک نرم افزار مستقل هستند (یک فایل اجرایی هستند) که به زبان C نوشته شدن.

 

چندتا ابزار در تصویر میبینید؟ من چندتاشو نام می برم:

 

۱- java که همون مفسر یا interpreter جاوا هستش و کارش اینه که bytecode هارو اجرا کنه ( همون فایل های class. رو )

۲- javac که همون کامپایلر جاوا هستش و وظیفه ی اون، کامپایل سورس کد جاوا (java.) به فایل های بایت کد (class.) هست.

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

۴- javadoc که بوسیله ی اون از روی سورس ها میتونیم داکیومنت تولید کنیم

۵- و سایر ابزار ها

 

زمانی که شما از IDEها (مثل eclipse ) استفاده می کنید، نه کامپایلر رو می بینید و نه مفسر رو. در واقع اکلیپس در پشت پرده، از این ابزارهای jdk استفاده کرده و سورس کد را کامپایل، و سپس فایل های class. تولید شده را با استفاده از مفسر جاوا اجرا می کند و نتیجه را به شما نشان می دهد.

 

مطلب بعدی که باید بدونید این هست که:
هر کدام از این ابزارها،  چندین فلگ (flag) دارن. برای دیدن فلگ های هر کدام از اینها کافیه که ترمینال(در لینوکس) و یا cmd (در ویندوز) رو باز کنید و از دستور help-  استفاده کنید.

مثلا برای دیدن فلگ های jar از دستور jar -help استفاده کنید که خروجی زیر رو به شما میده.

 
Illegal option: h
Usage: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
Options:
    -c  create new archive
    -t  list table of contents for archive
    -x  extract named (or all) files from archive
    -u  update existing archive
    -v  generate verbose output on standard output
    -f  specify archive file name
    -m  include manifest information from specified manifest file
    -n  perform Pack200 normalization after creating a new archive
    -e  specify application entry point for stand-alone application
        bundled into an executable jar file
    -0  store only; use no ZIP compression
    -P  preserve leading '/' (absolute path) and ".." (parent directory) components from file names
    -M  do not create a manifest file for the entries
    -i  generate index information for the specified jar files
    -C  change to the specified directory and include the following file
If any file is a directory then it is processed recursively.
The manifest file name, the archive file name and the entry point name are
specified in the same order as the 'm', 'f' and 'e' flags.

Example 1: to archive two class files into an archive called classes.jar:
       jar cvf classes.jar Foo.class Bar.class
Example 2: use an existing manifest file 'mymanifest' and archive all the
           files in the foo/ directory into 'classes.jar':
       jar cvfm classes.jar mymanifest -C foo/ .
 

 

همانطور که در خروجی بالا می بینید، ابزار jar، فلگ های زیادی داره،   c  -t   -x-   و سایر فلگ ها.

 

ما بیشتر با دوتا ابزار jdk کار خواهیم داشت. یکی ابزار javac که کامپایلر جاوا هست و دیگری ابزار java که مفسر جاوا هست.  هر کدام از این ها، تعدادی فلگ دارن ( می تونید دستور help- رو بزنید و همه ی فلگ هاش رو ببینید). دوتا از فلگ ها برای ما مهمه. یکی فلگ classpath-   و دیگری فلگ   sourcepath-  که در فصل های بعد توضیح میدم.

 

 

و نکته ی پایانی اینکه:

اگر میخاید در مورد هر کدوم از این ابزار ها اطلاعات کسب کنید و توضیحات کامل فلگ ها رو، بهتره برید به وبسایت خود اوراکل به این ادرس

 

 

بازگشت به فهرست اصلی

۰ نظر ۳۰ بهمن ۰۰ ، ۰۰:۰۱
Linux-Geek

 

فصل اول

 

مقدمه

 

 

سلام. به این آموزش متنی خوش اومدید. در این مجموعه پست ها، یاد می گیریم که چگونه یک پروژه ی java  رو از صفر تا 100 بصورت دستی (بدون IDE) ایجاد، و کامپایل، و اجرا کنیم و سپس از برنامه خروجی گرفته و تبدیل به یک فایل JAR بکنیم. و همچنین چگونه از لایبرری های jar استفاده کنیم.

 

در این اموزش، نکات زیادی یاد خواهید گرفت که شاید پس از سال ها برنامه نویسی در جاوا هنوز نمی دونستید! این آموزش در ۸ فصل نوشته شده و توصیه می کنم فصل ها رو به ترتیب برید جلوwink.

 

 

قبلا در این پست توضیح دادم که چرا نباید از IDE استفاده کنیم و برای همین قصد ندارم دوباره همون مطالب رو تکرار کنم. اگر نمی دونید چرا باید یک پروژه ی جاوا رو بصورت دستی ایجاد کنید، حتما به اون پست سر بزنید.

 

من در این آموزش ها از jdk  ورژن  1.8  استفاده کردم، چون jdk 9  یه مقدار ساختارش فرق کرده، بنابراین ساختار پروژهای جاوا ۸ با جاوا ۹ (و بالاتر) فرق کرده. ولی جای نگرانی نیست، من هردوتاش رو توضیح میدم، شما فقط قدم به قدم با آموزش ها همراه باشید.

 

همچنین سیستم عامل من لینوکس هست ولی شما می تونید در ویندوز هم به راحتی این آموزش ها رو پیاده سازی کنید.

 

 

 

توجه: دقت کنید که این پست برای اموزش جاوا نیست. من فرض رو بر این گذاشتم که شما جاوا رو از قبل بلد هستید و میتونید پروژه های جاوا رو در Eclipse یا Intellij یا Netbeans به راحتی انجام بدید. پس اگر جاوا رو بلد نیستید و قبلا کار نکردید و نمیتونید توی این IDE ها پروژه بسازید، این آموزش به در شما نمیخوره.

 

 

و نکته ی آخر:

اگر بخواهیم بصورت دستی همه ی کارها رو در جاوا انجام بدیم، لازم است که با چندین مفهوم، قشنگ اشنا باشیم، از جمله مفهوم پکیج در جاوا، مفهوم کامپایلر، مفهوم مفسر، مفهوم ادرس فعلی در شل یا current working directory و اینجور بحث ها،  که  من در فصل های بعدی درباره هر کدام از این ها مفصل توضیح دادم. پس با من همراه باشیدsmiley

 

بازگشت به فهرست اصلی

 

۰ نظر ۲۹ بهمن ۰۰ ، ۲۳:۳۳
Linux-Geek

 

کامپایل و اجرای پروژه های جاوا بدون نیاز به IDE

 

 

 

 

فصل اول: مقدمه

فصل دوم:  مفهوم jdk

فصل سوم: مفهوم پکیج در جاوا

فصل چهارم: مفهوم current working directory در شل

فصل پنجم: مفهوم کامپایل و اجرا در جاوا

فصل ششم: نحوه ی کامپایل سورس کد های جاوا با کامپایلر جاوا ( یا همان javac)

فصل هقتم: نحوه ی اجرای پروژه ی کامپایل شده ی جاوا با مفسر جاوا (یا همان  java)

فصل هشتم: ایجاد و کامپایل و اجرای پروژهای جاوا با سناریو های مختلف: سناریوی اول

فصل نهم: ایجاد و کامپایل و اجرای پروژهای جاوا با سناریو های مختلف: سناریوی دوم

 

 

 

 

این پست در دست تکمیل است (هنوز کامل نشده)
 

۰ نظر ۲۹ بهمن ۰۰ ، ۲۳:۲۴
Linux-Geek