Яка різниця між декларативним та імперативним програмуванням? [зачинено]


541

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


3
Імператив іде в ресторан і замовляє 6 унцій. стейк (варений рідко), фрі (з кетчупом), салат (з ранчо) і кокс (без льоду). Офіціант доставляє саме те, що він просив, і за нього платять 14,50 доларів. З іншого боку, Декларатив іде в ресторан і каже офіціанту, що він хоче заплатити близько 12 доларів за вечерю, і він налаштований на стейк. Офіціант повертається з 6 унціями. стейк (варене середовище), столову картопляне пюре, парову брокколі, рулет для обіду і склянку води. Його стягують 11,99 дол.
cs_pupil

Відповіді:


786

Чудовий приклад декларативного проти імперативного програмування C # - LINQ.

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

Наприклад, почнемо з цієї колекції і виберемо непарні числа:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

Завдяки імперативному програмуванню ми переглянемо це і вирішимо, що хочемо:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

Ось ми говоримо:

  1. Створіть підбірку результатів
  2. Перегляньте кожне число колекції
  3. Перевірте число, якщо воно непарне, додайте його до результатів

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

var results = collection.Where( num => num % 2 != 0);

Тут ми говоримо "Дайте нам усе, де це не дивно", а не "Перегляньте колекцію. Перевірте цей предмет, якщо він незвичайний, додайте його до колекції результатів".

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


8
+1. Однак ви спочатку згадуєте LINQ, але які приклади стосуються цього?
Зано

15
collection.Where використовується декларативні методи розширення LINQ. Це не використання мов C #, а декларативний API. Я не хотів тут змішувати повідомлення, саме тому я уникав мовних доповнень, побудованих на основі декларативних методів.
Рід Копсей

241
Мені здається, що декларативне програмування - це не що інше, як шар абстракції.
Дражен Беловук

8
Це хороша відповідь, але це відповідь на різницю між нечистим функціональним та імперативним програмуванням. collection.Whereне використовує декларативний синтаксис, який надає Linq - див. msdn.microsoft.com/en-us/library/bb397906.aspx для прикладів from item in collection where item%2 != 0 select item. Виклик функції не стає декларативним програмуванням лише тому, що ця функція знаходиться в просторі імен System.Linq.
Піт Кіркхем

30
@PeteKirkham Синтаксис, який ви використовуєте, не є проблемою - декларативний проти імперативу більше стосується оголошення того, що ви хочете, аби пояснити, як саме це має відбуватися. Використання синтаксису інтегрованого синтаксису або методу розширення є окремою проблемою.
Рід Копсей

145

Декларативне програмування - це коли ти кажеш, що хочеш, а імперативна мова - це коли ти кажеш, як отримати те, що ти хочеш.

Простий приклад в Python:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

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

Зв'язати на прикладі C #, як правило, використовуючи результати LINQ в декларативному стилі, оскільки ви не говорите, як отримати те, що ви хочете; ви говорите лише те, що хочете. Можна сказати те саме про SQL.

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

SELECT score FROM games WHERE id < 100;

"компілятор" SQL може "оптимізувати" цей запит, оскільки він знає, що idце індексоване поле - або, можливо, він не індексований. А може, двигун SQL знає, що це ідеальний час для використання всіх 8 ядер для швидкого паралельного пошуку. Ви , як програміст, не переймаєтесь жодним із цих умов, і вам не потрібно писати свій код, щоб таким чином обробляти будь-який особливий випадок.


30
Цей приклад Python НЕ є декларативним.
Хуанхо Конті

18
@Juanjo: Це IS decalarative.
зниклий фактор

3
Як перше твердження тут більш декларативне, ніж друге?
zenna

17
Погодьтеся з Хуанхо і Денною - контурна конструкція не магічно перетворюється на декларативну програму, коли її переробляють на більш короткі позначення.
Фелікс Френк

11
Не погоджуючись з @FelixFrank і схиляючись до "сміливого" заяви @ missingfaktor. Традиційний, "повністю" декларативний спосіб зробити це filter(lambda x: x < 5, range(20)), є лише черговим перетворенням на коротші позначення. Це жодним чином не відрізняється від виразу розуміння списку (який має чіткі розділи "карта" та "фільтр"), який був створений (див. Pep 202 ) з явним наміром створити більш стислі позначення. І це розуміння списку було б в цьому випадку більш чітким / ідіоматичним.
yoniLavi

100

Декларативний проти імперативного

парадигма програмування є фундаментальним стилем програмування. Існує чотири основні парадигми: імперативна, декларативна, функціональна (яка вважається підмножиною декларативної парадигми) та об'єктно-орієнтована.

Декларативне програмування : це парадигма програмування, яка виражає логіку обчислення (що робити), не описуючи його потік управління (How do). Деякі відомі приклади декларативних мов, специфічних для домену (DSL), включають CSS, регулярні вирази та підмножину SQL (SELECT запити, наприклад) Багато мов розмітки, такі як HTML, MXML, XAML, XSLT ..., часто декларативні. Декларативне програмування намагається розмити різницю між програмою як набором інструкцій і програмою як твердженням про бажану відповідь.

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

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

