ІСТОРІЯ РОЗВИТКУ МОВ ПРОГРАМУВАННЯ

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

Ассемблер. Першим значним кроком став перехід до мови ассемблера (англійська мова assembly language, або assembler, на українську перекладається саме тим терміном, який було використано вище). Не дуже помітний, з першого погляду крок – перехід до символьного кодування машинних команд – мав насправді величезне значення. Програмісту не треба було більше занурюватися до способів кодування команд на апаратному рівні. Більш того, зазвичай однакові за суттю команди кодувались зовсім різними способами залежно від власних параметрів. З’явилася також можливість використання макросів та міток, що також спрощувало створення, модифікацію та налагодження програм.

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

Фортран. В 1954 році у надрах IBM групою розробників на чолі з Джоном Бекусом (John Backus) було створено мову програмування Fortran. Значення цієї події важко переоцінити. Це перший крок програмування високого рівня. Вперше програміст міг по справжньому абстрагуватися від особливостей машинної архітектури. Ключовою ідеєю, що відрізняв нову мову від ассемблера, була концепція підпрограм. Крім того, синтаксична структура мови була достатньо складна для машинної обробки в першу чергу через те, що пробіли як синтаксичні одиниці взагалі не використовувались. Це породжувало масу помилок. Мова Фортран використовувалася (і використовується на сьогоднішній день) для наукових обчислень. Відсутні звичні мовні конструкції, семантична перевірка компілятором, підтримка сучасних способів структурування коду та даних. Це усвідомлювали і самі розробники. За визнанням самого Бекуса, перед ними стояла задача скоріше розробки компілятора, аніж мови. Розуміння самостійного значення мов програмування прийшло пізніше. Появу Фортрана зустріли ще з більшою критикою, аніж ассемблера. Програмістів лякало зниження ефективності програм за рахунок використання проміжної ланки у виді компілятора. І ці побоювання мали під собою основу: дійсно, гарний програміст, скоріш за все, при розв’язуванні якої-небудь невеликої задачі вручну напише код, що працюватиме швидше, аніж код, отриманий як результат компіляції. Через деякий час прийшло розуміння того, що реалізація великих проектів неможлива без використання мов високого рівня. Потужність обчислювальних машин зростала, і переваги мов високого рівня стали настільки очевидними, що підштовхнуло розробників до творення нових мов, все більш сучасних.

Cobol. В 1960 році була створена мова програмування Cobol. Вона задумувалася як мова для створення комерційних додатків, і він став таким. На Коболі написані тисячі прикладних комерційних систем. Відмітною особливістю мови є можливість ефективної роботи з великими масивами даних, що характерно саме для комерційних прикладних задач. Популярність Кобола настільки висока, що навіть зараз, при всіх його недоліках (за структурою та задуму Кобол нагадує Фортран) з’являються нові його діалекти та реалізації. Так нещодавно з’явилась реалізація Кобола, у поєднанні з Microsoft.NET, що вимагало внесення до мови деяких рис об’єктно-орієнтованої мови.

PL/1. В 1964 році все таж сама корпорація IBM створила мову PL/1, яка була покликана замінити Кобол та Фортран. Мова мала виняткове розмаїття синтаксичних конструкцій. В ній вперше з’явилася обробка виняткових ситуацій та підтримка паралелізму. Треба відмітити, що синтаксична структура мови була украй складною. Пропуски вже використовувалися як синтаксичні роздільники, але ключові слова не були зарезервовані. Зокрема, наступний рядок - це цілком нормальний оператор на PL/1:

IF ELSE=THEN THEN THEN; ELSE ELSE

В силу таких особливостей розробка компілятора для PL/1 була виключно складною справою. Мова так і не стала популярною поза світом IBM.

BASIC. В 1963 році Дартмурським коледжом (Dartmouth College) була створена мова програмування BASIC (Beginners’ All-Purpose Instruction Code – багатоцільова мова символічних інструкцій для початківців). Мова замислювалася впершу чергу як засіб навчання і як перша мова програмування, що вивчалася. Він передбачався таким, що легко інтерпретується і компілюється. Треба сказати, що BASIC дійсно став мовою, на якою вчаться програмувати. Було створено декілька потужних реалізацій BASIC, що підтримують найсучасніші концепції програмування (яскравий приклад - Microsoft Visual Basic).

Algol. У 1960 році командою на чолі з Петером Науром (Peter Naur) була створена мова програмування Algol. Ця мова дала початок цілому сімейству Алгол-подібних мов (найважливіший представник - Pascal). У 1968 році з'явилася нова версія мови. Вона не знайшла такого широкого практичного застосування, як перша версія, але була вельми популярна в кругах теоретиків. Мова була достатньо цікава, оскільки володіла багатьма унікальним на той момент характеристиками.

Подальший розвиток мов програмування.

Створення кожна з вищезазначених мов (за виключенням, можливо, Algol’а) було викликано деякими практичними вимогами. Ці мови послужили фундаментом для пізніших розробок. Всі вони представляють одну і ту ж парадигму програмування. Наступні мови пішли істотно далі в своєму розвитку, убік глибшого абстрагування.

Pascal-подібні мови. У 1970 році Никлаусом Віртом було створено мову програмування Pascal. Мова чудова тим, що це перша широко поширена мова для структурного програмування (першим, строго кажучи, був Алгол, але він не набув такого широкого поширення). Вперше оператор безумовного переходу перестав грати основоположну роль при управлінні порядком виконання операторів. У цій мові також упроваджена строга перевірка типів, що дозволило виявляти багато помилок на етапі компіляції. Негативною рисою мови була відсутність в ній засобів для розбиття програми на модулі. Вірт усвідомлював це і розробив мову Modula-2 (1978), в якій ідея модуля стала однією з ключових концепцій мови. У 1988 році з'явилася Modula-3, в яку були додані об'єктно-орієнтовані риси. Логічним продовженням Pascal і Modula є мова Oberon і Oberon-2. Вони характеризуються рухом убік об’єктно- і компоненто- орієнтованості.

С-подібні мови. У 1972 році Керніганом і Рітчи була створена мова програмування C. Вона створювалася як мова для розробки операційної системи UNIX. C часто називають «асемблером, що переноситься», маючи на увазі те, що він дозволяє працювати з даними практично так само ефективно, як на асемблері, надаючи при цьому структуровані конструкції, що управляють, і абстракції високого рівня (структури і масиви). Саме з цим пов'язана його величезна популярність і понині. І саме це є його ахіллесовою п'ятою. Компілятор C дуже слабо контролює типи, тому дуже легко написати зовні абсолютно правильну, але логічно помилкову програму. У 1986 році Бьярн Страуструп створив першу версію мови C++, додавши в мову C об'єктно-орієнтовані риси, узяті з Simula, і виправивши деякі помилки і невдалі рішення мови. C++ продовжує удосконалюватися і в даний час, так в

1998 році вийшла нова (третя) версія стандарту, що містить в собі деякі досить істотні зміни. Мова стала основою для розробки сучасних великих і складних проектів. У ній є, проте і слабкі сторони, що витікають з вимог ефективності. У 1995 році в корпорації Sun Microsystems Кеном Арнольдом і Джеймсом Гослінгом була створена мова Java. Він успадковував синтаксис C і C++ і був позбавлений від деяких неприємних рис останнього. Відмітною особливістю мови є компіляція в код якоїсь абстрактної машини, для якої потім пишеться емулятор (Java Virtual Machine) для реальних систем. Крім того, в Java немає показників і множинного спадкоємства, що сильно підвищує надійність програмування. У 1999-2000 роках в корпорації Microsoft була створена мова C#. Вона

достатньою мірою схожа з Java (і замислювалася як альтернатива останній), але має і відмітні особливості. Орієнтована, в основному, на розробку багатокомпонентних Інтернет-додатків.

