JavaRush /Java блогу /Random-KY /Программалоо тилдеринин деңгээли
Marat Sadykov
Деңгээл

Программалоо тилдеринин деңгээли

Группада жарыяланган

Киришүү

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

Машина тилдери (Эң төмөнкү деңгээл)

Биз программалык камсыздоо аймагынан Аппараттык камсыздоо аймагына кыска сапар жасашыбыз керек. Келгиле, жөнөкөйлөтүлгөн түрдө карап көрөлү. Процессор компьютердин негизги "мээси" болуп саналат. Ал орнотулган энелик платада автобустар (байланыш үчүн маалымат каналдары) аркылуу башка түзүлүштөр менен иштешүү үчүн колдонулган контроллерлор бар.
Уровни языков программирования - 2
Кээ бирлери жогорку ылдамдыкта иштешет (кызыл жебелер): процессор эстутумдан буйруктарды чыгарып, маалыматтарды манипуляциялайт, видеокарта, өзгөчө 3D оюндарында, монитор экранында сүрөт түзүү үчүн чоң көлөмдөгү текстураларды, формаларды, пикселдик координаттарды жана башка an objectтерди керектейт. . Башкаларга (маалымат алмашуу ылдамдыгынын чектелүүсүнөн) мындай жогорку көрсөткүчтөрдүн кереги жок. Ар кандай ички жана тышкы түзүлүштөр жашыл жебелер менен диаграммада туташтырылган.

Процессордун ички дүйнөсү

Процессордун бардык буйруктары экorк формада аткаруу үчүн эстутумдан келет. Инструкциялардын форматы, саны, топтому анын архитектурасына жараша болот. Алардын көбү бири-бирине туура келбей, ар кандай идеологияны карманышат. Ошондой эле буйруктун түрү процессор иштеген режимге (8/16/32... бит тереңдиги) жана маалымат булагына (эс тутум, регистр, стек...) көз каранды. Ошол эле аракет ар кандай көрсөтмөлөр менен көрсөтүлүшү мүмкүн. Процессордо эки операндды кошуу (ADD X,Y) жана көрсөтүлгөнгө бирди кошуу (INC X) боюнча көрсөтмөлөр бар. Операндка үч эселикти кошуу ADD X,3 катары жасалышы мүмкүн же INC X үч жолу чалуу менен жасалышы мүмкүн.Ал эми ар кандай процессорлор үчүн бул ыкмалардын кайсынысы ылдамдык же эс тутумдун изи боюнча оптималдуу болоорун алдын ала айтуу мүмкүн эмес. Ыңгайлуулук үчүн бинардык маалымат он алтылык формада жазылган. Келгиле, тааныш программанын бир бөлүгүн карап көрөлү (С тor, синтаксиси Java тorне окшош)
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 процессорунун төмөнкү деңгээлдеги программалоо тor чындыгында ушундай көрүнөт. Аргумент менен методду чакырып, натыйжаны бирге көбөйткөн фрагмент. Бул процессорго аткаруу үчүн трансформациясыз түздөн-түз берилүүчү машина тor (code). Артыкчылыктары:
  • Биз кырдаалды толугу менен өздөштүрүүбүз, процессорду жана компьютердик жабдыктарды колдонуу үчүн бизде эң кеңири мүмкүнчүлүктөр бар.
  • Кодду уюштуруунун жана оптималдаштыруунун бардык варианттары биз үчүн жеткorктүү.
Минустары:
  • Процессорлордун иштеши боюнча кеңири бorмге ээ болуу жана codeду аткарууда көп сандагы аппараттык факторлорду эске алуу зарыл.
  • Берилген мисалга караганда бир аз татаалыраак программаларды түзүү code жазууга жана аны оңдоого кеткен убакыттын кескин көбөйүшүнө алып келет.
  • Платформанын көз карандылыгы: бир процессор үчүн түзүлгөн программа көбүнчө башкаларда иштебейт. Бул процессор үчүн анын иштөөсүнүн башка режимдеринде codeду оңдоо талап кылынышы мүмкүн.
Машина codeдору компьютерлердин жаралышында кеңири колдонулган, компьютердик пионерлердин доорунда программалоонун башка ыкмалары болгон эмес. Учурда алар микроэлектроника тармагындагы инженерлер тарабынан процессорлорду иштеп чыгууда же төмөн деңгээлдеги тестирлөөдө кээде колдонулат.

Ассамблея тor (төмөнкү деңгээл)

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

Группа С/Фортран тилдери (орто/жогорку деңгээл)

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

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

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

Мындан ары прогресс

Акыркы убакта программалоонун дагы бир түрү популярдуу болууда - функционалдык (тил деңгээлин андан ары өнүктүрүү) . Бул жерде эсептөөлөр үчүн абстракциянын дагы бир түрү - функциялардын жыйындысын аргумент катары кабыл алып, башкасын кайтаруучу функциялар. Өзгөрмөлөрдүн ролун ошол эле функциялар ойнойт (бизге тааныш болгон өзгөрмөлөр Java тorндеги тип жарыялоонун алдындагы акыркыга окшош, жөн гана туруктуу туюнтмалар). Функциянын өзү өз чөйрөсүндө жабык, анын ишинин натыйжасы берилген аргументтерге гана көз каранды. Мындан эки кереметтүү касиет келип чыгат:
  • Сыноо үчүн бизге функциянын аргументтери гана керек (иштин натыйжасы тышкы өзгөрмөлөргө көз каранды эмес, ж.б.).
  • Функционалдык стилдеги программа кереметтүү түрдө параллелдүүлүккө даяр: ырааттуу функция чалуулары кошуна жиптерде берorши мүмкүн (анткени аларга тышкы факторлор таасир этпейт) жана кулпуларды талап кылbyte (башкача айтканда, синхрондоштуруу көйгөйлөрү жок). Көп ядролуу процессорлордун кеңири жайылышын эске алганда, бул темага убакыт бөлүүгө жакшы түрткү.
Бирок, кирүү босогосу OOPге караганда жогору: эффективдүү code үчүн функциялар түрүндө аткаруу алгоритмин сүрөттөгөн программаны түзүү керек. Бирок таза функционалдуу стил үчүн логиканын жана категория теориясынын негиздерин билүү жакшы болмок. Эң популярдуусу - Haskell, Scala, F#. Бирок коркпоңуз, функционалдык программалоонун элементтери Java-да (ошондой эле башка заманбап үчүнчү муундагы тилдерде) пайда болгон жана аларды OOP менен айкалыштырууга болот. Сиз JavaRush онлайн стажировкасында бул майда-чүйдөсүнө чейин биле аласыз. Логикалык программалоо чөйрөсү (тилдердин кийинки деңгээли) суроо-талаптын аздыгынан кеңири практикалык колдонууну таба элек. Программаларды түзүү дискреттик математиканын негиздерин, предикаттык логиканы, чектөө куралдарын жана математикалык логиканын башка тармактарын билүүнү талап кылат. Эң популярдуу активдүү тил Prolog.

Корутунду

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