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

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

скачати

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

Установа освіти

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

Реферат

на тему:

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

Гомель 2006

Зміст

Введення

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 Рівні мов програмування

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

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

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

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

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

  • Алфавіт значно ширше машинного, що робить його набагато більш виразним і істотно підвищує наочність і зрозумілість тексту;

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

  • Конструкція команд (операторів) відображає змістовні види обробки даних і задаються в зручному для людини вигляді;

  • Використовується апарат змінних і дії над ними;

  • Підтримується широкий набір типів даних

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

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

1.5.Компіліруемие й інтерпретовані мови

Мови програмування поділяються на два класи - компільовані й інтерпретовані.

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

Якщо програма написана на мові, що інтерпретується, то інтерпретатор безпосередньо виконує (інтерпретує) її текст без попереднього перекладу. При цьому програма залишається мовою оригіналу і не може бути запущена без інтерпретатора. Можна сказати, що процесор комп'ютера - це інтерпретатор машинного коду.

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

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

Для будь-якого інтерпретується мови можна створити компілятор - наприклад, мова Лісп, спочатку інтерпретується, може компілюватися без яких би то не було обмежень. Створюваний під час виконання програми код може так само динамічно компілюватися під час виконання.

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

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

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

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

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

Протягом багатьох років програмне забезпечення будувалося на основі операційних і процедурних мов, таких як Фортран, Бейсик, Паскаль, Ада, Сі. Сьогодні сучасні версії цих і їм подібних мов (Модула, Форт) домінують при розробці прикладних програмних засобів. Однак у міру еволюції мов програмування отримали широке поширення й інші, принципово інші підходи.

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

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

Модульне програмування - це мистецтво розбиття задачі на деяке число різних модулів, вміння широко використовувати стандартні модулі шляхом їх параметричної настройки, автоматизація складання готових модулів з ​​бібліотек, банків модулів.

Основні концепції модульного програмування:

  • кожен модуль реалізує єдину незалежну функцію;

  • кожен модуль має єдину точку входу і виходу;

  • кожен модуль має єдину точку входу і виходу;

  • розмір модуля по можливості повинен бути мінімізований;

  • кожен модуль може бути розроблений і закодований різними членами бригади програмістів і може бути окремо протестований;

  • вся система побудована з модулів;

  • модуль не повинен давати побічних ефектів;

  • кожен модуль не залежить від того, як реалізовані інші модулі.

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

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

Концепція модульного програмування реалізована в ряді мов, таких як 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. Моделі фон Неймана (традиційні мови програмування).

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

Скриптова мова (англ. scripting language, також називають мову сценаріїв) - мова програмування, розроблена для запису «сценаріїв», послідовностей операцій, які користувач може виконувати на комп'ютері. Прості скриптові мови раніше часто називали мовами пакетної обробки (batch languages ​​або job control languages). Сценарії завжди інтерпретуються, а не компілюються.

У прикладній програмі, сценарій (скрипт) - це програма, яка автоматизує деяке завдання, яке без сценарію користувач робив би вручну, використовуючи інтерфейс програми.

Оскільки сценарії інтерпретуються з початкового коду динамічно при кожного виконання, вони виконуються зазвичай значно повільніше готових програм, відтранслювати в машинний код на етапі компіляції. Тому сценарні мови не застосовуються для написання програм, що потребують оптимальності і швидкості виконання. Але з-за простоти вони часто застосовуються для написання невеликих, одноразових («проблемних») програм. Також, в плані швидкодії скриптові мови можна розділити на мови динамічного розбору (sh, command.com) і попередньо компільовані (Perl). Мови динамічного розбору прочитують інструкції з файлу програми мінімально потрібними блоками, і виконують ці блоки, не читаючи подальший код. Передкомпільовані мови спочатку прочитують всю програму, компілюють її всю або в машинний код, або в якийсь внутрішній формат, і лише потім - виконують код, що вийшов.

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

FORTRAN I

Математичні формули

ALGOL-58

Математичні формули

Flowmatic

Математичні формули

IPL V

Математичні формули

Перше покоління (1954-1958)

Друге покоління (1959-1961)

FORTRAN II

Підпрограми, роздільна компіляція

ALGOL-60

Блокова структура, типи даних

COBOL

Опис даних, робота з файлами

Lisp

Обробка списків, покажчики, збірка сміття

Третє покоління (1962-1970)

PL / I

FORTRAN + ALGOL + COBOL

ALGOL-68

Більш суворий приймач ALGOL-60

Pascal

Простіший приймач ALGOL-60

Simula

Класи, абстрактні дані

  • Втрачене покоління (1970-1980)

Мови створені, але не ті, що вижили. Наприклад, PL / 1, Malboge.

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

У 1830-і роки математик Чарльз Беббідж загорівся чудовою та (на той час) абсолютно божевільною ідеєю побудови "думаючої" машини. Він зважився на споруду повністю автоматичного рахункового пристрою. Ця машина повинна була виконувати одне додавання в секунду і працювати без участі людини. Напевно, першою мовою програмування потрібно вважати мову програмування для машини Беббідж. Він припускав, що його машина буде складати і віднімати за одну секунду, множити два пятідесятізначних числа за хвилину, ділити стозначного на пятідесятізначное теж за хвилину. Але він так і не добудував машину з-за браку коштів (до того часу вся машина цілком займала величезну кімнату) і робітників. Своїх грошей Беббідж не вистачило, а ніхто інший не погоджувався йому допомогти, тому що ніхто не вірив у цю затію з автоматичною машиною. Її навіть називали "дивацтвом Беббідж". А першим програмістом стала дочка лорда Байрона - Ада Лавлейс. Вона допомагала йому складати програми для цієї "чудо-машини".

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

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

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

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

DO 10 I = 1,100

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

DO10I = 1.100.

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

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

У 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'а) було викликано деякими практичними вимогами. Ці мови послужили фундаментом для більш пізніх розробок. Всі вони представляють одну і ту ж парадигму програмування. Наступні мови пішли істотно далі в своєму розвитку, в бік більш глибокого абстрагування.

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

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

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

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

У 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 + +, CLOS, Eiffel або Ada, але з-під зовнішньої краси буде виглядати стиль FORTRAN, Pascal або С. Виразна здатність об'єктно-орієнтованої мови буде або втрачена, або спотворена . Але ще більш істотно, що при цьому буде мало шансів впоратися зі складністю розв'язуваних завдань.

Абстрагування

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

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

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

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

На думку Сейдвіца і Старка "існує цілий спектр абстракцій, починаючи з об'єктів, які майже точно відповідають реаліям предметної області, і закінчуючи об'єктами, які не мають право на існування". Ось ці абстракції:

Абстракція сутності

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

Абстракція поведінки

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

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

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

Довільна абстракція

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

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

Інкапсуляція

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

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

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

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

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

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

Модульність

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

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

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

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

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

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

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

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

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

Ієрархія

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

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

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

Типізація

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

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

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

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

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

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

Паралелізм

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

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

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

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

  • "Проміжні результати обчислення виразів.

  • Локальні змінні у виклику процедур.

  • Власні змінні, глобальні змінні і динамічно створювані дані.

  • Дані, які зберігаються між сеансами виконання програми.

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

  • Дані, які взагалі переживають програму ".

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

Мови програмування, як правило, не підтримують поняття зберігання; примітним винятком є Smalltalk, в якому є протоколи для збереження об'єктів на диску та завантаження з диска. Проте, записувати об'єкти в неструктуровані файли - це підхід, придатний тільки для невеликих систем.

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

Визначимо сохраняемость наступним чином:

Збереженість - здатність об'єкта існувати в часі, переживаючи породив його процес, і (або) у просторі, переміщаючись зі свого первісного адресного простору.

Збереженість підтримує стан і клас об'єкта в просторі і в часі.

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

Наведемо характеристики об'єктно-орієнтованих мов програмування з точки зору семи основних елементів об'єктної моделі.

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

Абстракції

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

Так

Так

Так

Так

Інкапсуляція

Змінних

Методів

Закриті

Відкриті

Модульність

Різновиди модулів

Ні

Ієрархії

Успадкування

Шаблони

Метаклассов

Одиночне

Ні

Так

Типізація

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

Ні

Так (одиночний)

Паралельність

Багатозадачність

Непряма (за допомогою класів)

Збереженість

Довгоживучі об'єкти

Ні

Табл.2 Основні характеристики Object Pascal.

Абстракції

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

Так

Так

Ні

Ні

Інкапсуляція

Змінних

Методів

Відкриті

Відкриті

Модульність

Різновиди модулів

Модуль (unit)

Ієрархії

Успадкування

Шаблони

Метаклассов

Одиночне

Ні

Ні

Типізація

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

Так

Так (одиночний)

Паралельність

Багатозадачність

Ні

Збереженість

Довгоживучі об'єкти

Ні

Табл.3.Основние характеристики C + +.

Абстракції

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

Так
Так
Так
Так

Інкапсуляція

Змінних
Методів

