جاوا یک زبان تمام نشدنی!
جاوا، شبیه به سیپلاسپلاس است، اما مدل شیءگرایی آسانتری دارد و از قابلیتهای سطح پایین کمتری پشتیبانی میکند. ایده شیءگرایی جاوا از زبان اسمالتاک گرفته شده است. یکی از قابلیتهای مهم جاوا مدیریت خودکار حافظه است. ضریب اطمینان عملکرد برنامههای نوشته شده به این زبان نسبت به زبانهای نسل اول همچون سی بالاتر است. برنامههای جاوا به بایت کد تبدیل میشوند و توسط ماشین مجازی جاوا (JVM) به کدهای ماشین تبدیل و اجرا میشوند. در صورت وجود JVM مانند سایر زبانهای مبتنی بر آن که وابسته به سیستمعامل خاصی نیستند برنامههای نوشته شده به جاوا روی هر نوع سیستم عامل قابل اجرا هستند. شعار معروف این جاوا یکبار بنویس و همهجا اجرا کن به همین ویژگی اشاره دارد. این ویژگی جاوا را مستقل از سکو مینامند.
ماشین مجازی جاوا (JVM)
ماشین مجازی جاوا (JVM) برنامهای است که بایتکدهای زبان جاوا را مطابق با سیستمعاملی خاص کامپایل کرده و آنها را برای اجرا در سطح سیستمعامل آماده میکند، در حقیقت شعار اصلی زبان جاوا (یکبار بنویس و همهجا اجرا کن) با استفاده از این ماشین مجازی امکانپذیر شدهاست.
برنامههای جاوا و اپلتها
جاوا برای نوشتن انواع برنامههای کاربردی مناسب است. توسعهدهندگان میتوانند از زبان جاوا برای ساخت برنامههایی همچون برنامههای تحت وب، برنامهنویسی سیستمهای کوچک مانند تلفن همراه، برنامههای کاربردی بزرگ (Enterprise)، برنامههای رومیزی (Desktop) و نمونههای مشابه استفاده کنند. قابلیت خاصی در جاوا به نام اپلت وجود دارد. اپلتها امکانات فراوانی برای نوشتن برنامههای تحت وب در اختیار برنامهنویسان قرار میدهند. البته وجود ماشین مجازی جاوا برای اجرای اپلت لازم است.
اداره خودکار حافظه
جاوا از حافظه بازیافتی خودکار برای اداره حافظه در چرخه زندگی یک شیء استفاده میکند. برنامهنویس زمانی که اشیاء به وجود میآیند، این حافظه را تعیین میکند؛ و در زمان اجرا نیز، زمانی که این اشیاء در استفاده زیاد طولانی نباشند، برنامهنویس مسئول بازگرداندن این حافظهاست. زمانی که مرجعی برای شیهای باقیمانده نیست، شیهای غیرقابل دسترس برای آزاد شدن به صورت خودکار توسط بازیافت حافظه، انتخاب میشوند. اگر برنامهنویس مقداری از حافظه را برای شیهایی که زیاد طولانی نیستند، نگه دارد، چیزهایی شبیه سوراخ حافظه اتفاق میافتند. یکی از دیدگاهایی که در پس زمینه مدل اداره حافظه خودکار جاوا وجود دارد، این است که برنامهنویس هزینه اجرای اداره دستی حافظه را نادیده میگیرد. در بعضی از زبانها حافظه لازم برای ایجاد یک شیء، به صورت ضمنی و بدون شرط، به پشته تخصیص داده میشود؛ یا بهطور صریح اختصاص داده شده و از heap بازگردانده میشود. در هر کدام از این راهها، مسئولیت اداره اقامت حافظه با برنامهنویس است. اگر برنامه شیء را برنگرداند، سوراخ حافظه اتفاق میافتد. اگر برنامه تلاش کند به حافظهای را که هماکنون بازگردانده شده، دستیابی پیدا کند یا برگرداند، نتیجه تعریف شده نیست و ممکن است برنامه بیثبات شده یا تخریب شود. این ممکن است با استفاده از اشارهگر مدتی باقی بماند، اما سرباری و پیچیدگی برنامه زیاد میشود. بازیافت حافظه اجازه دارد در هر زمانی اتفاق بیفتد. بهطوریکه این زمانی اتفاق میافتد که برنامه بیکار باشد. اگر حافظهٔ خالی کافی برای تخصیص شیء جدید در هیپ وجود نداشته باشد، ممکن است برنامه برای چند دقیقه متوقف شود. در جایی که زمان پاسخ یا اجرا مهم باشد، اداره حافظه و منابع اشیاء استفاده میشوند. جاوا از نوع اشارهگر ریاضی C و ++C پشتیبانی نمیکند. در جایی که آدرس اشیاء و اعداد صحیح میتوانند به جای هم استفاده شوند. همانند ++C و بعضی زبانهای شیگرای دیگر، متغیرهای نوعهای اولیه جاوا شیگرا نبودند. مقدار نوعهای اولیه، مستقیماً در فیلدها ذخیره میشوند. در فیلدها (برای اشیاء) و در پشته (برای توابع)، بیشتر از هیپ استفاده میشود. این یک تصمیم هوشیارانه توسط طراح جاوا برای اجرا است. به همین دلیل جاوا یک زبان شیگرای خالص به حساب میآید.
ترکیب دستوری
گرامر جاوا محدودتر از سی پلاس پلاس است و برخلاف سی پلاس پلاس که ترکیبی است از ساختارها و شیگرایی، زبان جاوا یک زبان شیگرای خالص میباشد. فقط نوع داده اصلی از این قاعده مستثنی است. جاوا بسیاری از ویژگیها را پشتیبانی میکند و از کلاسها برای سادهتر کردن برنامهنویسی و کاهش خطا استفاده میکند.
نمونههایی از برنامههای جاوا
در زیر نمونهای از برنامهای که در جاوا نوشته شدهاست آورده شدهاست. البته برای کامپایل کردن این برنامه بایستی JDK (کیت توسعه جاوا) روی سیستم مورد نظر نصب شده باشد.
public class Test{
public static void main(String[] args) {
System.out.println(“HelloWorld!”);
}
}
بهطور مثال، برنامه Hello world در زبان جاوا به شرح زیر نوشته میشود:
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println(“Hello, World!”);
}
}
بر طبق قرارداد فایلها باید هم نام کلاسهای عمومی نامگذاری شوند. سپس باید پسوند java را به این صورت به نام فایل اضافه کرد: “HelloWorld.java”. این فایل اول باید با استفاده از کامپایلر جاوا به بایت کد کامپایل شود. در نتیجه فایل HelloWorld.class ایجاد میشود. این فایل قابل اجرا است. فایل جاوا ممکن است فقط یک کلاس عمومی داشته باشد. اما میتواند شامل چندین کلاس با دستیابی عمومی کمتر باشد. کلاسی که به صورت خصوصی تعریف میشود ممکن است در فایل.java ذخیره شود. کامپایلر برای هر کلاسی که در فایل اصلی تعریف میشود یک کلاس فایل تولید میکند؛ که نام این کلاس فایل همنام کلاس است با پسوند.class کلمه کلیدی public (عمومی) برای قسمتهایی که میتوانند از کدهای کلاسهای دیگر صدا زده شوند، به کار برده میشود. کلمه کلیدی static (ایستا) در جلوی یک تابع، یک تابع ایستا را که فقط وابسته به کلاس است و نه قابل استفاده برای نمونههایی از کلاس، نشان میدهد. فقط تابعهای ایستا میتوانند توسط اشیاء بدون مرجع صدا زده شوند. دادههای ایستا به متغیرهایی که ایستا نیستند، نمیتوانند دسترسی داشته باشند.
کلمه کلیدی void (تهی) نشان میدهد که تابع main هیچ مقداری را برنمیگرداند. اگر برنامه جاوا بخواهد با خطا از برنامه خارج شود، باید System.exit صدا زده شود. کلمه main یک کلمه کلیدی در زبان جاوا نیست. این نام واقعی تابعی است که جاوا برای فرستادن کنترل به برنامه، صدا میزند. برنامه جاوا ممکن است شامل چندین کلاس باشد که هر کدام دارای تابع main هستند. تابع main باید آرایهای از اشیاء رشتهای را بپذیرد. تابع main میتواند از آرگومانهای متغیر به شکل public static void main(string… args) استفاده کند که به تابع main اجازه میدهد اعدادی دلخواه از اشیاء رشتهای را فراخوانی کند. پارامترstring[] args آرایهای از اشیاء رشته ایست که شامل تمام آرگومانهایی که به کلاس فرستاده میشود، است.
کلاسهای خاص
اپلت جاواها برنامههایی هستند که برای کاربردهایی نظیر نمایش در صفحات وب، ایجاد شدهاند. واژه import باعث میشود کامپایلر جاوا کلاسهای javaapplet.Applet وjava.awt.Graphics را به کامپایل برنامه اضافه کند. کلاس Hello کلاس Applet را توسعه میدهد. کلاس اپلت چارچوبی برای کاربردهای گروهی برای نمایش و کنترل چرخهٔ زندگی اپلت، درست میکند. کلاس اپلت یک تابع پنجرهای مجرد است که برنامههای کوچکی با قابلیت نشان دادن واسط گرافیکی برای کاربر را فراهم میکند. کلاس Hello تابع موروثی (print(Graphicsy را از سوپر کلاس container باطل میکند، برای اینکه کدی که اپلت را نمایش میدهد، فراهم کند. تابع paint شیهای گرافیکی را که شامل زمینههای گرافیکی هستند را میفرستد تا برای نمایش اپلتها استفاده شوند. تابع paint برای نمایش “Hello world!” تابع (drawstring(string,int,in را صدا میزند.
جاوا سرولت
فناوری servlet جاوا گسترش وب را به آسانی فراهم میکند؛ و شامل مکانیزمهایی برای توسعه تابعی سرور وب و برای دسترسی به سیستمهای تجاری موجود است.servlet قسمتی از javaEE است که به درخواستهای مشتری پاسخ میدهد.
جاوا در مقایسه با زبانهای برنامهنویسی دیگر
جاوا یکی دیگر از گزینههای محبوب در سازمانهای بزرگ است سالیان متمادی است که به همان شکل باقی مانده است. جاوا بهطور گستردهای برای ساخت برنامههای تحت وب در مقیاس سازمانی استفاده میشود و هنوز هم در فهرست محبوبترین زبانهای برنامهنویسی است. برنامههای نوشته شده با جاوا پایداری زیادی دارند، بنابراین، بسیاری از سازمانهای بزرگ آنرا به رسمیت شناختهاند. اگر به دنبال شغل مبتنی بر توسعه در یک سازمان بزرگ هستید ، جاوا زبانی است که شما باید یاد بگیرید. جاوا همچنین در توسعه برنامه اندروید کاربرد گستردهای دارد. تقریباً هر شغلی امروز به یک برنامه اندروید نیاز دارد. با توجه به اینکه امروز میلیاردها کاربر اندروید وجود دارد و با توجه به این واقعیت که گوگل یک چارچوب عالی برای توسعه مبتنی بر جاوا – Android Studio – ایجاد کرده است ، فرصتی بزرگ برای توسعه دهندگان جاوا باز می شود.
زبان برنامهنویسی پایتون
فلسفه اصلی طراحی پایتون خوانایی بالای کدها است و نویسههای فاصله خالی در آن معنادار هستند و مکرر استفاده میشوند. ساختار زبانی و دیدگاه شیءگرا در پایتون به گونهای طراحی شدهاست که به برنامهنویس امکان نوشتن کد منطقی و واضح (بدون ابهام) را برای پروژههای کوچک و بزرگ میدهد. کلمات کلیدی و اصلی این زبان به صورت حداقلی تهیه شدهاند و در مقابل کتابخانههایی که در اختیار کاربر است بسیار وسیع هستند. بر خلاف برخی زبانهای برنامهنویسی رایج دیگر که بلاکهای کد در آکولاد تعریف میشوند (بهویژه زبانهایی که از نحو زبان سی پیروی میکنند) در زبان پایتون از نویسه فاصله و جلو بردن متن برنامه برای مشخص کردن بلاکهای کد استفاده میشود. به این معنی که تعدادی یکسان از نویسه فاصله در ابتدای سطرهای هر بلاک قرار میگیرند، و این تعداد در بلاکهای کد درونیتر افزایش مییابد. بدین ترتیب بلاکهای کد به صورت خودکار ظاهری مرتب دارند. پایتون مدلهای مختلف برنامهنویسی (از جمله شیگرا و برنامهنویسی دستوری و تابع محور) را پشتیبانی میکند و برای مشخص کردن نوع متغیرها از یک سامانه پویا استفاده میکند.
این زبان از زبانهای برنامهنویسی مفسر بوده و به صورت کامل یک زبان شیءگرا است که در ویژگیها با زبانهای تفسیری پرل، روبی، اسکیم، اسمالتاک و تیسیال مشابهت دارد و از مدیریت خودکار حافظه استفاده میکند. لازم به توضیح است که پشتیبانی از زبان پایتون ۲ رسماً در سال 2020 به پایان میرسد.
فلسفه طراحی زبان پایتون
پایتون یک زبان برنامهنویسی چند پارادایمی است بهطوریکه هم شیءگرایی و برنامهنویسی ساختیافته را کاملاً پوشش میدهد و هم بسیاری از خصوصیات پایتون برنامهنویسی جنبه گرا و تابعی (مثل پشتیبانی از فرا برنامهنویس را پوشش میدهد. پارادایمهای برنامهنویسی دیگر نیز به وسیله افزونهها پشتیبانی شدهاند. مثل برنامهنویسی منطقی.
پایتون از تایپ پویا و ترکیبی از شمارش مرجع و یک حلقه کشف و بازیافت قسمتهای هدر رفته حافظه برای مدیریت حافظه، استفاده میکند. یک ویژگی مهم پایتون تحلیل نام پویا است، که روشها و نام متغیرها را در طول اجرای برنامه به هم ملحق میکند.
به جای اینکه تمام عملکرد پایتون در هسته آن متمرکز باشد طوری طراحی شدهاست که به خوبی از افزونهها پشتیبانی کند. این ویژگی پایتون که آن را محبوب کردهاست راهی برای اضافه کردن ای پی آی به نرمافزارهای موجود بودهاست. ایده فان روسوم از زبانی با هسته کوچک و کتابخانه استاندارد بزرگ با مفسر آسان توسعه پذیر، ریشه در سرخوردگی او از زبان ABC دارد.
پایتون تلاش میکند تا نحو و گرامری سادهتر و جمع و جور تر داشته باشد و به همین دلیل برای روششناسی کد فقط یک انتخاب در مقابل توسعه دهنده قرار میدهد. روش پایتون در مقابل روش پرل (بیش از یک روش برای انجام آن وجود دارد) قرار دارد و فلسفه طراحی آن چنین است «باید یک راه – و ترجیحاً فقط یک راه – آشکار برای انجام آن وجود داشته باشد.».
هدف دیگر طراحی زبان آسان کردن توسعهپذیری است. ماژولهایی که تازه ساخته شدهاند، بهسادگی در C و C++ نوشته میشوند. پایتون همچنین میتواند به عنوان زبان توسعه برای ماژولها و کاربردهای موجود که به برنامه واسط قابل برنامهریزی نیاز دارد، استفاده شود. توسعه دهندگان پایتون سعی کردند از بهینهسازی زود هنگام اجتناب کنند و وصلههای غیر حساس سیپایتون که باعث افزایش سرعت نهایی میشد را اضافه نکردند. هرگاه برای برنامهنویس پایتون سرعت اهمیت داشت او میتواند توابع زمانبر را به ماژولهای افزونه ای ببرد و آنها را به زبانهایی مثل سی بنویسد یا از پایپای استفاده کند که نوعی کامپایلر درجا است. از سایتون که اسکریپت پایتون را به سی ترجمه میکند نیز میتوان استفاده کرد.
ترکیب دستوری زبان پایتون
پایتون در نظر دارد که زبانی بسیار خوانا باشد؛ بنابراین طرح بندی آن مرتب و بدون حشو و زوائد است، و اغلب از کلمات کلیدی انگلیسی استفاده میکند، در حالی که زبانها دیگر از نقطهگذاری استفاده میکنند. پایتون برای جداکردن بلوک کد به جای استفاده کردن از آکولاد از تورفتگی فاصله خالی استفاده میکند. برای شروع بلوک کد یک پله تورفتگی را بیشتر میکنیم و برای اتمام آن یک پله بلوک کد را کمتر میکنیم. پس ساختار ظاهری برنامه نمایش دهنده ساختار معنایی آن است. این ویژگی ای که به نام قانون off-side نیز شناخته میشود؛ و در بعضی از زبانها وجود دارد؛ ولی در بیشتر زبانهای برنامهنویسی وجود تورفتگی معنای خاصی نمیدهد.
کامپایلرهای همسو با پایتون ر
چندین کامپایلر به زبانهای سطح بالای شیء گرا وجود دارد خواه زبان مبدأ پایتون محدود نشده باشد خواه زیر مجموعههای محدود شده آن یا زبانهای مشابه پایتون باشند:
سایتون، کدهای پایتون را به سی و سی پلاسپلاس کامپایل میکند.
IronPython از روش مشابهی استفاده میکند تا برنامه نوشته شده با پایتون را بر .NET. زمان اجرای زبان مشترک اجرا کند.
جایتون امکان استفاده از کلاسها کتابخانه جاوا را از زبان پایتون فراهم میکند.
MyHDL پایتون را به زبان ویاچدیال کامپایل میکند.
Nuitka پایتون را به C++ کامپایل میکند.
Jython از LLVM استفاده میکند تا کد پایتون را به کد ماشین کامپایل کند.
Pythran کد پایتون را به زبان C++ کامپایل میکند.
RPython میتواند به زبان C, کامپایل شود و برای ساختن مفسر پایپای پایتون استفاده میشود.
کتابخانه استاندارد
پایتون یک کتابخانه استاندارد بزرگ دارد، که از آن به عنوان یکی از بزرگترین توانایی پایتون یاد میشود، مشروط به اینکه ابزارهای از پیش نوشته شده، با بسیاری از وظایف سازگار باشد. ماژولهای کتابخانه استاندارد میتوانند به شیوه ماژولهای نوشته شده در سی یا پایتون آرگومان دهی شوند. اخیراً کتابخانههای C++ به یک کتابخانه به نام Boost.Python رشد یافتهاست، برای ایجاد قابلیت همکاری بین C++ و پایتون. به دلیل تنوع گسترده در ابزارهای تولید شده توسط کتابخانه استاندارد، این کتابخانه با توانایی استفاده یک زبان سطح پایین ترکیب شده، مثل C و C++، که البته به عنوان واسط بین کتابخانههای دیگر است، پایتون میتواند یک واسط قوی بین زبانها و ابزارها باشد.
کتابخانه استاندارد با تعداد زیاد فرمتها و پروتکلهایی که حمایت میکند (مانند MIME و HTTP)، خصوصاً برای نوشتن علائم اینترنت مناسب است. پایتون همچنین ماژولهایی برای ایجاد واسط کاربر گرافیکی، اتصال به پایگاه داده رابطهای، تولید اعداد شبه تصادفی، محاسبات با دقت دلخواه اعشاری،[۸۳] دستکاری عبارات با قاعده و آزمایش واحد دارد. بعضی از قسمتهای کتابخانهٔ استاندارد همراه با توضیحاتی هستند (مثل WSGI wsgiref که پیرو PEP 333 است، اما اکثریت ماژولها اینگونه نیستند. آنها از طریق کدها، اسناد داخلی، و دنباله تست شان (اگر موجود باشد) تعیین میشوند. اگر چه، به دلیل اینکه کد پایتون اکثر کتابخانههای استاندارد، چندسکویی است، فقط ماژولهای اندکی هستند که باید برای پیادهسازیهای دیگر تغییر داده شوند یا دومرتبه نوشته شوند. پکیجهای پایتون در زمینههای گوناگونی همچون خودکارسازی، آنالیز داده، پایگاه داده، پردازش تصویر، یادگیری ماشین، برنامههای موبایل، چندرسانهای، شبکه، محاسبه علمی، مدیریت سیستم، پردازش متن، چارچوبهای نرمافزاری تحت وب، Web scraping و نمونههای مشابه استفاده میشود.