امامان شیعیان دوازده امامی
اکثریت شیعه، را شیعه امامیه یا اثنیعشری (دوازده امامی) تشکیل میدهد، از آنجا که آنان جانشینان پیامبر اسلام را ۱۲ نفر میدانند، اثنا عشریه (دوازده امامی) نامیده شدهاند.
نام و خصوصیات امامان دوازدهگانه در احادیثی که از پیامبر اسلام روایت شده، بیان گردیدهاست. آنان عبارتند از:

امام علی بن ابی طالب امیرالمومنین
امام حسن بن علی(حسن مجتبی)
امام حسین بن علی (سید الشهدا)
امام علی بن الحسین (سجاد/زین العابدین)
امام محمد بن علی (باقر)
امام جعفر بن محمد (صادق)
امام موسی بن جعفر (کاظم)
امام علی بن موسی (رضا)
امام محمد بن علی (تقی)
امام علی بن محمد (نقی)
امام حسن بن علی (حسن عسکری)
امام حجت بن الحسن (المهدی)
فقه
مذهب فقهی شیعیان دوازدهامامی به فقه امامیه مشهور است.
علایم ظاهری شیعیان
در روایتی از حسن بن علی العسکری نقل شده است: «نشانه و علامتِ مؤمن (شیعه) پنج چیز است: ۱- ۵۱ رکعت نماز در شبانهروز خواندن (۱۷ رکعت واجب و ۳۴ رکعت مستحبی و نافله روزانه)، ۲- زیارت کردن امام حسین در روز اربعین، ۳- انگشتر را در دست راست نمودن، ۴- پیشانی را در سجده بر خاک نهادن، ۵- بسم الله الرحمن الرحیم را در نمازه بلند گفتن.»
یکی دیگر از نشانههای ظاهری شیعیان شهادت دادن به ولایت و خلافت بلافصل علی بن ابیطالب و امامان بعد از او در اذان (با ذکر اشهد ان علیاْ ولیالله یا نظایر آن) میباشد؛ که شهادت ثالثه نامیده میشود. البته گواهی دادن به ولایت علی بن ابیطالب در اذان به عنوان استحباب و تبرک گفته میشود و از اجزای اصلی اذان نیست. گر چه شهادت به ولایت علی بن ابی طالب در این زمانه شعار مذهب شیعه محسوب میشود، ولی برخی مراجع تقلید معتقدند که این عبارت باید طوری گفته شود که شبیه جملات اذان و اقامه نگردد.
جغرافیای تشیع
شیعیان حدود ۱۶٪ تا ۳۰٪ از کل جمعیت مسلمانان را تشکیل میدهند. ، بیشتر شیعیان دوازدهامامی در هند, ایران، عراق، جمهوری آذربایجان، لبنان، افغانستان، پاکستان و کشورهای حاشیه خلیج فارس مانند یمن و بحرین زندگی میکنند. بر اساس آمار سیا ورلد فکتبوک ۸۹ درصد مردم ایران ۶۰ تا ۶۵ درصد مردم عراق، ۸۵ درصد مردم جمهوری آذربایجان و ۳۰ درصد مردم کویت و ۲۰ تا ۳۰ درصد مردم افغانستان و ۱۶ درصد مردم امارات متحده عربی شیعه دوازدهامامی هستند. از شیعیان لبنان، عربستان سعودی، بحرین و قطر آمار دقیقی در دست نیست. همچنین بنابر آمار ۲۰٪ مردم پاکستان شیعه هستند که بخشی از آنها بخصوص در کشمیر، اسماعیلی هستند. شیعیان یمن، عمدتاً از زیدیه هستند، اما از آنان نیز آمار دقیقی در دست نیست. همچنین ۲۰ درصد از مردم شیعه ترکیه موسوم به علوییون و شیعیان سوریه نیز علوی هستند.
شاه عبدالعظیم
آرامگاه عبدالعظیم حسنی در مجموعه آرامگاههای نوادگان حسن بن علی است که در شهر ری (در جنوب تهران) قرار دارد. این آرامگاه با آرامگاه حمزه و طاهر یکی از مشهورترین زیارتگاههای شیعیان ایران بوده و مربوط به دوره ایلخانی - دوره صفوی - دوره قاجار است. این اثر در تاریخ ۱۱ بهمن ۱۳۳۴ با شمارهٔ ثبت ۴۰۶ بهعنوان یکی از آثار ملی ایران به ثبت رسیده است.
نسب عبدالعظیم
احمد بن علی نجاشی (یکی از بزرگان علم رجال)، درباره نسب وی مینویسد: هنگامی که جنازه او را برای غسل برهنه میکردند، در جیب لباس وی نوشتهای یافت شد که در آن، نسبش، این گونه نوشته شده بود: من ابوالقاسم، عبدالعظیم بن عبدالله بن علی بن حسن بن زید بن علی بن حسن بن علی بن ابی طالب هستم. براساس این نسخه از رجال النجاشی، در نسب ایشان، میان وی و امام حسن، پنج نفر واسطه وجود دارد؛ لیکن در نسخههای معتبر این کتاب، میان «زید» - یعنی جدّ سوّم ایشان – و امام حسن علیه السّلام، شخص دیگری واسطه نیست. بنابراین، نیاکان حضرت عبدالعظیم علیه السّلام به ترتیب، عبارت اند از:
۱. عبدالله بن علی
پدر عبدالعظیم، «عبدالله» نام داشت و مادرش، «فاطمه» دختر عقبة بن قیس بود. عبدالله، در زمان حیات جدّش «حسن بن زید» زاده شد و چون پیش از زایشش، پدرش «علی» در زندان درگذشت، جدّش سرپرستی او را به عهده گرفت.
۲. علی بن حسن
نام جدّ نخست عبدالعظیم، «علی» و لقب او «سدید» است. وی همراه پسر عمویش عبدالله محض و گروهی دیگر از سادات حسینی، در دوران خلافت منصور بر ضدّ عبّاسیان قیام کرد. جمعی از آنان و از جمله وی، دستگیر و به بغداد منتقل شدند. او پس از مدّتی در زندان وفات یافت.
۳. حسن بن زید
جدّ دوّم عبدالعظیم، «حسن» نام داشت. وی تنها فرزند پسر زید بود که از بزرگان عصر خودش به شمار میرفت و در بین بنی هاشم، به بخشش، کرَم، سخاوت و خدمت به نیازمندان، شهرت داشته است. وی از سوی منصور خلیفه عبّاسی به ولایت مدینه گمارده شد؛ ولی پس از مدّتی، مورد خشم او قرار گرفت و به زندان افتاد و در سال ۱۶۸ ق، در هشتاد سالگی از دنیا رفت.
۴. زید فرزند (حسن پسر علی بن ابیطالب)
جدّ سوّم عبدالعظیم، زید فرزند بزرگ امام حسن است. ایشان سرپرست اوقاف پیامبر اسلام بوده و به بزرگواری، پرهیزکاری و نیکوکاری توصیف گردیده است. شاعران، او را ستوده و مردم از هر سو به وی روی می آوردهاند. وی در یکصد سالگی، چشم از جهان فرو بست و در زمینی به نام «حاجز» در نزدیکی مدینه دفن گردید.
بناها
بنای نخستین این آرامگاه را محمد پسر زید داعی علوی در نیمه دوم قرن سوم هجری قمری برابر با با قرن نهم میلادی تعمیر اساسی کرد. در گاه اصلی ورودی آن که در شمال آرامگاه قرار دارد به فرمان پادشاهان خاندان بویه و سپس با تلاش مجدالملک قمی ساخته شد.
بنای آرامگاه در بخش پایین چهارگوشی است که هر سوی آن حدود هشت متر است. در بالا مانند همه بناهای سلجوقی برفراز چهارگوشه حرم چهار گوشوار یعنی چهار طاق مورب بنا کردهاند و بالاتر از آن یک هشت ضلعی و بر روی آن یک شانزدهضلعی ساختهاند. روی این شانزدهضلعی گنبد اصلی حرم ساخته شده است. تمام این بخشها از درون آیینهکاری شده است. تعمیر و تغییرات اصلی این بخش در زمان شاهطهماسب صفوی انجام گرفته است. صحنها و ایوان از آثار دوره صفوی میباشد. در دوره قاجار تعمیرات و اضافات بسیاری صورت گرفت. پوشش زرین گنبد به فرمان ناصرالدین شاه در سال ۱۲۷۰ هجری قمری برابر با ۱۸۳۵ میلادی انجام گرفته است.
آثار تاریخی
تاریخ ساخت صندوق داخل آرامگاه عبدالعظیم ۷۲۵ هجری قمری برابر با ۱۳۳۵ میلادی است.
دو لوحه کتیبه چوبی روی یک جفت در چوبی جدید تر نصب شده که تاریخ ساخت لوحهها ۸۴۸ هجری قمری مطابق با ۱۴۴۴ میلادی است.
تاریخ ساخت درب بزرگ چوبی بین رواق شمالی و مسجد زنانه ۹۰۴ هجری قمری (برابر با ۱۴۹۸ میلادی) و به سبک دوره تیموری است.
آرامگاههای پیرامون
بسیاری از نامداران ایران در کنار آرامگاه و رواقهای اطراف، عمدتاً در باغ طوطی، به خاک سپرده شدهاند. ازجمله: ناصرالدین شاه قاجار (که پس از پیروزی انقلاب اسلامی تخریب گشت.)، آیتالله سید ابوالقاسم کاشانی، ملا علی کنی و محمد قزوینی، عباس اقبال آشتیانی، شیخ محمد خیابانی، ستار خان، محمدتقی فلسفی و برخی حکام اردلان که از وابستگان پادشاهان قاجار بودند نیز در صحن آرمیدهاند.
در دوره پهلوی آرامگاهی در جوار این آستان برای رضا شاه پهلوی تدارک دیده شد که به تدریج بسیاری از وابستگان این خاندان در آن جا به خاک سپرده شدند. از جمله: علیرضا پهلوی، سلیمان بهبودی، سپهبد فضلالله زاهدی، ارتشبد محمد خاتم، حسن علی منصور. این آرامگاه پس از انقلاب اسلامی سال ۱۳۵۷ به همراه آرامگاه پنجاه تن از وابستگان رژیم گذشته توسط گروهی به سردستگی صادق خلخالی ویران شد.
درگذشت عبدالعظیم
عبدالعظیم از ترس خشم خلیفه وقت فرار کرده و به ری وارد میشود و در سرداب خانه یکی از شیعیان آن شهر به زندگی پنهانی روی میآورد. او روزها روزه میگرفت و شبها به نماز میایستاد. گاهی پنهانی از خانه بیرون میآمد و قبری را که اکنون روبروی آرامگاهش است زیارت میکرد.
پس از مدتی عبدالعظیم بیمار میشود و چندی بعد در میگذرد. هنگامی که خواستند او را غسل بدهند کاغذی را در پیراهنش مییابند که او خود و پدرانش را نام میبرد: من ابوالقاسم پسر عبدالله پسر علی پسر حسن پسر زید پسر حسن پسر علی بن ابیطالب هستم.
حسن بن راشد
حسن بن راشد مکنی ابو علی وی از شاگردان محمد جواد وعلی نقی شمرده شده ونزد ایشان از منزلت ومقام والای برخوردار بودهاست.
شیخ مفید او را از زمره فقیهان برجسته وشخصیتهای طراز اول دانسته که حلال وحرام از آنها گرفته میشد، و راهی برای مذمت وطعن بر آنان وجود نداشت.
شیخ طوسی نیز به هنگام بحث از سفرا ووکلای ممدوح امامان شیعه از حسن بن راشد به عنوان وکیل امام هادی نام برده نامههای آن امام را به او یاد آور شدهاست.
محمد بن فرج، می گوید: در نامهای به امام هادی از ابو علی و... پرسیدم؟ امام در پاسخ نوشت: نام ابن راشد را بردی خدا او را رحمت کند، او سعادتمندانه زندگی کرد وشهید در گذشت.
عثمان بن سعید
ابو عمرو، عثمان بن سعید اسدی عمروی نخستین نایب امام زمان و از یاران و شاگردان مورد وثوق امام هادی و امام حسن عسکری بود.
نام
او از قبیله بنی اسد بود و چون در سامرا زندگی میکرد به او عسکری هم میگفتند. در محافل شیعه به او «سمّان» و «زیّات» (به معنی روغن فروش) هم میگفتند. به خاطر اختفاء امر نیابت و استتار فعالیتهای سیاسی، روغنفروشی میکرد، و اموال و نامهها را با ظرف روغن میان امام و شیعیان جابهجا میکرد. وی همچنین به خاطر ابراز نیابت از طرف امام دوازدهم خود را باب (به معنای درب امامت) مینامید. امام حسن عسکری چون نام طولانی او را شنید، گفت: «کنیه ابن عثمان و ابو عمرو در یک مرد جمع نمیشود». و بنابراین دستور داد که کنیه او را که ابو عمرو باشد بر هم بزنند و وی را «عمری» نامیدند.
غیبت صغری
پس از در گذشت امام حسن عسکری، احتمالاً عثمان بن سعید امام حسن عسکری را غسل داد و کفن کرد و حنوط نمود و به خاک سپرد.
در این زمان که غیبت صغری هم آغاز گردید، عثمان بن سعید از سوی امام مهدی بهعنوان نخستین نایب خاص وی منصوب گشت و واسطه میان امام و شیعیان شد. درگذشت او را میان سال ۲۶۰ تا ۲۶۷ قمری ذکر کردهاند. هنگامی که وی در گذشت پسرش محمد را به جای خود منصوب کرد، جسدش را در جانب غربی بغداد در شارع المیدان، که نزدیک دروازه قبلی قرار داشت، بهخاک سپردند و قبر در خود قبله مسجد است.
مدینه
مدینه یا مدینةالنبی، (به عربی: المدینة المنورة)، نام شهری است در کشور پادشاهی عربستان سعودی واقع در شبه جزیره عربستان. این شهر در شمال ریاض و در میانه نجد قرار گرفته و آبوهوایی خشک و بیابانی با تابستانهای داغ و زمستانهای سرد دارد. این شهر پیش از هجرت پیامبر اسلام به آن، یثرب نام داشت، که با ورود پیامبر، آنرا مدینة النبی (یعنی: شهر پیامبر) نامیدند.
شهری مدینه در ناحیه تاریخی حجاز در کشور عربستان سعودی، این شهر پس از هجرت پیامبر اسلام، به مدینةالنبی(شهر پیامبر) معروف شد، در اولین شب ربیع الاول سال ۱۴ بعثت، «محمد» به «یثرب» مهاجرت نمود و سرآغاز تاریخ مسلمانان(تاریخ هجری)، از همان سال میباشد.
مسجدالنبی، مسجد قباء و مسجد ذوقبلتین در این شهر قرار دارند. مدینه امروزه از شهرهای مقدس مسلمانان بهشمار میآید. مقبره پیامبر اسلام در این شهر و در داخل خانه پیامبر در کنار مسجد النبی قرار دارد و از مهمترین زیارت گاه های مسلمانان است. برای نخستین بار تصاویری از داخل محل مرقد پیامبر منتشر شده است که این مرقد را بسیار ساده و با روپوشی از پارچه سبز نشان می دهد که بر روی آن کلمات "لااله الا الله" و "محمد رسول الله" نوشته شده است
فاصله مدینه تا مکه حدود ۴۲۰ کیلومتر است.
تاریخچه یثرب
یثرب از شهرهای باستانی است که در کتیبههای معینی از آن نام برده شدهاست. این شهر از جمله محلهایی بود که گروهی از نیروهای معینی در آن اقامت داشتند. پس از آنکه روزگار دولت معینیان سپری گردید، سبائیان حکومت آنجا را در دست گرفتند. معروف است که حکومتهای معین و سبا همواره در پی بسط سلطه و نفوذ خود در سرزمینهای شمال عربستان بودند. همچنین در جغرافیای بطلمیوس دوبار از این شهر نام برده شدهاست، یک بار به نام ایاترپه و بار دیگر به نام ایاتریپا. استفان بیزانسی از این شهر به نام ایاتریپاپولیس یاد کردهاست. این شهر در نزد راویان اخبار گذشته به نام اثرب و یثرب معروف است. به نوشته آنان یثرب مرکز مدینهاست، که از قناه تا جرف و از المال، که بدان برناوی میگویند، تا زباله امتداد میابد. برخی از راویان اخبار گمان بردهاند که این شهر به دلیل انتساب به یثرب بن قانیه بن مهلائیل بن ارم بن عبیل بن عوص بن ارم بن سام بن نوح، بدین نام خوانده شدهاست و او نخستین کسی بود که هنگام پراکنده شدن خاندان نوح در این سرزمین فرود آمد.
دیگران گمان کردهاند که نام یثرب ماخوذ از ثرب به معنای فساد یا از تثریب یعنی «مواخذه به علت گناه» است و نوشتهاند که پیامبر به دلیل کراهت از تثیرب، از نامیدن این شهر به اسم یثرب نهی کرد و آن را طیبه و طابه نامید. بلاذری مینویسد که یثرب به نام رئیس گروهی از عمالقه نامیده شدهاست که پس از بیرون راندن بنی عبیل بن عوص بن ارم بن سام، از فرزندام نوح، از آنجا فرود آمدند.
نام مدینه که پس از هجرت پیامبر، به یثرب اطلاق شدهاست ماخوذ از کلمه آرامی مدینتا به معنی قرق و شهر، خلاصه شده مدینه الرسول است. راویان اخبار نوشتهاند که یثرب یا مدینه ۲۹ اسم دارد که عبارتند از: طیبه، طابه، مسکینه، عذراء، جابره، محببه، مجبوره، یثرب، ناجیه، موفیه، اکاله البلدان ع محفوفه، مسلمه، مجنه، قدسیه، عاصمه، مرزوقه، شافیه، خیره، محبوبه، مرحومه، جابره، مختاره، محرمه، غلبه، ببره، تندر، حسیبه، دارالبرار، حسنه، دارالخیار، دارالیمان، دارالسنه، دارالهجره، قاصمه، طباطبا.
نامیدن به نام پیشین
در قرآن آمده است که منافقین مدینه، شهر را به نام قدیمش (یعنی یثرب) مینامیدند، و نام جدید آن را پذیرا نبودند. آیات ۱۲ و ۱۳ سوره احزاب بیان میدارد که در جنگ احزاب، وقتی منافقان و افراد ضعیفالایمان، احزاب و گروههای مختلف کفار و جمعیت فراوان آنها را دیدند، گفتند: خدا و رسولش جز وعدههای فریبنده دروغین به ما ندادهاند؛ و برخی از آنها میگفتند: ای مردم یثرب این میدان جای ماندن شما نیست، پس به خانههای خود بازگردید (و گر نه همگی کشته میشوید)! این در حالی بود که -طبق آیه ۲۲ سوره احزاب- وقتی مؤمنان احزاب و سپاهیان دشمن را دیدند، گفتند: اين همان است كه خدا و رسولش به ما وعده دادند و خدا و رسولش راست گفتند؛ و (ديدن آنها) جز بر ايمان و تسليم آنان نيفزود.
تقلید
تقلید در اصل به معنی پیروی و دنبالهروی است و در شریعت اسلامی به معنی اجرای حکمی است که مرجع تقلید بیان میکند. عموماً گفته میشود تقلید در اصول دین جایز نیست و باید با تحقیق به آنها رسید، ولی در احکام اغلب اوقات باید از شخص متخصص که به او مجتهد جامعالشرایط یا مرجع تقلید میگویند تقلید نمود. البته در تعیین حوزه لزوم تقلید، اختلاف نظر وجود دارد.
معانی تقلید
تقلید مصدر عربی باب تفعیل از مادّه «قَلَد»، و در لغت به معنای چیزی را ملازم کسی یا شخصی قرار دادن و گردن نهادن به کاری است. این واژه در اصطلاح فقهی به معنای التزام به عمل و گفتار مجتهد معیّن است. البته این واژه در متون فقهی در مبحث حج به معنای «علامتی بر گردن قربانی آویختن تا معلوم شود برای قربانی در حج است» هم به کار رفته است. در منابع اصولی و فقهی دو گونه تعریف برای تقلید مطرح شده شماری از فقها تقلید را امری متمایز از عمل کردن به حکم شرعی و آنرا اخذ فتوای مجتهد یا پذیرفتن آن یا التزام داشتن به آن تعریف کردهاند. در برابر، بیشتر فقها ماهیت تقلید را همان پیروی عملی از فتوای مجتهد دانستهاند.
مصادیق تقلید
از دیدگاه فقه اسلامی، تقلید در برخی موارد، از جمله در مورد احکام ضروری و یقینی، مجاز نیست، زیرا در سیرهٔ عقلا، تقلید تنها در مواردی صورت میگیرد که علم و قطع برای خود شخص وجود نداشته باشد. مورد دیگری که تقلید در آن ممکن نیست، عقایدی است که باید نسبت به آنها اعتقاد یقینی حاصل شود (مانند اصول دین)، حال آنکه تقلید یقین آور نیست. البته در برخی عقاید فرعی مذهبی رجوع جاهل به عالم میتواند برای مکلف یقین آور باشد، مانند رجوع به پیامبر اسلام برای تعیین امام و جانشینان پس از او؛ ولی این امر مصداق تقلید مصطلح شمرده نشده است. اهل سنّت نیز تقلید در عقاید را جایز نمیدانند زیرا در اینگونه امور تفکر و رسیدن به اطمینانْ مطلوب و تقلید مذموم است. آیة ۲۲ سورهٔ زخرف پیروی بی دلیل از روش گذشتگان را ناپسند شمرده و پیامبر اسلام نیز به تفکر در آیات مربوط به معرفت الهی توصیه کرده است. تنها به ظاهری مذهبان جواز تقلید در عقاید نسبت داده شده است.
موارد دیگر ممنوعیت تقلید در منابع فقهی امامی عبارت اند از: مسائل اصول فقه؛ مقدّمات اجتهاد، مانند صرف و نحو؛ شناختن مفهوم آن دسته از موضوعات احکام شرعی که جنبهٔ عرفی یا لغوی دارند، بر خلاف مواردی که شرع آنها را ایجاد نموده (مانند نماز و روزه)؛ و بالاخره احکام غیرالزامی مانند مستحبات و مکروهات که نیازی به تقلید ندارند و میتوان آنها را به امید رسیدن به پاداش الاهی انجام داد. در پارهای منابع فقهی سه مورد نخست هم، به استناد سیرة عقلا، مشمول ادلهٔ جواز تقلیدند.
در مذاهب مختلف اسلامی، تقلید بر مجتهد حرام است اما فرد غیرمجتهد یا کسی که در برخی موضوعات، عامی محسوب میشود، باید تقلید کند.
اکثریت شیعه، را شیعه امامیه یا اثنیعشری (دوازده امامی) تشکیل میدهد، از آنجا که آنان جانشینان پیامبر اسلام را ۱۲ نفر میدانند، اثنا عشریه (دوازده امامی) نامیده شدهاند.
نام و خصوصیات امامان دوازدهگانه در احادیثی که از پیامبر اسلام روایت شده، بیان گردیدهاست. آنان عبارتند از:

امام علی بن ابی طالب امیرالمومنین
امام حسن بن علی(حسن مجتبی)
امام حسین بن علی (سید الشهدا)
امام علی بن الحسین (سجاد/زین العابدین)
امام محمد بن علی (باقر)
امام جعفر بن محمد (صادق)
امام موسی بن جعفر (کاظم)
امام علی بن موسی (رضا)
امام محمد بن علی (تقی)
امام علی بن محمد (نقی)
امام حسن بن علی (حسن عسکری)
امام حجت بن الحسن (المهدی)
فقه
مذهب فقهی شیعیان دوازدهامامی به فقه امامیه مشهور است.
علایم ظاهری شیعیان
در روایتی از حسن بن علی العسکری نقل شده است: «نشانه و علامتِ مؤمن (شیعه) پنج چیز است: ۱- ۵۱ رکعت نماز در شبانهروز خواندن (۱۷ رکعت واجب و ۳۴ رکعت مستحبی و نافله روزانه)، ۲- زیارت کردن امام حسین در روز اربعین، ۳- انگشتر را در دست راست نمودن، ۴- پیشانی را در سجده بر خاک نهادن، ۵- بسم الله الرحمن الرحیم را در نمازه بلند گفتن.»
یکی دیگر از نشانههای ظاهری شیعیان شهادت دادن به ولایت و خلافت بلافصل علی بن ابیطالب و امامان بعد از او در اذان (با ذکر اشهد ان علیاْ ولیالله یا نظایر آن) میباشد؛ که شهادت ثالثه نامیده میشود. البته گواهی دادن به ولایت علی بن ابیطالب در اذان به عنوان استحباب و تبرک گفته میشود و از اجزای اصلی اذان نیست. گر چه شهادت به ولایت علی بن ابی طالب در این زمانه شعار مذهب شیعه محسوب میشود، ولی برخی مراجع تقلید معتقدند که این عبارت باید طوری گفته شود که شبیه جملات اذان و اقامه نگردد.
جغرافیای تشیع
شیعیان حدود ۱۶٪ تا ۳۰٪ از کل جمعیت مسلمانان را تشکیل میدهند. ، بیشتر شیعیان دوازدهامامی در هند, ایران، عراق، جمهوری آذربایجان، لبنان، افغانستان، پاکستان و کشورهای حاشیه خلیج فارس مانند یمن و بحرین زندگی میکنند. بر اساس آمار سیا ورلد فکتبوک ۸۹ درصد مردم ایران ۶۰ تا ۶۵ درصد مردم عراق، ۸۵ درصد مردم جمهوری آذربایجان و ۳۰ درصد مردم کویت و ۲۰ تا ۳۰ درصد مردم افغانستان و ۱۶ درصد مردم امارات متحده عربی شیعه دوازدهامامی هستند. از شیعیان لبنان، عربستان سعودی، بحرین و قطر آمار دقیقی در دست نیست. همچنین بنابر آمار ۲۰٪ مردم پاکستان شیعه هستند که بخشی از آنها بخصوص در کشمیر، اسماعیلی هستند. شیعیان یمن، عمدتاً از زیدیه هستند، اما از آنان نیز آمار دقیقی در دست نیست. همچنین ۲۰ درصد از مردم شیعه ترکیه موسوم به علوییون و شیعیان سوریه نیز علوی هستند.
شاه عبدالعظیم
آرامگاه عبدالعظیم حسنی در مجموعه آرامگاههای نوادگان حسن بن علی است که در شهر ری (در جنوب تهران) قرار دارد. این آرامگاه با آرامگاه حمزه و طاهر یکی از مشهورترین زیارتگاههای شیعیان ایران بوده و مربوط به دوره ایلخانی - دوره صفوی - دوره قاجار است. این اثر در تاریخ ۱۱ بهمن ۱۳۳۴ با شمارهٔ ثبت ۴۰۶ بهعنوان یکی از آثار ملی ایران به ثبت رسیده است.
نسب عبدالعظیم
احمد بن علی نجاشی (یکی از بزرگان علم رجال)، درباره نسب وی مینویسد: هنگامی که جنازه او را برای غسل برهنه میکردند، در جیب لباس وی نوشتهای یافت شد که در آن، نسبش، این گونه نوشته شده بود: من ابوالقاسم، عبدالعظیم بن عبدالله بن علی بن حسن بن زید بن علی بن حسن بن علی بن ابی طالب هستم. براساس این نسخه از رجال النجاشی، در نسب ایشان، میان وی و امام حسن، پنج نفر واسطه وجود دارد؛ لیکن در نسخههای معتبر این کتاب، میان «زید» - یعنی جدّ سوّم ایشان – و امام حسن علیه السّلام، شخص دیگری واسطه نیست. بنابراین، نیاکان حضرت عبدالعظیم علیه السّلام به ترتیب، عبارت اند از:
۱. عبدالله بن علی
پدر عبدالعظیم، «عبدالله» نام داشت و مادرش، «فاطمه» دختر عقبة بن قیس بود. عبدالله، در زمان حیات جدّش «حسن بن زید» زاده شد و چون پیش از زایشش، پدرش «علی» در زندان درگذشت، جدّش سرپرستی او را به عهده گرفت.
۲. علی بن حسن
نام جدّ نخست عبدالعظیم، «علی» و لقب او «سدید» است. وی همراه پسر عمویش عبدالله محض و گروهی دیگر از سادات حسینی، در دوران خلافت منصور بر ضدّ عبّاسیان قیام کرد. جمعی از آنان و از جمله وی، دستگیر و به بغداد منتقل شدند. او پس از مدّتی در زندان وفات یافت.
۳. حسن بن زید
جدّ دوّم عبدالعظیم، «حسن» نام داشت. وی تنها فرزند پسر زید بود که از بزرگان عصر خودش به شمار میرفت و در بین بنی هاشم، به بخشش، کرَم، سخاوت و خدمت به نیازمندان، شهرت داشته است. وی از سوی منصور خلیفه عبّاسی به ولایت مدینه گمارده شد؛ ولی پس از مدّتی، مورد خشم او قرار گرفت و به زندان افتاد و در سال ۱۶۸ ق، در هشتاد سالگی از دنیا رفت.
۴. زید فرزند (حسن پسر علی بن ابیطالب)
جدّ سوّم عبدالعظیم، زید فرزند بزرگ امام حسن است. ایشان سرپرست اوقاف پیامبر اسلام بوده و به بزرگواری، پرهیزکاری و نیکوکاری توصیف گردیده است. شاعران، او را ستوده و مردم از هر سو به وی روی می آوردهاند. وی در یکصد سالگی، چشم از جهان فرو بست و در زمینی به نام «حاجز» در نزدیکی مدینه دفن گردید.
بناها
بنای نخستین این آرامگاه را محمد پسر زید داعی علوی در نیمه دوم قرن سوم هجری قمری برابر با با قرن نهم میلادی تعمیر اساسی کرد. در گاه اصلی ورودی آن که در شمال آرامگاه قرار دارد به فرمان پادشاهان خاندان بویه و سپس با تلاش مجدالملک قمی ساخته شد.
بنای آرامگاه در بخش پایین چهارگوشی است که هر سوی آن حدود هشت متر است. در بالا مانند همه بناهای سلجوقی برفراز چهارگوشه حرم چهار گوشوار یعنی چهار طاق مورب بنا کردهاند و بالاتر از آن یک هشت ضلعی و بر روی آن یک شانزدهضلعی ساختهاند. روی این شانزدهضلعی گنبد اصلی حرم ساخته شده است. تمام این بخشها از درون آیینهکاری شده است. تعمیر و تغییرات اصلی این بخش در زمان شاهطهماسب صفوی انجام گرفته است. صحنها و ایوان از آثار دوره صفوی میباشد. در دوره قاجار تعمیرات و اضافات بسیاری صورت گرفت. پوشش زرین گنبد به فرمان ناصرالدین شاه در سال ۱۲۷۰ هجری قمری برابر با ۱۸۳۵ میلادی انجام گرفته است.
آثار تاریخی
تاریخ ساخت صندوق داخل آرامگاه عبدالعظیم ۷۲۵ هجری قمری برابر با ۱۳۳۵ میلادی است.
دو لوحه کتیبه چوبی روی یک جفت در چوبی جدید تر نصب شده که تاریخ ساخت لوحهها ۸۴۸ هجری قمری مطابق با ۱۴۴۴ میلادی است.
تاریخ ساخت درب بزرگ چوبی بین رواق شمالی و مسجد زنانه ۹۰۴ هجری قمری (برابر با ۱۴۹۸ میلادی) و به سبک دوره تیموری است.
آرامگاههای پیرامون
بسیاری از نامداران ایران در کنار آرامگاه و رواقهای اطراف، عمدتاً در باغ طوطی، به خاک سپرده شدهاند. ازجمله: ناصرالدین شاه قاجار (که پس از پیروزی انقلاب اسلامی تخریب گشت.)، آیتالله سید ابوالقاسم کاشانی، ملا علی کنی و محمد قزوینی، عباس اقبال آشتیانی، شیخ محمد خیابانی، ستار خان، محمدتقی فلسفی و برخی حکام اردلان که از وابستگان پادشاهان قاجار بودند نیز در صحن آرمیدهاند.
در دوره پهلوی آرامگاهی در جوار این آستان برای رضا شاه پهلوی تدارک دیده شد که به تدریج بسیاری از وابستگان این خاندان در آن جا به خاک سپرده شدند. از جمله: علیرضا پهلوی، سلیمان بهبودی، سپهبد فضلالله زاهدی، ارتشبد محمد خاتم، حسن علی منصور. این آرامگاه پس از انقلاب اسلامی سال ۱۳۵۷ به همراه آرامگاه پنجاه تن از وابستگان رژیم گذشته توسط گروهی به سردستگی صادق خلخالی ویران شد.
درگذشت عبدالعظیم
عبدالعظیم از ترس خشم خلیفه وقت فرار کرده و به ری وارد میشود و در سرداب خانه یکی از شیعیان آن شهر به زندگی پنهانی روی میآورد. او روزها روزه میگرفت و شبها به نماز میایستاد. گاهی پنهانی از خانه بیرون میآمد و قبری را که اکنون روبروی آرامگاهش است زیارت میکرد.
پس از مدتی عبدالعظیم بیمار میشود و چندی بعد در میگذرد. هنگامی که خواستند او را غسل بدهند کاغذی را در پیراهنش مییابند که او خود و پدرانش را نام میبرد: من ابوالقاسم پسر عبدالله پسر علی پسر حسن پسر زید پسر حسن پسر علی بن ابیطالب هستم.
حسن بن راشد
حسن بن راشد مکنی ابو علی وی از شاگردان محمد جواد وعلی نقی شمرده شده ونزد ایشان از منزلت ومقام والای برخوردار بودهاست.
شیخ مفید او را از زمره فقیهان برجسته وشخصیتهای طراز اول دانسته که حلال وحرام از آنها گرفته میشد، و راهی برای مذمت وطعن بر آنان وجود نداشت.
شیخ طوسی نیز به هنگام بحث از سفرا ووکلای ممدوح امامان شیعه از حسن بن راشد به عنوان وکیل امام هادی نام برده نامههای آن امام را به او یاد آور شدهاست.
محمد بن فرج، می گوید: در نامهای به امام هادی از ابو علی و... پرسیدم؟ امام در پاسخ نوشت: نام ابن راشد را بردی خدا او را رحمت کند، او سعادتمندانه زندگی کرد وشهید در گذشت.
عثمان بن سعید
ابو عمرو، عثمان بن سعید اسدی عمروی نخستین نایب امام زمان و از یاران و شاگردان مورد وثوق امام هادی و امام حسن عسکری بود.
نام
او از قبیله بنی اسد بود و چون در سامرا زندگی میکرد به او عسکری هم میگفتند. در محافل شیعه به او «سمّان» و «زیّات» (به معنی روغن فروش) هم میگفتند. به خاطر اختفاء امر نیابت و استتار فعالیتهای سیاسی، روغنفروشی میکرد، و اموال و نامهها را با ظرف روغن میان امام و شیعیان جابهجا میکرد. وی همچنین به خاطر ابراز نیابت از طرف امام دوازدهم خود را باب (به معنای درب امامت) مینامید. امام حسن عسکری چون نام طولانی او را شنید، گفت: «کنیه ابن عثمان و ابو عمرو در یک مرد جمع نمیشود». و بنابراین دستور داد که کنیه او را که ابو عمرو باشد بر هم بزنند و وی را «عمری» نامیدند.
غیبت صغری
پس از در گذشت امام حسن عسکری، احتمالاً عثمان بن سعید امام حسن عسکری را غسل داد و کفن کرد و حنوط نمود و به خاک سپرد.
در این زمان که غیبت صغری هم آغاز گردید، عثمان بن سعید از سوی امام مهدی بهعنوان نخستین نایب خاص وی منصوب گشت و واسطه میان امام و شیعیان شد. درگذشت او را میان سال ۲۶۰ تا ۲۶۷ قمری ذکر کردهاند. هنگامی که وی در گذشت پسرش محمد را به جای خود منصوب کرد، جسدش را در جانب غربی بغداد در شارع المیدان، که نزدیک دروازه قبلی قرار داشت، بهخاک سپردند و قبر در خود قبله مسجد است.
مدینه
مدینه یا مدینةالنبی، (به عربی: المدینة المنورة)، نام شهری است در کشور پادشاهی عربستان سعودی واقع در شبه جزیره عربستان. این شهر در شمال ریاض و در میانه نجد قرار گرفته و آبوهوایی خشک و بیابانی با تابستانهای داغ و زمستانهای سرد دارد. این شهر پیش از هجرت پیامبر اسلام به آن، یثرب نام داشت، که با ورود پیامبر، آنرا مدینة النبی (یعنی: شهر پیامبر) نامیدند.
شهری مدینه در ناحیه تاریخی حجاز در کشور عربستان سعودی، این شهر پس از هجرت پیامبر اسلام، به مدینةالنبی(شهر پیامبر) معروف شد، در اولین شب ربیع الاول سال ۱۴ بعثت، «محمد» به «یثرب» مهاجرت نمود و سرآغاز تاریخ مسلمانان(تاریخ هجری)، از همان سال میباشد.
مسجدالنبی، مسجد قباء و مسجد ذوقبلتین در این شهر قرار دارند. مدینه امروزه از شهرهای مقدس مسلمانان بهشمار میآید. مقبره پیامبر اسلام در این شهر و در داخل خانه پیامبر در کنار مسجد النبی قرار دارد و از مهمترین زیارت گاه های مسلمانان است. برای نخستین بار تصاویری از داخل محل مرقد پیامبر منتشر شده است که این مرقد را بسیار ساده و با روپوشی از پارچه سبز نشان می دهد که بر روی آن کلمات "لااله الا الله" و "محمد رسول الله" نوشته شده است
فاصله مدینه تا مکه حدود ۴۲۰ کیلومتر است.
تاریخچه یثرب
یثرب از شهرهای باستانی است که در کتیبههای معینی از آن نام برده شدهاست. این شهر از جمله محلهایی بود که گروهی از نیروهای معینی در آن اقامت داشتند. پس از آنکه روزگار دولت معینیان سپری گردید، سبائیان حکومت آنجا را در دست گرفتند. معروف است که حکومتهای معین و سبا همواره در پی بسط سلطه و نفوذ خود در سرزمینهای شمال عربستان بودند. همچنین در جغرافیای بطلمیوس دوبار از این شهر نام برده شدهاست، یک بار به نام ایاترپه و بار دیگر به نام ایاتریپا. استفان بیزانسی از این شهر به نام ایاتریپاپولیس یاد کردهاست. این شهر در نزد راویان اخبار گذشته به نام اثرب و یثرب معروف است. به نوشته آنان یثرب مرکز مدینهاست، که از قناه تا جرف و از المال، که بدان برناوی میگویند، تا زباله امتداد میابد. برخی از راویان اخبار گمان بردهاند که این شهر به دلیل انتساب به یثرب بن قانیه بن مهلائیل بن ارم بن عبیل بن عوص بن ارم بن سام بن نوح، بدین نام خوانده شدهاست و او نخستین کسی بود که هنگام پراکنده شدن خاندان نوح در این سرزمین فرود آمد.
دیگران گمان کردهاند که نام یثرب ماخوذ از ثرب به معنای فساد یا از تثریب یعنی «مواخذه به علت گناه» است و نوشتهاند که پیامبر به دلیل کراهت از تثیرب، از نامیدن این شهر به اسم یثرب نهی کرد و آن را طیبه و طابه نامید. بلاذری مینویسد که یثرب به نام رئیس گروهی از عمالقه نامیده شدهاست که پس از بیرون راندن بنی عبیل بن عوص بن ارم بن سام، از فرزندام نوح، از آنجا فرود آمدند.
نام مدینه که پس از هجرت پیامبر، به یثرب اطلاق شدهاست ماخوذ از کلمه آرامی مدینتا به معنی قرق و شهر، خلاصه شده مدینه الرسول است. راویان اخبار نوشتهاند که یثرب یا مدینه ۲۹ اسم دارد که عبارتند از: طیبه، طابه، مسکینه، عذراء، جابره، محببه، مجبوره، یثرب، ناجیه، موفیه، اکاله البلدان ع محفوفه، مسلمه، مجنه، قدسیه، عاصمه، مرزوقه، شافیه، خیره، محبوبه، مرحومه، جابره، مختاره، محرمه، غلبه، ببره، تندر، حسیبه، دارالبرار، حسنه، دارالخیار، دارالیمان، دارالسنه، دارالهجره، قاصمه، طباطبا.
نامیدن به نام پیشین
در قرآن آمده است که منافقین مدینه، شهر را به نام قدیمش (یعنی یثرب) مینامیدند، و نام جدید آن را پذیرا نبودند. آیات ۱۲ و ۱۳ سوره احزاب بیان میدارد که در جنگ احزاب، وقتی منافقان و افراد ضعیفالایمان، احزاب و گروههای مختلف کفار و جمعیت فراوان آنها را دیدند، گفتند: خدا و رسولش جز وعدههای فریبنده دروغین به ما ندادهاند؛ و برخی از آنها میگفتند: ای مردم یثرب این میدان جای ماندن شما نیست، پس به خانههای خود بازگردید (و گر نه همگی کشته میشوید)! این در حالی بود که -طبق آیه ۲۲ سوره احزاب- وقتی مؤمنان احزاب و سپاهیان دشمن را دیدند، گفتند: اين همان است كه خدا و رسولش به ما وعده دادند و خدا و رسولش راست گفتند؛ و (ديدن آنها) جز بر ايمان و تسليم آنان نيفزود.
تقلید
تقلید در اصل به معنی پیروی و دنبالهروی است و در شریعت اسلامی به معنی اجرای حکمی است که مرجع تقلید بیان میکند. عموماً گفته میشود تقلید در اصول دین جایز نیست و باید با تحقیق به آنها رسید، ولی در احکام اغلب اوقات باید از شخص متخصص که به او مجتهد جامعالشرایط یا مرجع تقلید میگویند تقلید نمود. البته در تعیین حوزه لزوم تقلید، اختلاف نظر وجود دارد.
معانی تقلید
تقلید مصدر عربی باب تفعیل از مادّه «قَلَد»، و در لغت به معنای چیزی را ملازم کسی یا شخصی قرار دادن و گردن نهادن به کاری است. این واژه در اصطلاح فقهی به معنای التزام به عمل و گفتار مجتهد معیّن است. البته این واژه در متون فقهی در مبحث حج به معنای «علامتی بر گردن قربانی آویختن تا معلوم شود برای قربانی در حج است» هم به کار رفته است. در منابع اصولی و فقهی دو گونه تعریف برای تقلید مطرح شده شماری از فقها تقلید را امری متمایز از عمل کردن به حکم شرعی و آنرا اخذ فتوای مجتهد یا پذیرفتن آن یا التزام داشتن به آن تعریف کردهاند. در برابر، بیشتر فقها ماهیت تقلید را همان پیروی عملی از فتوای مجتهد دانستهاند.
مصادیق تقلید
از دیدگاه فقه اسلامی، تقلید در برخی موارد، از جمله در مورد احکام ضروری و یقینی، مجاز نیست، زیرا در سیرهٔ عقلا، تقلید تنها در مواردی صورت میگیرد که علم و قطع برای خود شخص وجود نداشته باشد. مورد دیگری که تقلید در آن ممکن نیست، عقایدی است که باید نسبت به آنها اعتقاد یقینی حاصل شود (مانند اصول دین)، حال آنکه تقلید یقین آور نیست. البته در برخی عقاید فرعی مذهبی رجوع جاهل به عالم میتواند برای مکلف یقین آور باشد، مانند رجوع به پیامبر اسلام برای تعیین امام و جانشینان پس از او؛ ولی این امر مصداق تقلید مصطلح شمرده نشده است. اهل سنّت نیز تقلید در عقاید را جایز نمیدانند زیرا در اینگونه امور تفکر و رسیدن به اطمینانْ مطلوب و تقلید مذموم است. آیة ۲۲ سورهٔ زخرف پیروی بی دلیل از روش گذشتگان را ناپسند شمرده و پیامبر اسلام نیز به تفکر در آیات مربوط به معرفت الهی توصیه کرده است. تنها به ظاهری مذهبان جواز تقلید در عقاید نسبت داده شده است.
موارد دیگر ممنوعیت تقلید در منابع فقهی امامی عبارت اند از: مسائل اصول فقه؛ مقدّمات اجتهاد، مانند صرف و نحو؛ شناختن مفهوم آن دسته از موضوعات احکام شرعی که جنبهٔ عرفی یا لغوی دارند، بر خلاف مواردی که شرع آنها را ایجاد نموده (مانند نماز و روزه)؛ و بالاخره احکام غیرالزامی مانند مستحبات و مکروهات که نیازی به تقلید ندارند و میتوان آنها را به امید رسیدن به پاداش الاهی انجام داد. در پارهای منابع فقهی سه مورد نخست هم، به استناد سیرة عقلا، مشمول ادلهٔ جواز تقلیدند.
در مذاهب مختلف اسلامی، تقلید بر مجتهد حرام است اما فرد غیرمجتهد یا کسی که در برخی موضوعات، عامی محسوب میشود، باید تقلید کند.
7:43 pm
برنامهنویسی
برنامهنویسی رایانه در فرهنگ واژه غیر متخصّصین ممکن است به تمام پروژه ساخت نرمافزار یا برنامهٔ رایانهای گفته شود. با این همه برنامهنویسی تنها بخشی از فرایند توسعهٔ نرمافزار یا برنامه رایانهای است. اهمیت، توجه و منابع اختصاص داده شده به برنامهنویسی، بسته به ویژگیهای مشخص شده محصول و خواست افراد درگیر در پروژه و کاربران و در نهایت شیوهٔ انتخاب شده مهندسی نرمافزار متغیر است.
برنامهنویسی کامپیوتر (که اغلب در انگلیسی programming یا coding گفته میشود) فرایند نوشتن، اشکال زدایی(debug) و نگهداری کد منبع (source code) برنامه کامپیوتر میباشد. این کد منبع با یک زبان برنامه نویسی نوشته شده است. این کد منبع ممکن است تغییر داده شده یک کد قبلی و یا یک کد کاملاً جدید باشد. هدف برنامه نویسی ساختن یک برنامه میباشد که یک رفتار خواسته شده را به نمایش بگذارد.

