JavaRush /Java блогы /Random-KK /Бағдарламалау тілдерінің деңгейлері
Marat Sadykov
Деңгей

Бағдарламалау тілдерінің деңгейлері

Топта жарияланған

Кіріспе

Әртүрлі бағдарламалау тілдері қандай? Оларға қандай ұғымдар енген? Олар қалай дамыды? Бұл мақалада біз деңгейлер деп аталатын бағдарламалау тілдерінің түрлерін қарастырамыз - машина codeтарынан (төмен деңгей, компьютерлік жабдыққа жақын) Java немесе C# (жоғары деңгей) сияқты тілдерге дейін. Бағдарламаның мәтіндік тізімі нөлдер мен бірліктердің жиынына айналу жолында неғұрлым аз түрлендірулерге ұшыраса, соғұрлым деңгей төмен болады.
Бағдарламалау тілдерінің деңгейлері – 1
Бұдан әрі қараймыз:
  1. Төмен деңгейлі тілдер (машина codeтары және құрастыру)
  2. Орта деңгей (C, Fortran….)
  3. Жоғары деңгей (C++, Java, Python, Ruby, JavaScript...)
Деңгей сондай-ақ іске асыруды жүзеге асыру үшін болашақ бағдарламаның тізбесі қаншалықты егжей-тегжейлі болуы керек екенін сипаттайды. Бұл процесс адамдар үшін қаншалықты қарапайым? Тілдің деңгейін оның мүмкіндіктерінің бір мәнді көрсеткіші деп қарауға болмайды. Бағдарламалау тілі – бір салада тиімді, ал басқаларында пайдасы аз құрал. Ағашпен ағаш ұстасы да, ұста да жұмыс істейді. Біріншісінде негізгі құрал – қашау жинағы, екіншісінде – балта бар. Дегенмен, ағаш ұстасы оюланған шкафты әдемірек етеді, ал ағаш ұстасы үйді тезірек салады. Әрқайсысы бірінің жұмысын орындауға қабілетті болғанымен, олар мұны әлдеқайда тиімді емес етеді. Компьютердегі әртүрлі деректер нөлдер мен бірліктердің жиындары түрінде берілген. Оны өңдеуге арналған басқару командалары қажетті ақпараттың орнын және өзгерту әдісін анықтайтын нұсқауларды қамтитын бірдей деректер болып табылады.

Машина тілдері (ең төменгі деңгей)

Бағдарламалық құрал аймағынан Аппараттық құрал аймағына қысқаша баруымыз керек. Оны жеңілдетілген түрде қарастырайық. Процессор – компьютердің негізгі «миы». Ол орнатылған аналық платада шиналар (байланыс үшін деректер арналары) арқылы басқа құрылғылармен әрекеттесу үшін пайдаланылатын контроллерлер бар.
Бағдарламалау тілдерінің деңгейлері – 2
Кейбіреулері жоғары жылдамдықта жұмыс істейді (қызыл көрсеткілер): процессор жадтан пәрмендер алады және деректерді өңдейді, видеокарта, әсіресе 3D ойындарында, монитор экранында кескін құру үшін үлкен көлемдегі текстураларды, пішіндерді, пиксель координаттарын және басқа нысандарды тұтынады. . Басқаларына (ақпарат алмасу жылдамдығының шектеулеріне байланысты) мұндай жоғары көрсеткіштер қажет емес. Әртүрлі ішкі және сыртқы құрылғылар диаграммада жасыл көрсеткілермен қосылған.

Процессордың ішкі әлемі