Наступний приклад імперативного програмування в MSDN перебирає числа 1 на 10 та знаходить парні числа.

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);

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


7
Чи можете ви додати опис для об'єктно-орієнтованого?
mbigras


54

У всіх вищезазначених відповідях та інших онлайнових публікаціях згадується наступне:

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

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

  • Наприклад, LINQ є декларативнішим, ніж цикли (для, в той час, і т.д.), наприклад, ви можете використовувати list.Where()для отримання нового відфільтрованого списку. Для цього Microsoft зробила все важке підняття за абстракцією LINQ.

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

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

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

// JavaScript example

// Least declarative
const bestProducts = [];
for(let i = 0; i < products.length; i++) {
    let product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
const bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

PS Крайність декларативного програмування полягає у винайденні нових доменних мов (DSL):

  1. Пошук рядків : регулярне вираження замість спеціального імперативного коду
  2. React.js : JSX замість прямої маніпуляції з DOM
  3. AWS CloudFormation : YAML замість CLI
  4. Реляційна база даних : SQL замість старих API для читання та запису, таких як ISAM або VSAM.

Є багато прикладів хороших декларативних запрограмовані: Реагувати , CloudFormation , Terraform
engineforce

Отже, "декларативне" програмування означає лише переміщення коду, який виконує завдання до функції?
Гійом Ф.

@GuillaumeF. Йдеться про створення конкретної домену абстракції. Напр., - у банківській справі: вам слід створити такі функції, як debit, depositі т.д., замість повторення коду, що account.balance += depositAmount
порушує,

44

Додам ще один приклад, який рідко спливає в декларативно-імперативному обговоренні програмування: Інтерфейс користувача!

У C # ви можете побудувати інтерфейс користувача за допомогою різних технологій.

На завершення, ви можете використовувати DirectX або OpenGL, щоб дуже імперативно намалювати свої кнопки, прапорці тощо ... по черзі (або насправді трикутник за трикутником). Вам належить сказати, як намалювати інтерфейс користувача.

На завершення, у вас є WPF. Ви в основному пишете деякі XML (так, так, "XAML" технічно), і фреймворк працює для вас. Ви кажете, як виглядає інтерфейс користувача. Саме система повинна розібратися, як це зробити.

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

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

Суть усього цього:

Декларативний -> whatви хочете зробити

Імператив -> howви хочете, щоб це було зроблено


27

Мені сподобалося пояснення з курсу в Кембриджі + їхні приклади:

  • Декларативний - вкажіть, що робити, а не як це зробити
    • Напр .: HTML описує те, що повинно з’являтися на веб-сторінці, а не як його слід малювати на екрані
  • Імператив - вкажіть і те, і як
    • int x; - що (декларативне)
    • x=x+1; - як

"не як це слід малювати на екрані" ... То чи означає це, що тоді CSSє імперативним ?
Chef_Code

11
Ні. Це також можна вважати декларативним, оскільки ви просто говорите, що хочете - "зробіть цю межу клітинки синьою" . Уявіть, що ви хочете намалювати ту саму межу в імперативному підході (Наприклад: JavaScript). Тоді вам потрібно сказати «перейти до точки (x1, y1), провести синю лінію між цією точкою та (x2, y1), провести синю лінію від (x2, y1) до (x2, y2), провести синю лінію від (x2, y2) до (x1, y2), намалюйте синю лінію від (x1, y2) до (x1, y1) " .
ROMANIA_engineer

@ROMANIA_engineer, де я можу знайти такий курс у Кембриджі, будь ласка?
тестова команда

@testteam, шукайте в Google тег "cl.cam.ac.uk викладання ooprog". Ви можете змінити роки за URL-адресою.
ROMANIA_engineer

@ROMANIA_engineer, отримав, спасибі
тестова команда

26

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


Ви можете подивитися на кожну інструкцію як на падіння десь на континуумі:

Ступінь абстракції:

Declarative <<=====|==================>> Imperative

Приклад декларативного реального світу:

  1. Бібліотекар, будь ласка, перевірте мені копію Мобі Діка. (Бібліотекар на власний розсуд обирає найкращий метод для виконання запиту)

Приклад імперативного реального світу:

  1. Зайдіть у бібліотеку
  2. Знайти систему організації книг (Каталог карт - Стара школа)
  3. Дослідження використання каталогів карт (Ви теж забули, правда)
  4. З’ясуйте, як маркуються та організовуються полки.
  5. З’ясуйте, як організовані книги на полиці.
  6. Розташування перехресних довідників із каталогу карток із системою організації для пошуку зазначеної книги.
  7. Візьміть книгу до системи виїзду.
  8. Перевірте книгу.

Хіба це не більше абстрагування, ніж декларативне / імперативне? Ви все ще закликаєте бібліотекаря принести книгу.
kamathln

Оновлена ​​відповідь, щоб бути більш повною і включити цей аспект у рішення.
Lucent Fox

3
У цьому є деяка правда, але це не повне визначення. За допомогою декларативного програмування ви заявляєте кінцеву мету, не зважаючи на вихідну точку. При імперативному програмуванні важлива визначена початкова точка. Це як різниця в наданні адреси проти вказівки. Адреса корисна незалежно від того, хто ви є. Тоді як вказівки недійсні, якщо ви починаєте десь в іншому місці.
Cthutu

24

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

Декларативний стиль має дві переваги перед імперативним стилем:

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

Calvert, C Kulkarni, D (2009). Основний LINQ. Аддісон Веслі. 48.


11

Імперативне програмування вказує чітко комп'ютеру, що робити, і як це робити, як-от вказівка ​​порядку та іншого

C #:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

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

C # - набагато більш імперативна мова програмування, але деякі функції C # більш декларативні, як Linq

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

Те саме можна було написати обов'язково:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(приклад з wikipedia Linq)


2
У вас помилка друку: Виписки linq є декларативними, а не імперітивними (у вас "функції C # є більш імперативними, як Linq" слід читати декларативні.
Reed Copsey

Виправлено (деякий час тому)
Маккей

8

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

З http://en.wikipedia.org/wiki/Declarative_programming

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

Хорошим порівнянням є модель ASP.Net "за кодом". У вас є декларативні файли ".ASPX", а потім обов'язкові файли коду "ASPX.CS". Я часто виявляю, що якщо я можу зробити все, що мені потрібно, в декларативній половині сценарію набагато більше людей можуть стежити за тим, що робиться.


7

Викрасти Філіп Робертс тут :

  • Імперативне програмування повідомляє машині, як щось робити (в результаті чого ви хочете статися)
  • Декларативне програмування повідомляє машині, що ви хочете, щоб це сталося (і комп'ютер визначає, як це зробити)

Два приклади:

1. Подвоєння всіх чисел у масиві

В обов’язковому порядку:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

Декларативно:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

2. Підведення підсумків усіх елементів у списку

В обов’язковому порядку

var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

Декларативно

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15

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


5
Як і у страхітливій кількості відповідей на це питання, ваш приклад «декларативного» програмування є прикладом функціонального програмування. Семантика "map" - "застосувати цю функцію до елементів масиву в порядку". Ви не дозволяєте виконувати час роботи в порядку виконання.
Піт Кіркем

4

Імперативне програмування
Мова програмування, яка вимагає дисципліни дисципліни, такі як C / C ++, Java, COBOL, FORTRAN, Perl та JavaScript. Програмісти, які пишуть такими мовами, повинні розробити належний порядок дій, щоб вирішити проблему, спираючись на знання обробки та програмування даних.

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

Прикладами декларативного програмування є CSS, HTML, XML, XSLT, RegX.


2

декларативна програма - це лише дані для якоїсь більш-менш «універсальної» імперативної реалізації / vm.

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

мінуси: ви гадаєте правильно. загальний (і параметризований DSL) імперативний алгоритм / vm реалізація може бути повільнішим та / або голодним, ніж специфічний. У деяких випадках. якщо такі випадки рідкісні - просто забудьте про це, нехай це буде повільно. якщо вона частота - ви завжди можете розширити DSL / vm для цього випадку. десь уповільнення всіх інших випадків, впевнено ...

PS Frameworks знаходиться на півдорозі між DSL та імперативом. і як і всі рішення на півдорозі ... вони поєднують у собі недоліки, а не переваги. вони не такі безпечні ТА не такі швидкі :) подивіться на хеккел джек-оф-трейд - це на півдорозі між сильним простим ML та гнучким метапрогом Prolog і ... що це за монстр. ви можете розглядати Prolog як Haskell з булевими функціями / предикатами. і наскільки проста його гнучкість проти Haskell ...


2

Мені просто цікаво, чому ніхто не згадав класи атрибутів як декларативний інструмент програмування в C #. Популярна відповідь на цій сторінці щойно розповідала про LINQ як декларативний інструмент програмування.

За даними Вікіпедії

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

Отже, LINQ, як функціональний синтаксис, безумовно, є декларативним методом, але класи атрибутів у C #, як інструмент конфігурації, також є декларативними. Ось хороша відправна точка, щоб прочитати більше про нього: Короткий огляд програмування атрибутів C #


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

2

Просто додамо ще один приклад щодо розвитку мобільних додатків. В iOS та Android у нас є Interface Builders, де ми можемо визначити інтерфейс програм.

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

Але ми також можемо намалювати цілі компоненти в коді, і це вкрай важливо.

Крім того, деякі нові мови, такі як Angular JS, зосереджуються на розробці декларативних інтерфейсів, і ми можемо побачити багато інших мов, які пропонують ту саму підтримку. Як і у Java, немає жодного хорошого декларативного способу малювати настільні додатки для робочого столу в Java Swing або Java FX, але в найближчому майбутньому вони просто можуть.


Java не є абревіатурою BTW
Мордехай

1

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

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}

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

private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.