Матеріал з Вікіпедії
Мова програмування - формальна знакова система. призначена для запису комп'ютерних програм. Мова програмування визначає набір лексичних. синтаксичних і семантичних правил, що визначають зовнішній вигляд програми і дії, які виконає виконавець (зазвичай - ЕОМ) під її управлінням.
З часу створення перших програмованих машин людство придумало більш восьми тисяч мов програмування (включаючи нестандартні, візуальні і езотеричні мови) [1]. Щороку їх кількість збільшується. Деякими мовами вміє користуватися тільки невелике число їх власних розробників, інші стають відомі мільйонам людей. Професійні програмісти можуть володіти десятком і більше різних мов програмування.
Мова програмування призначений для написання комп'ютерних програм, які представляють собою набір правил, що дозволяють комп'ютеру виконати той чи інший обчислювальний процес. організувати управління різними об'єктами, і т. п. Мова програмування відрізняється від природних мов тим, що призначений для взаємодії людини з ЕОМ, в той час як природні мови використовуються для спілкування людей між собою. Більшість мов програмування використовує спеціальні конструкції для визначення і маніпулювання структурами даних і управління процесом обчислень.
Як правило, мова програмування існує в декількох, але істотно відрізняються видах:
- стандарту мови - набору специфікацій, що визначають його синтаксис і семантику; стандарт мови може історично розвиватися (див. докладніше стандартизація);
- втілень (реалізацій) стандарту - власне програмних засобів, що забезпечують роботу відповідно до того чи іншого варіанту стандарту мови; такі програмні засоби розрізняються по виробнику, марці та варіанту (версії), часу випуску, повноті втілення стандарту, додаткових можливостей; можуть мати певні помилки або особливості втілення, що впливають на практику використання мови або навіть на його стандарт.
Історія [ред]
Ранні етапи розвитку [ред]
В цей же час, в 1940-і роки, з'явилися електричні цифрові комп'ютери і була розроблена мова, який можна вважати першим високорівневих мовою програмування для ЕОМ - «Plankalkül», створений німецьким інженером К. Цузе в період з 1943 по 1945 роки [2] .
З середини 1950-х почали з'являтися мови третього покоління, такі як Фортран. Лісп і Кобол [3]. Мови програмування цього типу більш абстрактні (їх ще називають «мовами високого рівня») і універсальні, не мають жорсткої залежності від конкретної апаратної платформи і використовуваних на ній машинних команд. Програма на мові високого рівня може виконуватися (принаймні, в теорії, на практиці зазвичай є ряд специфічних версій або діалектів реалізації мови) на будь-який ЕОМ, на якій для цієї мови є транслятор (інструмент, що переводить програму на мову машини, після чого вона може бути виконана процесором).
Оновлені версії перерахованих мов досі знаходяться в обігу в розробці програмного забезпечення, і кожен з них зробив певний вплив на подальший розвиток мов програмування [4]. Тоді ж, в кінці 1950-х років, з'явився Алгол. також послужив основою для ряду подальших розробок у цій сфері. Необхідно зауважити, що на формат і застосування ранніх мов програмування в значній мірі впливали інтерфейсні обмеження [5].
Удосконалення [ред]
У період 1960-х - 1970-х років були розроблені основні парадигми мов програмування, які використовуються в даний час, хоча в багатьох аспектах цей процес був лише поліпшення ідей і концепцій, закладених ще в перших мовами третього покоління.
- Мова APL вплинув на функціональне програмування і став першою мовою, який підтримував обробку масивів [6].
- Мова ПЛ / 1 (NPL) був розроблений в 1960-х роках як об'єднання кращих рис Фортрана і Кобола.
- Мова Симула. що з'явився приблизно в цей же час, вперше включав підтримку об'єктно-орієнтованого програмування. В середині 1970-х група фахівців представила мову Smalltalk. який був уже цілком об'єктно-орієнтованим.
- У період з 1969 по 1973 роки велася розробка мови Сі. популярного і до цього дня [7] і став основою для безлічі подальших мов, наприклад, таких популярних, як С ++ і Java.
- У 1972 році був створений Пролог - найбільш відомий (хоча і не перший, і далеко не єдиний) мова логічного програмування.
- У 1973 році в мові ML була реалізована розширена система полиморфной типізації. поклала початок типізованим мов функціонального програмування.
Кожен з цих мов породив по сімейству нащадків, і більшість сучасних мов програмування в кінцевому рахунку засноване на одному з них.
Крім того, в 1960-1970-х роках активно велися суперечки про необхідність підтримки структурного програмування в тих чи інших мовах [8]. Зокрема, голландський фахівець Е. Дейкстра виступав у пресі з пропозиціями про повну відмову від використання інструкцій GOTO у всіх високорівневих мовах. Розвивалися також прийоми, спрямовані на скорочення обсягу програм і підвищення продуктивності роботи програміста і користувача.
Об'єднання і розвиток [ред]
У 1980-ті роки настав період, який можна умовно назвати часом консолідації. Мова С ++ об'єднав в собі риси об'єктно-орієнтованого і системного програмування, уряд США стандартизувати мову Ада. похідний від Паскаля і призначений для використання в бортових системах управління військовими об'єктами, в Японії і інших країнах світу здійснювалися значні інвестиції в вивчення перспектив так званих мов п'ятого покоління, які включали б в себе конструкції логічного програмування [9]. Спільнота функціональних мов прийняло в якості стандарту ML і Лісп. В цілому цей період характеризувався швидше опорою на закладений в попередньому десятилітті фундамент, ніж розробкою нових парадигм.
Важливою тенденцією, що спостерігалася в розробці мов програмування для великомасштабних систем, було зосередження на застосуванні модулів - об'ємних одиниць організації коду. Хоча деякі мови, такі, як ПЛ / 1, вже підтримували відповідну функціональність, модульна система знайшла своє відображення і застосування також і в мовах Модула-2. Оберон. Ада і ML. Часто модульні системи об'єднувалися з конструкціями узагальненого програмування [10].
Важливим напрямком робіт стають візуальні (графічні) мови програмування. в яких процес «написання» програми як тексту замінюється на процес «малювання» (конструювання програми у вигляді діаграми) на екрані ЕОМ. Візуальні мови забезпечують наочність і краще сприйняття логіки програми людиною.
В даний час розвиток мов програмування йде в напрямку підвищення безпеки і надійності, створення нових форм модульної організації коду та інтеграції з базами даних.
Стандартизація мов програмування [ред]
Для багатьох широко поширених мов програмування створені міжнародні стандарти. Спеціальні організації проводять регулярне оновлення і публікацію специфікацій і формальних визначень відповідної мови. В рамках таких комітетів триває розробка і модернізація мов програмування і вирішуються питання про розширення або підтримки вже існуючих і нових мовних конструкцій.
Типи даних [ред]
Сучасні цифрові комп'ютери є двійковими і дані зберігають у довічним (бінарному) коді (хоча можливі реалізації і в інших системах числення). Ці дані зазвичай відображають інформацію з реального світу (імена, банківські рахунки, вимірювання та ін.), Що представляє високорівневі концепції.
Особлива система, по якій дані організовуються в програмі, - це система типів мови програмування; розробка і вивчення систем типів відома під назвою теорія типів. Мови можна поділити на мають статичну типізацію і динамічну типізацію. а також Безтипові мови (наприклад, Forth).
Структури даних [ред]
Системи типів в мовах високого рівня дозволяють визначати складні, складові типи, так звані структури даних. Як правило, структурні типи даних утворюються як декартовій твір базових (атомарних) типів і раніше певних складових типів.
Основні структури даних (списки, черги, хеш-таблиці, двійкові дерева і пари) часто представлені особливими синтаксичними конструкціями в мовах високого рівня. Такі дані структуруються автоматично.
Семантика мов програмування [ред]
Існує кілька підходів до визначення семантики мов програмування.
Найбільш широко поширені різновиди наступних трьох: операційного, дериваційного (аксіоматичного) і денотаціонного (математичного).
- При описі семантики в рамках операційного підходу зазвичай виконання конструкцій мови програмування інтерпретується за допомогою деякої уявної (абстрактної) ЕОМ.
- Аксіоматична семантика описує наслідки виконання конструкцій мови за допомогою мови логіки і завдання перед-і постусловіем.
- Дентаціонная семантика оперує поняттями, типовими для математики - безлічі, відповідності, а також судження, затвердження та ін.
Парадигма програмування [ред]
Мова програмування будується відповідно до тієї чи іншої базовою моделлю обчислень і парадигмою програмування.
Способи реалізації мов [ред]
Програма на компільованих мов за допомогою компілятора (особливої програми) перетвориться (компілюється) в машинний код (набір інструкцій) для даного типу процесора і далі збирається в виконуваний файл. який може бути запущений на виконання як окрема програма. Іншими словами, компілятор переводить вихідний текст програми з мови програмування високого рівня в двійкові коди інструкцій процесора.
Якщо програма написана на интерпретируемом мовою, то інтерпретатор безпосередньо виконує (інтерпретує) вихідний текст без попереднього перекладу. При цьому програма залишається мовою оригіналу і не може бути запущена без інтерпретатора. Процесор комп'ютера, в зв'язку з цим, можна назвати інтерпретатором для машинного коду.
Поділ на компільовані й інтерпретовані мови є умовним. Так, для будь-якого традиційно компилируемого мови, як, наприклад, Паскаль. можна написати інтерпретатор. Крім того, більшість сучасних «чистих» інтерпретаторів не виконують! Конструкції мови безпосередньо, а компілюють їх в деякий високорівневе проміжне представлення (наприклад, з разименованія змінних і розкриттям макросів).
Для будь-якого інтерпретується мови можна створити компілятор - наприклад, мова Лісп, спочатку інтерпретується, може компілюватися без яких би то не було обмежень. Створюваний під час виконання програми код може так само динамічно компілюватися під час виконання.
Як правило, скомпільовані програми виконуються швидше і не вимагають для виконання додаткових програм, так як вже переведені на машинну мову. Разом з тим, при кожній зміні тексту програми потрібно її перекомпіляція, що уповільнює процес розробки. Крім того, скомпільована програма може виконуватися тільки на тому ж типі комп'ютерів і, як правило, під тією ж операційною системою, на яку був розрахований компілятор. Щоб створити виконуваний файл для машини іншого типу, потрібна нова компіляція.
Інтерпретовані мови мають деякі специфічні додатковими можливостями (див. Вище), крім того, програми на них можна запускати відразу ж після зміни, що полегшує розробку. Програма на интерпретируемом мовою може бути часто запущена на різних типах машин і операційних систем без додаткових зусиль.
Однак інтерпретовані програми виконуються помітно повільніше, ніж компільовані, крім того, вони не можуть виконуватися без програми-інтерпретатора.
Деякі мови, наприклад, Java і C #. знаходяться між компільовані і інтерпретуються. А саме, програма компілюється не в машинний мову, а в машинно-незалежний код низького рівня, байт-код. Далі байт-код виконується віртуальною машиною. Для виконання байт-коду зазвичай використовується інтерпретація, хоча окремі його частини для прискорення роботи програми можуть бути трансльовані в машинний код безпосередньо під час виконання програми за технологією компіляції «на льоту» (Just-in-time compilation, JIT). Для Java байт-код виповнюється віртуальною машиною Java (Java Virtual Machine, JVM), для C # - Common Language Runtime.
Подібний підхід у певному сенсі дозволяє використовувати плюси як інтерпретаторів, так і компіляторів. Слід згадати, що є мови, які мають і інтерпретатор, і компілятор (Форт).
Мови програмування низького рівня [ред]
Перші комп'ютери доводилося програмувати двійковими машинними кодами. Однак програмувати таким чином - досить трудомістка і важка задача. Для спрощення цього завдання почали з'являтися мови програмування низького рівня, які дозволяли ставити машинні команди в зрозумілому для людини вигляді. Для перетворення їх у двійковий код були створені спеціальні програми - транслятори.
Мови низького рівня, як правило, використовують для написання невеликих системних програм, драйверів пристроїв, модулів стиків з нестандартним обладнанням, програмування спеціалізованих мікропроцесорів, коли найважливішими вимогами є компактність, швидкодія і можливість прямого доступу до апаратних ресурсів.
Мови програмування високого рівня [ред]
Особливості конкретних комп'ютерних архітектур в них не враховуються, тому створені програми легко переносяться з комп'ютера на комп'ютер. У більшості випадків достатньо просто перекомпілювати програму під певну комп'ютерну архітектурну і операційну систему. Розробляти програми на таких мовах значно простіше і помилок допускається менше. Значно скорочується час розробки програми, що особливо важливо при роботі над великими програмними проектами.
Недоліком деяких мов високого рівня є великий розмір програм в порівнянні з програмами на мовах низького рівня. З іншого боку, для алгоритмічно і структурно складних програм при використанні суперкомпіляціі перевага може бути на стороні мов високого рівня. Сам текст програм на мові високого рівня менше, проте, якщо взяти в байтах, то код, спочатку написаний на асемблері, буде більш компактним. Тому в основному мови високого рівня використовуються для розробки програмного забезпечення комп'ютерів і пристроїв, які мають великий обсяг пам'яті. А різні підвиди асемблера застосовуються для програмування інших пристроїв, де критичним є розмір програми.
Використовувані символи [ред]
Сучасні мови програмування розраховані на використання ASCII. тобто доступність всіх графічних символів ASCII є необхідною і достатньою умовою для запису будь-яких конструкцій мови. Керуючі символи ASCII використовуються обмежено: допускаються тільки повернення каретки CR, переклад рядка LF і горизонтальна табуляція HT (іноді також вертикальна табуляція VT і перехід до наступної сторінки FF).
Ранні мови, що виникли в епоху 6-бітних символів. використовували більш обмежений набір. Наприклад, алфавіт Фортрана включає 49 символів (включаючи пробіл): A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - * / (). $ '.
Помітним винятком є мова APL. в якому використовується дуже багато спеціальних символів.
Математично обґрунтовані мови програмування [ред]
Приклади математично обґрунтованих мов і втілюються ними математичних моделей:
Наявність математичного обґрунтування для мови може гарантувати (або, як мінімум, обіцяти з дуже високою ймовірністю) деякі або всі з наступних позитивних властивостей:
Слід мати на увазі, що мови, успадковані від «успадкованих від математики» вже не обов'язково будуть володіти цими властивостями. Наприклад, мова Python поєднує в собі кілька згаданих моделей, але для їх поєднання не існує обгрунтування, тому він не може вважатися «успадкованих від математики», і, як наслідок, йому притаманне лише останнє з вказаних властивостей.
Див. Також [ред]
Примітки [ред]
There is a fundamental limit to complexity of any software system for it to be still manageable: if it requires more than "one brainfull" of information to understand a component of the system, then that component will not be understood fully. It will be extremely difficult to make enhancements or fi x bugs, and each fi x is likely to introduce further errors due to this incomplete knowledge.