Барлық процессор командалары екілік формада орындау үшін жадтан келеді. Нұсқаулардың пішімі, саны, ішкі жиыны оның архитектурасына байланысты. Олардың көпшілігі бір-бірімен үйлеспейді, әртүрлі идеологияны ұстанады. Сондай-ақ пәрмен түрі процессор жұмыс істейтін режимге (8/16/32... бит тереңдігі) және деректер көзіне (жад, регистр, стек...) қатты байланысты. Бірдей әрекетті әртүрлі нұсқаулармен көрсетуге болады. Процессорда екі операндты қосу (ADD X,Y) және көрсетілгенге біреуін қосу (INC X) нұсқаулары бар. Операндқа үш есе қосуды ADD X,3 ретінде немесе INC X-ті үш рет шақыру арқылы жасауға болады.Және әртүрлі процессорлар үшін бұл әдістердің қайсысы жылдамдық немесе жад көлемі бойынша оңтайлы болатынын болжау мүмкін емес. Ыңғайлы болу үшін екілік ақпарат он алтылық түрде жазылады. Таныс бағдарламаның бір бөлігін қарастырайық (синтаксисі Java тіліне ұқсас Си тілі)
int func() {
    int i = getData("7") ;
    return ++i;
   ...
}
Процессорға арналған нұсқаулар тізбегі түріндегі бірдей әрекеттерді жүзеге асыратын code: ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... Intel процессорының төменгі деңгейлі бағдарламалау тілі шын мәнінде осылай көрінеді. Аргументі бар әдісті шақыратын және нәтижені біреуіне көбейтіп қайтаратын фрагмент. Бұл процессорға орындау үшін трансформациясыз тікелей берілетін машина тілі (code). Артықшылықтары:
  • Біз жағдайды толығымен меңгереміз, бізде процессор мен компьютерлік жабдықты пайдаланудың ең кең мүмкіндіктері бар.
  • Кодты ұйымдастыру және оңтайландырудың барлық нұсқалары бізге қолжетімді.
Минустары:
  • Процессорлардың жұмыс істеуі туралы кең білімге ие болу және codeты орындау кезінде көптеген аппараттық факторларды ескеру қажет.
  • Келтірілген мысалдан сәл күрделірек бағдарламалар жасау codeты жазуға және оны жөндеуге кететін уақыттың күрт артуына әкеледі.
  • Платформаға тәуелділік: бір процессор үшін жасалған бағдарлама әдетте басқаларында жұмыс істемейді. Бұл процессор үшін оның жұмысының басқа режимдерінде codeты өңдеу қажет болуы мүмкін.
Машиналық codeтар компьютерлер пайда болған кезде кеңінен қолданылды, компьютерлік пионерлер дәуірінде бағдарламалаудың басқа әдістері болған жоқ. Қазіргі уақытта оларды микроэлектроника саласындағы инженерлер процессорларды әзірлеу немесе төмен деңгейде сынау кезінде кейде пайдаланады.

Ассемблер тілі (төмен деңгей)

Компьютерден айырмашылығы, сіз және мен ақпаратты сандық түрде емес, мәтіндік/семантикалық түрде жақсы қабылдаймыз. Смартфоныңызда елу контактінің атын оңай атай аласыз, бірақ олардың сәйкес телефон нөмірлерін жатқа жазуыңыз екіталай. Бағдарламалауда да солай. Біз үш негізгі қадамды орындау арқылы баспалдақпен жоғары көтерілеміз:
  • Бір символдық нұсқауды сәйкес әрекеттерді орындайтын цифрлық процессор командаларының топтарына байланыстырайық.
  • Процессор нұсқауларының аргументтерін бөлек бөліп көрсетейік.
  • Жад аймақтарын, айнымалыларды және жеке командалардың орнын атау мүмкіндігімен таныстырайық.
Машиналық codeтағы (орталық) және ассемблер тіліндегі (оң жақта) алдыңғы программаның фрагменттерін салыстырайық:
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
Көріп отырғаныңыздай, бағдарламаны жазу процесі жеңілдетілген: сандық команда мәндерін генерациялау, өту ұзақтығын есептеу, оның ұяшықтары бойынша жадтағы деректерді тарату және басқа процессор мүмкіндіктері үшін анықтамалық кітаптарды пайдаланудың қажеті жоқ. Символдық командалар жиынынан және орындалу логикасына қажетті аргументтерден қажетті әрекетті сипаттаймыз, содан кейін транслятор бағдарламасы мәтіндік файлды процессорға түсінікті нөлдер мен бірліктердің жиынына аударады. Артықшылықтары:
  • Кодты жазу және өзгерту процесі жеңілдетілді.
  • Барлық аппараттық ресурстарға бақылау жүргізілді.
  • Бағдарламаны басқа платформаларға тасымалдау оңайырақ, бірақ олар аппараттық құралдардың үйлесімділігіне байланысты өзгертуді қажет етеді.
Минустары:
  • Ассемблер тілі – төменгі деңгейлі программалау тілі. Кодтың тіпті шағын бөлімдерін жасау қиын. Сонымен қатар, жабдықтың нақты жұмысын ескеру қажет.
  • Платформаға тәуелділік.
