Класифікація мов програмування за рівнями

Класифікація мов програмування за рівнями

Мови програмування - це системи символів і правил їх поєднання, призначені для взаємодії людини зі складними машинами. Існують сотні таких організованих систем, що виконують різні функції. Щоб зорієнтуватися в цьому різноманітті, фахівці створюють загальні класифікації мов програмування, засновані на тій чи іншій характерній ознаці.

Взаємодія людини і машини

Важливо зрозуміти, як відбувається спілкування людей з розумними механізмами, перш ніж переходити до класифікації мов програмування.


Одного разу чоловік подумав, що машина може виконувати фізичну роботу за нього. Так з 'явився паровий двигун. Потім заповзятлива людина вирішила перекласти на машину ще й роботу розумову. Так з 'явилися ЕВМ.

Щоб досягти якогось результату, необхідно розуміти, як це зробити. У програмуванні можна виділити кілька етапів вирішення будь-якого завдання:

  1. Формалізований логічний опис самого завдання.
  2. Побудова алгоритму, що описує всі кроки досягнення мети, починаючи від обробки вхідних даних і закінчуючи отриманням результату.
  3. Кодування - складання програми на будь-якій з мов програмування, яку потім можна буде перекласти на зрозумілу для комп 'ютера мову.
  4. Трансляція - безпосередній переклад.
  5. Збирання програми (виконуваного додатка) з усіх складених частин.

Це ієрархічна структура, в якій вищі рівні базуються на нижчих. Без чіткого завдання та грамотного опрацювання алгоритму неможливо створити якісну програму.

Структура мов програмування

Пристрій всіх систем взаємодії схожий і багато в чому визначає класифікацію мов програмування.

Основні об 'єкти мови програмування постійні і нагадують компоненти людських мовних систем:

  • синтаксис, що визначає формальні правила запису програми, допустимі види і регістр символів;
  • лексика, що включає весь словниковий запас мови: імена змінних і функцій, константи, рядки, оператори;
  • граматика, що вказує, як правильно поєднувати одиниці мови для утворення словосполучень і речень.

Лексика і граматика разом визначають семантику мови. На цьому рівні конкретні послідовності знаків набувають особливого сенсу, зрозумілого людині та комп 'ютеру. Наприклад, слово while у багатьох системах програмування трактується як початок циклічної операції.


Звичайно, комп 'ютери не розуміють звичайних слів, саме по собі поєднання латинських букв нічого для них не означає. Машини мають справу з машинним кодом - нулями і одиницями, що описують примітивні стану наявності або відсутності сигналу. Тому мови програмування встановлюють чіткі відповідності певних слів і послідовностей нативних машинних команд.

Перші примітивні системи управління машинами - перфокарти - використовувалися для ткацьких верстатів Жаккарда, які переносили на шовк візерунок будь-якої складності. Таким же способом програмувалися самограючі піаніно.

Існують сотні систем програмування, і щороку з 'являються нові. Деякі з них принципово відрізняються один від одного, інші дуже схожі і мають лише дрібні особливості. Кожна призначена для вирішення своєї задачі, широкої або вузькоспеціалізованої.

Огляд класифікацій

Мови програмування можуть бути згруповані за десятками різних ознак. Вони є принципово важливими або мають прикладне значення.

Спостерігається сильна залежність класифікації мов програмування від історії розвитку. З роками технології ускладнювалися і кардинально змінювалися, на перший план виходила зручність програміста, з 'являлися ефективні алгоритми, складні команди і нові рівні абстракції.

Основні класифікації мов програмування за видами та механізмом роботи базуються на таких параметрах:

  • Особливості лексики та граматики в сукупності з рівнем абстракції та ступенем зручності для людини.
  • Базова концепція та методологія складання алгоритмів.
  • Спосіб представлення даних.
  • Організація процесу взаємодії з машиною, механізм виконання програм.
  • Область життя, в якій застосовується мова.
  • Історична епоха, в яку мовна система була сформована.

