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