زبان برنامه‌نویسی: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
FreshmanBot (بحث | مشارکت‌ها)
جز ←‏مدیریت منابع و نشت حافظه: اصلاح نویسه با استفاده از AWB
FreshmanBot (بحث | مشارکت‌ها)
جز اصلاح فاصله مجازی + اصلاح نویسه با استفاده از AWB
خط ۳:
{{ویکی‌سازی}}
 
'''زبان‌های برنامه‌نویسی''' ساختارهای زبانی دستور مداری در [[رایانه]]‌ها هستند که به‌وسیلهٔ آنهاآن‌ها می‌توان یک [[الگوریتم]] را به‌وسیلهٔ ساختارهای دستوری متفاوت برای اجرای رایانه توصیف کرد و با این روش امکان نوشتن برنامه جهت تولید [[نرم‌افزار]]های جدید بوجود می‌آید. معمولاً هر زبان برنامه‌نویسی دارای یک محیط نرم‌افزاری برای وارد کردن متن برنامه، اجرا، [[همگردانی]] و رفع اشکال آن هستند.
عموماً زبانهای [[برنامه‌نویسی]] را به پنج نسل تقسیم می‌کنند:
* نسل اول [[زبان ماشین]] - زبان صفرو یک
خط ۳۸:
* هدف: زبان‌های برنامه‌نویسی با [[زبان‌های طبیعی]] تفاوت دارند و آن اینکه زبان‌های طبیعی فقط برای فعل و انفعالات بین مردم به کار می‌روند، در حالیکه زبان‌های برنامه‌نویسی همچنین به انسانها اجازه می‌دهد که از طریق دستورهای با ماشین‌ها ارتباط برقرار کنند. برخی زبان‌های برنامه‌نویسی بوسیله یک دستگاه استفاده می‌شوند تا دستگاه دیگری را کنترل کند. برای مثال برنامه‌های پست اسکریپت(post script) غالباً توسط برنامه دیگری برای کنترل یک چاپگر یا نمایشگر ایجاد می‌شوند.
* ساختارها: زبان‌های برنامه‌نویسی ممکن است ساختارهایی برای تعریف و تغییر [[داده ساختارها]] یا کنترل جریان اجرا داشته باشند.
* توان بیانگر: [[نظریه محاسبات]]، زبان‌ها را بوسیله محاسباتی که توان بیان آنهاآن‌ها را دارند [[طبقه‌بندی]] می‌کند. تمام زبان‌های «کامل تورینگ» می‌توانند مجموعه یکسانی از الگوریتم‌ها را پیاده‌سازی کنند.ANSI/ISO SQL و Charity مثال‌هایی هستند از زبان‌هایی که کامل تورینگ نیستند، ولی غالباً زبان برنامه‌نویسی نامیده می‌شوند.
برخی مؤلفین اصطلاح «زبان برنامه‌نویسی» را محدود به آنهایی می‌کنند که می‌توانند تمام الگوریتم‌های ممکن را پیاده‌سازی کنند، گاهی اوقات اصطلاح «زبان رایانه» برای زبان‌های برنامه‌نویسی محدودتر به کار می‌رود.
زبان‌های غیر محاسباتی، مانند زبان‌های مارک آپ(markup) HTML یا گرامرهای قراردادی مثل BNF، معمولاً زبان برنامه‌نویسی محسوب نمی‌شوند. یک زبان برنامه‌نویسی (که می‌تواند کامل تورینگ نباشد) ممکن است در این زبان‌های غیر محاسباتی (میزبان) تعبیه شوند.
خط ۴۴:
== کاربرد ==
زبان برنامه‌نویسی یک مکانیزم [[ساخت یافته]] برای تعریف داده‌ها، و عملیات یا تبدیل‌هایی که ممکن است بطور اتوماتیک روی آن داده انجام شوند، فراهم می‌کند. یک [[برنامه‌نویس]] از انتزاعات آماده در زبان استفاده می‌کند تا مفاهیم به کار رفته در محاسبات را بیان کند. این مفاهیم به عنوان یک مجموعه از ساده‌ترین عناصر موجود بیان می‌شوند (مفاهیم ابتدایی نامیده می‌شوند).
[[زبان‌های برنامه‌نویسی]] با غالب [[زبان‌های انسانی]] تفاوتی دارد و آن این است که نیاز به بیان دقیق تر و کامل تری دارد. هنگام استفاده از زبان‌های طبیعی برای ارتباط با دیگر انسان‌ها، نویسندگان و گویندگان می‌توانند مبهم باشند و اشتباهات کوچک داشته باشند، و همچنان انتظار داشته باشند که مخاطب آنهاآن‌ها متوجه شده باشد. اگرچه، مجازا، رایانه‌ها «دقیقاً آنچه که به آنهاآن‌ها گفته شده را انجام می‌دهند.» و نمی‌توانند «بفهمند» که نویسنده دقیقاً چه کدی مد نظر نویسنده بوده‌است] البته امروزه برنامه‌هایی برای انجام این کار تولید شده‌اند و تلاش‌های بسیاری در این زمینه انجام شده ولی هنوز به نتیجهٔ رضایت بخشی نرسیده‌است[. ترکیب تعریف زبان، یک برنامه، و ورودی برنامه بطور کامل رفتار خروجی را به هنگام اجرای برنامه (در محدوده کنترل آن برنامه) مشخص می‌کند.
برنامه‌های یک رایانه ممکن است در یک فرایند ناپیوسته بدون دخالت انسان اجرا شوند، یا یک کاربر ممکن است دستورهای را در یک مرحله فعل و انفعال مفسر تایپ کند. در این حالت «دستور»ها همان برنامه‌ها هستند، که اجرای آنهاآن‌ها زنجیروار به هم مرتبطند. به زبانی که برای دستور دادن به برنامه‌ای استفاده می‌شود، زبان اسکریپت می‌گویند.
بسیاری از زبان‌ها کنار گذاشته شده‌اند، برای رفع نیازهای جدید جایگزین شده‌اند، با برنامه‌های دیگر ترکیب شده‌اند و در نهایت استعمال آنهاآن‌ها متوقف شده‌است. با وجود اینکه تلاش‌هایی برای طراحی یک زبان رایانه« کامل» شده‌است که تمام اهداف را تحت پوشش قرار دهد، هیچ‌یک نتوانستند بطور کلی این جایگاه را پر کنند. نیاز به زبان‌های رایانه‌ای گسترده از گستردگی زمینه‌هایی که زبان‌ها استفاده می‌شوند، ناشی می‌شود:
* محدوده برنامه‌ها از متون بسیار کوچک نوشته شده توسط افراد عادی تا سیستم‌های بسیار بزرگ نوشته شده توسط صدها برنامه‌نویس است
* توانایی برنامه‌نویس‌ها: از تازه‌کارهایی که بیش از هر چیز به سادگی نیاز دارند تا حرفه‌ای‌هایی که با پیچیدگی قابل توجهی کنار می‌آیند.
* برنامه‌ها باید سرعت، اندازه و سادگی را بسته به سیستم‌ها از ریزپردازنده‌ها تا ابر رایانه‌ها متناسب نگه دارند.
* برنامه‌ها ممکن است یک بار نوشته شوند و تا نسل‌ها تغییر نکنند، یا ممکن است پیوسته اصلاح شوند.
* در نهایت، برنامه‌نویس‌ها ممکن است در علایق متفاوت باشند: آنهاآن‌ها ممکن است به بیان مسائل با زبانی خاص خو گرفته باشند.
 
یک سیر رایج در گسترش زبان‌های برنامه‌نویسی این است که قابلیت حل مسائلی با درجات انتزاعی بالاتری را اضافه کنند. زبان‌های برنامه‌نویسی اولیه به [[سخت‌افزار رایانه]] گره خورده بودند. همان‌طور که زبان‌های برنامه‌نویسی جدید گسترش پیدا کرده‌اند، ویژگی‌هایی به برنامه‌ها افزوده شده که به برنامه‌نویس اجازه دهد که ایده‌هایی که از ترجمه ساده به دستورهای سخت‌افزار دورتر هستند نیز استفاده کند. چون برنامه‌نویس‌ها کمتر به پیچیدگی رایانه محدود شده‌اند، برنامه‌های آنهاآن‌ها می‌تواند محاسبات بیشتری با تلاش کمتر از سوی برنامه‌نویس انجام دهند. این به آنهاآن‌ها این امکان را می‌دهد که کارایی بیشتر در واحد زمان داشته باشند.
«پردازنده‌های زبان طبیعی» به عنوان راهی برای ازبین بردن نیاز به زبان‌های اختصاصی برنامه‌نویسی پیشنهاد شده‌اند. هرچند، این هدف دور است و فواید آن قابل بحث است. «ادسگر دیجسترا» موافق بود که استفاده از یک [[زبان رسمی]] برای جلوگیری از مقدمه سازی ساختارهای بی‌معنی واجب است، و زبان برنامه‌نویسی طبیعی را با عنوان «احمقانه» رد کرد، «آلن پرلیس» نیز مشابها این ایده را رد کرد.
مطابق با متدولوژی نامتجانس استفاده شده توسط langpop.com در سال ۲۰۰۸، ۱۲ زبان پرکاربرد عبارتند از:
خط ۵۹:
 
== المان‌ها ==
تمام زبان‌های برنامه‌نویسی تعدادی بلوک‌های ابتدایی برای توضیح داده و پردازش یا تبدیل آنهاآن‌ها (مانند جمع کردن دو عدد با انتخاب یک عضو از یک مجموعه) دارند. این «عناصر ابتدایی» بوسیله قوانین معناشناسی و دستوری تعریف می‌شوند که ساختار و معنای مربوطه را توضیح می‌دهند.
 
=== دستور(syntax) ===
خط ۹۲:
 
=== معناشناسی ایستا ===
معناشناسی ایستا محدودیت‌هایی بر روی ساختار مجاز متن‌ها تعیین می‌کند که بیان آنهاآن‌ها در فرمول دستوری استاندارد مشکل یا غیرممکن است. مهمترین این محدودیت‌ها به وسیله [[سیستم نوع]] گذاری انجام می‌شود. برخلاف باور برخی از برنامه‌نویسان محدودیت‌های اعمال شده، اعمال نشده‌اند بلکه در واقع ناشی از زیرساخت‌های آن زبان برنامه‌نویسی هستند تا سرعت پردازش را افزایش دهند و قدرت پردازش پردازنده را برای تایپ‌کستینگ‌های خودکار متعدد صرف نکنند. استفاده از روش ایستا صرفاً سرعت پردازش‌هایی را افزایش می‌دهد که در کسری از ثانیه به محاسبه حجم انبوهی از داده‌ها نیاز دارند. این موضوع بهبود پردازش برای مثال خودش را در گرافیک‌های سنگین بازی‌های کامپیوتری نشان می‌دهد همچنین برای مثال در سرورهای بک‌اند (پشتی) بانکداری با حجم انبوهی از ثبت ترنزاکشن‌ها که از زبان ایستای جاوا استفاده می‌شود اما حتی در موضوع گرافیک جاوا به دلیل استفاده از گاربیج‌کالکشن یا جمع‌آوری زباله و البته استفاده از ماشین مجازی برای مدیریت حافظه سرعت پردازشی C++ را ندارد از طرفی استفاده دات نت از زبان میانجی IL برای پشتیبانی از زبان‌های متعدد مانند C# یا F# و کامپایل نکردن مستقیم به باینری ماشینی باعث می‌شود که سرعت پردازش C# نیز از جاوا پایین‌تر باشد اما امکانات گسترده‌تری را در زمینه‌های خاصی مانند طراحی وب یا ساخت برنامه‌های سبک‌پردازشی روی سیستم‌عامل را فراهم کند اگرچه با صرف میزان بیشتری از منابع حافظه و پردازشی.
 
=== سیستم نوع گذاری ===
خط ۹۸:
 
==== زبان‌های نوع گذاری شده و بدون نوع گذاری ====
یک زبان نوع گذاری شده‌است اگر مشخصات هر عملیات، نوع داده‌های قابل اجرا توسط آن را با نشان دادن نوع‌هایی که برای آنهاآن‌ها قابل اجرا نیست، تعیین کند. برای مثال، «این متن درون گیومه قرار دارد» یک رشته‌است. در غالب زبان‌های برنامه‌نویسی، تقسیم یک رشته با یک عدد معنایی ندارد. در نتیجه غالب زبان‌های برنامه‌نویسی مدرن ممکن است اجرای این عملیات را توسط برنامه‌ها رد کنند. در برخی زبان‌ها، عبارات بی‌معنی ممکن است هنگام ترجمه(compile) پیدا شود (چک کنندهچک‌کننده نوع ایستا)، و توسط کامپایلر رد شود، در حالی که در سایر برنامه‌ها، هنگام اجرا پیدا شود. (چک کنندهچک‌کننده نوع دینامیک) که به استثنای در حال اجرا منتج شود(runtime exception).
حالت خاص زبان‌های نوع دار زبان‌های تک نوعند. این زبان‌ها غالباً اسکریپتی یا مارک آپ هستند، مانند rexx وSGML و فقط یک داده گونه دارند—غالباً رشته‌های کاراکتری که هم برای داده‌های عددی و هم برای داده‌های سمبلی کاربرد دارند.
در مقابل، یک زبان بدون نوع گذاری، مثل اکثر زبان‌های اسمبلی، این امکان را می‌دهد که هر عملیاتی روی هر داده‌ای انجام شود، که معمولاً دنباله‌ای از بیت‌ها با طول‌های متفاوت در نظر گرفته می‌شوند. زبان‌های سطح بالا که بی نوع هستند شامل زبان‌های ساده رایانه‌ای و برخی از انواع زبان‌های نسل چهارم.
خط ۱۰۵:
 
==== نوع گذاری ایستا و پویا ====
در نوع گذاری ایستا تمام عبارات نوع‌های خود را قبل از اجرای برنامه تعیین می‌کنند (معمولاً در زمان کامپایل). برای مثال، ۱ و (۲+۲) عبارات عددی هستند؛ آنهاآن‌ها نمی‌توانند به تابعی که نیاز به یک رشته دارد داده شوند، یا در متغیری که تعریف شده تا تاریخ را نگه دارد، ذخیره شوند.
 
زبان‌های نوع گذاری شده ایستا می‌توانند با مانیفست نوع گذاری شوند یا با استفاده از نوع استنباط شوند. در حالت اول، برنامه‌نویس بیشتر صریحاً نوع‌ها را در جایگاه‌های متنی مشخص می‌نویسد (برای مثال، در تعریف متغیرها). در حالت دوم، کامپایلر نوع عبارات و تعریف‌ها را بر اساس متن استنباط می‌کند. غالب زبان‌های مسیر اصلی(mainstream) ایستا نوع گذاری شده، مانند C#,C++ و Java، با مانیفست نوع گذاری می‌شوند
خط ۱۱۵:
تمام تعاریف جایگزین برای «ضعیف نوع گذاری شده» به زبان‌ها اشاره می‌کند، مثل perl, JavaScript, C++، که اجازه تعداد زیادی تبدیل نوع داخلی را می‌دهند. در جاوااسکریپت، برای مثال، عبارت ۲*x به صورت ضمنی x را به عدد تبدیل می‌کند، و این تبدیل موفقیت‌آمیز خواهد بود حتی اگر x خالی، تعریف نشده، یک آرایه، یا رشته‌ای از حروف باشد. چنین تبدیلات ضمنی غالباً مفیدند، اما خطاهای برنامه‌نویسی را پنهان می‌کنند.
 
قوی و ایستا در حال حاضر عموماً دو مفهوم متعامد فرض می‌شوند، اما استفاده در ادبیات تفاوت دارد، برخی عبارت «قوی نوع گذاری شده» را به کار می‌برند و منظورشان قوی، ایستایی نوع گذاری شده‌است، و یا، حتی گیچ کنندهگیچ‌کننده تر، منظورشان همان ایستایی نوع گذاری شده‌است؛ بنابراین C هم قوی نوع گذاری شده و هم ضعیف و ایستایی نوع گذاری شده نامیده می‌شود.
 
=== معناشناسی اجرا ===
خط ۱۳۴:
تفاوت سرعت پردازش زبان‌های ایستا و پویا در برنامه‌هایی که نیاز به پردازش‌های بسیار حجیم در مدت زمان بسیار کوتاه دارند خودش را نشان می‌دهد بنابراین تفاوت سرعت پردازش در مورد حتی وبگاه‌های بسیار شلوغ آنقدر نیست که امکانات فراهم شده توسط یک زبان سطح بالا مانند php یا python را فدای سرعت C++ کنند البته برای مثال فیسبوک مجبور شد که php را بواسطه c++ بر روی facebook hiphop گسترش دهد تا به سرعت پردازش مطلوب خودش برسد. برای مثال درباره python توصیه شده‌است که حلقه‌های چرخشی روی حجم بالای داده را بواسطه لوپ خود پایثون و با اندیس index انجام ندهید بلکه یک آرایه array تهیه کرده و چرخش را به زیرساخت C++ آن واگذار کنید.
 
اما مساله مدیریت حافظه و نشت آن یا memory leakage از آنجاست که در زمان اجرای برنامه (runtime) ابتدا فضایی از حافظه به نام کداسپیس به کد اختصاس داده می‌شود و به بقیه حافظه در دسترس heap گفته می‌شود. مسئولیت استفاده و تضمین خالی کردن بخش اشغال‌شده از heap پس از پایان کار به عهده خود برنامه‌نویس است در غیر اینصورت برنامه ممکن است دچار نشت حافظه شود. در زمان ران‌تایم جدولی از کداسپیس درون ساختار زبان برای تعیین حافظه مورد استفاده هر بخش از کد (مثلامثلاً یک تابع یا فانکشن) اختصاص داده می‌شود که به هر بخش از آن اصطلاحاً Scope گفته می‌شود که تعیین می‌کند که کدام متغیرها توسط کدام بخش از کد استفاده می‌شوند تا در آغاز یک scope آن متغیرها درون محیط مثلامثلاً یک تابع ایجاد شوند و پس از اجرا کاملاً پاک شوند (کسانی که در محیط ساده [[بورن شل]] کار کرده‌اند با این موضوع به خوبی آشنا می‌شوند). اما در زمان استفاده از ریفرنس خارجی در قالب pointer (اختصاصی زبان C++) آن متغیری که به ظاهر در محیط اسکوپ استفاده می‌شود در واقع فقط یک میان‌بر ریفرنس است به پوینتری که فضایی را روی حافظه تعیین کرده استکرده‌است که خارج از محدوده اسکوپ مثلامثلاً تابع فعلی ما قرار دارد در نتیجه با پایان کار فانکشن ما، فضای اختصاصی آن پوینتر تخلیه نمی‌شود بلکه فقط متغیر ریفرنسی که به آن اشاره می‌کرده پاک می‌شود و نشت حافظه رخ می‌دهد (به آن pointer که هیچ متغیر ریفرنسی نداشته باشد پوینتر وحشی یا wild گفته می‌شود) و این پوینتر می‌تواند یک شی بانک اطلاعاتی دارای حجم انبوهی از داده‌های استخراج شده باشد یا یک شی ارتباطی بانک اطلاعاتی که از دسترس خارج شده‌اند اما فضای حافظه را تا زمان باز بودن برنامه اشغال می‌کنند. ریفرنس‌های پوینتر حتی در زبان‌های سطح بالا مانند php و python یا C# هنوز در لایه زیرین ناپیدا استفاده می‌شوند برای انتقال متغیرها در سراسر برنامه اما زبان سطح بالا تعداد ریفرنس‌های موجود به هر پوینتر را حفظ می‌کند و زمانی که این تعداد صفر بشود زمان مرگ پوینتر و تخلیه آن فرا رسیده یا آن را به سطل زباله گاربیج‌کالکشن می‌فرستد تا همه آنهاآن‌ها را با هم و در یک نوبت تخلیه کند و از بار پردازشی اضافه ناشی از تخلیه مکرر بکاهد اگرچه تعداد نوبت‌های تخلیه گاربیج‌کالکشن در تنظیمات برنامه یا سرور ماشین مجازی قابل تنظیم است.
 
== عمل ==
خط ۱۴۰:
 
=== خصوصیات ===
خصوصیات یک زبان برنامه‌نویسی باید تعریفی فراهم کند که کاربران و پیاده کننده‌هایپیاده‌کننده‌های زبان می‌توانند از آن استفاده کنند تا مشخص کنند که رفتار یک برنامه درست است. با داشتن کد منبع:
خصوصیات یک زبان برنامه‌نویسی چندین قالب می‌تواند بگیرد، مانند مثال‌های زیر:
* تعریف صریح دستور، معناشناسی ایستا، و معناشناسی اجرای زبان. درحالیکه دستور معمولاً با یک معناشناسی قراردادی مشخص می‌شود، تعاریف معناشناسی ممکن است در [[زبان طبیعی]] نوشته شده باشند (مثل زبان C)، یا معناشناسی قراردادی (مثل StandardML ,Scheme)
خط ۱۷۷:
هر یک از این زبان‌ها یک خانواده بزرگ از وارثین از خود به جای گذاشت، و مدرنترین زبان‌ها از تبار حداقل یکی از زبان‌های فوق به‌شمار می‌آیند.
 
دهه‌های ۶۰ و ۷۰ مناقشات بسیاری روی [[برنامه‌نویسی ساخت یافته]] به خود دیدند، و اینکه آیا زبان‌های برنامه‌نویسی باید طوری طراحی شوند که آنهاآن‌ها را پشتیبانی کنند.
 
«ادسگر دیکسترا» در نامه‌ای معروف در ۱۹۶۸ که در ارتباطات ACM منتشر شد، استدلال کرد که دستورgoto باید از تمام زبان‌های سطح بالا حذف شود.
خط ۱۹۱:
پیشرفت زبان برنامه‌نویسی همچنان ادامه پیدا می‌کند، هم در تحقیقات و هم در صنعت. جهت‌های فعلی شامل امنیت و وارسی [[قابلیت اعتماد]] است، گونه‌های جدید مدولی(mixin، نماینده‌ها، جنبه‌ها) و تجمع [[پایگاه داده]].
 
۴GLها نمونه‌ای از زبان‌هایی هستند که محدوده استفاده آنهاآن‌ها مشخص است، مثل SQL. که به جای اینکه داده‌های اسکالر را برگردانند، مجموعه‌هایی را تغییر داده و برمی‌گردانند که برای اکثر زبان‌ها متعارفند. Perl برای مثال، با «مدرک اینجا» خود می‌تواند چندین برنامه ۴GL را نگه دارد، مانند چند برنامه [[جاوا اسکریپت]]، در قسمتی از کد پرل خود و برای پشتیبانی از چندین زبان برنامه‌نویسی با تناسب متغیر در «مدرک اینجا» استفاده کند.
 
=== سنجش استفاده از زبان ===