تاریخچه
موضوع دستگاههایی که به دنبالهای از دستورالعملهای از قبل تعریف شده عمل میکند بر میگردد به Greek Mythology.
برنامه نویسی مدرن
اندازه گیری کاربرد زبان
تعیین اینکه محبوبترین زبان برنامه نویسی مدرن کدام است کار بسیار مشکلی است. بعضی از زبانها در کاربردهای خاصی محبوب است و بعضی دیگر مرتباً در نوشتن کاربردهای گوناگون استفاده میشود. روشهای اندازه گیری محبوبیت زبان شامل موارد زیر میباشد: شمردن تعداد آگهیهای اشتغال و توجه به یک زبان، تعداد کتابهای آموزشی فروخته شده در مورد یک زبان، تخمین تعداد خطوط کد نوشته شده در یک زبان
پارادایمها
زبانهای برنامهنویسی گوناگون براساس قابلیتهای درنظر گرفته شده از شیوهٔ خطهای مختلف استفاده میکنند. موارد ریزتری مانند چگونگی برخورد با نیازهای پشت پردهٔ ماشین مانند مدیریت حافظه و مدیریت زباله نیز در زبانهای مختلف متفاوت است. علاوه بر اینها، مفاهیمی متفاوت از (اجرای) یک برنامه تصور شدهاند که پارادایم یا الگو نام دارند.
برنامهنویسی دستوری
برنامهنویسی دستوری (به انگلیسی: Imperative programming) در علوم رایانه یکی از شیوههای برنامهنویسی است که در آن مراحل اجرای یک برنامه کامپیوتری قدم به قدم توسط برنامه نویس بیان میشود. این بر خلاف زبانهای اعلانی است که در آنها تنها نتیجه انجام دستورات بیان میشود. به بیان دیگر در زبانهای دستوری چگونگی اجرای برنامه بیان میشود اما در زبانهای اعلانی چیستی نتیجه بیان میشود.
به عنوان مثال اگر قصد باز کردن دری را داشته باشیم و با زبان اعلانی این را بخواهیم بیان کنیم خواهیم گفت در را باز کن اما اگر با زبان دستوری بیان کنیم خواهیم گفت بلند شو، به طرف در نردیک شو، دستگیره را بگیر و در را به طرف بیرون هل بده.
زبان برنامهنویسی
زبانهای برنامهنویسی ساختارهای زبانی دستورمداری در رایانهها هستند که بهوسیلهٔ آنها میتوان یک الگوریتم را بهوسیلهٔ ساختارهای دستوری متفاوت برای اجرای رایانه توصیف کرد و با این روش امکان نوشتن برنامه جهت تولید نرمافزارهای جدید بوجود میآید. معمولاً هر زبان برنامهنویسی دارای یک محیط نرمافزاری برای وارد کردن متن برنامه، اجرا، همگردانی و رفع اشکال آن هستند. عموماً زبانهای برنامه نویسی را به پنج نسل تقسیم میکنند:
نسل اول زبان ماشین - زبان صفرو یک
نسل دوم زبانهایی مانند اسمبلی -قابل فهم تر برای انسان
نسل سوم زبانهایی مانند کوبول و پی ال وان و... -دستورات قابل فهم تر برای انسان و نیاز به کمپایلرها
نسل چهارم مثل زبانهای اوراکل و فاکس پرو و اس کیو الها - نزدیک به محاورههای انسانی
نسل پنج زبانهایی مانند prolog , ops5 - تمرکز بر حل مسئله و استفاده از الگوریتمهای نوشته شده توسط
برنامه نویس
یک زبان برنامه نویسی یک زبان مصنوعی است که برای بیان محاسباتی که توسط یک ماشین (مخصوصا رایانه) قابل انجام است، طراحی شدهاست.زبانهای برنامه نویسی برای ایجاد برنامههایی به کار میروند که رفتار یک ماشین را مشخص میکنند، الگوریتم دقیق را بیان میکنند، و یا روشی برای ارتباط انسانند. بسیاری از زبانهای برنامه نویسی تعدادی قالب از ویژگیهای نوشته شده دستوری(syntax) و معناشناسی (semantics) دارند، چرا که رایانهها دستورات دقیقاً مشخص نیاز دارند. برخی توسط سند خصوصیات (specification document) تعیین شدهاند. (برای مثال یک استاندارد ISO)، در حالی که برخی دیگر دارای پیاده سازی غالبی میباشند.(مانند Perl) اولین زبان برنامه نویسی به قبل از اختراع رایانه باز میگردد، و برای هدایت رفتار ماشینهایی مانند دستگاههای نساجی اتوماتیک و نوازندههای پیانو به کار میرفت. هزاران زبان برنامه نویسی خلق شدهاند، بیشتر در زمینهٔ رایانه، زمینهای که هر ساله بسیاری دیگر ایجاد میشوند.
تقسیمبندی
زبانهای برنامه نویسی را میتوان از چهار دیدگاه متفاوت مورد بررسی قرار داده و تقسیم بندی کرد: الف)روشهای برنامه نویسی ۱-زیر روالی ۲-ساخت یافته ۳-مدولار ۴-شئ گرا ب)نزدیکی به زبان ماشین ۱-سطح پایین ۲-سطح میانی ۳-سطح بالا ج)نوع ترجمه ۱-مفسری ۲-کامپایلری د)رابط برنامه نویسی ۱-مبتنی بر متن ۲-مبتنی بر گرافیک (ویژوال)
تعاریف
ویژگیهایی که غالباً برای تشکیل یک زبان برنامه نویسی مهم شمرده میشوند:
تابع :یک زبان برنامه نویسی، زبانی است که برای نوشتن برنامههای رایانهای به کار میرود که رایانهای را برای انجام محاسبات یا اجرای الگوریتم و یا احتمالاً کنترل دستگاههای خارجی مثل چاپگر، ربات و... درگیر میکنند.
هدف: زبانهای برنامه نویسی با زبانهای طبیعی تفاوت دارند و آن اینکه زبانهای طبیعی فقط برای فعل و انفعالات بین مردم به کار میروند، در حالیکه زبانهای برنامه نویسی همچنین به انسانها اجازه میدهد که از طریق دستورات با ماشینها ارتباط برقرار کنند. برخی زبانهای برنامه نویسی بوسیله یک دستگاه استفاده میشوند تا دستگاه دیگری را کنترل کند. برای مثال برنامههای پست اسکریپت(post script) غالباً توسط برنامه دیگری برای کنترل یک چاپگر و یا نمایشگر ایجاد میشوند.
ساختارها: زبانهای برنامه نویسی ممکن است ساختارهایی برای تعریف و تغییر داده ساختارها یا کنترل جریان اجرا داشته باشند.
توان بیانگر: نظریه محاسبات، زبانها را بوسیله محاسباتی که توان بیان آنها را دارند طبقه بندی میکند. تمام زبانهای "کامل تورینگ" میتوانند مجموعه یکسانی از الگوریتمها را پیاده سازی کنند.ANSI/ISO SQL و Charity مثالهایی هستند از زبانهایی که کامل تورینگ نیستند، ولی غالباً زبان برنامه نویسی نامیده میشوند.
برخی مولفین اصطلاح" زبان برنامه نویسی" را محدود به آنهایی میکنند که میتوانند تمام الگوریتمهای ممکن را پیاده سازی کنند، گاهی اوقات اصطلاح" زبان رایانه" برای زبانهای برنامه نویسی محدودتر به کار میرود. زبانهای غیر محاسباتی، مانند زبانهای مارک آپ(markup) HTML یا گرامرهای قراردادی مثل BNF، معمولاً زبان برنامه نویسی محسوب نمیشوند. یک زبان برنامه نویسی(که میتواند کامل تورینگ نباشد) ممکن است در این زبانهای غیر محاسباتی (میزبان) تعبیه شوند.
کاربرد
زبان برنامه نویسی یک مکانیزم ساخت یافته برای تعریف دادهها، و عملیات یا تبدیلهایی که ممکن است بطور اتوماتیک روی آن داده انجام شوند، فراهم میکند. یک برنامه نویس از انتزاعات آماده در زبان استفاده میکند تا مفاهیم به کار رفته در محاسبات را بیان کند. این مفاهیم به عنوان یک مجموعه از سادهترین عناصر موجود بیان میشوند(مفاهیم ابتدایی نامیده میشوند). زبانهای برنامه نویسی با غالب زبانهای انسانی تفاوتی دارد و آن این است که نیاز به بیان دقیق تر و کامل تری دارد. هنگام استفاده از زبانهای طبیعی برای ارتباط با دیگر انسانها، نویسندگان و گویندگان میتوانند مبهم باشند و اشتباهات کوچک داشته باشند، و همچنان انتظار داشته باشند که مخاطب آنها متوجه شده باشد. اگرچه، مجازا، رایانهها "دقیقاً آنچه که به آنها گفته شده را انجام میدهند." و نمیتوانند "بفهمند" که نویسنده دقیقاً چه کدی مد نظر نویسنده بودهاست] البته امروزه برنامههایی برای انجام این کار تولید شدهاند و تلاشهای بسیاری در این زمینه انجام شده ولی هنوز به نتیجهٔ رضایت بخشی نرسیده است[. ترکیب تعریف زبان، یک برنامه، و ورودی برنامه بطور کامل رفتار خروجی را به هنگام اجرای برنامه (در محدوده کنترل آن برنامه) مشخص میکند. برنامههای یک رایانه ممکن است در یک فرایند ناپیوسته بدون دخالت انسان اجرا شوند، یا یک کاربر ممکن است دستورات را در یک مرحله فعل و انفعال مفسر تایپ کند.در این حالت "دستور"ها همان برنامهها هستند، که اجرای آنها زنجیروار به هم مرتبطند.به زبانی که برای دستور دادن به برنامهای استفاده میشود، زبان اسکریپت میگویند. بسیاری از زبانها کنار گذاشته شدهاند، برای رفع نیازهای جدید جایگزین شدهاند، با برنامههای دیگر ترکیب شدهاند و در نهایت استعمال آنها متوقف شدهاست. با وجود اینکه تلاشهایی برای طراحی یک زبان رایانه" کامل" شدهاست که تمام اهداف را تحت پوشش قرار دهد، هیچ یک نتوانستند بطور کلی این جایگاه را پر کنند. نیاز به زبانهای رایانهای گسترده از گستردگی زمینههایی که زبانها استفاده میشوند، ناشی میشود:
محدوده برنامهها از متون بسیار کوچک نوشته شده توسط افراد عادی تا سیستمهای بسیار بزرگ نوشته شده توسط صدها برنامه نویس است
توانایی برنامه نویسها: از تازه کارهایی که بیش از هر چیز به سادگی نیاز دارند تا حرفهایهایی که با پیچیدگی قابل توجهی کنار میآیند.
برنامهها باید سرعت، اندازه و سادگی را بسته به سیستمها از ریزپردازندها تا ابر رایانهها متناسب نگه دارند.
برنامهها ممکن است یک بار نوشته شوند و تا نسلها تغییر نکنند، و یا ممکن است پیوسته اصلاح شوند.
در نهایت، برنامه نویسها ممکن است در علایق متفاوت باشند: آنها ممکن است به بیان مسائل با زبانی خاص خو گرفته باشند.
یک سیر رایج در گسترش زبانهای برنامه نویسی این است که قابلیت حل مسائلی با درجات انتزاعی بالاتری را اضافه کنند. زبانهای برنامه نویسی اولیه به سختافزار رایانه گره خورده بودند. همانطور که زبانهای برنامه نویسی جدید گسترش پیدا کردهاند، ویژگیهایی به برنامهها افزوده شده که به برنامه نویس اجازه دهد که ایدههایی که از ترجمه ساده به دستورات سختافزار دورتر هستند نیز استفاده کند. چون برنامه نویسها کمتر به پیچیدگی رایانه محدود شدهاند، برنامههای آنها میتواند محاسبات بیشتری با تلاش کمتر از سوی برنامه نویس انجام دهند. این به آنها این امکان را میدهد که کارایی بیشتردر واحد زمان داشته باشند. "پردازندههای زبان طبیعی" به عنوان راهی برای ازبین بردن نیاز به زبانهای اختصاصی برنامه نویسی پیشنهاد شدهاند. هرچند، این هدف دور است و فواید آن قابل بحث است. "ادسگر دیجسترا" موافق بود که استفاده از یک زبان رسمی برای جلوگیری از مقدمه سازی ساختارهای بی معنی واجب است، و زبان برنامه نویسی طبیعی را با عنوان "احمقانه" رد کرد، "آلن پرلیس" نیز مشابها این ایده را رد کرد. مطابق با متدولوژی نامتجانس استفاده شده توسط langpop.com در سال ۲۰۰۸، ۱۲ زبان پرکاربرد عبارتند از: C, C++, C#, Java, JavaScript, Perl, PHP, Python, Ruby, Shell, SQL, and Visual Basic.
معناشناسی ایستا
معناشناسی ایستا محدودیتهایی بر روی ساختار مجاز متنها تعیین میکند که بیان آنها در فرمول دستوری استاندارد مشکل و یا غیر ممکن است. مهمترین این محدودیتها به وسیله سیستم نوع گذاری انجام میشود.
سیستم نوع گذاری
یک سیستم نوع گذاری مشخص میکند که یک زبان برنامه نویسی چگونه مقادیر و عبارات را در نوع(type) دسته بندی میکند، چگونه میتواند آن نوعها را تغییر دهد و رفتار متقابل آنها چگونهاست. این کارعموما توضیح داده ساختارهایی که میتوانند در آن زبان ایجاد شوند را شامل میشود. طراحی و مطالعه سیستمهای نوع گذاری بوسیله ریاضیات قراردادی را تئوری نوع گذاری گویند.
زبانهای نوع گذاری شده و بدون نوع گذاری
یک زبان نوع گذاری شدهاست اگر مشخصات هر عملیات، نوع دادههای قابل اجرا توسط آن را با نشان دادن نوعهایی که برای آنها قابل اجرا نیست، تعیین کند. برای مثال، "این متن درون گیومه قرار دارد" یک رشتهاست. در غالب زبانهای برنامه نویسی، تقسیم یک رشته با یک عدد معنایی ندارد. در نتیجه غالب زبانهای برنامه نویسی مدرن ممکن است اجرای این عملیات را توسط برنامهها رد کنند. در برخی زبانها، عبارات بی معنی ممکن است هنگام ترجمه(compile) پیدا شود(چک کننده نوع ایستا)، و توسط کامپایلر رد شود، در حالی که در سایر برنامهها، هنگام اجرا پیدا شود.(چک کننده نوع دینامیک) که به استثنای در حال اجرا منتج شود(runtime exception). حالت خاص زبانهای نوع دار زبانهای تک نوعند. این زبانها غالباً اسکریپتی و یا مارک آپ هستند، مانند rexx وSGML و فقط یک داده گونه دارند—غالباً رشتههای کاراکتری که هم برای دادههای عددی و هم برای دادههای سمبلی کاربرد دارند. در مقابل، یک زبان بدون نوع گذاری، مثل اکثر زبانهای اسمبلی، این امکان را میدهد که هر عملیاتی روی هر دادهای انجام شود، که معمولاً دنبالهای از بیتها با طولهای متفاوت در نظر گرفته میشوند. زبانهای سطح بالا که بی نوع هستند شامل زبانهای ساده رایانهای و برخی از انواع زبانهای نسل چهارم.
در عمل، در حالیکه تعداد بسیار کمی از دیدگاه نظریه نوع، نوع گذاری شده تلقی میشوند(چک کردن یا رد کردن تمام عملیاتها)، غالب زبانهای امروزی درجهای از نوع گذاری را فراهم میکنند. بسیاری از زبانهای تولیدکننده راهی را برای گذشتن یا موقوف کردن سیستم نوع فراهم میکنند.
نوع گذاری قوی و ضعیف
نوع گذاری ضعیف این امکان را ایجاد میکند که با متغیری به جای متغیری دیگر برخورد شود، برای مثال رفتار با یک رشته به عنوان یک عدد. این ویژگی بعضی اوقات ممکن است مفید باشد، اما ممکن است باعث ایجاد برخی مشکلات برنامه شود که موقع کامپایل و حتی اجرا پنهان بمانند.
نوع گذاری قوی مانع رخ دادن مشکل فوق میشود. تلاش برای انجام عملیات روی نوع نادرست متغیر منجر به رخ دادن خطا میشود. زبانهایی که نوع گذاری قوی دارند غالباً با نام "نوع-امن" و یا امن شناخته میشوند. تمام تعاریف جایگزین برای "ضعیف نوع گذاری شده" به زبانها اشاره میکند، مثل perl, JavaScript, C++، که اجازه تعداد زیادی تبدیل نوع داخلی را میدهند. در جاوااسکریپت، برای مثال، عبارت ۲*x به صورت ضمنی x را به عدد تبدیل میکند، و این تبدیل موفقیت آمیز خواهد بود حتی اگر x خالی، تعریف نشده، یک آرایه، و یا رشتهای از حروف باشد. چنین تبدیلات ضمنی غالباً مفیدند، اما خطاهای برنامه نویسی را پنهان میکنند.
قوی و ایستا در حال حاضر عموماً دو مفهوم متعامد فرض میشوند، اما استفاده در ادبیات تفاوت دارد، برخی عبارت "قوی نوع گذاری شده" را به کار میبرند و منظورشان قوی، ایستایی نوع گذاری شدهاست، و یا، حتی گیچ کننده تر، منظورشان همان ایستایی نوع گذاری شدهاست. بنابراین C هم قوی نوع گذاری شده و هم ضعیف و ایستایی نوع گذاری شده نامیده میشود.
معناشناسی اجرا
وقتی که داده مشخص شد، ماشین باید هدایت شود تا عملیاتها را روی داده انجام دهد. معناشناسی اجرا ی یک زبان تعیین میکند که چگونه و چه زمانی ساختارهای گوناگون یک زبان باید رفتار برنامه را ایجاد کنند.
برای مثال، معناشناسی ممکن است استراتژی را که بویسله آن عبارات ارزیابی میشوند را تعریف کند و یا حالتی را که ساختارهای کنترلی تحت شرایطی دستورها را اجرا میکنند.
کتابخانه هسته
اغلب زبانهای برنامه نویسی یک کتابخانه هسته مرتبط دارند(گاهی اوقات "کتابخانه استاندارد" نامیده میشوند، مخصوصا وقتی که به عنوان قسمتی از یک زبان استاندارد ارائه شده باشد)، که به طور قراردادی توسط تمام پیاده سازیهای زبان در دسترس قرار گرفته باشند. کتابخانه هسته معمولاً تعریف الگوریتمها، داده ساختارها و مکانیزمهای ورودی و خروجی پرکاربرد را در خود دارد. کاربران یک زبان، غالباً با کتابخانه هسته به عنوان قسمتی از آن رفتار میکنند، اگرچه طراحان ممکن است با آن به صورت یک مفهوم مجزا رفتار کرده باشند. بسیاری از خصوصیات زبان هستهای را مشخص میکنند که باید در تمام پیاده سازیها موجود باشند، و در زبانهای استاندارد شده این کتابخانه هسته ممکن است نیاز باشد. بنابراین خط بین زبان و کتابخانه هسته آن از زبانی به زبان دیگر متفاوت است. درواقع، برخی زبانها به گونهای تعریف شدهاند که برخی از ساختارهای دستوری بدون اشاره به کتابخانه هسته قابل استفاده نیستند. برای مثالف در جاوا، یک رشته به عنوان نمونهای از کلاس “java.lang.String” تعریف شده است؛ مشابها، در سمال تاک(smalltalk) یک تابع بی نام(یک "بلاک") نمونهای از کلاس BlockContext کتابخانه میسازد. بطور معکوس، Scheme دارای چندین زیرمجموعه مرتبط برای ایجاد سایر ماکروهای زبان میباشد، و در نتیجه طراحان زبان حتی این زحمت را نیز تحمل نمیکنند که بگویند کدام قسمت زبان به عنوان ساختارهای زبان باید پیاده سازی شوند، و کدام یک به عنوان بخشی ازکتابخانه.
عمل
طراحان زبان و کاربران باید مصنوعاتی ایجاد کنند تا برنامه نویسی را در عمل ممکن سازند و کنترل کنند. مهمترین این مصنوعات خصوصیات و پیاده سازیهای زبان هستند.
خصوصیات
یک زبان برنامه نویسی باید تعریفی فراهم کند که کاربران و پیاده کنندههای زبان میتوانند از آن استفاده کنند تا مشخص کنند که رفتار یک برنامه درست است. با داشتن کد منبع: خصوصیات یک زبان برنامه نویسی چندین قالب میتواند بگیرد، مانند مثالهای زیر:
تعریف صریح دستور، معناشناسی ایستا، ومعناشناسی اجرای زبان. درحالیکه دستور معمولاً با یک معناشناسی قراردادی مشخص میشود، تعاریف معناشناسی ممکن است در زبان طبیعی نوشته شده باشند (مثل زبان C)، یا معناشناسی قراردادی(مثل StandardML ,Scheme)
توضیح رفتار یک مترجم برای زبان(مثل C,fortran). دستور و معناشناسی یک زبان باید از این توضیح استنتاج شوند، که ممکن است به زبان طبیعی یا قراردادی نوشته شود.
پیاده سازی منبع یا مدل. گاهی اوقات در زبانهای مشخص شده(مثل: prolog,ANSI REXX).دستور و معناشناسی صریحاً در رفتار پیاده سازی مدل موجودند.
پیاده سازی
پیاده سازی یک زبان برنامه نویسی امکان اجرای آن برنامه را روی پیکربندی مشخصی از سختافزار و نرمافزار را فراهم میکند. بطور وسیع، دو راه رسیدن به پیاده سازی زبان برنامه نویسی وجود دارد. کامپایل کردن و تفسیر کردن. بطور کلی با هر بک از ابن دو روش میتوان یک زبان را پیاده سازی کرد.
خروجی یک کامپایلر ممکن است با سختافزار و یا برنامهای به نام مفسر اجرا شود. در برخی پیاده سازیها که از مفسر استفاده میشود، مرز مشخصی بین کامپایل و تفسیر وجود ندارد. برای مثال، برخی پیاده سازیهای زبان برنامه نویسی بیسیک کامپایل میکنند و سپس کد را خط به خط اجرا میکنند.
برنامههایی که مستقیماً روی سختافزار اجرا میشوند چندین برابر سریعتر از برنامههایی که با کمک نرمافزار اجرا میشوند، انجام میشوند.
یک تکنیک برای بهبود عملکرد برنامههای تفسیر شده کامپایل در لحظه آن است. در این روش ماشین مجازی، دقیقاً قبل از اجرا، بلوکهای کدهای بایتی که قرار است استفاده شوند را برای اجرای مستقیم روی سختافزار ترجمه میکند.
تاریخچه
پیشرفتهای اولیه
اولین زبان برنامه نویسی به قبل از رایانههای مدرن باز میگردد. قرن ۱۹ دستگاههای نساجی و متون نوازنده پیانو قابل برنامه نویسی داشت که امروزه به عنوان مثالهایی از زبانهای برنامه نویسی با حوزه مشخص شناخته میشوند. با شروع قرن بیستم، پانچ کارتها داده را کد گذاری کردند و پردازش مکانیکی را هدایت کردند. در دهه ۱۹۳۰ و ۱۹۴۰، صورت گرایی حساب لاندای آلونزو چرچ و ماشین تورینگ آلن تورینگ مفاهیم ریاضی بیان الگوریتمها را فراهم کردند؛ حساب لاندا همچنان در طراحی زبان موثر است.
در دهه ۴۰، اولین رایانههای دیجیتال که توسط برق تغذیه میشدند ایجاد شدند. اولین زبان برنامه نویسی سطح بالا طراحی شده برای کامپیوتر پلانکالکول بود، که بین سالهای ۱۹۴۵ و ۱۹۴۳ توسط کنراد زوس برای ز۳ آلمان طراحی شد.
کامپیوترهای اوایل ۱۹۵۰، بطور خاص ÜNIVAC ۱ و IBM ۷۰۱ از برنامههای زبان ماشین استفاده میکردند. برنامه نویسی زبان ماشین نسل اول توسط نسل دومی که زبان اسمبلی نامیده میشوند جایگزین شد. در سالهای بعد دهه ۵۰، زبان برنامه نویسی اسمبلی، که برای استفاده از دستورات ماکرو تکامل یافته بود، توسط سه زبان برنامه نویسی سطح بالا دیگر: FORTRAN,LISP , COBOL مورد استفاده قرار گرفت. نسخههای به روز شده این برنامهها همچنان مورد استفاده قرار میگیرند، و هر کدام قویا توسعه زبانهای بعد را تحت تاثیر قرار دادند. در پایان دهه ۵۰ زبان algol ۶۰ معرفی شد، و بسیاری از زبانهای برنامه نویسی بعد، با ملاحظه بسیار، از نسل algol هستند. قالب و استفاده از زبانهای برنامه نویسی به شدت متاثر از محدودیتهای رابط بودند.
پالایش
دوره دهه ۶۰ تا اواخر دهه ۷۰ گسترش مثالهای عمده زبان پرکاربرد امروز را به همراه داشت. با این حال بسیاری از جنبههای آن بهینه سازی ایدههای اولیه نسل سوم زبان برنامه نویسی بود:
APL برنامه نویسی آرایهای را معرفی کرد و برنامه نویسی کاربردی را تحت تاثیر قرار داد.
PL/i(NPL) دراوایل دهه ۶۰ طراحی شده بود تا ایدههای خوب فورترن و کوبول را بهم پیوند دهد.
در دهه ۶۰، Simula اولین زبانی بود که برنامه نویسی شئ گرا را پشتیبانی میکرد، در اواسط دهه۷۰. Smalltalk به دنبال آن به
عنوان اولین زبان کاملاً شئ گرا معرفی شد.
C بین سالهای ۱۹۶۹ تا ۱۹۷۳ به عنوان زبان برنامه نویسی سیستمی طراحی شد و همچنان محبوب است.
Prolog، طراحی شده در ۱۹۷۲، اولین زبان برنامه نویسی منطقی بود.
در ۱۹۷۸ ML سیستم نوع چند ریخت روی لیسپ ایجاد کرد، و در زبانهای برنامه نویسی کاربردی ایستا نوع گذاری شده پیشگام شد.
هر یک از این زبانها یک خانواده بزرگ از وارثین از خود به جای گذاشت، و مدرنترین زبانها از تبار حداقل یکی از زبانهای فوق به شمار میآیند.
دهههای ۶۰ و ۷۰ مناقشات بسیاری روی برنامه نویسی ساخت یافته به خود دیدند، و اینکه آیا زبانهای برنامه نویسی باید طوری طراحی شوند که آنها را پشتیبانی کنند.
"ادسگر دیکسترا" در نامهای معروف در ۱۹۶۸ که در ارتباطات ACM منتشر شد، استدلال کرد که دستورgoto باید از تمام زبانهای سطح بالا حذف شود.
در دهههای ۶۰ و ۷۰ توسعهٔ تکنیکهایی صورت گرفت که اثر یک برنامه را کاهش میداد و در عین حال بهره وری برنامه نویس و کاربر را بهبود بخشید. دسته کارت برای ۴GL اولیه بسیار کوچکتر از برنامهٔ هم سطح بود که با ۳GL deck نوشته شده بود.
یکپارچگی و رشد
دهه ۸۰ سالهای یکپارچگی نسبی بود. C++ برنامه نویسی شئ گرا و برنامه نویسی سیستمی را ترکیب کرده بود. ایالات متحده ایدا(زبان برنامه نویسی سیستمی که بیشتر برای استفاده توسط پیمان کاران دفاعی بود) را استاندارد سازی کرد. در ژاپن و جاهای دیگر، هزینههای گزافی صرف تحقیق در مورد زبان نسل پنجم میشد که دارای ساختارهای برنامه نویسی منطقی بود. انجمن زبان کاربردی به سمت استانداردسازی ML و Lisp حرکت کرد. به جای ایجاد مثالهای جدید، تمام این تلاشها ایدههایی که در دهههای قبل حلق شده بودند را بهتر کرد.
یک گرایش مهم در طراحی زبان در دهه ۸۰ تمرکز بیشتر روی برنامه نویسی برای سیستمهای بزرگ از طریق مدولها، و یا واحدهای کدهای سازمانی بزرگ مقیاس بود. مدول-۲، ایدا. و ML همگی سیستمهای مدولی برجستهای را در دهه ۸۰ توسعه دادند. با وجود اینکه زبانهای دیگر، مثل PL/i، پشتیبانی بسیار خوبی برای برنامه نویسی مدولی داشتند. سیستمهای مدولی غالباً با ساختارهای برنامه نویسی عام همراه شدهاند.
رشد سریع اینترنت در میانه دهه ۹۰ فرصتهای ایجاد زبانهای جدید را فراهم کرد. Perl، در اصل یک ابزار نوشتن یونیکس بود که اولین بار در سال ۱۹۸۷ منتشر شد، در وبگاههای دینامیک متداول شد. جاوا برای برنامه نویسی جنب سروری مورد استفاده قرار گرفت. این توسعهها اساساً نو نبودند، بلکه بیشتر بهینه سازی شده زبان و مثالهای موجود بودند، و بیشتر بر اساس خانواده زبان برنامه نویسی C بودند. پیشرفت زبان برنامه نویسی همچنان ادامه پیدا میکند، هم در تحقیقات و هم در صنعت. جهتهای فعلی شامل امنیت و وارسی قابلیت اعتماد است، گونههای جدید مدولی(mixin، نمایندهها، جنبهها) و تجمع پایگاه داده.
۴GLها نمونهای از زبانهایی هستند که محدوده استفاده آنها مشخص است، مثل SQL. که به جای اینکه دادههای اسکالر را برگردانند، مجموعههایی را تغییر داده و بر میگردانند که برای اکثر زبانها متعارفند. Perl برای مثال، با "مدرک اینجا" خود میتواند چندین برنامه ۴GL را نگه دارد، مانند چند برنامه جاوا سکریبت، در قسمتی از کد پرل خود و برای پشتیبانی از چندین زبان برنامه نویسی با تناسب متغیر در "مدرک اینجا" استفاده کند.
برنامهنویسی رایانه در فرهنگ واژه غیر متخصّصین ممکن است به تمام پروژه ساخت نرمافزار یا برنامهٔ رایانهای گفته شود. با این همه برنامهنویسی تنها بخشی از فرایند توسعهٔ نرمافزار یا برنامه رایانهای است. اهمیت، توجه و منابع اختصاص داده شده به برنامهنویسی، بسته به ویژگیهای مشخص شده محصول و خواست افراد درگیر در پروژه و کاربران و در نهایت شیوهٔ انتخاب شده مهندسی نرمافزار متغیر است.
برنامهنویسی کامپیوتر (که اغلب در انگلیسی programming یا coding گفته میشود) فرایند نوشتن، اشکال زدایی(debug) و نگهداری کد منبع (source code) برنامه کامپیوتر میباشد. این کد منبع با یک زبان برنامه نویسی نوشته شده است. این کد منبع ممکن است تغییر داده شده یک کد قبلی و یا یک کد کاملاً جدید باشد. هدف برنامه نویسی ساختن یک برنامه میباشد که یک رفتار خواسته شده را به نمایش بگذارد.

تاریخچه
موضوع دستگاههایی که به دنبالهای از دستورالعملهای از قبل تعریف شده عمل میکند بر میگردد به Greek Mythology.
برنامه نویسی مدرن
اندازه گیری کاربرد زبان
تعیین اینکه محبوبترین زبان برنامه نویسی مدرن کدام است کار بسیار مشکلی است. بعضی از زبانها در کاربردهای خاصی محبوب است و بعضی دیگر مرتباً در نوشتن کاربردهای گوناگون استفاده میشود. روشهای اندازه گیری محبوبیت زبان شامل موارد زیر میباشد: شمردن تعداد آگهیهای اشتغال و توجه به یک زبان، تعداد کتابهای آموزشی فروخته شده در مورد یک زبان، تخمین تعداد خطوط کد نوشته شده در یک زبان
پارادایمها
زبانهای برنامهنویسی گوناگون براساس قابلیتهای درنظر گرفته شده از شیوهٔ خطهای مختلف استفاده میکنند. موارد ریزتری مانند چگونگی برخورد با نیازهای پشت پردهٔ ماشین مانند مدیریت حافظه و مدیریت زباله نیز در زبانهای مختلف متفاوت است. علاوه بر اینها، مفاهیمی متفاوت از (اجرای) یک برنامه تصور شدهاند که پارادایم یا الگو نام دارند.
برنامهنویسی دستوری
برنامهنویسی دستوری (به انگلیسی: Imperative programming) در علوم رایانه یکی از شیوههای برنامهنویسی است که در آن مراحل اجرای یک برنامه کامپیوتری قدم به قدم توسط برنامه نویس بیان میشود. این بر خلاف زبانهای اعلانی است که در آنها تنها نتیجه انجام دستورات بیان میشود. به بیان دیگر در زبانهای دستوری چگونگی اجرای برنامه بیان میشود اما در زبانهای اعلانی چیستی نتیجه بیان میشود.
به عنوان مثال اگر قصد باز کردن دری را داشته باشیم و با زبان اعلانی این را بخواهیم بیان کنیم خواهیم گفت در را باز کن اما اگر با زبان دستوری بیان کنیم خواهیم گفت بلند شو، به طرف در نردیک شو، دستگیره را بگیر و در را به طرف بیرون هل بده.
زبان برنامهنویسی
زبانهای برنامهنویسی ساختارهای زبانی دستورمداری در رایانهها هستند که بهوسیلهٔ آنها میتوان یک الگوریتم را بهوسیلهٔ ساختارهای دستوری متفاوت برای اجرای رایانه توصیف کرد و با این روش امکان نوشتن برنامه جهت تولید نرمافزارهای جدید بوجود میآید. معمولاً هر زبان برنامهنویسی دارای یک محیط نرمافزاری برای وارد کردن متن برنامه، اجرا، همگردانی و رفع اشکال آن هستند. عموماً زبانهای برنامه نویسی را به پنج نسل تقسیم میکنند:
نسل اول زبان ماشین - زبان صفرو یک
نسل دوم زبانهایی مانند اسمبلی -قابل فهم تر برای انسان
نسل سوم زبانهایی مانند کوبول و پی ال وان و... -دستورات قابل فهم تر برای انسان و نیاز به کمپایلرها
نسل چهارم مثل زبانهای اوراکل و فاکس پرو و اس کیو الها - نزدیک به محاورههای انسانی
نسل پنج زبانهایی مانند prolog , ops5 - تمرکز بر حل مسئله و استفاده از الگوریتمهای نوشته شده توسط
برنامه نویس
یک زبان برنامه نویسی یک زبان مصنوعی است که برای بیان محاسباتی که توسط یک ماشین (مخصوصا رایانه) قابل انجام است، طراحی شدهاست.زبانهای برنامه نویسی برای ایجاد برنامههایی به کار میروند که رفتار یک ماشین را مشخص میکنند، الگوریتم دقیق را بیان میکنند، و یا روشی برای ارتباط انسانند. بسیاری از زبانهای برنامه نویسی تعدادی قالب از ویژگیهای نوشته شده دستوری(syntax) و معناشناسی (semantics) دارند، چرا که رایانهها دستورات دقیقاً مشخص نیاز دارند. برخی توسط سند خصوصیات (specification document) تعیین شدهاند. (برای مثال یک استاندارد ISO)، در حالی که برخی دیگر دارای پیاده سازی غالبی میباشند.(مانند Perl) اولین زبان برنامه نویسی به قبل از اختراع رایانه باز میگردد، و برای هدایت رفتار ماشینهایی مانند دستگاههای نساجی اتوماتیک و نوازندههای پیانو به کار میرفت. هزاران زبان برنامه نویسی خلق شدهاند، بیشتر در زمینهٔ رایانه، زمینهای که هر ساله بسیاری دیگر ایجاد میشوند.
تقسیمبندی
زبانهای برنامه نویسی را میتوان از چهار دیدگاه متفاوت مورد بررسی قرار داده و تقسیم بندی کرد: الف)روشهای برنامه نویسی ۱-زیر روالی ۲-ساخت یافته ۳-مدولار ۴-شئ گرا ب)نزدیکی به زبان ماشین ۱-سطح پایین ۲-سطح میانی ۳-سطح بالا ج)نوع ترجمه ۱-مفسری ۲-کامپایلری د)رابط برنامه نویسی ۱-مبتنی بر متن ۲-مبتنی بر گرافیک (ویژوال)
تعاریف
ویژگیهایی که غالباً برای تشکیل یک زبان برنامه نویسی مهم شمرده میشوند:
تابع :یک زبان برنامه نویسی، زبانی است که برای نوشتن برنامههای رایانهای به کار میرود که رایانهای را برای انجام محاسبات یا اجرای الگوریتم و یا احتمالاً کنترل دستگاههای خارجی مثل چاپگر، ربات و... درگیر میکنند.
هدف: زبانهای برنامه نویسی با زبانهای طبیعی تفاوت دارند و آن اینکه زبانهای طبیعی فقط برای فعل و انفعالات بین مردم به کار میروند، در حالیکه زبانهای برنامه نویسی همچنین به انسانها اجازه میدهد که از طریق دستورات با ماشینها ارتباط برقرار کنند. برخی زبانهای برنامه نویسی بوسیله یک دستگاه استفاده میشوند تا دستگاه دیگری را کنترل کند. برای مثال برنامههای پست اسکریپت(post script) غالباً توسط برنامه دیگری برای کنترل یک چاپگر و یا نمایشگر ایجاد میشوند.
ساختارها: زبانهای برنامه نویسی ممکن است ساختارهایی برای تعریف و تغییر داده ساختارها یا کنترل جریان اجرا داشته باشند.
توان بیانگر: نظریه محاسبات، زبانها را بوسیله محاسباتی که توان بیان آنها را دارند طبقه بندی میکند. تمام زبانهای "کامل تورینگ" میتوانند مجموعه یکسانی از الگوریتمها را پیاده سازی کنند.ANSI/ISO SQL و Charity مثالهایی هستند از زبانهایی که کامل تورینگ نیستند، ولی غالباً زبان برنامه نویسی نامیده میشوند.
برخی مولفین اصطلاح" زبان برنامه نویسی" را محدود به آنهایی میکنند که میتوانند تمام الگوریتمهای ممکن را پیاده سازی کنند، گاهی اوقات اصطلاح" زبان رایانه" برای زبانهای برنامه نویسی محدودتر به کار میرود. زبانهای غیر محاسباتی، مانند زبانهای مارک آپ(markup) HTML یا گرامرهای قراردادی مثل BNF، معمولاً زبان برنامه نویسی محسوب نمیشوند. یک زبان برنامه نویسی(که میتواند کامل تورینگ نباشد) ممکن است در این زبانهای غیر محاسباتی (میزبان) تعبیه شوند.
کاربرد
زبان برنامه نویسی یک مکانیزم ساخت یافته برای تعریف دادهها، و عملیات یا تبدیلهایی که ممکن است بطور اتوماتیک روی آن داده انجام شوند، فراهم میکند. یک برنامه نویس از انتزاعات آماده در زبان استفاده میکند تا مفاهیم به کار رفته در محاسبات را بیان کند. این مفاهیم به عنوان یک مجموعه از سادهترین عناصر موجود بیان میشوند(مفاهیم ابتدایی نامیده میشوند). زبانهای برنامه نویسی با غالب زبانهای انسانی تفاوتی دارد و آن این است که نیاز به بیان دقیق تر و کامل تری دارد. هنگام استفاده از زبانهای طبیعی برای ارتباط با دیگر انسانها، نویسندگان و گویندگان میتوانند مبهم باشند و اشتباهات کوچک داشته باشند، و همچنان انتظار داشته باشند که مخاطب آنها متوجه شده باشد. اگرچه، مجازا، رایانهها "دقیقاً آنچه که به آنها گفته شده را انجام میدهند." و نمیتوانند "بفهمند" که نویسنده دقیقاً چه کدی مد نظر نویسنده بودهاست] البته امروزه برنامههایی برای انجام این کار تولید شدهاند و تلاشهای بسیاری در این زمینه انجام شده ولی هنوز به نتیجهٔ رضایت بخشی نرسیده است[. ترکیب تعریف زبان، یک برنامه، و ورودی برنامه بطور کامل رفتار خروجی را به هنگام اجرای برنامه (در محدوده کنترل آن برنامه) مشخص میکند. برنامههای یک رایانه ممکن است در یک فرایند ناپیوسته بدون دخالت انسان اجرا شوند، یا یک کاربر ممکن است دستورات را در یک مرحله فعل و انفعال مفسر تایپ کند.در این حالت "دستور"ها همان برنامهها هستند، که اجرای آنها زنجیروار به هم مرتبطند.به زبانی که برای دستور دادن به برنامهای استفاده میشود، زبان اسکریپت میگویند. بسیاری از زبانها کنار گذاشته شدهاند، برای رفع نیازهای جدید جایگزین شدهاند، با برنامههای دیگر ترکیب شدهاند و در نهایت استعمال آنها متوقف شدهاست. با وجود اینکه تلاشهایی برای طراحی یک زبان رایانه" کامل" شدهاست که تمام اهداف را تحت پوشش قرار دهد، هیچ یک نتوانستند بطور کلی این جایگاه را پر کنند. نیاز به زبانهای رایانهای گسترده از گستردگی زمینههایی که زبانها استفاده میشوند، ناشی میشود:
محدوده برنامهها از متون بسیار کوچک نوشته شده توسط افراد عادی تا سیستمهای بسیار بزرگ نوشته شده توسط صدها برنامه نویس است
توانایی برنامه نویسها: از تازه کارهایی که بیش از هر چیز به سادگی نیاز دارند تا حرفهایهایی که با پیچیدگی قابل توجهی کنار میآیند.
برنامهها باید سرعت، اندازه و سادگی را بسته به سیستمها از ریزپردازندها تا ابر رایانهها متناسب نگه دارند.
برنامهها ممکن است یک بار نوشته شوند و تا نسلها تغییر نکنند، و یا ممکن است پیوسته اصلاح شوند.
در نهایت، برنامه نویسها ممکن است در علایق متفاوت باشند: آنها ممکن است به بیان مسائل با زبانی خاص خو گرفته باشند.
یک سیر رایج در گسترش زبانهای برنامه نویسی این است که قابلیت حل مسائلی با درجات انتزاعی بالاتری را اضافه کنند. زبانهای برنامه نویسی اولیه به سختافزار رایانه گره خورده بودند. همانطور که زبانهای برنامه نویسی جدید گسترش پیدا کردهاند، ویژگیهایی به برنامهها افزوده شده که به برنامه نویس اجازه دهد که ایدههایی که از ترجمه ساده به دستورات سختافزار دورتر هستند نیز استفاده کند. چون برنامه نویسها کمتر به پیچیدگی رایانه محدود شدهاند، برنامههای آنها میتواند محاسبات بیشتری با تلاش کمتر از سوی برنامه نویس انجام دهند. این به آنها این امکان را میدهد که کارایی بیشتردر واحد زمان داشته باشند. "پردازندههای زبان طبیعی" به عنوان راهی برای ازبین بردن نیاز به زبانهای اختصاصی برنامه نویسی پیشنهاد شدهاند. هرچند، این هدف دور است و فواید آن قابل بحث است. "ادسگر دیجسترا" موافق بود که استفاده از یک زبان رسمی برای جلوگیری از مقدمه سازی ساختارهای بی معنی واجب است، و زبان برنامه نویسی طبیعی را با عنوان "احمقانه" رد کرد، "آلن پرلیس" نیز مشابها این ایده را رد کرد. مطابق با متدولوژی نامتجانس استفاده شده توسط langpop.com در سال ۲۰۰۸، ۱۲ زبان پرکاربرد عبارتند از: C, C++, C#, Java, JavaScript, Perl, PHP, Python, Ruby, Shell, SQL, and Visual Basic.
معناشناسی ایستا
معناشناسی ایستا محدودیتهایی بر روی ساختار مجاز متنها تعیین میکند که بیان آنها در فرمول دستوری استاندارد مشکل و یا غیر ممکن است. مهمترین این محدودیتها به وسیله سیستم نوع گذاری انجام میشود.
سیستم نوع گذاری
یک سیستم نوع گذاری مشخص میکند که یک زبان برنامه نویسی چگونه مقادیر و عبارات را در نوع(type) دسته بندی میکند، چگونه میتواند آن نوعها را تغییر دهد و رفتار متقابل آنها چگونهاست. این کارعموما توضیح داده ساختارهایی که میتوانند در آن زبان ایجاد شوند را شامل میشود. طراحی و مطالعه سیستمهای نوع گذاری بوسیله ریاضیات قراردادی را تئوری نوع گذاری گویند.
زبانهای نوع گذاری شده و بدون نوع گذاری
یک زبان نوع گذاری شدهاست اگر مشخصات هر عملیات، نوع دادههای قابل اجرا توسط آن را با نشان دادن نوعهایی که برای آنها قابل اجرا نیست، تعیین کند. برای مثال، "این متن درون گیومه قرار دارد" یک رشتهاست. در غالب زبانهای برنامه نویسی، تقسیم یک رشته با یک عدد معنایی ندارد. در نتیجه غالب زبانهای برنامه نویسی مدرن ممکن است اجرای این عملیات را توسط برنامهها رد کنند. در برخی زبانها، عبارات بی معنی ممکن است هنگام ترجمه(compile) پیدا شود(چک کننده نوع ایستا)، و توسط کامپایلر رد شود، در حالی که در سایر برنامهها، هنگام اجرا پیدا شود.(چک کننده نوع دینامیک) که به استثنای در حال اجرا منتج شود(runtime exception). حالت خاص زبانهای نوع دار زبانهای تک نوعند. این زبانها غالباً اسکریپتی و یا مارک آپ هستند، مانند rexx وSGML و فقط یک داده گونه دارند—غالباً رشتههای کاراکتری که هم برای دادههای عددی و هم برای دادههای سمبلی کاربرد دارند. در مقابل، یک زبان بدون نوع گذاری، مثل اکثر زبانهای اسمبلی، این امکان را میدهد که هر عملیاتی روی هر دادهای انجام شود، که معمولاً دنبالهای از بیتها با طولهای متفاوت در نظر گرفته میشوند. زبانهای سطح بالا که بی نوع هستند شامل زبانهای ساده رایانهای و برخی از انواع زبانهای نسل چهارم.
در عمل، در حالیکه تعداد بسیار کمی از دیدگاه نظریه نوع، نوع گذاری شده تلقی میشوند(چک کردن یا رد کردن تمام عملیاتها)، غالب زبانهای امروزی درجهای از نوع گذاری را فراهم میکنند. بسیاری از زبانهای تولیدکننده راهی را برای گذشتن یا موقوف کردن سیستم نوع فراهم میکنند.
نوع گذاری قوی و ضعیف
نوع گذاری ضعیف این امکان را ایجاد میکند که با متغیری به جای متغیری دیگر برخورد شود، برای مثال رفتار با یک رشته به عنوان یک عدد. این ویژگی بعضی اوقات ممکن است مفید باشد، اما ممکن است باعث ایجاد برخی مشکلات برنامه شود که موقع کامپایل و حتی اجرا پنهان بمانند.
نوع گذاری قوی مانع رخ دادن مشکل فوق میشود. تلاش برای انجام عملیات روی نوع نادرست متغیر منجر به رخ دادن خطا میشود. زبانهایی که نوع گذاری قوی دارند غالباً با نام "نوع-امن" و یا امن شناخته میشوند. تمام تعاریف جایگزین برای "ضعیف نوع گذاری شده" به زبانها اشاره میکند، مثل perl, JavaScript, C++، که اجازه تعداد زیادی تبدیل نوع داخلی را میدهند. در جاوااسکریپت، برای مثال، عبارت ۲*x به صورت ضمنی x را به عدد تبدیل میکند، و این تبدیل موفقیت آمیز خواهد بود حتی اگر x خالی، تعریف نشده، یک آرایه، و یا رشتهای از حروف باشد. چنین تبدیلات ضمنی غالباً مفیدند، اما خطاهای برنامه نویسی را پنهان میکنند.
قوی و ایستا در حال حاضر عموماً دو مفهوم متعامد فرض میشوند، اما استفاده در ادبیات تفاوت دارد، برخی عبارت "قوی نوع گذاری شده" را به کار میبرند و منظورشان قوی، ایستایی نوع گذاری شدهاست، و یا، حتی گیچ کننده تر، منظورشان همان ایستایی نوع گذاری شدهاست. بنابراین C هم قوی نوع گذاری شده و هم ضعیف و ایستایی نوع گذاری شده نامیده میشود.
معناشناسی اجرا
وقتی که داده مشخص شد، ماشین باید هدایت شود تا عملیاتها را روی داده انجام دهد. معناشناسی اجرا ی یک زبان تعیین میکند که چگونه و چه زمانی ساختارهای گوناگون یک زبان باید رفتار برنامه را ایجاد کنند.
برای مثال، معناشناسی ممکن است استراتژی را که بویسله آن عبارات ارزیابی میشوند را تعریف کند و یا حالتی را که ساختارهای کنترلی تحت شرایطی دستورها را اجرا میکنند.
کتابخانه هسته
اغلب زبانهای برنامه نویسی یک کتابخانه هسته مرتبط دارند(گاهی اوقات "کتابخانه استاندارد" نامیده میشوند، مخصوصا وقتی که به عنوان قسمتی از یک زبان استاندارد ارائه شده باشد)، که به طور قراردادی توسط تمام پیاده سازیهای زبان در دسترس قرار گرفته باشند. کتابخانه هسته معمولاً تعریف الگوریتمها، داده ساختارها و مکانیزمهای ورودی و خروجی پرکاربرد را در خود دارد. کاربران یک زبان، غالباً با کتابخانه هسته به عنوان قسمتی از آن رفتار میکنند، اگرچه طراحان ممکن است با آن به صورت یک مفهوم مجزا رفتار کرده باشند. بسیاری از خصوصیات زبان هستهای را مشخص میکنند که باید در تمام پیاده سازیها موجود باشند، و در زبانهای استاندارد شده این کتابخانه هسته ممکن است نیاز باشد. بنابراین خط بین زبان و کتابخانه هسته آن از زبانی به زبان دیگر متفاوت است. درواقع، برخی زبانها به گونهای تعریف شدهاند که برخی از ساختارهای دستوری بدون اشاره به کتابخانه هسته قابل استفاده نیستند. برای مثالف در جاوا، یک رشته به عنوان نمونهای از کلاس “java.lang.String” تعریف شده است؛ مشابها، در سمال تاک(smalltalk) یک تابع بی نام(یک "بلاک") نمونهای از کلاس BlockContext کتابخانه میسازد. بطور معکوس، Scheme دارای چندین زیرمجموعه مرتبط برای ایجاد سایر ماکروهای زبان میباشد، و در نتیجه طراحان زبان حتی این زحمت را نیز تحمل نمیکنند که بگویند کدام قسمت زبان به عنوان ساختارهای زبان باید پیاده سازی شوند، و کدام یک به عنوان بخشی ازکتابخانه.
عمل
طراحان زبان و کاربران باید مصنوعاتی ایجاد کنند تا برنامه نویسی را در عمل ممکن سازند و کنترل کنند. مهمترین این مصنوعات خصوصیات و پیاده سازیهای زبان هستند.
خصوصیات
یک زبان برنامه نویسی باید تعریفی فراهم کند که کاربران و پیاده کنندههای زبان میتوانند از آن استفاده کنند تا مشخص کنند که رفتار یک برنامه درست است. با داشتن کد منبع: خصوصیات یک زبان برنامه نویسی چندین قالب میتواند بگیرد، مانند مثالهای زیر:
تعریف صریح دستور، معناشناسی ایستا، ومعناشناسی اجرای زبان. درحالیکه دستور معمولاً با یک معناشناسی قراردادی مشخص میشود، تعاریف معناشناسی ممکن است در زبان طبیعی نوشته شده باشند (مثل زبان C)، یا معناشناسی قراردادی(مثل StandardML ,Scheme)
توضیح رفتار یک مترجم برای زبان(مثل C,fortran). دستور و معناشناسی یک زبان باید از این توضیح استنتاج شوند، که ممکن است به زبان طبیعی یا قراردادی نوشته شود.
پیاده سازی منبع یا مدل. گاهی اوقات در زبانهای مشخص شده(مثل: prolog,ANSI REXX).دستور و معناشناسی صریحاً در رفتار پیاده سازی مدل موجودند.
پیاده سازی
پیاده سازی یک زبان برنامه نویسی امکان اجرای آن برنامه را روی پیکربندی مشخصی از سختافزار و نرمافزار را فراهم میکند. بطور وسیع، دو راه رسیدن به پیاده سازی زبان برنامه نویسی وجود دارد. کامپایل کردن و تفسیر کردن. بطور کلی با هر بک از ابن دو روش میتوان یک زبان را پیاده سازی کرد.
خروجی یک کامپایلر ممکن است با سختافزار و یا برنامهای به نام مفسر اجرا شود. در برخی پیاده سازیها که از مفسر استفاده میشود، مرز مشخصی بین کامپایل و تفسیر وجود ندارد. برای مثال، برخی پیاده سازیهای زبان برنامه نویسی بیسیک کامپایل میکنند و سپس کد را خط به خط اجرا میکنند.
برنامههایی که مستقیماً روی سختافزار اجرا میشوند چندین برابر سریعتر از برنامههایی که با کمک نرمافزار اجرا میشوند، انجام میشوند.
یک تکنیک برای بهبود عملکرد برنامههای تفسیر شده کامپایل در لحظه آن است. در این روش ماشین مجازی، دقیقاً قبل از اجرا، بلوکهای کدهای بایتی که قرار است استفاده شوند را برای اجرای مستقیم روی سختافزار ترجمه میکند.
تاریخچه
پیشرفتهای اولیه
اولین زبان برنامه نویسی به قبل از رایانههای مدرن باز میگردد. قرن ۱۹ دستگاههای نساجی و متون نوازنده پیانو قابل برنامه نویسی داشت که امروزه به عنوان مثالهایی از زبانهای برنامه نویسی با حوزه مشخص شناخته میشوند. با شروع قرن بیستم، پانچ کارتها داده را کد گذاری کردند و پردازش مکانیکی را هدایت کردند. در دهه ۱۹۳۰ و ۱۹۴۰، صورت گرایی حساب لاندای آلونزو چرچ و ماشین تورینگ آلن تورینگ مفاهیم ریاضی بیان الگوریتمها را فراهم کردند؛ حساب لاندا همچنان در طراحی زبان موثر است.
در دهه ۴۰، اولین رایانههای دیجیتال که توسط برق تغذیه میشدند ایجاد شدند. اولین زبان برنامه نویسی سطح بالا طراحی شده برای کامپیوتر پلانکالکول بود، که بین سالهای ۱۹۴۵ و ۱۹۴۳ توسط کنراد زوس برای ز۳ آلمان طراحی شد.
کامپیوترهای اوایل ۱۹۵۰، بطور خاص ÜNIVAC ۱ و IBM ۷۰۱ از برنامههای زبان ماشین استفاده میکردند. برنامه نویسی زبان ماشین نسل اول توسط نسل دومی که زبان اسمبلی نامیده میشوند جایگزین شد. در سالهای بعد دهه ۵۰، زبان برنامه نویسی اسمبلی، که برای استفاده از دستورات ماکرو تکامل یافته بود، توسط سه زبان برنامه نویسی سطح بالا دیگر: FORTRAN,LISP , COBOL مورد استفاده قرار گرفت. نسخههای به روز شده این برنامهها همچنان مورد استفاده قرار میگیرند، و هر کدام قویا توسعه زبانهای بعد را تحت تاثیر قرار دادند. در پایان دهه ۵۰ زبان algol ۶۰ معرفی شد، و بسیاری از زبانهای برنامه نویسی بعد، با ملاحظه بسیار، از نسل algol هستند. قالب و استفاده از زبانهای برنامه نویسی به شدت متاثر از محدودیتهای رابط بودند.
پالایش
دوره دهه ۶۰ تا اواخر دهه ۷۰ گسترش مثالهای عمده زبان پرکاربرد امروز را به همراه داشت. با این حال بسیاری از جنبههای آن بهینه سازی ایدههای اولیه نسل سوم زبان برنامه نویسی بود:
APL برنامه نویسی آرایهای را معرفی کرد و برنامه نویسی کاربردی را تحت تاثیر قرار داد.
PL/i(NPL) دراوایل دهه ۶۰ طراحی شده بود تا ایدههای خوب فورترن و کوبول را بهم پیوند دهد.
در دهه ۶۰، Simula اولین زبانی بود که برنامه نویسی شئ گرا را پشتیبانی میکرد، در اواسط دهه۷۰. Smalltalk به دنبال آن به
عنوان اولین زبان کاملاً شئ گرا معرفی شد.
C بین سالهای ۱۹۶۹ تا ۱۹۷۳ به عنوان زبان برنامه نویسی سیستمی طراحی شد و همچنان محبوب است.
Prolog، طراحی شده در ۱۹۷۲، اولین زبان برنامه نویسی منطقی بود.
در ۱۹۷۸ ML سیستم نوع چند ریخت روی لیسپ ایجاد کرد، و در زبانهای برنامه نویسی کاربردی ایستا نوع گذاری شده پیشگام شد.
هر یک از این زبانها یک خانواده بزرگ از وارثین از خود به جای گذاشت، و مدرنترین زبانها از تبار حداقل یکی از زبانهای فوق به شمار میآیند.
دهههای ۶۰ و ۷۰ مناقشات بسیاری روی برنامه نویسی ساخت یافته به خود دیدند، و اینکه آیا زبانهای برنامه نویسی باید طوری طراحی شوند که آنها را پشتیبانی کنند.
"ادسگر دیکسترا" در نامهای معروف در ۱۹۶۸ که در ارتباطات ACM منتشر شد، استدلال کرد که دستورgoto باید از تمام زبانهای سطح بالا حذف شود.
در دهههای ۶۰ و ۷۰ توسعهٔ تکنیکهایی صورت گرفت که اثر یک برنامه را کاهش میداد و در عین حال بهره وری برنامه نویس و کاربر را بهبود بخشید. دسته کارت برای ۴GL اولیه بسیار کوچکتر از برنامهٔ هم سطح بود که با ۳GL deck نوشته شده بود.
یکپارچگی و رشد
دهه ۸۰ سالهای یکپارچگی نسبی بود. C++ برنامه نویسی شئ گرا و برنامه نویسی سیستمی را ترکیب کرده بود. ایالات متحده ایدا(زبان برنامه نویسی سیستمی که بیشتر برای استفاده توسط پیمان کاران دفاعی بود) را استاندارد سازی کرد. در ژاپن و جاهای دیگر، هزینههای گزافی صرف تحقیق در مورد زبان نسل پنجم میشد که دارای ساختارهای برنامه نویسی منطقی بود. انجمن زبان کاربردی به سمت استانداردسازی ML و Lisp حرکت کرد. به جای ایجاد مثالهای جدید، تمام این تلاشها ایدههایی که در دهههای قبل حلق شده بودند را بهتر کرد.
یک گرایش مهم در طراحی زبان در دهه ۸۰ تمرکز بیشتر روی برنامه نویسی برای سیستمهای بزرگ از طریق مدولها، و یا واحدهای کدهای سازمانی بزرگ مقیاس بود. مدول-۲، ایدا. و ML همگی سیستمهای مدولی برجستهای را در دهه ۸۰ توسعه دادند. با وجود اینکه زبانهای دیگر، مثل PL/i، پشتیبانی بسیار خوبی برای برنامه نویسی مدولی داشتند. سیستمهای مدولی غالباً با ساختارهای برنامه نویسی عام همراه شدهاند.
رشد سریع اینترنت در میانه دهه ۹۰ فرصتهای ایجاد زبانهای جدید را فراهم کرد. Perl، در اصل یک ابزار نوشتن یونیکس بود که اولین بار در سال ۱۹۸۷ منتشر شد، در وبگاههای دینامیک متداول شد. جاوا برای برنامه نویسی جنب سروری مورد استفاده قرار گرفت. این توسعهها اساساً نو نبودند، بلکه بیشتر بهینه سازی شده زبان و مثالهای موجود بودند، و بیشتر بر اساس خانواده زبان برنامه نویسی C بودند. پیشرفت زبان برنامه نویسی همچنان ادامه پیدا میکند، هم در تحقیقات و هم در صنعت. جهتهای فعلی شامل امنیت و وارسی قابلیت اعتماد است، گونههای جدید مدولی(mixin، نمایندهها، جنبهها) و تجمع پایگاه داده.
۴GLها نمونهای از زبانهایی هستند که محدوده استفاده آنها مشخص است، مثل SQL. که به جای اینکه دادههای اسکالر را برگردانند، مجموعههایی را تغییر داده و بر میگردانند که برای اکثر زبانها متعارفند. Perl برای مثال، با "مدرک اینجا" خود میتواند چندین برنامه ۴GL را نگه دارد، مانند چند برنامه جاوا سکریبت، در قسمتی از کد پرل خود و برای پشتیبانی از چندین زبان برنامه نویسی با تناسب متغیر در "مدرک اینجا" استفاده کند.