Парадигми програмування
Об'єктно орієнтоване програмування
Найбільш поширена зараз парадигма. Це підвид імперативного програмування — воно ґрунтується на послідовних викликах команд, які змінюють дані, з якими працює програма. Таким чином вона оперує об'єктами, і це зручно для багатьох програм.
Початківців часто лякає абревіатура ОВП, але освоїти парадигму об'єктно-орієнтованого програмування не так складно, як здається. Свого часу ця ідея виявилася вірусною: створювати об'єкти, що належать класам, а також використовувати методи як дії, які може виконати об'єкт або які можна зробити над ним. Багато фахівців із Computer Science дотримуються такого підходу. Велика перевага тут у тому, що програмісту, який використовує ОВП, легко розібратися, що відбувається у програмі. Достатньо подивитися, які дії робить кожен із об'єктів.
Найлегше використовувати ОВП у Python, складніше — у C++. Але якщо в цих мовах у програміста ще є можливість уникнути ООП (наприклад, для Python цілком підходить функціональне програмування), то в Java і C # завжди необхідно створювати класи, одних функцій недостатньо.
Абстракція даних
Абстрагування означає виділення значної інформації та виняток із розгляду незначущої. У ОВП розглядають лише абстракцію даних (нерідко називаючи її просто «абстракцією»), маючи на увазі набір найбільш значних характеристик об'єкта, доступних іншій програмі.
Інкапсуляція
Інкапсуляція - властивість системи, що дозволяє об'єднати дані та методи, що працюють з ними, у класі. Одні мови (наприклад C++, Java або Ruby) ототожнюють інкапсуляцію з приховуванням, але інші (Smalltalk, Eiffel, OCaml) розрізняють ці поняття.
Успадкування
Спадкування - властивість системи, що дозволяє описати новий клас на основі вже існуючого з частково або повністю запозиченою функціональністю. Клас, від якого виробляється успадкування, називається базовим, батьківським чи суперкласом. Новий клас — нащадком, спадкоємцем, дочірнім чи похідним класом.
Поліморфізм підтипів
Поліморфізм підтипів (в ООП званий просто «поліморфізмом») — властивість системи, що дозволяє використовувати об'єкти з однаковим інтерфейсом без інформації про тип та внутрішню структуру об'єкта. Інший вид поліморфізму - параметричний - в ООП називають узагальненим програмуванням.
Клас
Клас - універсальний, комплексний тип даних, що складається з тематично єдиного набору "полів" (змінних більш елементарних типів) і "методів" (функцій для роботи з цими полями), тобто він є моделлю інформаційної сутності з внутрішнім та зовнішнім інтерфейсами для оперування своїм вмістом (значення полів). Зокрема, у класах широко використовуються спеціальні блоки з одного або частіше двох спарених методів, які відповідають за елементарні операції з певним полем (інтерфейс присвоювання та зчитування значення, геттер-сеттер), які імітують безпосередній доступ до поля. Ці блоки називаються «властивостями» і майже збігаються за конкретним ім'ям зі своїм полем (наприклад, ім'я поля може починатися з малої, а ім'я властивості — з великої літери). Іншим проявом інтерфейсної природи класу і те, що з копіюванні відповідної змінної через присвоєння копіюється лише інтерфейс, але з самі дані, тобто клас — тип даних. Змінна об'єкт, що відноситься до заданого класом типу, називається екземпляром цього класу. При цьому в деяких системах клас також може представлятися деяким об'єктом при виконанні програми за допомогою динамічної ідентифікації типу даних. Зазвичай класи розробляють таким чином, щоб забезпечити цілісність даних об'єкта, що відповідають природі об'єкта і вирішуваній задачі, а також зручний і простий інтерфейс. У свою чергу, цілісність предметної області об'єктів та їх інтерфейсів, а також зручність їх проектування забезпечується успадкуванням.
Об'єкт
Сутність в адресному просторі обчислювальної системи, що з'являється під час створення екземпляра класу (наприклад, після запуску результатів компіляції та зв'язування вихідного коду виконання).
Основу ОВП було закладено на початку 1960-х років. Прорив у використанні екземплярів та об'єктів був досягнутий у MIT з PDP-1, і першою мовою програмування для роботи з об'єктами став Simula 67. Він був розроблений Крістен Найгаард та Оле-Джохан Даль у Норвегії з метою створення симуляторів. Вони працювали над симуляціями вибуху кораблів та зрозуміли, що можуть згрупувати кораблі у різні категорії. Кожному типу судна було вирішено привласнити свій власний клас, який повинен містити набір унікальних характеристик і даних. Таким чином, Simula не лише запровадила поняття класу, а й представила робочу модель.
Термін "об'єктно-орієнтоване програмування" був уперше використаний Xerox PARC у мові програмування Smalltalk. Поняття ООП використовувалося для позначення процесу використання об'єктів як основу для розрахунків.
Функціональна парадигма програмування займає друге місце після ООП. Це розвиток ідей декларативного програмування: програма створюється як інструмент, який вирішує визначену задачу і в підсумку дає потрібний результат.
Між послідовниками різних парадигм, що виявилися в одному ветці коментарів, завжди розгорається бесконечний холівар з обвиненнями в «ООП/ФП головного мозку». Але бують і програмісти, готові застосувати будь-який із підходів у залежності від проекту.
Найбільш характерний для функціонального програмування мова — Haskell. У реальних проектах він застосовується рідко, але будто створений для красивих рішень у духу FP — тому Haskell став культовим серед професійних програмістів, які віддають перевагу цій парадигмі.
У ФП код програми складається з функцій, для яких детально прописано, що має бути на вході, а що — на виході. Причому одну функцію цілком можна подати на вхід до іншої в якості аргумента. Так програма виконується, запуская потрібні функції.
Преимущества функціонального підходу — в тому, що код легко читати, а тестування спрощується. Все тому, що дії, вироблені функцією, не залежать від зовнішнього стану. Виповнення коду стає більш прогнозованим, а неожиданні побічні ефекти — менш вірогідними.
Крім об'єктно-орієнтованого та функціонального програмування, є й інші парадигми. Деякі з них вже витеснені більш сучасними підходами. Але є і специфічні парадигми, які потрібні для конкретних ситуацій. Расскажем про кілька самих розпростертих.
Цей підхід є різновидом імперативної парадигми програмування. Процедурами тут називають команди, які застосовуються у певному порядку та послідовно змінюють стан пам'яті. Після всіх команд програма видає результат.
Процедурне програмування застосовується у класичних мовах на зразок C і Pascal, а й у найсучасніших. Наприклад, Go, де крім процедурного підходу можна застосувати і ООП, але з обмеженою функціональністю.
При процедурному підході простіше писати та підтримувати код, ніж при об'єктно-орієнтованому, але водночас програми важче масштабувати та створювати на їх основі складні проекти.
До них відносяться: 1С, Ada, Алгол 60, Алгол 68, Basic (до появления Visual Basic), Си, КОБОЛ, Фортран, Модула-2, HAL/S, Pascal, PureBasic,ПЛ/1, РАПИРА, REXX, Go, Nim
У цій парадигмі програміст створює узагальнені уявлення для класів та функцій. Тобто не просто класи, які можуть успадковуватись (як в ОВП), а шаблони функцій чи класів (якщо застосувати такий підхід у C++). Спочатку у них немає вимог типу даних для вхідних параметрів, тому шаблони можна зробити більш універсальними.
Перевага цієї парадигми в тому, що можна створювати алгоритми, які працюватимуть з різними типами, і для цього не доведеться додавати реалізації для кожного типу окремо. Такий підхід можна поєднати як з ОВП, і з іншими сучасними парадигмами програмування.
Логічне програмування – це підвид декларативного. Заснований на виведенні інформації із заданих фактів та логічних правил, які до них можна застосувати. За виконання програм використовуються правила формальної логіки.
Можливість застосувати цю парадигму закладена у мові Prolog - він дозволяє вводити пропозиції у вигляді фактів та набору правил. Розробку Prolog розпочали ще 1970 року, і метою було зрозуміти природну мову. Логіка використовується як формалізувати його семантику. Якщо мати фактичну інформацію про предметної області, можна автоматизувати видачу інформації за схемою «питання — відповідь».
Хоча переважна більшість розробників використовують об'єктно-орієнтоване чи функціональне програмування, ці парадигми не стали абсолютними монополістами. Не виключено, що з розвитком технологій, наприклад, при перенесенні частини обчислювальних завдань на квантові комп'ютери, актуальною стане якась нова, ще не створена парадигма.
Короткий огляд мов програмування
Cтрого типизированный объектно-ориентированный язык программирования общего назначения, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Разработка ведётся сообществом, организованным через Java Community Process; язык и основные реализующие его технологии распространяются по лицензии GPL. Права на торговую марку принадлежат корпорации Oracle.
Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре, для которой существует реализация виртуальной Java-машины. Дата официального выпуска — 23 мая 1995 года. Занимает высокие места в рейтингах популярности языков программирования (2-е место в рейтингах IEEE Spectrum (2020)[2] и TIOBE (2021).
Суворо типізована об'єктно-орієнтована мова програмування загального призначення, розроблена компанією Sun Microsystems (надалі придбаною компанією Oracle). Розробка ведеться спільнотою, організованою через Java Community Process; мова та основні технології, що реалізують її, поширюються за ліцензією GPL. Права на торгову марку належать корпорації Oracle.
Програми Java зазвичай транслюються у спеціальний байт-код, тому вони можуть працювати на будь-якій комп'ютерній архітектурі, для якої існує реалізація віртуальної Java-машини. Дата офіційного випуску – 23 травня 1995 року. Займає високі місця у рейтингах популярності мов програмування (2-е місце у рейтингах IEEE Spectrum (2020)[2] та TIOBE (2021).
Спочатку мова називалася Oak («Дуб»), розроблявся Джеймсом Гослінг для програмування побутових електронних пристроїв. Через те, що мова з такою назвою вже існувала, Oak була перейменована на Java. Названий на честь марки кави Java, яка, у свою чергу, отримала назву однойменного острова (Ява), тому на офіційній емблемі мови зображено чашку з гарячою кавою. Існує й інша версія походження назви мови, пов'язана з алюзією на кавоварку як приклад побутового пристрою, для програмування якого спочатку мова створювалася. Відповідно до етимології в російськомовній літературі з кінця двадцятого і до перших років двадцять першого століття назва мови нерідко перекладалася як Ява, а не транскрибувалася.
В результаті роботи проекту світ побачив принципово новий пристрій, кишеньковий персональний комп'ютер Star7, який випередив свій час більш ніж на 10 років, але через велику вартість 50 доларів не зміг зробити переворот у світі технології і був забутий.
Пристрій Star7 не був популярним, на відміну від мови програмування Java та його оточення. Наступним етапом життя стала розробка інтерактивного телебачення. 1994 року стало очевидним, що інтерактивне телебачення було помилкою.
З середини 1990-х років мова стала широко використовуватися для написання клієнтських програм та серверного програмного забезпечення. Тоді ж певного поширення набула технологія Java-аплетів - графічних Java-додатків, що вбудовуються у веб-сторінки; З розвитком можливостей динамічних веб-сторінок у 2000-ті роки технологія стала застосовуватися рідко.
У веб-розробці застосовується Spring Framework; Для документування використовується утиліта Javadoc.
Основні особливості мови
Програми Java транслюються в байт-код Java, що виконується віртуальною машиною Java (JVM) - програмою, що обробляє байтовий код і передає інструкції обладнання як інтерпретатор.
Перевагою такого способу виконання програм є повна незалежність байт-коду від операційної системи та обладнання, що дозволяє виконувати Java-програми на будь-якому пристрої, для якого існує відповідна віртуальна машина. Іншою важливою особливістю технології Java є гнучка система безпеки, в рамках якої виконання програми повністю контролюється віртуальною машиною. Будь-які операції, які перевищують встановлені повноваження програми (наприклад, спроба несанкціонованого доступу до даних або з'єднання з іншим комп'ютером), викликають негайне переривання.
Часто до вад концепції віртуальної машини відносять зниження продуктивності. Ряд удосконалень дещо збільшив швидкість виконання програм на Java:
застосування технології трансляції байт-коду в машинний код безпосередньо під час роботи програми (JIT-технологія) з можливістю збереження версій класу в машинному коді
широке використання платформно-орієнтованого коду (native-код) у стандартних бібліотеках
апаратні засоби, що забезпечують прискорену обробку байт-коду (наприклад, технологія Jazelle, яку підтримують деякі процесори архітектури ARM).
За даними сайту shootout.alioth.debian.org, для семи різних завдань час виконання на Java становить у середньому у півтора-два рази більше, ніж для C/C++, у деяких випадках Java швидше, а в окремих випадках у 7 разів повільніше. З іншого боку, більшість їх споживання пам'яті Java-машиной було у 10—30 разів більше, ніж програмою на C/C++. Також примітне дослідження, проведене компанією Google, згідно з яким відзначається суттєво нижча продуктивність і більше споживання пам'яті в тестових прикладах Java в порівнянні з аналогічними програмами на C++.
Ідеї, закладені в концепцію та різні реалізації середовища віртуальної машини Java, надихнули безліч ентузіастів на розширення переліку мов, які могли б бути використані для створення програм, що виконуються на віртуальній машині. Ці ідеї знайшли також вираз у специфікації загальномовної інфраструктури CLI, закладеної основою платформи .NET компанією Microsoft.
Усередині Java існує кілька основних сімейств технологій:
Java SE - Java Standard Edition, основне видання Java, містить компілятори, API, Java Runtime Environment; підходить для створення додатків користувача, в першу чергу - для настільних систем.
Java EE - Java Enterprise Edition, являє собою набір специфікацій для створення програмного забезпечення рівня підприємства. У 2017-му проект Java EE було передано Eclipse Foundation, після чого було перейменовано на Jakarta EE. Модулі Java EE видалені з Java SE, починаючи з 11-ї версії.
Java ME - Java Micro Edition, створена для використання у пристроях, обмежених за обчислювальною потужністю, наприклад, у мобільних телефонах, КПК, вбудованих системах;
Java Card – технологія надає безпечне середовище для програм, що працюють на смарт-картах та інших пристроях з дуже обмеженим обсягом пам'яті та можливостями обробки.
Java та Microsoft
Компанія Microsoft розробила власну реалізацію JVM під назвою Microsoft Java Virtual Machine
(MSJVM), що включалася до складу різних операційних систем, починаючи з Windows 98 (також входила до Internet Explorer від версії 3 і вище, що дозволяло використовувати MSJVM в Windows 95 і Windows NT 4 після установки IE3+ на дані ОС).
MSJVM мала істотні відмінності від Sun Java, що багато в чому ламають основну концепцію переносимості програм між різними платформами:
відсутність підтримки програмного інтерфейсу виклику віддалених методів (RMI);
відсутність підтримки технології JNI;
наявність нестандартних розширень, таких як засоби інтеграції Java і DCOM, що працюють тільки на платформі Windows.
Тісна інтеграція Java з DCOM і Win32 поставила під питання кроссплатформенну парадигму мови. Згодом це стало приводом для судових позовів з боку Sun Microsystems до Microsoft. Суд прийняв бік компанії Sun Microsystems. У кінцевому рахунку між двома компаніями було досягнуто домовленості про можливість продовження терміну офіційної підтримки користувачів нестандартної Microsoft JVM до кінця 2007 року.
У 2005 році компанією Microsoft для платформи .NET була представлена Java-подібна мова J#, яка не відповідає офіційній специфікації мови Java і виключена згодом із стандартного інструментарію розробника Microsoft Visual Studio, починаючи з Visual Studio 2008.
Java та Android
Мова Java активно використовується для створення мобільних програм під операційну систему Android. При цьому програми компілюються в нестандартний байт-код для використання їх віртуальною машиною Dalvik (починаючи з Android 5.0 Lollipop, віртуальна машина замінена на ART). Для такої компіляції використовують додатковий інструмент, а саме Android SDK (Software Development Kit), розроблений компанією Google.
Розробку додатків можна вести в середовищі Android Studio, NetBeans, в середовищі Eclipse, використовуючи при цьому плагін Android Development Tools (ADT) або IntelliJ IDEA. Версія JDK повинна бути 5.0 або вище.
8 грудня 2014 року Android Studio визнана компанією Google офіційним середовищем розробки під ОС Android.
Наступні успішні проекти реалізовані із залученням Java (J2EE) технологій: RuneScape, Amazon, eBay, LinkedIn, Yahoo!
Наступні компанії переважно фокусуються на Java (J2EE) технологіях: SAP, IBM, Oracle. Зокрема, СУБД Oracle Database включає JVM як свою складову частину, що забезпечує можливість безпосереднього програмування СУБД мовою Java, включаючи, наприклад, процедури, що зберігаються.
Продуктивність
Програми, написані на Java, мають репутацію більш повільних і займають більше оперативної пам'яті, ніж написані мовою C. Проте швидкість виконання програм, написаних мовою Java, була суттєво покращена з випуском у 1997—1998 роках так званого JIT-компілятора у версії 1.1 на додаток до інших особливостей мови для підтримки кращого аналізу коду (такі як внутрішні класи, клас StringBuffer спрощені логічні обчислення і так далі). Крім того, було зроблено оптимізацію віртуальної машини Java - з 2000 року для цього використовується віртуальна машина HotSpot. Станом на лютий 2012 року, код Java 7 приблизно в 1,8 рази повільніший за код, написаний мовою Сі.
Деякі платформи пропонують апаратну підтримку виконання Java. Наприклад, мікроконтролери, що виконують код Java на апаратному забезпеченні замість програмної JVM, а також засновані на ARM процесори, які підтримують виконання байткод Java через опцію Jazelle.
Метапрограмування. Створення програм, які створюють інші програми як результат своєї роботи, які змінюють або доповнюють себе під час виконання. Приклад, коли можна говорити про метапрограмування: програма на мові C++ генерує скрипт на SQL для внесення даних до реляційної бази даних. Можна говорити про два різновиди метапрограмування: метапрограмування на стадії компіляції (генерація коду) та метапрограмування на стадії виконання (самомодифікація коду). Під метапрограмуванням у рамках бібліотеки VivaCore слід розуміти можливість розширення синтаксису та функціональності мови Сі/Сі++ для створення власної мови програмування. Створені метапрограми цією мовою програмування можуть бути трансльовані з використанням VivaCore в код мовою Сі/Сі++ і скомпільовані зовнішнім компілятором.