Мови Ada та Ada 95. У 1983 році під егідою Міністерства Оборони США була створена мова Ada. Мова чудова тим, що дуже багато помилок може бути виявлено на етапі компіляції. Крім того, підтримуються багато аспектів програмування, які часто віддаються на відкуп операційній системі (паралелізм, обробка виключень). У 1995 році був прийнятий стандарт мови Ada 95, яка розвиває попередню версію, додаючи в неї об'екну орієнтованість і виправляючи деякі неточності. Обидві ці мови не отримали широкого розповсюдження поза військовими й іншими великомасштабними проектами (авіація, залізничні перевезення). Основною причиною є складність освоєння мови і достатньо громіздкий синтаксис (значно громіздкіший, ніж Pascal).

Мови обробки даних. Всі перелічені мови є мовами загального призначення в тому сенсі, що вони не орієнтовані і не оптимізовані під використання яких-небудь специфічних структур даних або на застосування в яких-небудь специфічних областях. Було розроблено велику кількість мов, орієнтованих на достатньо специфічні застосування. У 1957 році була зроблена спроба створення мови для опису математичної обробки даних. Мова була названа APL (Application Programming Language). Її відмітною особливістю було використання математичних символів (що ускладнювало застосування на текстових терміналах; поява графічних інтерфейсів зняла цю проблему) і дуже могутній синтаксис, який дозволяв проводити безліч нетривіальних операцій прямо над складними об'єктами, не вдаючись до розбиття їх на компоненти. Широкому застосуванню перешкодило, як вже наголошувалося, використання нестандартних символів як елементів синтаксису. У 1962 році з'явилася мова Snobol (а в 1974 - його наступник Icon), призначена для обробки рядків. Синтаксис Icon нагадує C і Pascal одночасно. Відмінність полягає в наявності потужних вбудованих функцій роботи з рядками і пов'язана з цими функціями особлива семантика. Сучасним аналогом Icon і Snobol є Perl - мова обробки рядків і текстів, в яку додано деякі об'єктно-орієнтовані можливості. Вважається дуже практичною мовою, проте їй бракує елегантність. У 1969 році була створена мова SETL - мова для опису операцій над множинами. Основною структурою даних в мові є множина, а операції аналогічні математичним операціям над множинами. Корисна при написанні програм, що мають справу з складними абстрактними об'єктами.

Скриптові мови. Останнім часом у зв'язку з розвитком Інтернет-технологій та продуктивності комп'ютерів набули поширення так звані скриптові мови. Ці мови спочатку орієнтувалися на використання в якості внутрішніх керуючих мов у складних системах. Багато хто з них, проте ж, вийшов за межі сфери свого початкового застосування і використовуються нині в зовсім інших областях. Характерними особливостями даних мов є, по-перше, їх інтерпретованість (компіляція або неможлива, або небажана), по-друге, простий синтаксис, а по-третє, легка розширюваність. Таким чином, вони ідеально підходять для використання в часто змінних програмах, дуже невеликих програмах або у випадках, коли для виконання операторів мови витрачається час, неспівставний з часом їх розбору. Було створено чималу кількість таких мов. Мова JavaScript була створена в компанії Netscape Communications як мова для опису складної поведінки веб-сторінок. Спочатку називалася LiveScript, причиною зміни назви стали маркетингові міркування. Інтерпретується браузером під час відображення веб-сторінки. За синтаксисом схожа з Java і (віддалено) з C/C++. Має можливість використовувати вбудовану в браузер об'єктну функціональність, проте об'єктно-орієнтованою мовою не є. Мова VBScript була створена в корпорації Microsoft багато в чому як альтернатива JavaScript. Має схожу область застосування. Синтаксично схожий з мовою Visual Basic (і є урізаною версією останньої). Так само, як і JavaScript, виконується браузером при відображенні веб-сторінок і має той ступінь об’єктно-орієнтованості. Мова Perl створювалася в допомогу системному адміністраторові операційної системи Unix для обробки різного роду текстів і виділення потрібної інформації. Розвинулася до потужного засобу роботи з текстом. Є мовою, що інтерпретується, і реалізована практично на всіх існуючих платформах. Застосовується при обробці текстів, а також для динамічної генерації веб-сторінок на веб-серверах. Об'єктно-орієнтована мова програмування Python, що інтерпретується. За структурою та областю застосування близька до Perl, проте менш поширена та строгіша й логічніша. Є реалізації для більшості існуючих платформ.

Об’єктно-орієнтовані мови. Об'єктно-орієнтований підхід, що прийшов на зміну структурному, вперше з'явився зовсім не в C++, як вважають деякі. Існує ціла низка чистих об'єктно-орієнтованих мов, без відомостей про які наш огляд був би неповним. Першою об’єктно-орієнтованою мовою була мова Simula (1967). Ця мова була призначена для моделювання різних об'єктів і процесів, і об'єктно-орієнтовані риси з'явилися в ній саме для опису властивостей модельних об'єктів. Популярність об'єктно-орієнтованому програмуванню принесла мова Smalltalk, створену в 1972 році. Мова призначалася для проектування складних графічних інтерфейсів і була першою по-справжньому об'єктно-орієнтованою мовою. У ній класи і об'єкти - це єдині конструкції програмування. Великим недоліком Smalltalk є великі вимоги до пам'яті і низька продуктивність отриманих програм. Це пов'язано з не дуже вдалою реалізацією об'єктно-орієнтованих особливостей. Існує мова з дуже вдалою реалізацією об'ектної-орієнтованості, що не є надбудовою ні над якою іншою мовою – Eiffel (1986). Будучи чистою мовою об'єктно-орієнтованого програмування, вона, крім того, підвищує надійність програми шляхом використання „контрольних тверджень”.

Создание UML (Unified Modeling Language - Унифицированный Язык Моделирования) началось в 1994 году. В это время Грэйди Буч (Grady Booch) и Джеймс Рэмбо (James Rambaugh) начали объединять несколько методов объектно-ориентированного моделирования в фирме Rational Software. И уже в 1995 году была представлена спецификация метода, названного Unified Method. Первая версия UML была принята консорциумом OMG (Object Management Group) в январе 1997 года. Утвержденная же в сентябре версия UML 1.1 была принята на вооружение основными компаниями – производителями программного обеспечения, такими, как Microsoft, IBM, Hewlett-Packard и производителями CASE-средств, которые реализовали поддержку UML в своих программных продуктах (Paradigm Plus, Microsoft Visual Modeler for Visual Basic, Delphi и др.)

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

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

Функціональні мови. Основна ідея, що лежить в основі функціонального програмування, - це представлення програми у вигляді математичних функцій (тобто функцій, значення яких визначається лише їх аргументами, а не контекстом виконання). Оператор присвоєння в таких мовах не використовується (або, як мінімум, його використання не заохочується). Імперативні можливості, як правило, є, але їх застосування обставлене серйозними обмеженнями. Існують мови з пасивною та з активною семантикою. Відмінність полягає, грубо кажучи, в тому, що в мовах з активною семантикою обчислення проводяться в тому ж місці, де вони описані, а у разі пасивної семантики обчислення проводиться тільки тоді, коли воно дійсно необхідне. Перші мови мають ефективнішу реалізацію, тоді як другі - кращу семантику. З мов з активною семантикою згадаємо ML і два його сучасних діалекту - Standard ML (SML) і CAML. Останній має об'єктно-орієнтованого нащадка - Objective CAML (O’CaML). Серед мов з пасивною семантикою найбільш поширені два: Haskell і його більш простий діалект Clean.

Мови логічного програмування. Програми на мовах логічного програмування виражені як формули математичної логіки, а компілятор намагається отримати наслідки з них. Родоначальником більшості мов логічного програмування є мова Prolog (1971). У ній є низка нащадків - Parlog (1983, орієнтований на паралельні обчислення), Delta Prolog та ін.