Еволюція мов програмування

02.09.2015

Фортран

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

У Фортране наступна конструкція описує «цикл for до мітки 10 при зміні індексу від 1 до 100»:

DO 10 I=1,100

Якщо ж тут замінити кому на крапку, то вийде оператор присвоювання:

DO10I = 1.100

Кажуть, що така помилка змусила ракету вибухнути під час старту!

Мова Фортран використовувався (і використовується донині) для наукових обчислень. Він страждає від відсутності багатьох звичних мовних конструкцій та атрибутів, компілятор практично ніяк не перевіряє синтаксично правильну програму з точки зору семантичної коректності (відповідність типів та ін.). У ньому немає підтримки сучасних способів структурування коду і даних. Це усвідомлювали і самі розробники. За визнанням самого Бекуса, перед ними стояло завдання швидше розробки компіляторів, ніж мови. Розуміння самостійного значення мов програмування прийшло пізніше.

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

Cobol

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

PL/1

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

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

BASIC

У 1963 році в Дартмурском коледжу (Dartmouth College) був створений мова програмування BASIC (Beginners All-Purpose Symbolic Instruction Code — багатоцільовий мову символічних інструкцій для початківців). Мова замислювався в першу чергу як засіб навчання і як перший досліджуваний мову програмування. Він передбачався легко интерпретируемым і компилируемым. Треба сказати, що BASIC дійсно став мовою, на якому вчаться програмувати (принаймні, так було ще кілька років тому; зараз ця роль відходить до Pascal). Було утворено кілька потужних реалізацій 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. Вони характеризуються рухом у бік об’єктно — та компонентно-орієнтованості.

C-подібні мови

У 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).

Мови обробки даних

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

APL

У 1957 році була зроблена спроба створення мови для опису математичної обробки даних. Мова був названий APL (Application Programming Language). Його відмінною рисою було використання математичних символів (що ускладнювало застосування на текстових терміналах; поява графічних інтерфейсів зняло цю проблему) і дуже потужний синтаксис, який дозволяв проводити безліч нетривіальних операцій прямо над складними об’єктами, не вдаючись до розбивання їх на компоненти. Широкому застосуванню завадило, як вже зазначалося, використання нестандартних символів як елементів синтаксису.

Snobol і Icon

У 1962 році з’явився мова Snobol (а в 1974 — його наступник Icon), призначений для обробки рядків. Синтаксис Icon нагадує С і Pascal одночасно. Відмінність полягає в наявності потужних вбудованих функцій роботи з рядками і пов’язана з цими функціями особлива семантика. Сучасним аналогом Icon і Snobol є Perl — мова обробки рядків і текстів, в який додані деякі об’єктно-орієнтовані можливості. Вважається дуже практичним мовою, однак йому бракує елегантності.

SETL

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

Lisp і йому подібні мови

У 1958 році з’явилася мова Lisp — мову для обробки списків. Отримав досить широке поширення в системах штучного інтелекту. Має кілька нащадків: Planner (1967), Scheme (1975), Common Lisp (1984). Багато його риси були успадковані сучасними мовами функціонального програмування.

Скриптові мови

останнім часом у зв’язку з розвитком Інтернет-технологій, широким поширенням високопродуктивних комп’ютерів і поруч інших факторів набули поширення так звані скриптові мови. Ця мови спочатку орієнтувалися на використання в якості внутрішніх керуючих мов у різного роду складних системах. Багато з них, однак, вийшли за межі свого початкового застосування і використовуються нині в зовсім інших областях. Характерними особливостями цих мов є, по-перше, їх інтерпретованість (компіляція або неможлива або небажана), по-друге, простота синтаксису, а в-третіх, легка розширюваність. Таким чином, вони ідеально підходять для використання в часто змінюваних програмах, дуже невеликих програмах або у випадках, коли для виконання операторів мови витрачається час, непорівнянне з часом їх розбору. Було створено досить велику кількість таких мов, перерахуємо лише основні і найбільш часто використовуються.

JavaScript

Мова був створений в компанії Netscape Communications в якості мови для опису складного поведінки веб-сторінок. Спочатку називався LiveScript, причиною зміни назви отримали маркетингові міркування. Інтерпретується браузером під час перегляду веб-сторінки. З синтаксису схожий з Java і (віддалено) з C/C++. Має можливість використовувати вбудовану в браузер об’єктну функціональність, однак справді об’єктно-орієнтованою мовою не є.

VBScript

Мова був створений в корпорації Microsoft в чому як альтернативу JavaScript. Має схожу сферу застосування. Синтаксично схожий з мовою Visual Basic і є урізаною версією останнього). Так само, як і JacaScript, виповнюється браузером при відображенні веб-сторінок і має ту ж ступінь об’єктно-орієнтованості.

Perl

Мова створювався допомога системного адміністратора операційної системи Unix для обробки різного роду текстів і виділення потрібної інформації. Розвинувся до потужного засобу роботи з текстами. Є интерпретируемым мовою і реалізований на практично всіх наявних платформах. Застосовується при обробці текстів, а також для динамічної генерації веб-сторінок на веб-серверах.

Python

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

Об’єктно-орієнтовані мови

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

Simula

Першим об’єктно-ориентрованным мовою була мова Simula (1967). Ця мова був призначений для моделювання різних об’єктів і процесів, і об’єктно-орієнтовані риси з’явилися в ньому саме для опису властивостей модельних об’єктів.

Smalltalk

Популярність об’єктно-орієнтованого програмування приніс мова Smalltalk, створений у 1972 році. Мова призначався для проектування складних графічних інтерфейсів і був першим по-справжньому об’єктно-орієнтованою мовою. У ньому класи і об’єкти — це єдині конструкції програмування. Великим недоліком Smalltalk є великі вимоги до пам’яті і низька продуктивність отриманих програм. Це пов’язано з не дуже вдалою реалізацією об’єктно-орієнтованих особливостей. Популярність мов C++ і Ada 95 пов’язана саме з тим, що об’єктно-орієнтованість реалізована без істотного зниження продуктивності.

Eiffel

Існує мову з дуже гарною реалізацією об’єктно-орієнтованості, не є надбудовою над якою іншою мовою. Це мова Eiffel (1986). Будучи чистою мовою об’єктно-орієнтованого програмування, він, крім того, підвищує надійність програми шляхом використання контрольних тверджень».

Мови паралельного програмування

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

Мова occam

Мова occam був створений в 1982 році і призначений для програмування трансп’ютерів — багатопроцесорних систем розподіленої обробки даних. Він описує взаємодію паралельних процесів у вигляді каналів — способів передачі інформації від одного процесу до іншого. Відзначимо особливість синтаксису мови occam — в ньому послідовний і паралельний порядки виконання операторів рівноправні, і їх необхідно явно вказувати ключовими словами PAR і SEQ.

Модель паралельних обчислень Linda

У 1985 році була запропонована модель паралельних обчислень Linda. Основним її завданням є організація взаємодії між паралельно выполняющимися процесами. Це досягається за рахунок використання глобальної кортежной області (tuple space). Процес може помістити туди кортеж з даними (тобто сукупність кількох, можливо різнорідних, даних), а інший процес може очікувати появи в кортежной області деякого кортежу і, після його появи, прочитати кортеж з можливим наступним його видаленням. Зауважимо, що процес може, наприклад, помістити кортеж в область і завершитися, а інший процес може через деякий час скористатися цим кортежем. Таким чином забезпечується можливість асинхронної взаємодії. Очевидно, що за допомогою такої моделі може бути сэмулировано і синхронне взаємодія. Linda — це модель паралельних обчислень, вона може бути додана в будь-яку мову програмування. Існують досить ефективні реалізації Linda, обходящие проблему існування глобальної кортежной області з потенційно необмеженим обсягом пам’яті.

Неимперативные мови

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

Функціональні мови

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

мов з енергійною семантикою згадаємо ML і два його сучасних діалекту — Standard ML (SML) і CaML. Останній має об’єктно-орієнтованого нащадка — Objective CaML (O » CaML).

Серед мов з ледачою семантикою найбільш поширені два: Haskell і його більш простий діалект Clean.

Більш докладні відомості про функціональних мовах наведені тут:

Мови логічного програмування

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

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

Замість висновку

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

Метою даного огляду була спроба дати читачеві уявлення про всім різноманітті існуючих мов програмування. Серед програмістів часто побутує думка про «загальної застосовності» тієї чи іншої мови (C, C++, Pascal і т.п.). Це думка виникає з кількох причин: брак інформації, звичка, інертність мислення. Я спробував трохи компенсувати перший фактор. Щодо решти можу лише сказати, що справжній професіонал повинен постійно прагнути підвищувати свої професійну кваліфікацію. А для цього потрібно не боятися експериментувати. Ну і що, що все навколо пишуть на C/С++/VB/Pascal/Perl/Java/… (потрібне підкреслити)? А чому б не спробувати що-небудь новеньке? А раптом це виявиться ефективніше? Зрозуміло, перш ніж братися використовувати нову мову, потрібно уважно вивчити всі його особливості, включаючи наявності ефективної реалізації, можливості взаємодії з існуючими модулями і т. п. і тільки після цього приймати рішення. Зрозуміло, завжди є ризик піти не тим шляхом, але… Не помиляється лише той, хто нічого не робить.

І ще. Мені доводилося чути, а часом і брати участь в дискусіях виду «мова A краще, ніж мова B». Я сподіваюся, що, прочитавши цей огляд, багато переконаються в безглуздості таких спорів. Максимум, про що може йти мова — це про переваги однієї мови над іншим при вирішенні тієї чи іншої задачі в тих чи інших умовах. Ось тут дійсно інколи є про що посперечатися. І рішення часом зовсім не очевидно. Однак сперечатися «взагалі» — очевидна дурість.

Ця стаття замислювалася як відповідь тим, хто кричить «мову X MUST DIE». Сподіваюся, що відповідь вийшла досить адекватним і переконливим. Сподіваюся також, що стаття має, крім полемічної, і пізнавальну цінність.

Короткий опис статті: мова програмування

Джерело: Еволюція мов програмування

Також ви можете прочитати