Мова програмування високого рівня
Високорівнева мова програмування — мова програмування, розроблена для швидкого і зручного використання програмістом. Основна риса високорівневих мов — це абстракція, тобто введення смислових конструкцій, які коротко описують такі структури даних і операції над ними, опис яких на машинному коді або низькорівневій мові програмування був би дуже великим, складним для розуміння програмістів і зайняв би багато часу при написанні. Написані програми на мові високого рівня згодом перетворюються в машинний код для виконання безпосередньо операційною системою. В результаті безпосередній код, що виконується на комп'ютері і створений в процесі трансляції переважно містить певні зайві інструкції, тому виконання таких програм дещо повільніше. Швидкість також залежить від способу трансляції. Проте для сучасної обчислювальної техніки цей час не критичний. В разі якщо швидкість все ж критична, або ж потрібно напряму працювати з апаратним забезпеченням, то використовують мови низького рівня (асемблер).
Переваги та історія виникнення
Високорівневі мови програмування були розроблені для спрощення створення програм і з метою платформової незалежності суті алгоритмів. Написання програми на машинному коді або на мові низького рівня потребує від програміста доброго знання апаратного забезпечення та операційної системи. При використанні мови високого рівня програмістам здебільшого не потрібно, наприклад, вникати в особливості реалізації того чи іншого процесора комп'ютера. Залежність від платформи перекладається на інструментальні програми — транслятори, які перетворюють текст, написаний на мові високого рівня, в елементарні машинні команди (інструкції). Прикладами трансляторів є компілятори та інтерпретатори. Компілятори перетворюють код в машинний і в результаті виходить виконуваний файл для певної платформи, який згодом уже не потребує ніяких засобів даної мови для запуску програми. Інтерпретатори мови транслюють код при кожному запуску програми при цьому вимагається, щоб на комп'ютері були встановлені відповідні засоби для даної мови програмування. Для кожної мови програмування і для кожної платформи розробляється власний транслятор, який, наприклад, перекладає текст, написаний на Delphi в елементарні команди мікропроцесорів сімейства x86.
Так, високорівневі мови прагнуть не тільки полегшити вирішення складних програмних завдань, але і спростити портування програмного забезпечення. Використання різноманітних трансляторів забезпечує зв'язок програм, написаних за допомогою мов високого рівня, з різними операційними системами, програмованими пристроями та обладнанням, і, в ідеалі, не вимагає модифікації початкового тексту для будь-якої платформи.
Такого роду відірваність високорівневих мов від апаратної реалізації комп'ютера крім безлічі плюсів має і мінуси. Зокрема, вона не дозволяє створювати прості і точні інструкції для використовуваного устаткування. Програми, написані на мовах високого рівня, простіші для розуміння програмістом, але менш ефективні, ніж їхні аналоги, створювані за допомогою низькорівневих мов. Одним з наслідків цього стало додавання підтримки тієї чи іншої мови низького рівня (мова асемблера) в ряд сучасних професійних високорівневих мов програмування.
Прикладами мов високого рівня є C++, C#, Java, JavaScript, Python, PHP, Ruby, Perl, Pascal, Delphi, LISP. Мовам високого рівня властиве вміння працювати з комплексними структурами даних. До більшості з них інтегровано підтримку стрічкових типів, об'єктів, операцій файлового вводу-виводу і т. д..[1]
Першою мовою програмування високого рівня вважається комп'ютерна мова Plankalkül, розроблена німецьким інженером Конрадом Цузе ще в період 1942-1946 років.[2] Однак транслятора для нього не існувало до 2000 року. Першим у світі транслятором мови високого рівня є ПП (Програмуюча Програма), він же ПП-1, успішно випробуваний в 1954 році.
Однією з найперших реалізованих мов програмування високого рівня є Адресна мова програмування (1955р.), яка вперше в світі використовувала опосередковану адресацію вищих рангів (Pointers - є аналогом). В результаті винаходу опосередкованої адресації в Адресному програмуванні були введені складні типи даних: деревообразні формати, яким подібні абстрактні типи даних.
Транслятор ПП-2 (1955 рік, 4-й у світі транслятор) вже був оптимізувальним і містив власний завантажувач і зневаджувач, бібліотеку стандартних процедур, а транслятор ПП для ЕОМ Стріла-4 вже містив і компонувальник (linker) з модулів. Однак, широке застосування високорівневих мов почалося з виникненням Фортрана і створенням компілятора для цієї мови (1957).[3]
Переносимість програм
Поширена думка, що програми на мовах високого рівня можна написати один раз і потім використовувати на комп'ютері будь-якого типу. Насправді ж це так тільки для тих програм, які мало взаємодіють з операційною системою, наприклад, виконують будь-які обчислення або обробку даних. Більшість же інтерактивних (а тим більше мультимедійних) програм звертаються до системних викликів, які сильно розрізняються залежно від операційної системи. Наприклад, для виведення графіки на екран комп'ютера програми під Microsoft Windows використовують функції Windows API, які відрізняються від використовуваних в системах, що підтримують стандарт POSIX. Найчастіше для цих цілей в них використовується програмний інтерфейс X-сервера.
До теперішнього часу створено цілий ряд програмних бібліотек (наприклад, бібліотека Qt або wxWidgets), що приховують невідповідності системних викликів різних операційних систем від прикладних програм. Однак такі бібліотеки, як правило, не дозволяють повністю використовувати всі можливості конкретних операційних систем.
Режими виконання
Існують три основні режими виконання для сучасних мов програмування високого рівня:
Інтерпретація
Коли написаний на мові код інтерпретується, то його синтаксис читається, а потім виконується безпосередньо, без стадії компіляції. Програма, яка називається інтерпретатором після запуску програми читає кожну інструкцію програми, слідуючи за течією виконання програми, і вирішує, що робити, і робить це. Гібрид інтерпретатора і компілятор компілює інструкцію в машинний код і виконує це; машинний код потім відкидається, щоб бути інтерпретованим заново, якщо лінія виконується знову. Інтерпретатори, як правило, найбільш прості варіанти реалізації поведінки мови, в порівнянні з іншими наведеними тут двома варіантами.
Компіляція
Коли код, написаний на мові, компілюється, його синтаксис перетворюється у виконувану форму перед запуском. Є два типи компіляції:
- Генерація машинного коду
Деякі компілятори компілюють вихідний код безпосередньо в машинний код. Це справжній режим компіляції, і мови, які безпосередньо і повністю перетворюються на машинний код можна назвати «справді компільованими» мовами. Дивитися мову асемблера.
- Проміжні представлення
Коли код, написаний на мові, компілюється в проміжне представлення, то таке проміжне представлення може бути оптимізовано або збережено для подальшого виконання без необхідності повторного читання початкового коду. Проміжне представлення може бути збережене, наприклад, у формі байт-коду. При виконанні, проміжне представлення згодом інтерпретується або додатково компілюється. Віртуальні машини далі можуть виконувати його безпосередньо або ж трансформувати його в машинний код. Таким чином межа між мовами з проміжним представленнями і дійсно компільованими мовами програмування є розмитою і нечіткою.
Транс-компіляція
Код, написаний на мові високого рівня, може бути перекладений на мову програмування низького рівня, для якої є широкодоступний рідний компілятор коду або на іншу мову високого рівня. Такі перекладачі існують для мов JavaScript і мова програмування C. Як приклад див. також CoffeeScript, Chicken Scheme і Eiffel. Зокрема, згенерований C і C++ код у середовищі EiffelStudio IDE з мови програмування Eiffel, можна подивитись в каталозі EIFGENs будь-якого скомпільованого проекту Eiffel. В Eiffel, процес «Перекладення» називається Транс-компіляція або Транс-скомпільований і компілятор Eiffel як Transcompiler.
Зверніть увагу, що переважно мови програмування не є строго «інтерпретованими» або «компільованими». Конкретна реалізація мови визначає поведінку з кодом. Наприклад, Алгол 60 і Фортран обидва були інтерпретованими. Крім того, наприклад стосовно Java, є певні труднощі при застосуванні цих ярликів до мови, а не до реалізації; Java компілюється в байт-код і байт-код згодом інтерпретується (в JVM) або компілюється на льоту (Just-in-time компіляція).
Розвиток високорівневих мов програмування
Популярні в даний час мови програмування високого рівня (як то Java, C#) та засоби розробки для них постійно розвиваються. У них з'являються нові елементи, нові бібліотеки класів, дещо міняється навіть і сам синтаксис тощо Розробники даних мов ведуть постійну роботу над покращенням швидкодії програм написаних на даних мовах. Популярні мови програмування також мають значну кількість сторонніх бібліотек та фреймворків. Ведуться спроби розробки нових мов програмування, у тому числі на базі існуючих мов програмування(Scala). Вдалі рішення в одній мові швидко підхоплюються розробниками інших мов, тому існуючі високорівневі мови мають значну кількість схожих елементів.
Фреймворки
Одною з основних тенденцій є поява і розвиток фреймворків — спеціалізованих інфраструктур програмних рішень для певних мов програмування, які беруть на себе вирішення певної складної задачі і таким чином значно прискорюють розробку складних систем. Наприклад спрощують розробку веб сайту, роботу з базою даних (автоматизують запити до бази даних), спрощують розробку графічного інтерфейсу для програм тощо Це свого роду складні бібліотеки (комплекс програмних бібліотек).
Надвисокорівневі мови програмування
Термін надвисокорівневі мови з'явився у зв'язку із спробами розробки мов більш високого рівня абстракції. В 1990-х роках популяризатори та розробники нових мов вживали термін надвисокорівневі мови програмування або ж ультра-високорівневі мови програмування. Це стосувалося мов, що характеризувалися наявністю додаткових структур і об'єктів, орієнтованих на прикладне використання. Прикладні об'єкти, у свою чергу, вимагають мінімального налаштування у вигляді параметрів і моментально готові до використання.[4][5][6] Ультра-високорівневі мови програмування покликані знижувати часові витрати на розробку програмного забезпечення і підвищувати якість кінцевого продукту. По суті аналогічну функціональність мають елементи бібліотек та фреймворків усіх сучасних високорівневих мов програмування (як то Java, C#), тому особливої популярності поділ на високорівневі та надвискорівневі мови не здобув. Інколи під надвискорівневими мовами розуміють декларативні мови.
Високорівнева комп'ютерна архітектура
Ведуться спроби розробити комп'ютери, які б могли б безпосередньо виконувати команди високих мов програмування (так звана високорівнева комп'ютерна архітектура)
Примітки
- How to Hurt the Hackers: "The Scoop on Internet Cheating and How You Can Combat It". Gamasutra.com. 24 липня 2000. Процитовано 15 вересня 2009.
- Giloi, Wolfgang, K. (1997). «Konrad Zuse's Plankalkül: The First High-Level „non von Neumann“ Programming Language». IEEE Annals of the History of Computing, vol. 19, no. 2, pp. 17–24, April–June, 1997. (abstract)
- Лондон, Кейс (1968). 4, Програмування. Вступ до комп'ютерів. 24 Russell Square London WC1: Faber and Faber Limited. с. 186. ISBN 0571085938. «Дві мови програмування високого рівня, які можуть бути використані як приклади тут, щоб показати структуру і призначення автокоду є COBOL (Common Business Oriented Language) і FORTRAN.»
- Сурана П. Мета-компіляція мови абстракцій.. (PDF). — 2006. Процитовано 2008-03-17.
- Кукетаєв. The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java. Архів оригіналу за 11 січня 2009. Процитовано 17 березня 2008.
- Chatzigeorgiou; Stephanides (2002). Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages. У Blieberger; Strohmeier. Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002. Springer. с. 367.