Скласти чітку класифікацію мов і систем програмування не можна, але можливо розділити і систематизувати їх за принципово важливими ознаками.


Зручність для людини

Інструкції, написані машинною мовою, зрозумілі комп 'ютеру, але вкрай незручні для людини. У них важко розібратися, їх практично неможливо швидко змінити або скласти з їх допомогою складний алгоритм. Для підвищення ефективності програмісти піднялися на нові рівні абстракції і навчили машину приймати більш людинорозумні інструкції і самостійно переводити їх у машинний код. Розглянемо класифікацію та особливості мов програмування різного рівня:

  • Машинний код. Це теж мова програмування, якою при належній підготовці можна написати інструкцію.
  • Низький рівень. По-справжньому низькорівневими є мови асемблера, які використовують нативні машинні команди, закодовані за допомогою мнемонічних кодів.
  • Середній рівень. Системи програмування цієї групи можуть вважатися низько- і високорівневими, залежно від конкретних уявлень про ступінь абстракції. Сюди можна віднести C і C++.
  • Високий рівень. Ці мови дозволяють створювати складні алгоритми, але потребують додаткової обробки перед виконанням, тому згенерований ними код менш ефективний і виконується повільніше.
  • Надвисокий рівень. Ця нечисленна група характеризується появою надпотужних команд і операторів. Сюди можна віднести Алгол-68.

Особливістю мов низького рівня є їх машинозалежність. Вони тісно прив 'язані до особливостей організації конкретного типу ЕВМ, але в цілому схожі один на одного. Вони забезпечують:

  • високу швидкість виконання і максимальну компактність створюваних програм;
  • пряма взаємодія з апаратними ресурсами;
  • повний контроль над пам 'яттю.

Основні недоліки низькорівневих мов:

  • для кожного типу ЕВМ необхідно використовувати певну систему команд, залежну від особливостей функціонування машини;
  • складність і низька швидкість процесу програмування;
  • висока ймовірність появи помилок, які складно відстежити;
  • відсутність мобільності програм, неможливість запустити їх на ЕВМ іншого типу.

Високорівневі системи програмування не прив 'язані до певної машинної системи команд і можуть виконуватися на будь-якому комп' ютері. Завдяки високому рівню абстракції вони можуть собі дозволити використовувати різні концепції та методології у складанні інструкцій. Тому класифікація мов програмування високого рівня дуже велика і складна.

Обробка програми машиною

Щоб виконати складну інструкцію, комп 'ютер насамперед повинен знизити її абстрактність і перевести на зрозумілу для себе мову. Спосіб, яким це робиться, називається моделлю виконання. Виділяють дві основні моделі і одну гібридну:


  • Компіляція - одноразове переведення всієї програми в машинний код.
  • Інтерпретація - послідовне виконання кожного виразу.
  • Транскомпіляція - переклад мовою нижчого рівня, наприклад C або асемблер, і його подальша компіляція.

Для перекладу необхідна спеціальна програма-транслятор - компілятор або інтерпретатор, без якої робота з мовою неможлива.

Інтерпретатор працює з кожним рядком програми окремо, аналізуючи його і відразу ж виконуючи. Його присутність необхідна від початку і до самого кінця роботи програми.

Основні недоліки інтерпретаційної моделі:

  • постійне перебування транслятора в пам 'яті ЕВМ;
  • повторна обробка повторюваних команд.

Незважаючи на це, інтерпретовані мови дуже зручні для циклічної розробки і зневадження, оскільки дозволяють швидко вносити зміни в програму.

Компілятор же працює тільки один раз, відразу перетворюючи всю інструкцію в зрозумілий для комп 'ютера вид - машинний код або якийсь проміжний байт-код, а потім залишає пам' ять ЕВМ. Тут виконання відокремлено від процесу трансляції, що є більш ефективною моделлю.


Основні недоліки компіляційної моделі:

  • велика складність.

