Statement, expression, operator — що є що

September 2, 2021 — 🍪🍪🍪🍪 2 хвилини чтива

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

Statement vs expression

Отже, statement інколи перекладають як вираз. Це може працювати, і скоріш за усе, у розмові вас зрозуміють. Проблема полягає в тому, що expression — це також вираз. І expression значно краще підходить до виразу, ніж statement.

У вільній формі термін statement пояснюється як певна операція, яка складає стрічку коду, або її частину. Тобто це щось трішки більше за ключове слово чи літерал, але менше за функцію. Але ж те ж саме можна сказати й про expression?

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

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

Що це все означає на практиці? Погляньмо на такі приклади (JS):

// Вираз
2+3

// Інструкція
with

// Умовна інструкція if, а в дужках — вираз
if (expression) {}

// Виклик функції — це також інструкція. Аргументи функції — вираз
console.log(...)

// Вираз, що скаладається з інструкції виклику функції, до якої передається вираз 10
Math.log(10)

Operator

А де ж тут оператор? Його інколи плутають зі схожим терміном ключове слово. І, хоча якась частина ключових слів справді вважається операторами, ці поняття не тотожні.

Оператор — це складова частина expression, частинка виразу, яка щось робить з операндами, з метою обрахувати якийсь результат. Тобто:

// Унарний оператор інкременту
++

// Бінарний оператор додавання (чи конкатенації)
+

// Оператор, який також є ключовим словом 
typeof

// Вираз, який складається з оператора і операнда
typeof undefined

// Інструкція, яка повертає значення виразу
return typeof undefined

Висновки

По-перше, expression — це вираз. По-друге, statement — це, в більшості випадків, інструкція. А з оператором і так все ясно.

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

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

Та й, зрештою, інколи це просто цікаво!

Посилання