Відкриті, захищені, закриті
Відкриті, захищені, закриті

Модульність

Різновиди модулів

файл

Ієрархії

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

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

Типізація

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

Так
Так (одиночний)

Паралельність

Багатозадачність

Непряма (за допомогою класів)

Збереженість

Довгоживучі об'єкти

Ні

Табл .4 Основні характеристики CLOS (Common Lisp Object System).

Абстракції

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

Так
Так
Так
Так

Інкапсуляція

Змінних
Методів

Читання, запис, доступ
Відкриті

Модульність

Різновиди модулів

Пакет

Ієрархії

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

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

Типізація

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

Можлива
Так (множинний)

Паралельність

Багатозадачність

Так

Збереженість

Довгоживучі об'єкти

Ні

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

Абстракції

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

Так
Так
Ні
Ні

Інкапсуляція

Змінних
Методів

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

Модульність

Різновиди модулів

Пакет

Ієрархії

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

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

Типізація

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

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

Паралельність

Багатозадачність

Так

Збереженість

Довгоживучі об'єкти

Ні

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

Абстракції

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

Так
Так
Ні
Ні

Інкапсуляція

Змінних
Методів

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

Модульність

Різновиди модулів

Блок (unit)

Ієрархії

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

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

Типізація

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

Так
Так

Паралельність

Багатозадачність

Ні

Збереженість

Довгоживучі об'єкти

Ні

Додаток

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

Position
Dec 2006

Position
Dec 2005

Delta in Position

Programming Language

Ratings
Dec 2006

Delta
Dec 2005

1

1

Java

19.907%

-2.36%

2

2

C

16.616%

-1.75%

3

3

C + +

10.409%

-0.39%

4

5

(Visual) Basic

8.912%

+1.33%

5

4

PHP

8.537%

-2.24%

6

6

Perl

6.396%

-0.74%

7

8

Python

3.762%

+1.00%

8

7

C #

3.171%

-0.11%

9

10

Delphi

2.569%

+1.11%

10

9

JavaScript

2.562%

+0.68%

11

20

9 *

Ruby

2.334%

+1.90%

12

11

SAS

2.232%

+1.06%

13

12

PL / SQL

1.345%

+0.28%

14

27

13 *

D

0.971%

+0.67%

15

17

ABAP

0.903%

+0.35%

16

15

Ada

0.661%

+0.07%

17

13

Lisp / Scheme

0.645%

-0.12%

18

14

COBOL

0.601%

-0.13%

19

16

Pascal

0.566%

-0.01%

20

37

17 *

Transact-SQL

0.472%

+0.31%

Висновок

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

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

Часто проводяться дискусії виду <мова A краще, ніж мова B>. Прочитавши цей огляд, можна переконається в безглуздості таких спорів. Максимум, про що може йти мова - це про переваги однієї мови над іншим при вирішенні тієї чи іншої задачі в тих чи інших умовах. Ось тут дійсно іноді є про що посперечатися. І рішення часом аж ніяк не очевидно.

Цей огляд мов програмування замислювався як відповідь тим, хто кричить <мова X MUST DIE>. Сподіваюся, що відповідь вийшла досить адекватним і переконливим.

Література

1.Інформатіка під редакцією Є.К. Хеннер, М., Академія, 2004р.

2.Інформатіка.Базовий курс під ред. С. В. Симоновича, С.-П «Пітер» 2005р.

3.Язикі програмування. Огляд-лікнеп. Хакер № 4, с.36-40.

4.Р.Богатирев, Природа та еволюція сценарних мов, Світ ПК, № 11,2001

5.Г.Буг, Об'єктно-орієнтований аналіз і проектування

6. Http:// citforum.ru

7. Http://school.keldysh.ru/sch444/MUSEUM / LANR / evol.htm

8. http://ru.wikipedia.org

9. Http://www.levenez.com/lang

10. http:// tiobe.com

53


Посилання (links):
  • http://school.keldysh.ru/sch444/MUSEUM% 20/LANR/evol.htm
  • http://www.levenez.com/lang
    Додати в блог або на сайт

    Цей текст може містити помилки.

    Програмування, комп'ютери, інформатика і кібернетика | Реферат
    208.9кб. | скачати


    Схожі роботи:
    Огляд можливостей мов електронних документів
    Походження мови Історичний розвиток мов
    Еволюція мов програмування
    Буковина - історичний огляд
    Буковина - історичний огляд
    Негатроніка Історичний огляд
    Класифікація мов
    Історичний огляд фінської літератури
    Генеалогічна класифікація мов 2
  • © Усі права захищені
    написати до нас