Перш ніж перевести програму на зрозумілу машину мову, транслятор багато разів проходить за вихідною інструкцією, аналізуючи і перевіряючи її.

Чіткого розмежування систем не існує, оскільки традиційно інтерпретовані мови можуть бути скомпільовані і навпаки.

Класифікація мов програмування високого рівня за моделлю виконання:

  • Інтерпретовані - Python, Haskell, PHP, JavaScript.
  • Компільовані відразу в машинний код: C, C++, Fortran, ASM.
  • Компільовані в байт-код: Python, Java.
  • Транскомпільовані: Haskell, Fortran, C, C++.

Обробка даних

Будь-яка мова програмування працює з інформацією, якою потрібно якимось чином маніпулювати, перевіряти на коректність, змінювати. Дані можуть бути найрізноманітнішими - числами, рядками або складними структурами. Зрозуміло, з кожним типом необхідно працювати по-різному, але щоб визначити, як саме, спочатку необхідно зрозуміти, з якими саме даними ЕВМ має справу.


На основі методу визначення різновиду даних побудована класифікація мов програмування за системою типів.

  • Нетипізовані мови.
  • Типізовані мови різного ступеня суворості.

Нетипізованими є мови асемблера, які здатні обробляти безпосередньо двійкові дані. Тип даних при цьому не має ніякого значення.

Для типізованих мов важливо, з яким різновидом даних вони працюють. Деякі дії визначено тільки для чисел, наприклад ділення, інші - тільки для рядків. При цьому деякі системи дозволяють програмісту певні вольності. Наприклад, вони можуть самостійно визначати і "неявно" "конвертувати один тип даних в інший, виходячи з семантики команди. Це дуже зручно, але ускладнює налагодження, оскільки може призвести до непомітної помилки. Яскравим прикладом нестрогої типізації є JavaScript.

Строго типізовані мови, наприклад, Java, такої свободи не допускають і вимагають зазначення типів та їх явної конверсії, якщо вона необхідна.

Існує також класифікація мов програмування високого рівня за часом перевірки типів даних:

  • статичні мови зазвичай є компільованими. Перевірка типів відбувається при аналізі програми перед її трансляцією на машинну мову.
  • динамічні мови перевіряють типи даних під час виконання.

Принциповий спосіб взаємодії

Високоабстрактні мови можуть бути розділені за основною парадигмою програмування. Існують десятки методологій складання програм, деякі з яких дуже схожі один на одного, тому створити чітку систему відмінностей неможливо. Коротко класифікація мов програмування виглядає так:

  • алгоритмічні, імперативні, процедурні. Потребують явного послідовного опису алгоритму вирішення завдання. Оператори при цьому об 'єднуються в процедурні групи, відокремлені від самих даних. Приклади процедурних мов - Pascal, Basic;
  • логічні, декларативні. Максимально формалізовано описують саме завдання і необхідний результат. Рішення при цьому має логічно слідувати з цього опису;
  • об 'єктно-орієнтовані, структуровані. Мають в основі концепцію об 'єкта, що об' єднує в собі дані та методи їх обробки.

Об 'єкти у програмуванні

Мови останньої групи описують всі сутності у вигляді незалежних об 'єктів, що приховують в собі складні механіки. Основними концепціями ОВП (об 'єктно-орієнтованого програмування) є:

  • інкапсуляція - приховування функціоналу всередині об 'єкта;
  • успадкування одними об 'єктами методів інших;
  • поліморфізм - зміна суті зі збереженням зовнішнього інтерфейсу.

Можна скласти також класифікацію мов об 'єктно-орієнтованого програмування за способом реалізації основних концепцій цього підходу - спадкування, інкапсуляції та поліморфізму. Крім класичних механізмів існують інші, наприклад прототипний, який використовується в JavaScript.

Методологія ОВП вважається найбільш прогресивною, ефективною і в деякому сенсі модною. Однак у ряді випадків для вирішення конкретного завдання більш ефективними можуть бути інші підходи, наприклад функціональний.

Покоління мов програмування

Класифікація мов програмування з історії їх появи вважається умовною, оскільки не враховує особливості конкретних систем. Однак вона дозволяє простежити, як змінювалися з часом концепції і ускладнювалися завдання, що стоять перед програмістами.

У спробах зв 'язати класифікацію та еволюцію мов програмування виділилися кілька великих груп, названих поколіннями:

  • Перше покоління - машинні мови низького рівня, прив 'язані до реалізації конкретної ЕВМ. "Програми" "цими мовами виглядали як рядки перемикачів, наведених у потрібне положення, або перфокарти (перфоленти). Таким чином, всі команди являли собою послідовність нулів і одиниць - бінарний код. Приклад: мова ARM-процесора.
  • У другому поколінні мови стали трохи зрозумілішими для людини, але відв 'язати їх від конкретного апарату так і не вдалося. Це час мов асемблера з його мнемонічними кодами і однозначною збіркою в машиночитну форму. Приклад: Макроассемблер.
  • Мови третього покоління зняли з програміста турботу про непринципові деталі складання інструкцій, таких як переклад програми в машинний код. Тепер комп 'ютер навчився робити це самостійно. Синтаксис і лексика наблизилися до людських, стали зрозумілішими. У цьому поколінні зародилися практично всі сучасні мови високого рівня з широкою областю застосування, незалежно від їх парадигми: PHP, Fortran.
  • У четвертому поколінні рівень абстракції зріс ще більше, різко звужуючи область використання. До цієї групи належать такі специфічні мови, як FoxPro, Simulink, SQL. З 'явилися мови візуального програмування: CAD-пакети, системи RAD.
  • Нарешті, мови п 'ятого покоління повинні були самі писати програми, отримуючи лише опис від програміста. Ця задумка так і не була реалізована повністю, оскільки для складання ефективного алгоритму іноді недостатньо прямої машинної логіки, а потрібна ще людська інтуїція і кмітливість. Прикладами мов п 'ятого покоління є MathCAD, Prolog і Mercury.

По суті, покоління мов у точності відповідають етапам програмування, розглянутим на початку статті, переліченим у зворотному порядку. Спочатку програміст всі операції брав на себе, а машина лише виконувала задану послідовність дій. Тепер же ЕВМ здатна видавати результат за формалізованим описом завдання.

Полегшення праці програміста супроводжується збільшенням навантаження на машину, програма виконується повільніше і вимагає великих ресурсів.

Незважаючи на те що технічний прогрес рухається семимильними кроками, мови перших поколінь зовсім не зникли. Вони застосовуються в областях, що потребують максимальної простоти та ефективності.

Область застосування

Кожна мова програмування хороша в своїй області, для якої вона створювалася. Так, для програмування мікроконтролерів використовуються асемблери, а з Java там робити нічого. Низькорівневе програмування драйверів ефективне з C, який дозволяє суворо контролювати ресурси пам 'яті. Для веб-програмування варто вибрати скриптові мови PHP та JavaScript, інтерпретатор якого вбудований в кожен сучасний браузер. Важливі банківські програми написані на Java, що забезпечує контроль помилок. Аерокосмічні - теж на Java або на Паскалі, який навіть прибирання сміття віддає на контроль програмісту.

Всі мови хороші, потрібно лише підібрати відповідний задачі.

Важливість класифікації

Складно розділити сотні існуючих систем взаємодії людини і ЕВМ на кілька чітких груп. І все ж огляд класифікацій мов програмування коротко простежує історію їх еволюції і глибше розкриває закладені в них ідеї.

Кожна мова одночасно належить до декількох з перелічених груп - вона може бути строго типізованою, компільованою і об 'єктно-орієнтованим одночасно. Тому не можна розглядати різноманіття систем програмування через призму якоїсь однієї класифікації.