Ең танымал Java демонстрациялық мысалы:
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:
Машина codeтары сияқты ассемблер тілін инженерлер мен жүйелік бағдарламашылар жиі пайдаланады. Ол әртүрлі перифериялық құрылғыларға арналған драйверлерді іске асыру мүмкіндіктері үшін уақыт бойынша маңызды немесе маңызды болып табылатын операциялық жүйе ядросының аппараттық құралдарға тәуелді бөліктерін жазу үшін қолданылады. Бірақ соңғы уақытта олар оған азырақ жүгінеді, өйткені оны пайдалану бағдарламалардың басқа платформаларға тасымалдануын айтарлықтай төмендетеді. Кейде олар бөлшектеу процесін пайдаланады - олар шағын фрагменттерді орындау логикасын талдау үшін цифрлық codeтардан бағдарламаның құрастыру тізімін жасайды. Сирек жағдайларда, егер бастапқы жоғары деңгейлі code қол жетімді болмаса: олармен күресу үшін вирустарды талдау немесе бастапқы codeты жоғалту. Ассемблер тілі бірінші/екінші буын болып саналады (біз ассемблер пайда болғанға дейінгі псевдоcodeтарды және олардың символдық командалардан айырмашылығын бөлек қарастырмаймыз). Мен Demo Scene-де ассемблерді пайдалануды ерекше атап өткім келеді: өнер, математика және төмен деңгейлі codeтау біріктіру, олардың жасаушыларының көркем идеяларын ресурс шектеулері бар бейнеклиптерді жасайтын бағдарламалар түрінде бейнелейді. Көбінесе бағдарлама мен деректер файлының жалпы көлемі 256 byteтан аспауы керек (4/64 килоbyte пішімі де танымал). Мұнда 4 КБ бағдарламаның мысалы берілген:

С тобы/Фортран тілдері (орта/жоғары деңгей)

Есептеуіш техниканың мүмкіндіктерінің дамуымен ассемблерде codeты іске асырудың функционалдық көлемі мен мерзімдері қанағаттанарлық емес болды. Бағдарламаларды жазу, тестілеу және қолдау шығындары олардың мүмкіндіктерінен жылдамырақ өсті. Бағдарламалаушыдан жабдықтың жұмыс істеуін білуге ​​қойылатын талаптарды азайту, оған адам логикасына жақын тілдерде жазуға мүмкіндік беретін құрал беру қажет болды. Бағдарламалау тілі түрлерінің жаңа деңгейіне өту. Әрі қарай дәйекті шақыру арқылы әртүрлі модульдерге бөлу мүмкіндігін қамтамасыз ету (proceduresалық бағдарламалау парадигмасы), оларды құру мүмкіндігімен деректердің әртүрлі түрлерін қамтамасыз ету және т.б.. Сонымен қатар, бұл шаралар codeтың басқа платформаларға тасымалдануын жақсартты, ыңғайлырақ ұйымдастыруды қамтамасыз етті. командалық жұмыс. Жоғарыда айтылғандардың барлығын қолдайтын алғашқы тілдердің бірі өткен ғасырдың 50-жылдарында жасалған Фортран тілі болды . Циклдерді, тармақтарды, ішкі бағдарламаларды және массивтермен жұмыс істеу және деректерді нақты, бүтін және күрделі сандар түрінде ұсыну арқылы орындау логикасын сипаттайтын мәтіндік формада құру мүмкіндігі инженерлер мен ғалымдарды қуантты. Қысқа уақыт ішінде ғылыми «құралдар» мен кітапханалар құрылды. Мұның бәрі Фортранның тар ғылыми ортада болса да, бүгінгі күнге дейін өзекті болуының және дамып келе жатқанының салдары болды, өйткені әзірлемелердің багажы өте үлкен, тек IMSL кітапханасы 1970 жылдан бері белсенді дамып келеді (!), Осыған ұқсас көптеген бағдарламалық жасақтаманы есте сақтай аласыз ба? - ескі адамдар? Бұл деңгейдегі тілдерді дамытудың тағы бір саласы – С. Егер Fortran ғалымдарға арналған құрал болса, онда Си бағдарламашыларға қолданбалы бағдарламалық қамтамасыз етуді: операциялық жүйелерді, драйверлерді және т.б. құруға көмектесу үшін жасалды. Тіл жадтың бөлінуін қолмен басқаруға мүмкіндік береді және аппараттық ресурстарға тікелей қол жеткізуге мүмкіндік береді. Си программалаушылары төмен деңгейлі нысандарды басқаруы керек, сондықтан көбі Си тілі жетілдірілген ассемблер тілі және оны көбінесе «орта деңгей» тілі деп атайды деп санайды. Ассемблерге деректерді теруді, proceduresалық және модульдік бағдарламалау элементтерін енгізе отырып, Си тілі әлі де жүйелік бағдарламалаудың негізгі тілдерінің бірі болып табылады, оған соңғы жылдардағы микроэлектрониканың қарқынды дамуы да ықпал етті. Гаджеттердің, контроллерлердің, желілік және басқа құрылғылардың барлық түрлеріне драйверлер, ынтымақтастық хаттамаларын енгізу және жабдықпен өзара әрекеттесуді жүзеге асыру үшін басқа салыстырмалы түрде төмен деңгейлі бағдарламалық қамтамасыз ету қажет. Жоғарыда айтылғандардың барлығы бүгінгі тілге деген сұраныстың артуына ықпал етеді. Объектілі-бағытталған және функционалдық принциптері Си синтаксисінен көп нәрсені ала отырып, C++, C#, Java түрінде одан әрі дамытылды .
  • Код құру процесін жеңілдету: типтерді енгізу, модульдерге бөлу, бағдарламалар тізімдерін қысқарту.
  • Прозрачная логика заложенного алгоритма вследствие ухода от машинных codeов к более понятным для человека командам в семантически описательном стиле.
  • Переносимость. Стало достаточно перекомпorровать текст программы для выполнения на другой платформе (возможно, с небольшой модификацией).
  • Скорость откомпorрованных программ.
