در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
هر برنامهای که اجرا میشود، به یک نقطه ورود1 نیاز دارد، بهطور خلاصه سیستم عامل باید بداند که برنامه از کجا آغاز میشود؟ این نقطه در واقع یک آدرس حافظه ، مربوط به یک نقطه در کد برنامه است و سیستم عامل بعد از بارگذاری برنامه در حافظه به آن آدرس مراجعه میکند.
در اکثر زبانهای برنامهنویسی تابعی بهنام main وجود دارد که در واقع همان نقطه شروع برنامه است. این تابع با توجه به ساختار سیستم عامل و دید برنامهنویس، چندین بازنویسی2 دارد. برای مثال در زبان C# برخی از بازنویسیها بهشکل زیر است:
static void Main();
static void Main(string[] args);
static int Main();
static int Main(string[] args);
اکنون تکتک این بازنویسیها را بررسی میکنیم. نکتهایی که باید دقت داشته باشید این است که این تابع با کلیدواژه static نشانهگذاری شده است، این امر در زبان جاوا نیز وجود دارد و دلیل کاربردش این است که زبانهایی مانند جاوا و سیشارپ زبانهایی مبتنی بر کلاس3 هستند و در آنها شما فقط با کلاسها سروکار دارید. امکان تعریف تابعی در خارج کلاس ندارید، بر خلاف C++ که زبانی شی گرا و تابع گرا است، که این امر بخاطر سازگار بودن با برنامههای نوشته شده به زبان C است.(در مورد تعریف تابع main در این زبان در آخر توضیحاتی داده خواهد شد)، بههمین دلیل که در جاوا و C# شما با کلاس سر و کار دارید تابع main یا بهتر بگوییم متد main شما باید static باشد. (static بودن یعنی بدون ساختن نمونه از کلاس میتوانید از یک عضو کلاس استفاده کنید) معرفی شود.
حال مقادیر ورودی و خروجی تابع main را بررسی میکنیم.
برای این کار کاملترین بازنویسی این متد رو بررسی میکنیم، یعنی:
static int Main(string[] args);
این بازنویسی یک آرایه از رشتههای متنی و یک مقدار عددی از نوع عدد صحیح برمیگرداند، خوب این مقادیر چه استفادههایی دارند؟ رشتههای ورودی در واقع مقادیر هستند که هنگام اجرای برنامه از طریق خط فرمان به برنامه فرستاده میشوند. تابع main مقداری عددی را برمیگرداند، این مقدار وضعیت پایان برنامه را مشخص میکند. برای مثال در کتابخانه استاندارد C دو متغیر ثابت برای این کار وجود دارد: یکی EXIT_SUCCESS که در واقع مقدار عددی صفر است و نشان میدهد که برنامه با موفقیت به کار خود پایان داده است و دیگری EXIT_FAILURE که نشاندهنده این است که برنامه با خطا پاین یافته. نکتهای که باید به آن توجه داشت، این است که تابع main در جاوا مقدار را برنمیگرداند ولی مقادیر ورودی آن مانند سیشارپ است، در زبان سیشارپ مقدار args نام برنامه را شامل نمیشود.
حال که با بازنویسیهای متد main آشنا شدیم این متد را در زبانهای برنامهنویسی دیگر بررسی میکنیم.
روش کار در زبان C و C++ مانند زبان C# است، اما با تفاوتهایی که آن هم بهخاطر ماهیت زبان برنامهنویسی است، که بهصورت زیر تعریف میشود:
int main(void)
int main(int argc, char *argv[])
تابع main میتواند مقداری را برنگرداند، مقدار argv شامل نام برنامه است بههمین خاطر همیشه مقدار argc برابر 1 است.
در نگارشی از زبان C که در سیستم عامل Apple استفاده میشود، تعریف این متد بهصورت زیر است:
int main(int argc, char *argv[], char *envp[])
همانطور که مشاهده میکنید، تفاوتهایی بین فراخوانی تابع main در یک زبان و پلتفورم متفاوت، وجود دارد.
در زبان Pascal برای این تابع نامی وجود ندارد و در واقع بلاک کدی که به . (نقطه) ختم شود، نشاندهنده تابع main است. به این صورت:
program Click
begin
{نقطه شروع}
End.
با توجه به تعریف این متد شاید این پرسش پیش بیاید که این متد پارمتر ورودی ندارد، پس چگونه به پارمترهای پاس داده شده به آن باید دسترسی داشته باشیم؟
برای این کار در زبان پاسکال دو متغیر به نامهای ParamCount و ParamStr تعریف شدهاند، اولی تعداد پارامترهای ورودی و دیگری آرایه رشته ای که حاوی پارامترهای ورودی است را مشخص میکند.
در پاسکال مانند C و C++ مقدار ParamStr نام برنامه را نیز شامل میشود.
همانطور که گفته شد، در زبان جاوا تابع main مقداری را برنمیگرداند و تعریف آن بهصورت زیر است:
public static void main(String[] args)
public static void main(String... args)
در جاوا نیز مانند C# args شامل نام برنامه نمیشود.
در زبان Perl تابعی بهنام main وجود ندارد، کد این برنامه از بالا به پایین اجرا میشود و مقادیر فرستاده شده توسط خط فرمان توسط متغیرهای @ARGV قابل بازیابی است و برخلاف C، نام برنامه در @ARGV موجود نیست.
نحوه استفاده از پارامترهای تابع main در برنامهها
در برنامههای خود با چک کردن تعداد آرگومانهای ورودی و خواندن آنها میتوانید کارهایی را انجام دهید، که این کارها بستگی به دید شما به برنامهتان دارد. در اکثر برنامهها با پارامتر -? یا /? میتوان به دستوراتی که برنامه بهعنوان پارمتر به برنامه داده میدهد، درسترسی داشت و با مقادیر آنها آشنا شد. بهطور مثال دستور regsvr32 که یک شیء COM را در ویندوز ثبت میکند، چند مقدار برای انجام کارهای خود از کاربر میگیرد. در همین مثال regsvr32 بهطور پیشفرض باید نام شیء COM که آدرس یک فایل dll است را به آن پاس دهید. این پارامتر اجباری است و باید مقدار داشته باشد ولی پارامترهای دیگر، پارامترهای اختیاری هستند که بود و نبود آنها تاثیری در کار اصلی برنامه ندارد ولی با مقداردهی آنها میتوان امکانات بیشتری داشت. برای نمونه همان regsvr32 را بررسی میکنیم:
برای اجرای این دستور باید آدرس فایل dll را به آن داد و پس از ثبت، یک پیغام برای شما ظاهر میشود که نشان میدهد، عملیات با موفقیت پایان یافته است. اگر پارامتر اختیاری /s را پیش از نشانی فایل وارد کنیم، دیگر این پیغام ظاهر نخواهد شد و اگر قبل از آدرس فایل /u را بنویسیم شی COM را از لیست اشیا COM ویندوز حذف میکند و اگر بعد از آن /s بگزاریم دیگر پیغام را مشاهده نمیکنیم بطور مثال
Regsvr32 /u /s C:\ClickCOM.dll
شما نیز به عنوان برنامه نویس میتوانید با پیاده سازی درست تابع main خود از این مقادیر استفاده کنید. بطور مثال کد زیر که به زبان سی شارپ نوشته شده است مقادیر پاس داده شده از طریق خط فرمان را چاپ میکند:
static void Main(string[] args) {
if (args.Length == 0)
return;
else {
for (int i = 0; i < args.Length; i++) {
Console.WriteLine(string.Format
("Command {0} : {1}",i, args[i])); } }
}
شما میتوانید با چک کردن مقادیر پارامترها برای هر کدام، یک عمل خاص را انجام دهید.
منبع
http://en.wikipedia.org/wiki/Main
_function_%28programming%29
http://en.wikipedia.org/wiki/Entry_point
http://en.wikipedia.org/wiki/Command-line_argument
پینوشت
1. EntryPoint
2. Overload
3. Class-based
امیر بهاالدین سبطالشیخ
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
گزارش «جامجم» درباره دستاوردهای زبان فارسی در گفتوگو با برخی از چهرههای ادب معاصر
معاون وزیر بهداشت: