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

1. Коротка історія розвитку мов програмування

2.

• Перші складні багатоцільові обчислювальні пристрої
з’явилися у середині XIX ст. Тоді ж виникла необхідність у
розробці програм для них, і вперше з такою задачею
стикнулася Ада Лавлейс (Байрон), яка працювала в той час з
Чарльзом Беббіджем над його механічною обчислювальною
машиною «Difference Engine».
2

3.

Августа Ада Кинг Лавлейс
англ. Augusta Ada King
Byron, Countess of Lovelace
Род деятельности:
математик
Дата рождения:
10 декабря 1815
Место рождения:
Лондон, Великобритания
Гражданство:
Великобритания
Дата смерти:
27 ноября 1852 (36 лет)
Место смерти:
Лондон, Великобритания
(С) Wikipedia®
3

4.

• Мови програмування (в сучасному їх розумінні)
з’явилися уже в епоху електронних
обчислювальних машин (ЕОМ) в другій половині
ХХ сторіччя.
• Вважають, що перша мова програмування – це
мова Short Code, що з’явилася у 1949 році.
• Програмісти, що працювали на перших моделях
ЕОМ, повинні були програмувати в машинних
кодах.
4

5.

6.

• Першими мовами програмування високого рівня були
Фортран, Кобол і Алгол, що з’явилися у 50-х роках XX ст.
Перші дві із них і зараз використовуються, а Алгол став
родоначальником цілого сімейства мов, в тому числі і
Паскаля та Сі.
• В теперішній час налічується декілька тисяч мов
програмування, більша частина з яких має доволі вузьку
спеціалізацію.
• Мова Pascal розроблена і обґрунтована у 1968-69 роках
проф. Ніклаусом Віртом із Цюріха. Названа в честь
знаменитого французького математика Блеза Паскаля.
• Мова Сі розроблена на початку 1970-х років
співробітниками Bell Labs Кеном Томпсоном і Денісом Рітчі
для використання в операційній системі UNIX
6

7.

• Ніклаус Вірт (Niklaus E. Wirth)
Блез Паскаль (Blaise Pascal)
математик, філософ, літератор, фізик
19 червня 1623 … 19 серпня 1662 (39 років)
Місце народження: Клермон-Феран, Овернь
Місце смерті: Париж
Дата народження: 5 лютого 1934 (79 років)
Швейцарська вища технічна школа Цюріха,
Стенфордський університет,
Цюріхський університет
7

8.

Кен Томпсон та Денніс Рітчі на початку 1970-х
років за PDP-11
8

9.

Денніс Рітчі (09.09.1941 – 08.10.2011)
(Dennis MacAlistair Ritchie)
Кен Томпсон (04.02.1943)
(Kenneth Lane Thompson)
9

10.

11. Програмні засоби для розробки програм

1.
2.
3.
4.
Текстові редактори
Інтерпретатори
Компілятори (compiling)
Компонувальники (зв’язування, лінкування
(linking) )
5. Відлагоджувачі (debug)
6. Інтегровані середовища (IDE – Integrated
Development Environment)
11

12. Qt Creator

• Інтегроване середовище для розробки програм з
використанням Qt SDK (Software Development Kit).
• Qt (вимовляється «кьют») — крос-платформений
інструментарій розробки ПЗ мовою
програмування C++.
• Є також «привязування» до багатьох інших мов
програмування: Python — PyQt, PySide; Ruby —
QtRuby; Java — Qt Jambi; PHP — PHP-Qt та інші.
12

13.

14.

15.

– інтернет-пейджер Skype (www.skype.com), що
призначений для голосового зв’язку VoIP (Voice
Over IP), дзвінків на звичайні телефони та
проведення відеоконференцій через Інтернет;
15

16.

17.

– програма Adobe Photoshop Album
(www.adobe.com) для обробки растрових
зображень;
– Інтернет мапа світу Google Earth
(earth.google.com), котра дозволяє розглядати
поверхню нашої планети з висоти пташиного
польоту;
17

18.

19.

20.

– програма для віртуалізації операційних систем
VirtualBox (www.virtualbox.org) від Sun
Microsystems;
– вільний програвач VLC Media Player
(www.videolan.org/vlc/).
20

21. Qt Creator

22. Qt Creator

23. Qt Creator

24. Qt Creator

25. Qt Creator

26. Консольний додаток Qt Creator на Сі

27. Консольний додаток Qt Creator на Сі

28. Консольний додаток Qt Creator на Сі

Назва(Название:) та шлях(Создать в: ) повинні бути лише англійською мовою
та без спецсимволів.
В наступних діалогових вікнах можна лишати все за замовчуванням
28

29. Консольний додаток Qt Creator на Сі

30. Консольний додаток Qt Creator на Сі

31. Самостійна робота:

Встановити дома Qt та запустити консольний додаток, в якому
на екран виводиться текст з вашим П.І.Б та назвою групи.
Як підтвердження, роздрукувати скріншот на якому буде
робочій стіл вашого комп’ютера з відкритим Qt Creator-ом та
запущеним у ньому відповідним консольним додатком.
31

Історія мов програмування

Зі збільшенням обсягу обчислень з’явився перший рахунковий переносний інструмент – “Рахівниця”.

На початку 17 століття виникла необхідність в складних обчисленнях. потрібні були рахункові пристрої, здатні виконувати великий обсяг обчислень з високою точністю. У 1642 р французький математик Паскаль сконструював першу механічну лічильну машину – “паскалина”.

У 1830 р англійський учений Бебідж запропонував ідею першої програмованої обчислювальної машини ( “аналітична машина”). Вона повинна була приводиться в дію силою пара, а програми кодувалися на перфокарти. Реалізувати цю ідею не вдалося, так як було неможливо зробити деякі деталі машини.

Перший реалізував ідею перфокарт Холлерит. Він винайшов машину для обробки результатів перепису населення. У своїй машині він вперше застосував електрику для розрахунків. У 1930 році американський учений Буш винайшов диференціальний аналізатор – перший в світі комп’ютер.

Великий поштовх у розвитку обчислювальної техніки дала друга світова війна. Військовим знадобився комп’ютер, яким став “Марк-1” – перший в світі цифровий комп’ютер, винайдений в 1944 р професором Айкнем. У ньому використовувалося поєднання електричних сигналів і механічних приводів. Розміри: 15 X 2,5 м., 750000 деталей. Могла перемножити два 23-х розрядних числа за 4 с.

У 1946 р групою інженерів на замовлення військового відомства США було створено перший електронний комп’ютер – “ЕНІАК”. Швидкодія: 5000 операцій додавання і 300 операцій множення в секунду. Розміри: 30 м. В довжину, обсяг – 85 м3., Вага – 30 тонн. Використовувалося 18000 ел. ламп.

Перша машина з хронімой програмою – “ЕДСАК” – була створена в 1949 р, а в 1951 р створили машину “

Юнивак “- перший серійний комп’ютер з хронімой програмою. У цій машині вперше була використана магнітна стрічка для запису і зберігання інформації

Для чого потрібна мова програмування?

Комп’ютера з’явилися дуже давно в нашому світі, але тільки останнім вpемя їх почали так посилено використовувати в багатьох отpаслях людського життя. Ще десять років тому було рідкістю побачити який-небудь персональний комп’ютер – вони були, але були дуже дорогі, і навіть не кожна фірма могла мати у себе в офісі комп’ютер. А зараз? Тепер в кожному третьому будинку є комп’ютер, що уже глибоко ввійшов у життя самих мешканців будинку.

Сама ідея створення штучного інтелекту з’явилася давним давно, але тільки в 20 столітті її почали здійснювати. Спочатку з’явилися величезні комп’ютери, які були подчастей розміром з величезний будинок. Використання таких машин, як ви самі розумієте, було не дуже зручно. Але що поробиш? Але світ не стояв на одному місці еволюційного розвитку – мінялися люди, змінювалася їх Навколишнє середовище, і разом з нею мінялися і самі технології, усе більше удосконалюючись. І комп’ютери ставали все менше і менше за своїми розмірами, поки не досягли сьогоднішніх розмірів.

Але людині теж треба якось спілкуватися з машиною – адже кому потрібна некерована машина? Спочатку люди вели своє спілкування з комп’ютерів за допомогою перфокарт. Перфокарти – це невеликі картки, на які нанесені ряди цифр. У комп’ютера був “дисковод”, в який вставлялися самі карти і він за допомогою маленьких голочок ставив дірочки на цифрах. Таке спілкування мало кому приємно – адже не дуже зручно тягати з собою купи перфокарт, які після одного використання доводилося викидати.

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

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

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

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

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

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

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

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

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

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

Ми часто скаржимося, що інші люди не розуміють нас; але поки і самі персональні комп’ютери не здатні до кінця зрозуміти нас, або зрозуміти, що ми хочемо сказати з півслова. І протягом якогось періоду часу нам доведеться задовольнятися такими машинами, які просто йдуть нашим вказівкам, виконуючи їх “з точністю до міліметра”.

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

У наш час посилено використовуються мови програмування більш високого рівня, працювати з якими набагато легше ніж з Ассемблером, так як в них одне слово може замінювати відразу кілька команд. І до того ж більшість мов програмування високого рівня в назвах команд, використовуваних при спілкуванні з комп’ютером, використовують еквіваленти, названі на англійській мові, що, природно, полегшує програмування. Але в них є один мінус в порівнянні з мовами, подібними Асемблеру – в Асемблері все команди, що надходять з програми чітко розподіляються в пам’яті комп’ютера, займаючи вільні місця, тим самим значно виграючи у швидкості; а мови високого рівня не вміють цього, відповідно втрачаючи в швидкості виконання програми. А в нашому сьогоднішньому світі всім відомо, що: “Час – гроші”.

Хоча, поки комп’ютер поступається людині з точки зору творчої діяльності, тому що машина не наділена поки такими якостями, які змогли б їй допомогти створити що-небудь нове, що не введено в її пам’ять самою людиною.

Боьшінства людей, мабуть, вважають, що терміни “обчислювальна машина” і “обчислювальна техніка” синонімами і пов’язують їх з фізичним обладнанням, як, наприклад, мікропроцесором, дисплеєм, дисками, принтерами і іншими істройствамі, що привертають увагу людей, коли людина бачить комп’ютер. Хоча ці пристрої і важливі, все-таки вони становлять лише “верхівку айсберга”. На початковому етапі іспользованаія сучасного комп’ютера ми маємо справу не з самим комп’ютером, а з сукупністю правил, званих мовами программіроваанія, на яких вказуються дії, які повинен виконувати комп’ютер. Важливе значення мови програмування підкреслюється тим фактом, що сама обчислювальна машина може розглядатися як апаратний інтерпретатор якогось конкретного мови, який називається машинною мовою. Для забезпечення ефективної роботи машини розроблені машинні мови, використання яких представляє відомі трудностідля людини. Більшість користувачів не відчувають цих незручностей завдяки наявності одного або декількох мов, створених для поліпшення зв’язку людини з машиною. Гнучкість обчислювальної машини проявляється в тому, що вона може виконувати програми-транслятори (в загальному випадку ВПМ називаються компіляторами або інтерпретаторами) для перетворення програм з мов, орієнтованих на користувачів, в програми на машинній мові. (В свою чергу навіть самі програми, ігри, системні оболонки є ні чим іншим, як досить проста програма-транслятор, яка в міру роботи, або гри звертається за допомогою своїх команд до “комп’ютерним нутрощів і зовнішностями”, трансліуя свої команди в машинні мови . І все це відбувається в реальному часі.)

Машинні мови, мови асемблера і

мови високого рівня

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

2. Асемблерні мови

3. Мови високого рівня.

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

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

Одним з мовно високого рівня є мова програмування С.

Історія мови С

Мова з бере свій початок від двох мов, BCPL і B. У 1967 році Мартін Річардс розробив BCPL як мову для написання системного програмного забезпечення та компіляторів. У 1970 році Кен Томпсон використовував В для створення ранніх версій операційної системи UNIX на комп’ютері DEC PDP-7. як в BCPL, так і в В змінні не розділялися на тіпи- кожне значення даних займало одне слово в пам’яті і відповідальність на розрізнення, наприклад, цілих і дійсних чисел цілком лягала на плечі програміста.

Мова С був розроблений (на основі В) Деннісом Річі з Bell Laboratories і вперше був реалізований в 1972 році на комп’ютері DEC PDP-11. Популярність З отримав в якості мови ОС UNIX. Сьогодні практично всі основні операційні системи були написані на С та / або С ++. Після двох десятиліть З є в наявності на більшості комп’ютерів. Він не залежить від апаратної частини.

В кінці 70-х років З перетворився в те, що ми називаємо «традиційний С». У 1983 році Американським комітетом національних стандартів в області комп’ютерів і обробці інформації був заснований єдиний стандарт цієї мови.

висновок

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

Список використаної літератури

1. Том Сван “Освоєння Turbo Assembler”, Діалектика, Київ, 1996 г.

2. Березін Б.І., Березін С.Б. “Початковий курс програмування”, Діалог МІФІ, Москва, 1996 г.

3. Лекції окоренкову Ніни Вікторівни по предмету “Мови програмування та методи трансляції”

4.Х.М.Дейтел, Як програмувати на С, Видавництво Біном, Москва, 2000 р

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

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

Міністерство освіти Республіки Білорусь

Гомельський державний університет імені Ф. Скорини

Історичний огляд, класифікація та характеристики мов програмування

1. Поняття зика програмування

1.1 Машинний код

1.2 Алгоритм і програма

1.3 Що таке мова програмування

1.4 Рівні мов програмування

1.5 компільовані й інтерпретовані мови

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

3. Історичний огляд мов програмування

4. Характеристики мов програмування

4.1 Елементи об’єктної моделі

4.2 Характеристики мов програмування з точки зору елементів об’єктної моделі

Додаток. Популярність мов програмування

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

Один із підходів, що допомагає провести огляд мов програмування, – підхід історичний. Дійсно, на перший погляд все виглядає дуже просто. Спочатку було програмування в машинних кодах, коли програміст був єдиним посередником між іншими смертними і Машиною – гігантським “ламповим монстром”, що займає якщо не цілий будинок, то майже цілий поверх. Потім з’явилися мнемонічні подання машинного коду, асемблер і, нарешті, макроассемблер. В кінці 50-х виникли мови формульного програмування, з яких найбільш чудовим був Фортран, потім (у 60-х) центр ваги став потроху зміщуватися до нечисельних методам – з’явився АЛГОЛ. Ще трохи, і до 70-х років відбулася структурна революція – АЛГОЛ-W і, нарешті, Паскаль. Далі настала черга “модульної” програмування – Модула і Модула-2. Приблизно в цей же час народжується знаменитий мову Сі, йде нова революція логічного програмування – в ​​моді ПРОЛОГ та експертні системи. Пентагон проводить свій знаменитий конкурс, на якому перемагає Ада, а Японія заявляє про проект машин п’ятого покоління, заснованих на SmallTalk. У результаті відбувається об’єктно-орієнтована революція, з’являються С + +, Оберон, Eiffel і Модула-3.

Загальні тенденції розвитку мов програмування при історичному підході простежити цілком можливо, однак виклад виходить сумбурним і плутаним. Дивуватися тут нічому – ладно якби сталася, наприклад, структурна революція: програмістська громадськість присягнула на вірність програмування без “goto” і прощай Фортран! Але ні, і Фортран зараз “в ходу”, а якщо згадати про його досягли успіху дітей Basic і Visual Basic, то доведеться визнати, що “некрологи” Фортрану більш ніж двадцятирічної давності виглядають у наш час як пісня історичний курйоз. Хоча вірно і те, що тих версій мови Фортран, що були чверть століття тому, вже не залишилося, та й машин, на яких з ними працювали, зараз знайдеш хіба що в музеї. Мова Паскаль також, в порівнянні з багатьма іншими мовами, зараз вже не молодий, але це не заважає йому залишатися одним з найбільш популярних мов і в наші дні. А Кобол? У нього ще більш похилий вік, а якщо подивитися по конференціях на Internet – виявиться, що дуже багато робіт і зараз проводиться на Коболе.

Інший можливий класифікаційний критерій мов програмування – це революційні ідеї програмування, які втілилися у відповідних рішеннях: структурне програмування, модульне програмування, об’єктно-орієнтоване програмування. Однак і тут чіткої класифікації не вийде. Приміром, Паскаль виник як “продукт” структурної революції, вдало ввібрав в себе ідеї революції “модульної”, і сьогодні існує практично на всіх комп’ютерних платформах в об’єктно-орієнтованих втіленнях. Інший приклад: прихильники мови С + +, як правило, найважливішим його перевагою називають об’єктно-орієнтоване програмування. Однак було б неправильно вважати, що С + + став популярним тільки завдяки об’єктів – як і об’єктно-орієнтована Паскаль, С + + є мовою гібридним. Застосування об’єктно-орієнтованої парадигми при роботі на ньому зовсім не обов’язково, і багато програмісти в практичній роботі цими можливостями як в С + +, так і в об’єктно-орієнтованому Паскалі не користуються. Точно так само, працюючи з сучасними компіляторами мови Паскаль, наприклад з широко відомими Borland Pascal / Turbo Pascal (Borland) 7.0 для IBM PC або Think Pascal (Symantec) для комп’ютерів Macintosh, можна в явному вигляді не користуватися модульними можливостями, оформляючи вихідний код програми майже у повній відповідності зі стандартним Паскалем. Помилковий підхід, скаже інший шанувальник прогресу. Проте початковий код, що відповідає стандарту, буде володіти високою переносимістю на різні платформи. Можуть бути й інші резони як для стандартних, так і для гібридних підходів. Мабуть, тому розробники об’єктно-орієнтованої мови Модула-3 зробили принцип “гібридності” одним з основних у своїй мові. З іншого боку, існує велика група чистих об’єктно-орієнтованих мов, де об’єктно-орієнтована парадигма є обов’язковою. Прикладом такої мови може служити Dee.

Здавалося б, ще один зручний класифікаційна ознака – популярність мови: чим мова популярніша – тим він кращий, так може, недовго думаючи, і розбити всі мови на “погані” і “хороші”? Однак добре відомо, що комерційний успіх того або іншого продукту не є об’єктивною оцінкою якості. Мода – минуща, особливо якщо її прихід стимулюється гучною рекламою і значними капіталовкладеннями. І наскільки вона популярна мова, тим більше суперечок навколо нього, чим більше у нього прихильників – тим більше і супротивників. Так, в самий найближчий час багато суперечок можна буде почути про мову Java. Чи не викличе прихильність цієї мови принципам об’єктно-орієнтованого програмування відтоку його прихильників – і тих, хто не прагне використовувати об’єктно-орієнтоване програмування на практиці, і тих, хто вважає, що в ряді сучасних мов (наприклад в С + + або в Eiffel) ці принципи реалізовані повніше?

І, нарешті, ще один критерій – рівень мови. Традиційно до мов низького рівня відносять асемблери, а до мов високого рівня всі інші універсальні мови програмування, втім, для таких мов, як Форт (FORTH), Сі і т. д., іноді виділяється якийсь “проміжний” рівень. Крім цього, робилися неодноразові спроби виділити будь-якої мову або групу мов на “надвисокий” рівень, наприклад для макросредств електронних таблиць. Не потрібно вдаватися в деталі, щоб відчути всю умовність і цієї класифікації. Тим більше, якщо врахувати, що більшість реалізацій сучасних мов програмування високого рівня мають багаті низькорівневі можливості. Скажімо, Inline-директива, що дозволяє записувати у вихідному тексті машинні коди, або вбудований асемблер, як, наприклад, це зроблено в Borland Pascal. Відзначимо, що, як правило, вбудований асемблер набагато зручніше – запис в кодах на його фоні виглядає анахронізмом. При необхідності програмування будь-якого фрагмента програми на низькому рівні можна застосовувати і звичайний “не вбудований” асемблер. У загальному випадку в сучасних мовних середовищах цілком можливо програмувати різні модулі однієї і тієї ж програми на різних мовах, наприклад і на кількох мовах високого рівня. Відзначимо, однак, що на практиці цього краще не робити без особливих причин.

Дуже проблематична класифікація мов і за назвою. Наприклад, Н. Вірт заявляє, що недоліки концепцій мови Паскаль долаються в мовах Модула-2 і Оберон: “Назви я ці мови Паскаль-2 і Паскаль-3 . їх еволюційна лінія була б очевидна”. Напрошується питання – що є мова, а що є діалект мови: наприклад, стандартний Паскаль, розширений Паскаль (Extended Pascal) і Turbo Pascal – три різні мови або три діалекти Паскаля?

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

1.Поняття мови програмування

1.1 Машинний код

Процесор комп’ютера – велика інтегральна мікросхема. Всі команди і дані він отримує у вигляді електричних сигналів. Фактично процесор можна розглядати як величезну сукупність досить простих електричних елементів – транзисторів. Транзистор має три висновки. На два крайніх подається напруга, необхідне для створення в транзисторі електричного струму, а на середній висновок – напруга, за допомогою якого можна управляти внутрішнім опором транзистора, а значить, управляти і струмом, і напругою на його висновках.

В електроніці транзистори мають 3 застосування: для створення підсилювачів, в електронних схемах, що володіють автокабельнимі властивостями, і в електронних перемикачах. Останній спосіб і застосовується в цифровій обчислювальній техніці. У процесорі комп’ютера транзистори згруповані в мікроелементи, звані трилерами і вентилями. Трилери мають два стійких стани (відкритий – закритий) і переключається з одного стану в інший електричними сигналами. Цим стійким станам відповідають математичні поняття 0 і 1. Вентилі трохи складніше – вони можуть мати кілька входів (напруга на виходах залежить від комбінацій напруг на входах) і служать для найпростіших арифметичних і логічних операцій).

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

1.2 Алгоритм і програма

Керувати комп’ютером треба за певним алгоритмом. Алгоритм – точно визначений опис способу розв’язання задачі у вигляді кінцевої (за часом) послідовності дій. Такий опис ще називають формальним. Для представлення алгоритму у вигляді, зрозумілим комп’ютеру, служать мови програмування. Спочатку завжди розробляють алгоритм дій, а потім він записується на одному з таких мов. У підсумку виходить текст програми – повне, закінчене та детальний опис алгоритму мовою програмування. Потім цей текст програми спеціальними службовими програмами, які називаються трансляторами, або переводиться в машинний код, або виконується.

1.3 Що таке мова програмування

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

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

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

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

1.4 Рівні мов програмування

Різні типи процесорів мають різні набори команд. Якщо мова програмування орієнтований на конкретний тип процесора і враховує його особливості, то він називається мовою програмування низького рівня. Оператори мови низького рівня близькі до машинного коду і орієнтовані на конкретні команди процесора.

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

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

Мови програмування, що імітують природні мови, що володіють укрупненими командами, орієнтованими на рішення прикладних змістовних завдань, називаються мовами високого рівня.

Мови програмування високого рівня мають наступні особливості:

  • Алфавіт значно ширше машинного, що робить його набагато більш виразним і істотно підвищує наочність і зрозумілість тексту;
  • Набір операцій, допустимих для використання, не залежить від набору машинних операцій, а вибираються з міркувань зручності формулювання алгоритмів розв’язання задач певного класу;
  • Конструкція команд (операторів) відображає змістовні види обробки даних і задаються в зручному для людини вигляді;
  • Використовується апарат змінних і дії над ними;
  • Підтримується широкий набір типів даних

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

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

Концепція модульного програмування реалізована в ряді мов, таких як Modula 2, Turbo Pascal 5.0 і вище, C, Python, Perl.

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

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

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

З мов об’єктного програмування, популярних серед професіоналів, слід назвати насамперед C + +, для більш широкого кола програмістів переважні середовища типу Delphi і Visual Basic.

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

Декларативні мови поділяються на два класи: функціональні та логічні.

Функціональне програмування – парадигма програмування, в якій процес обчислення трактується як обчислення значень функцій у математичному розумінні (тобто тих, чий єдиний результат роботи полягає в повернутому значенні, або іншими словами, обчислення яких не має побічного ефекту); спосіб вирішення завдання описується за допомогою залежно функцій один від одного (в тому числі можливі рекурсивні залежності), але без вказівки послідовності кроків.

Типовим представником функціональних мов програмування є Лісп. В основі мови Лісп лежить лямбда-числення. Лямбда-числення – формалізм для представлення функцій і способів їх комбінування. Разом зі своїм еквівалентом-комбінаторної логікою, в якій не використовуються змінні, – запропоновано близько 1930 логіками Черчем, Шейнфінкелем і Каррі.

В лямбда-численні Черча функція записується у вигляді l (x 1, x 2, . xn). Fn

В Ліспі лямбда-вираз має вигляд:

(LAMBDA (x1, x2, . xn). Fn).

Символ LAMBDA означає, що ми маємо справу з визначенням функції. Символи xi є формальними параметрами, вони утворюють список, званий лямбда-списком; fn – тіло функції, яка може мати довільну форму, що допускаються інтерпретатором Ліспу. Тілом функції може бути константа або композиція з викликів функцій.

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

Все сказане вище можна відобразити наступною схемою:

Наведемо інші класифікації мов програмування.

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

  1. Прості операційні моделі (мови, засновані на кінцевих автоматах, машині Тьюринга);
  2. Аплікативного моделі (мови на основі лямбда-числення Черча, системи комбінаторів Каррі, чистого Ліспу);
  3. Моделі фон Неймана (традиційні мови програмування).

FORTRAN I Математичні формули
ALGOL-58 Математичні формули
Flowmatic Математичні формули
IPL V Математичні формули

FORTRAN II Підпрограми, роздільна компіляція
ALGOL-60 Блокова структура, типи даних
COBOL Опис даних, робота з файлами
Lisp Обробка списків, покажчики, збірка сміття

PL / I FORTRAN + ALGOL + COBOL
ALGOL-68 Більш суворий приймач ALGOL-60
Pascal Простіший приймач ALGOL-60
Simula Класи, абстрактні дані

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

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

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

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

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

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

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

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

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

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

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

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

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

Відомості про більш пізніх мовах будемо приводити у вигляді опису сімейств мов. Це дозволить краще простежити взаємозв’язки між окремими мовами

У 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 нагадує С і Pascal одночасно. Відмінність полягає в наявності потужних вбудованих функцій роботи з рядками і пов’язана з цими функціями особлива семантика. Сучасним аналогом Icon і Snobol є Perl-мова обробки рядків і текстів, в який додані деякі об’єктно-орієнтовані можливості. Вважається дуже практичним мовою, проте йому бракує елегантності.

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

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

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

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

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

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

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

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

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

На початку 70-х років Роберт Ковальський, у той час працював в Единбурзі, і Алан Колмерое з Марселя розробляли подібні ідеї і навіть працювали разом протягом одного літа. У результаті були сформульовані основні положення логічного програмування, в 1972 році описано та реалізовано перший мова логічного програмування – Пролог (“програмування мовою логіки” – PROgramming in LOGic).

Функціональні мови програмування

Теорія, покладена в основу функціонального підходу народилася у 20-х – 30-х роках XX століття. У числі розробників математичних основ функціонального програмування можна назвати Мозеса Шенфінкель (Німеччина і Росія) і Хаскелл Каррі (Англія), що розробили комбінаторну логіку, а також Алонзо Черча (США) – творця -Числення.

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

У зв’язку з цією обставиною все більшу роль починає грати типізація. В кінці 70-х – початку 80-х років XX століття інтенсивно розробляються моделі типізації, що підходять для функціональних мов. З’являється безліч типізованих функціональних мов: ML (Робін Мілнер, 1979, з нині використовуються діалектів відомі Standard ML і Objective CAML), Scheme (1975), Hope, Miranda (Девід Тернер, 1985), Clean і багато інших. До того ж постійно збільшується число діалектів.

У результаті вийшло так, що практично кожна група, що займається функціональним програмуванням, використовувала власну мову. Це перешкоджало подальшому поширенню цих мов і породжувало численні більш дрібні проблеми. Щоб виправити ситуацію, об’єднана група провідних дослідників у галузі функціонального програмування вирішила відтворити переваги різних мов в новому універсальному функціональному мовою. Перша реалізація цієї мови, названого Haskell на честь Хаскелл Каррі, була створена в 1990 році. В даний час дійсний стандарт Haskell-98.

Нижче наведемо схему «Еволюція мов програмування».

4. Характеристики мов програмування

4.1 Елементи об’єктної моделі

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

  • абстрагування;
  • інкапсуляція;
  • модульність;
  • ієрархія.

  • типізація;
  • паралелізм;
  • сохраняемость.

Об’єкт представляє собою корисну модель якоїсь суті в предметній області

Об’єкт складається з узагальненого безлічі операцій

Абстракція віртуальної машини

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

Об’єкт включає в себе набір операцій, не мають один з одним нічого спільного

Абстракція фокусується на суттєвих з точки зору спостерігача характеристики об’єкта.

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

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

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

Інкапсуляцію можна визначити наступним чином:

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

Інкапсуляція приховує деталі реалізації об’єкта.

На думку Майерса “Поділ програми на модулі до деякої міри дозволяє зменшити її складність . Однак набагато важливішим є той факт, що всередині модульної програми створюються безлічі добре визначених і документованих інтерфейсів. Ці інтерфейси неоціненними для вичерпного розуміння програми в цілому”. У деяких мовах програмування, наприклад в Smalltalk, модулів немає, і класи складають єдину фізичну основу декомпозиції. В інших мовах, включаючи Object Pascal, C + +, Ada, CLOS, модуль – це самостійна мовна конструкція. У цих мовах класи та об’єкти становлять логічну структуру системи, вони поміщаються в модулі, що утворюють фізичну структуру системи. Це властивість стає особливо корисним, коли система складається з багатьох сотень класів.

Згідно Барбарі Лісков “модульність – це поділ програми на фрагменти, які компілюються окремо, але можуть встановлювати зв’язки з іншими модулями”. Ми будемо користуватися визначенням Парнасу: “Зв’язки між модулями – це їхні уявлення один про одного”. У більшості мов, які підтримують принцип модульності як самостійну концепцію, інтерфейс модуля відділений від його реалізації. Таким чином, модульність і інкапсуляція ходять рука об руку. У різних мовах програмування модульність підтримується по-різному. Наприклад, в C + + модулями є відокремленими компільовані файли. Для C / C + + традиційним є приміщення інтерфейсної частини модулів в окремі файли з розширенням. H (так звані файли-заголовки). Реалізація, тобто текст модуля, зберігається у файлах з розширенням з (у програмах на C + + часто використовуються розширення. Її,. СР і. Срр). Зв’язок між файлами оголошується директивою макропроцесора # include. Такий підхід будується виключно на угоді і не є суворою вимогою самої мови. У мові Object Pascal принцип модульності формалізований кілька суворіше. У цій мові визначено особливий синтаксис для інтерфейсної частини і реалізації модуля (unit). Мова Ada йде ще на крок далі: модуль (званий package) також має дві частини – специфікацію і тіло. Але, на відміну від Object Pascal, допускається роздільне визначення зв’язків з модулями для специфікації і тіла пакету. Таким чином, допускається, щоб тіло модуля мало зв’язку з модулями, невидимими для його специфікації.

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

Модулі виконують роль фізичних контейнерів, в які поміщаються визначення класів і об’єктів при проектуванні системи. Така ж ситуація виникає у проектувальників бортових комп’ютерів. Логіка електронного обладнання може бути побудована на основі елементарних схем типу НЕ, І-НЕ, АБО-НЕ, але можна об’єднати такі схеми в стандартні інтегральні схеми (модулі), наприклад, серій 7400, 7402 або 7404.

Модульність дозволяє зберігати абстракції роздільно.

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

Модульність – це властивість системи, яка була розкладена на внутрішньо зв’язкові, але слабо пов’язані між собою модулі.

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

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

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

Ієрархія – це впорядкування абстракцій, розташування їх по рівнях.

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

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

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

Ідея узгодження типів займає в понятті типізації центральне місце. Наприклад, візьмемо фізичні одиниці виміру. Ділячи відстань на час, ми очікуємо отримати швидкість, а не вагу. У множенні температури на силу сенсу немає, а в множенні відстані на силу – є. Все це приклади сильної типізації, коли прикладна область накладає правила і обмеження на використання та поєднання абстракцій.

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

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

Сувора типізація запобігає змішування абстракцій.

Є завдання, в яких автоматичні системи повинні обробляти багато подій одночасно. В інших випадках потреба в обчислювальній потужності перевищує ресурси одного процесора. У кожній з таких ситуацій природно використовувати декілька комп’ютерів для виконання завдання чи задіяти багатозадачність на многопроцессорном комп’ютері. Процес (потік управління) – це фундаментальна одиниця дії в системі. Кожна програма має принаймні один потік управління, паралельна система має багато таких потоків: століття одних недовгий, а інші живуть протягом всього сеансу роботи системи. Реальна паралельність досягається тільки на багатопроцесорних системах, а системи з одним процесором імітують паралельність за рахунок алгоритмів поділу часу.

Паралелізм – це властивість, що відрізняє активні об’єкти від пасивних.

Паралелізм дозволяє різним об’єктам діяти одночасно.

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

  • “Проміжні результати обчислення виразів.
  • Локальні змінні у виклику процедур.

  • Власні змінні, глобальні змінні і динамічно створювані дані.
  • Дані, які зберігаються між сеансами виконання програми.
  • Дані, які зберігаються при переході на нову версію програми.
  • Дані, які взагалі переживають програму “.

Абстракції Змінні примірника
Методи примірника
Змінні класу
Методи класу
Так Так Так Так
Інкапсуляція Змінних Методів Закриті Відкриті
Модульність Різновиди модулів Ні
Ієрархії Успадкування Шаблони Метаклассов Одиночне Ні Так
Типізація Сильна типізація
Поліморфізм
Ні Так (одиночний)
Паралельність Багатозадачність Непряма (за допомогою класів)
Збереженість Довгоживучі об’єкти Ні

Абстракції Змінні примірника
Методи примірника
Змінні класу
Методи класу
Так Так Ні Ні
Інкапсуляція Змінних Методів Відкриті Відкриті
Модульність Різновиди модулів Модуль (unit)
Ієрархії Успадкування Шаблони Метаклассов Одиночне Ні Ні
Типізація Сильна типізація
Поліморфізм
Так Так (одиночний)
Паралельність Багатозадачність Ні
Збереженість Довгоживучі об’єкти Ні

Абстракції Змінні примірника
Методи примірника
Змінні класу
Методи класу
Так
Так
Так
Так
Інкапсуляція Змінних
Методів
Відкриті, захищені, закриті
Відкриті, захищені, закриті
Модульність Різновиди модулів файл
Ієрархії Успадкування
Шаблони
Метаклассов
Множинне
Так
Ні
Типізація Сильна типізація
Поліморфізм
Так
Так (одиночний)
Паралельність Багатозадачність Непряма (за допомогою класів)
Збереженість Довгоживучі об’єкти Ні

Табл .4 Основні характеристики CLOS (Common Lisp Object System).
Абстракції Змінні примірника
Методи примірника
Змінні класу
Методи класу
Так
Так
Так
Так
Інкапсуляція Змінних
Методів
Читання, запис, доступ
Відкриті
Модульність Різновиди модулів Пакет
Ієрархії Успадкування
Шаблони
Метаклассов
Множинне
Ні
Так
Типізація Сильна типізація
Поліморфізм
Можлива
Так (множинний)
Паралельність Багатозадачність Так
Збереженість Довгоживучі об’єкти

Табл. 5 Основні характеристики Ada

Змінні примірника
Методи примірника
Змінні класу
Методи класу

Відкриті, закриті
Відкриті, закриті

Успадкування
Шаблони
Метаклассов

Ні (входить в Ada9x)
Так
Ні

Сильна типізація
Поліморфізм

Так
Ні (входить в Ada9x)

Табл. 6 Основні характеристики Eiffel.

Змінні примірника
Методи примірника
Змінні класу
Методи класу

Закриті
Відкриті, закриті

Успадкування
Шаблони
Метаклассов

Множинне
Так
Ні

Сильна типізація
Поліморфізм

Таблиця «популярності мов програмування »(TIOBE Programming Community Index for December 2006)

Position
Dec 2006

Position
Dec 2005