معرفی
زبان های برنامه نویسی مختلف کدامند؟ چه نوع مفاهیمی در آنها تعبیه شده است؟ چگونه توسعه یافتند؟ در این مقاله، انواع زبان های برنامه نویسی را بر اساس سطوح به اصطلاح – از کدهای ماشین (سطح پایین، نزدیک به سخت افزار کامپیوتر) تا زبان هایی مانند جاوا یا سی شارپ (سطح بالا) بررسی می کنیم. هر چه فهرست متنی برنامه در طول مسیر تبدیل شدن به مجموعه ای از صفر و یک دچار تغییرات کمتری شود، سطح پایین تر است.
در ادامه به این موارد خواهیم پرداخت:
- زبان های سطح پایین (کدهای ماشین و اسمبلی)
- سطح متوسط (C، Fortran….)
- سطح بالا (C++، جاوا، پایتون، روبی، جاوا اسکریپت...)
این سطح همچنین مشخص میکند که فهرست برنامههای آتی برای اجرای پیادهسازی چه مقدار جزئیات نیاز دارد. چقدر این فرآیند برای انسان ساده است؟ سطح یک زبان را نباید به عنوان شاخص روشنی از قابلیت های آن در نظر گرفت. زبان برنامه نویسی ابزاری است که در یک زمینه موثر و در برخی دیگر کمتر کاربرد دارد. هم وصال و هم نجار با چوب کار می کنند. اولی یک ابزار اصلی دارد - مجموعه ای از اسکنه، دومی - یک تبر. با این حال، یک نجار کابینت کنده کاری شده را زیباتر می کند و یک نجار خانه را سریعتر می سازد. اگرچه هرکدام قادر به انجام کار دیگری هستند، اما آن را با کارایی بسیار کمتری انجام خواهند داد. داده های مختلف در یک کامپیوتر به صورت مجموعه ای از صفر و یک نمایش داده می شوند. دستورات کنترلی برای پردازش آن همان داده هایی هستند که حاوی دستورالعمل هایی هستند که مکان اطلاعات لازم و روش اصلاح را تعیین می کنند.
زبان ماشین (پایین ترین سطح)
ما باید یک بازدید کوتاه از بخش نرم افزار به بخش سخت افزار داشته باشیم. بیایید به شکل ساده شده به آن نگاه کنیم.
پردازنده "مغز" اصلی کامپیوتر است. مادربردی که روی آن نصب شده است شامل کنترلرهایی است که برای تعامل با دستگاه های دیگر از طریق گذرگاه ها (کانال های داده برای ارتباط) استفاده می شود.
برخی با سرعت بالا کار می کنند (فلش های قرمز): پردازنده دستورات را از حافظه می گیرد و داده ها را دستکاری می کند، کارت گرافیک، به خصوص در بازی های سه بعدی، مقادیر زیادی بافت، اشکال، مختصات پیکسل و سایر اشیاء را برای ساختن یک تصویر روی صفحه نمایشگر مصرف می کند. . برخی دیگر (به دلیل محدودیت در سرعت تبادل اطلاعات) به چنین شاخص های بالایی نیاز ندارند. دستگاه های مختلف داخلی و خارجی در نمودار با فلش های سبز رنگ به هم متصل شده اند.
دنیای درونی پردازنده
تمام دستورات پردازنده از حافظه برای اجرا به صورت باینری می آیند. قالب، تعداد، زیر مجموعه دستورالعمل ها به معماری آن بستگی دارد. اکثر آنها با یکدیگر ناسازگار هستند و از ایدئولوژی های مختلفی پیروی می کنند. و همچنین نوع فرمان به شدت به حالت (8/16/32... عمق بیت) و منبع داده (حافظه، ثبت، پشته...) بستگی دارد که پردازنده با آن کار می کند. یک عمل مشابه را می توان با دستورالعمل های مختلف نشان داد. پردازنده دستورالعمل هایی برای اضافه کردن دو عملوند (ADD X,Y) و اضافه کردن یکی به یک عملوند مشخص شده (INC X) دارد. افزودن تریپل به یک عملوند می تواند به صورت ADD X,3 یا با فراخوانی سه بار INC X انجام شود و برای پردازنده های مختلف نمی توان پیش بینی کرد که کدام یک از این روش ها از نظر سرعت یا ردپای حافظه بهینه خواهد بود. برای راحتی، اطلاعات باینری به شکل هگزادسیمال نوشته شده است. بیایید بخشی از یک برنامه آشنا (زبان C، که نحو آن شبیه جاوا است) را در نظر بگیریم.
int func() {
int i = getData("7") ;
return ++i;
...
}
کدی که همان اقدامات را به صورت دنباله ای از دستورالعمل ها برای پردازنده اجرا می کند:
... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ...
زبان برنامه نویسی سطح پایین برای پردازنده اینتل در واقع شبیه این است. قطعه ای که یک متد را با آرگومان فراخوانی می کند و نتیجه را با افزایش یک برمی گرداند. این زبان ماشین (کد) است که مستقیماً بدون تغییر شکل به پردازنده برای اجرا منتقل می شود.
طرفداران:
- ما کاملاً بر شرایط مسلط هستیم، ما بیشترین امکانات را برای استفاده از پردازنده و سخت افزار رایانه داریم.
- همه گزینه ها برای سازماندهی و بهینه سازی کد در دسترس ما هستند.
معایب:
- داشتن دانش گسترده از عملکرد پردازنده ها و در نظر گرفتن تعداد زیادی از عوامل سخت افزاری هنگام اجرای کد ضروری است.
- ایجاد برنامه هایی که کمی پیچیده تر از مثال ذکر شده هستند، منجر به افزایش شدید زمان صرف شده برای نوشتن کد و اشکال زدایی آن می شود.
- وابستگی به پلتفرم: برنامهای که برای یک پردازنده ایجاد میشود معمولاً روی پردازندههای دیگر کار نمیکند. این امکان وجود دارد که برای این پردازنده در سایر حالت های عملکرد آن نیاز به ویرایش کد باشد.
کدهای ماشین به طور گسترده ای در سپیده دم کامپیوترها استفاده می شد؛ هیچ روش دیگری برای برنامه نویسی در عصر پیشگامان کامپیوتر وجود نداشت. در حال حاضر، آنها گهگاه توسط مهندسان در زمینه میکروالکترونیک هنگام توسعه یا آزمایش سطح پایین پردازنده ها استفاده می شوند.
زبان اسمبلی (سطح پایین)
برخلاف کامپیوتر، من و شما اطلاعات را بهتر به شکل متنی/معنی به جای دیجیتال درک می کنیم. شما به راحتی می توانید پنجاه نام مخاطب را در تلفن هوشمند خود نام ببرید، اما بعید است که بتوانید شماره تلفن مربوطه آنها را از روی قلب بنویسید. در مورد برنامه نویسی هم همینطور است. با انجام سه مرحله اساسی از نردبان نوع بالا می رویم:
- اجازه دهید یک دستورالعمل نمادین را به گروههایی از دستورالعملهای پردازنده دیجیتالی که اقدامات مربوطه را انجام میدهند مرتبط کنیم.
- بیایید آرگومان های دستورالعمل های پردازنده را به طور جداگانه برجسته کنیم.
- بیایید قابلیت نامگذاری نواحی حافظه، متغیرها و مکان تک تک دستورها را معرفی کنیم.
بیایید قطعات برنامه قبلی را در کد ماشین (مرکز) و در زبان اسمبلی (راست) مقایسه کنیم:
2004b0 48 83 ec 08 sub $0x8,%rsp
2004b4 bf bc 05 20 00 mov $0x2005bc,%edi
2004b9 31 c0 xor %eax,%eax
2004bb e8 e8 fe ff ff callq getData
2004c0 48 83 c4 08 add $0x8,%rsp
2004c4 83 c0 01 add $0x1,%eax
همانطور که می بینید، روند نوشتن یک برنامه ساده شده است: نیازی به استفاده از کتاب های مرجع برای تولید مقادیر دستور دیجیتال، محاسبه طول انتقال، توزیع داده ها در حافظه در سلول های آن و سایر ویژگی های پردازنده نیست. ما اقدام مورد نیاز را از مجموعه ای از دستورات نمادین و آرگومان های لازم برای منطق اجرا توصیف می کنیم و سپس برنامه مترجم فایل متنی را به مجموعه ای از صفر و یک های قابل فهم برای پردازنده ترجمه می کند.
طرفداران:
- فرآیند نوشتن و اصلاح کد ساده شده است.
- کنترل تمام منابع سخت افزاری حفظ شد.
- پورت کردن برنامه به پلتفرمهای دیگر نسبتاً سادهتر است، اما بسته به سازگاری سختافزار نیاز به اصلاح دارند.
معایب:
- زبان اسمبلی یک زبان برنامه نویسی سطح پایین است. ایجاد حتی بخش های کوچک کد دشوار است. علاوه بر این، باید عملکرد خاص تجهیزات را نیز در نظر گرفت.
- وابستگی به پلت فرم
محبوب ترین نمونه دمو جاوا:
public static void main(String[] args) {
System.out.println("Hello World!");
}
(سینتکس NASM، با استفاده از Windows API و kernel32.lib) به صورت زیر خواهد بود:
global _main
extern _GetStdHandle@4
extern _WriteFile@20
extern _ExitProcess@4
section .text
_main:
; DWORD bytes;
mov ebp, esp
sub esp, 4
; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
push -11
call _GetStdHandle@4
mov ebx, eax
; WriteFile( hstdOut, message, length(message), &bytes, 0);
push 0
lea eax, [ebp-4]
push eax
push (message_end - message)
push message
push ebx
call _WriteFile@20
; ExitProcess(0)
push 0
call _ExitProcess@4
; never here
hlt
message:
db 'Hello, World', 10
message_end:
مانند کدهای ماشین، زبان اسمبلی بیشتر توسط مهندسان و برنامه نویسان سیستم استفاده می شود. برای نوشتن بخشهای وابسته به سختافزار هسته سیستمعامل که برای ویژگیهای پیادهسازی درایورهای دستگاههای جانبی مختلف از نظر زمان یا حیاتی هستند، استفاده میشود. اما اخیراً آنها کمتر و کمتر به آن متوسل می شوند ، زیرا استفاده از آن قابلیت حمل برنامه ها را به سایر سیستم عامل ها بسیار کاهش می دهد. گاهی اوقات آنها از فرآیند جداسازی استفاده می کنند - آنها یک لیست اسمبلی یک برنامه را از کدهای دیجیتال ایجاد می کنند تا منطق اجرای قطعات کوچک را تجزیه کنند. در موارد نادر، اگر کد اصلی سطح بالا در دسترس نباشد: تجزیه و تحلیل ویروس ها برای مبارزه با آنها یا از دست دادن کد منبع.
زبان اسمبلی نسل اول / دوم در نظر گرفته می شود (ما شبه کدها را قبل از ظهور اسمبلر و تفاوت آنها با دستورات نمادین به طور جداگانه در نظر نخواهیم گرفت). من می خواهم استفاده از اسمبلر را در صحنه نمایشی برجسته کنم: تلفیقی از هنر، ریاضیات و برنامه نویسی سطح پایین، تجسم ایده های هنری سازندگان آنها در قالب برنامه هایی که کلیپ های ویدیویی با محدودیت منابع تولید می کنند. اغلب حجم کل برنامه و فایل داده نباید از 256 بایت تجاوز کند (فرمت 4/64 کیلوبایت نیز محبوب است). در اینجا یک مثال از یک برنامه 4 کیلوبایتی آورده شده است:
زبان های گروه C/Fortran (سطح متوسط/بالا)
با توسعه قابلیتهای فناوری رایانه، میزان عملکرد و زمان اجرای کد در اسمبلر دیگر رضایتبخش نبود. هزینههای نوشتن، آزمایش و نگهداری برنامهها مرتبهای سریعتر از قابلیتهای آنها افزایش یافت. لازم بود که الزامات برنامه نویس از نظر دانش عملکرد تجهیزات کاهش یابد تا ابزاری به او داده شود که به او امکان می دهد به زبان های نزدیک به منطق انسانی بنویسد. به سطح جدیدی از انواع زبان های برنامه نویسی بروید. امکان تقسیم به ماژول های مختلف با فراخوانی متوالی بیشتر (پارادایم برنامه نویسی رویه ای)، ارائه انواع مختلف داده ها با قابلیت ساخت آنها و غیره را فراهم می کند. کار گروهی.
یکی از اولین زبان هایی که همه موارد فوق را پشتیبانی کرد ، Fortran بود که در دهه 50 قرن گذشته توسعه یافت . امکان ایجاد به صورت متنی با توضیح منطق اجرا با استفاده از حلقه ها، شاخه ها، زیر روال ها و عملکرد با آرایه ها و ارائه داده ها به صورت اعداد واقعی، صحیح و مختلط مهندسان و دانشمندان را به وجد آورد. در مدت کوتاهی «چارچوبها» و کتابخانههای علمی ایجاد شد. همه اینها نتیجه این واقعیت بود که فرترن هنوز هم امروز مرتبط است، هرچند در یک محیط علمی محدود، و در حال توسعه است، از آنجایی که توشه پیشرفت ها بسیار زیاد است، کتابخانه
IMSL به تنهایی از سال 1970 (!) فعالانه در حال توسعه است. بسیاری از نرم افزارهای مرتبط مشابه را می توانید به خاطر بسپارید؟ یکی دیگر از شاخه های توسعه زبان ها در این سطح
C است. اگر Fortran ابزاری برای دانشمندان شد، C برای کمک به برنامه نویسان در ایجاد نرم افزارهای کاربردی ایجاد شد: سیستم عامل ها، درایورها و غیره. این زبان به شما امکان می دهد تخصیص حافظه را به صورت دستی کنترل کنید و دسترسی مستقیم به منابع سخت افزاری را می دهد. برنامه نویسان C باید موجودیت های سطح پایین را کنترل کنند، بنابراین بسیاری بر این عقیده هستند که C یک زبان اسمبلی پیشرفته است و اغلب یک زبان "سطح متوسط" نامیده می شود. با وارد کردن تایپ داده به اسمبلر، عناصر برنامهنویسی رویهای و ماژولار، زبان C هنوز یکی از زبانهای اصلی برنامهنویسی سیستم است که با توسعه سریع میکروالکترونیک در سالهای اخیر نیز تسهیل شده است. انواع گجتها، کنترلکنندهها، شبکه و سایر دستگاهها به درایورها، اجرای پروتکلها برای همکاری و سایر نرمافزارهای نسبتاً سطح پایین برای اجرای تعامل با تجهیزات نیاز دارند. همه موارد فوق به تقاضا برای زبان امروز کمک می کند. اصول شی گرا و عملکردی بیشتر در قالب های C++، C#، جاوا توسعه یافتند، که مقدار زیادی از نحو C را گرفت
.
- ساده سازی فرآیند ایجاد کد: معرفی انواع، تقسیم به ماژول ها، کاهش لیست برنامه ها.
- Прозрачная логика заложенного алгоритма вследствие ухода от машинных codeов к более понятным для человека командам в семантически описательном стиле.
- Переносимость. Стало достаточно перекомпorровать текст программы для выполнения на другой платформе (возможно, с небольшой модификацией).
- Скорость откомпorрованных программ.
Минусы:
- Отсутствие автоматического управления памятью и необходимость постоянного её контроля.
- Отсутствие реализации концепций an objectно-ориентированного и функционального программирования.
Развитие языков высокого уровня
زبان های برنامه نویسی سطح بالا، از نظر ایجاد نرم افزار، به طور فزاینده ای شروع به دور شدن از کدهای ماشینی و پیاده سازی پارادایم های برنامه نویسی مختلف علاوه بر موارد رویه ای کرده اند. اینها همچنین شامل اجرای اصول شی گرا هستند. C++، جاوا، پایتون، جاوا اسکریپت، روبی ... - طیف وسیعی از زبان های این نوع امروزه محبوب ترین و مورد تقاضا هستند. آنها فرصت های بیشتری را برای پیاده سازی انواع نرم افزارها فراهم می کنند و نمی توان به وضوح "تخصص" هر یک از آنها را تعیین کرد. اما محبوبیت برنامه در زمینه های مربوطه به دلیل کتابخانه ها / چارچوب هایی برای کار با آنها است، به عنوان مثال:
JavaScript - Frontend. این زبان برای تعامل بین یک مرورگر وب مشتری و یک کاربر و یک سرور راه دور طراحی شده است. محبوب ترین کتابخانه ها Angular، React و VUE هستند. در حال حاضر، آن را به طور نسبتا فعال در وب و سرورهای دیگر (باطن)، Node.js به خصوص محبوب است.
روبی - باطن. برای ایجاد اسکریپت ها (فایل های سرویس) و روی سرورهای وب استفاده می شود. چارچوب اصلی Ruby On Rails است.
پایتون یک دامنه علمی و مهندسی (فراتر از دامنه وب) است. این یک جایگزین برای محاسبات استاندارد و بسته های ریاضی (Mathematica، Octave، MatLab...) است، اما دارای معناشناسی معمول زبان و تعداد زیادی کتابخانه است. در زمینه سیستم های یادگیری ماشینی، آمار و هوش مصنوعی طرفداران زیادی دارد. کتابخانه های پر استفاده شامل django، numpy، pandas و tensorflow هستند.
C++ – توسعه جهانی و تکاملی زبان C. قابلیت های برنامه نویسی کاربردی و شی گرا را بدون از دست دادن توانایی تعامل با سخت افزار سطح پایین ارائه می دهد. با توجه به این، بهره وری و انعطاف پذیری در هنگام ایجاد نرم افزار تحقق می یابد، اما قیمت نیز مطابقت دارد: یک مانع بالا برای ورود به دلیل مشخصات پیچیده زبان، نیاز به کنترل مستقل بر منابع در هنگام اجرای برنامه. بسیاری از نرم افزارهای تک کاربره و سیستمی با استفاده از آن نوشته می شوند: ماژول های سیستم عامل (ویندوز، سیمبین...)، بازی ها، ویرایشگرها (Adobe Photoshop، Autodesk Maya...)، پایگاه های داده (MSSQL، Oracle...)، پخش کننده ها ( WinAmp...) و غیره لازم به ذکر است که نرم افزار مدرن محصول پیچیده ای است که در توسعه آن از چندین زبان برنامه نویسی به طور همزمان استفاده می شود و تعیین میزان مشارکت هر یک از آنها در آن می تواند بسیار دشوار باشد. نتیجه کلی
پیشرفت بیشتر
اخیراً نوع دیگری از برنامه نویسی محبوبیت پیدا کرده است -
عملکردی (توسعه بیشتر سطح زبان) . در اینجا نوع دیگری از انتزاع برای محاسبات وجود دارد - توابعی که مجموعه ای از توابع را به عنوان آرگومان می گیرند و دیگری را برمی گرداند. نقش متغیرها توسط توابع یکسان ایفا می شود (متغیرهایی که برای ما آشنا هستند فقط عبارات ثابت هستند، شبیه به نهایی قبل از یک اعلان نوع در جاوا). خود تابع در محدوده خود بسته است ، نتیجه عملکرد آن فقط به آرگومان های ارسال شده بستگی دارد. دو ویژگی قابل توجه از این به دست می آید:
- برای آزمایش فقط به آرگومان های تابع نیاز داریم (نتیجه کار به متغیرهای خارجی و غیره بستگی ندارد).
- یک برنامه به سبک عملکردی به طور معجزه آسایی آماده همزمانی است: فراخوانی های تابع متوالی را می توان در رشته های مجاور صادر کرد (زیرا تحت تأثیر عوامل خارجی قرار نمی گیرند) و نیازی به قفل ندارند (یعنی هیچ مشکلی در همگام سازی وجود ندارد). با توجه به پذیرش گسترده پردازنده های چند هسته ای، انگیزه خوبی برای اختصاص زمان به این موضوع است.
با این حال، آستانه ورودی بالاتر از OOP است: برای کد مؤثر، لازم است یک برنامه ساخته شود، که الگوریتم اجرا را در قالب توابع توصیف کند. اما همچنین برای یک سبک عملکردی ناب، دانستن مبانی منطق و نظریه مقوله خوب است. محبوب ترین ها Haskell، Scala، F# هستند. اما نترسید، عناصر برنامه نویسی کاربردی در جاوا (و همچنین در سایر زبان های مدرن نسل سوم) ظاهر شده اند و می توان آنها را با OOP ترکیب کرد. در کارآموزی آنلاین JavaRush با جزئیات بیشتر با تمام این جزئیات آشنا خواهید شد. رشته
برنامه نویسی منطقی (سطح بعدی زبان ها) به دلیل تقاضای کم هنوز کاربرد عملی گسترده ای پیدا نکرده است. ساختن برنامه ها مستلزم دانش مبانی ریاضیات گسسته، منطق محمول، ابزارهای محدودیت و دیگر شاخه های منطق ریاضی است. محبوب ترین زبان فعال Prolog است.
نتیجه
در حال حاضر رایج ترین زبان ها OOP هستند. جاوا، از زمان پیدایش، همیشه در برترین، معمولاً در سه زبان برتر، محبوب بوده است. علاوه بر OOP، حاوی عناصر برنامه نویسی کاربردی است و شما می توانید سبک های مختلف نوشتن برنامه های خود را ترکیب کنید. طیف برنامه های کاربردی جاوا بسیار گسترده است - اینها وظایف تجاری، اجرای سرورهای وب (پشتیبان)، زبان اصلی برای ایجاد برنامه های اندروید، محیط های برنامه نویسی متقابل پلتفرم و مکان های کاری (IDE/AWM) و مدل سازی و موارد دیگر است. . موقعیت جاوا به ویژه در بخش Enterprise قوی است - حوزه ای از نرم افزارهای شرکتی که نیاز به کد با کیفیت و طولانی مدت و اجرای پیچیده ترین منطق تجاری دارد.
GO TO FULL VERSION