Минусы:
  • Отсутствие автоматического управления памятью и необходимость постоянного её контроля.
  • Отсутствие реализации концепций an objectно-ориентированного и функционального программирования.

Развитие языков высокого уровня

Жоғары деңгейлі программалау тілдері бағдарламалық жасақтаманы жасау тұрғысынан машиналық codeтардан алшақтап, proceduresалық тілмен қатар әртүрлі программалау парадигмаларын жүзеге асыра бастады. Бұларға an objectіге бағытталған принциптерді жүзеге асыру да жатады. C++, Java, Python, JavaScript, Ruby... - осы типтегі тілдер ауқымы бүгінгі таңда ең танымал және сұранысқа ие. Олар әртүрлі бағдарламалық қамтамасыз етуді енгізуге көбірек мүмкіндіктер береді және олардың әрқайсысының «мамандығын» нақты анықтау мүмкін емес. Бірақ тиісті салаларда қолданбаның танымалдылығы олармен жұмыс істеуге арналған кітапханалар/фремворктармен байланысты, мысалы: JavaScript - Frontend. Тіл клиенттік веб-шолғыш пен пайдаланушы мен қашықтағы server арасындағы өзара әрекеттесу үшін жасалған. Ең танымал кітапханалар - Angular, React және VUE. Қазіргі уақытта ол веб және басқа serverлерде (backend) салыстырмалы түрде белсенді қолданылады, Node.js әсіресе танымал. Ruby - Backend. Ол сценарийлерді (қызметтік файлдар) және веб-serverлерде жасау үшін қолданылады. Негізгі фреймворк - Ruby On Rails. Python – ғылыми және инженерлік домен (веб-доменнен басқа). Бұл стандартты есептеу және математикалық пакеттерге (Mathematica, Octave, MatLab...) балама болып табылады, бірақ тілдің әдеттегі семантикасына және көптеген кітапханаларға ие. Машиналық оқыту жүйелері, статистика және жасанды интеллект саласында көптеген жанкүйерлері бар. Жиі қолданылатын кітапханаларға джанго, нумпи, пандалар және тензорфлоу кіреді. C++ – Си тілінің әмбебап, эволюциялық дамуы.Төмен деңгейлі аппараттық құралдармен өзара әрекеттесу мүмкіндігін жоғалтпай, функционалдық және an objectіге бағытталған бағдарламалау мүмкіндіктерін береді. Осыған байланысты бағдарламалық қамтамасыз етуді құру кезінде өнімділік пен икемділік жүзеге асырылады, бірақ бағасы да сәйкес келеді: тілдің күрделі спецификациясына байланысты кіруге жоғары кедергі, бағдарламаны орындау кезінде ресурстарды тәуелсіз бақылау қажеттілігі. Оның көмегімен көптеген бір пайдаланушыға арналған және жүйелік бағдарламалық қамтамасыз ету жазылады: операциялық жүйе модульдері (Windows, Symbian...), ойындар, редакторлар (Adobe Photoshop, Autodesk Maya...), мәліметтер базасы (MSSQL, Oracle...), ойнатқыштар ( WinAmp...) және т.б. Айта кету керек, заманауи бағдарламалық қамтамасыз ету күрделі өнім болып табылады, оны әзірлеу кезінде бірден бірнеше бағдарламалау тілдері қолданылады және олардың әрқайсысының қатысу дәрежесін анықтау өте қиын болуы мүмкін. жалпы нәтиже.

Әрі қарай прогресс

Соңғы уақытта бағдарламалаудың тағы бір түрі танымал бола бастады - функционалдық (тіл деңгейін одан әрі дамыту) . Міне, есептеулер үшін абстракцияның тағы бір түрі – функциялар жиынын аргумент ретінде қабылдайтын және басқасын қайтаратын функциялар. Айнымалылардың рөлін бірдей функциялар атқарады (бізге таныс айнымалылар Java тіліндегі түрді жариялау алдындағы соңғыға ұқсас жай ғана тұрақты өрнектер). Функцияның өзі өз ауқымында жабық, оның жұмысының нәтижесі тек берілген аргументтерге байланысты. Осыдан екі керемет қасиет шығады:
  • Тестілеу үшін бізге тек функция аргументтері қажет (жұмыс нәтижесі сыртқы айнымалыларға тәуелді емес және т.б.).
  • Функционалды стильдегі бағдарлама керемет түрде параллельділікке дайын: жүйелі функция шақырулары көрші ағындарда шығарылуы мүмкін (өйткені оларға сыртқы факторлар әсер етпейді) және құлыптауды қажет етпейді (яғни, синхрондау проблемалары жоқ). Көп ядролы процессорларды кеңінен қолдануды ескере отырып, осы тақырыпқа уақыт бөлуге жақсы ынталандыру.
Дегенмен, кіру шегі OOP-ке қарағанда жоғары: тиімді code үшін функциялар түріндегі орындау алгоритмін сипаттайтын бағдарламаны құру қажет. Сонымен қатар таза функционалды стиль үшін логика мен категория теориясының негіздерін білу жақсы болар еді. Ең танымалдары - Haskell, Scala, F#. Бірақ қорықпаңыз, функционалдық бағдарламалау элементтері Java-да (сонымен қатар басқа заманауи үшінші буын тілдерінде) пайда болды және оларды OOP-пен біріктіруге болады. Сіз JavaRush онлайн тағылымдамасында осы мәліметтердің барлығын толығырақ біле аласыз. Логикалық бағдарламалау саласы (тілдердің келесі деңгейі) сұраныстың төмен болуына байланысты әлі де кең практикалық қолдануды таба алған жоқ. Бағдарламаларды құру дискретті математика негіздерін, предикат логикасын, шектеу құралдарын және математикалық логиканың басқа салаларын білуді талап етеді. Ең танымал белсенді тіл - Prolog.

Қорытынды

Қазіргі уақытта ең көп таралған тілдер - OOP. Java өзінің құрылған күнінен бастап әрқашан бірінші орында, әдетте ең танымал үш тілде болды. OOP-тан басқа, ол функционалдық бағдарламалау элементтерін қамтиды және сіз өз бағдарламаларыңызды жазудың әртүрлі стильдерін біріктіре аласыз. Java қолданбаларының ауқымы өте кең - бұл бизнес тапсырмалары, веб-serverлерді жүзеге асыру (бэкенд), Android қосымшаларын құрудың негізгі тілі, кросс-платформалық бағдарламалау орталары мен жұмыс орындары (IDE/AWM) және модельдеу және т.б. . Java позициясы әсіресе Кәсіпорын секторында күшті - жоғары сапалы және ұзақ мерзімді codeты және ең күрделі бизнес логикасын жүзеге асыруды талап ететін корпоративтік бағдарламалық қамтамасыз ету саласы.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION