Це трохи важко сказати, оскільки ці слова недостатньо чітко визначені. За загальною думкою, я думаю, що це нетипово називати Node.js рамкою, звичайно, але я б важко сперечатися, чому саме це не так.
Це все стає непростим, і я часто бачу по-справжньому погане використання мови, тому я буду зрозумілим і почну знизу
JavaScript є комп'ютерною мовою, тобто вузько, набором умов, які дозволяють нам читати та інтерпретувати купу тексту як семантику виконання - фантазійне слово для "способу інтерпретації мови як набору інструкцій". Класи програм , званих перекладачів , укладачів , transpilers , пуху , Текстмаркер і т.д. Всі приймають текст в і спробувати зробити що - то з цим традиційним розумінням того , як виконати код.
- Інтерпретатори фактично виконують семантику виконання, керуючи деякою машиною - як правило, комп'ютером. Ви можете подумати про них як про маленьку людину, що знаходиться всередині вашого комп'ютера, перемикаючи перемикачі типу "надрукувати цього персонажа" на основі інструкцій, написаних у вашій програмі JavaScript.
- Компілятори намагаються перетворити текст JavaScript у новий набір тексту, який має семантику виконання для іншої мови - можливо, той, який має спеціальне властивість, за допомогою якого комп'ютери можуть його безпосередньо виконувати.
- Транспілятори - це узагальнена форма компілятора, оскільки вони беруть текст JavaScript і виводять текст іншої мови. Різниця, таким чином, трохи суб'єктивна, але зазвичай компілятор вважає виведенням коду дуже низького рівня, а транспілятором як кодом високого рівня .
- Линтер , Текстмаркер , типу шашок , і т.д. все беруть в тексті і вихід якої - то аналітичний продукт JavaScript, виділений текст наприклад, на який впливає семантикою виконання, але на самому ділі не є представником цього.
Тепер давайте трохи розберемося в семантиці виконання. Як правило, семантика виконання включає процес читання тексту мови та надходження до опису абстрактної машини або опису спостережуваних побічних ефектів . Що я хотів би припустити, це те, що обидва з них припускають необхідність існування якогось "API низького рівня" або для роботи машини, або для здійснення спостережуваних ефектів. Зазвичай вони вважаються частиною середовища виконання
- Середовище виконання або виконання являє собою набір передбачуваних примітивів , що мова конвенція вимагає , щоб існувати для того , щоб працювати. Що стосується мови, можливо, існує певне припущення щодо їх поведінки, але вони непомітні. У зображенні перекладача, поданого вище, "людина всередині" просто натискає на перемикачі виконання - він не може особисто перевірити, що вони роблять.
Словом під час виконання зазвичай зловживають, щоб означати як набір самих передбачуваних примітивів, так і фактичне уявлення про них.
Отже, зараз ми переходимо до чогось волохатого. Мова - це сукупність умов, що передбачає існування часу виконання, щоб надати сенсу його семантиці виконання. Він ніколи не "пробує в них", оскільки вони поза сферою.
Для того, щоб фактично використовувати мову, ви хочете щось на зразок компілятора чи інтерпретатора разом із реалізацією. Компілятор / інтерпретатор і цей час виконання йдуть рука об руку, фактично виконуючи ваш код.
- V8 Chrome , який часто називають двигуном , - це пакетна угода, що містить інтерпретатора, компілятора та виконання, сумісну з інтерфейсом виконання, який вимагається стандартними конвенціями JavaScript ECMA.
То де ж Node.js вписується в це?
Ми повинні розбити його на частини:
- Node.js розширює мову JavaScript , надаючи більший набір примітивів для середовища виконання - тих, що не входять до стандартів ECMA. До них належать такі речі, як введення / виведення файлів . Це означає, що Node.js змінює мову і є в деякому сенсі новою мовою: "Node.js JavaScript"
- Node.js як пакет містить перекладача та компілятора. Це просто краде їх у V8.
- Node.js забезпечує реалізацію середовища виконання Node.js, що дозволяє виконувати "Node.js JavaScript".
- Node.js пропонує набір стандартних бібліотек, побудованих на версії нових примітивів, що робить їх більш доступними для кінцевих користувачів "Node.js JavaScript".
Так що Node.js - це багато речей!
Але це рамка?
Ось тут термінологія повністю розпадається - ніхто не має чіткого, послідовного, змістовного визначення того, що насправді є рамкою.
Існують дебати, які лютують: "що таке рамка проти бібліотеки", і вони закінчуються незадовільними речами на кшталт "бібліотека - це те, що ти називаєш, а рамки - це те, що тобі дзвонить". Я навіть не хочу давати таке сумне пояснення світлу дня, але JavaScript, і зокрема Node.js JavaScript, є надзвичайним ударом по цьому визначенню, оскільки вся техніка передачі зворотних викликів означає, що ви постійно переключаєтесь між дзвінками і називаються.
На мою особисту думку, тут є щось істотне. Я не хочу малювати яскраву лінію, але тому просто скажу
- Набір коду схожий на бібліотеку, якщо він працює як набір легогів : ділиться і робиться для складання. Хоча можуть бути приклади, як користуватися бібліотекою, звичайно, сам користувач повинен зібрати її під свої потреби.
- Набір коду схожий на рамки, якщо він не ділиться і передбачає умовності *: витягнення його частин може призвести до збою багатьох припущень, тому вам доведеться зрозуміти звичайне використання, щоб правильно використовувати рамку.
Це точно ручна хвиля, але я хочу намалювати дійсно цікавий момент про рамки:
Рамки передбачають набір умов, як інтерпретувати код; тому вони самі по собі є мовою.
Це може бути і те, про що люди також хочуть сперечатися, але якщо ви купили моє попереднє визначення, що мова - це лише набір умов, які дають життя текстовому блоку, то, коли ви складете новий шар умов, ви ' я побудував нову мову. Можливо, в рамках кадрів сировиною є семантичні інтерпретації їхньої мови, а не текстових файлів, але ідея така ж!
Отже, маючи все сказане, я абсолютно радий називати Node.js рамкою, навіть якщо це трохи суперечить нормі! Node.js додає функціональність сирому JavaScript на шляху розширення мови . З ним викладаються нові припущення та інструменти для роботи на цій розширеній мові. Функціонально ці ідеї збігаються з ідеями інших добре прийнятих рамок, таких як Ruby on Rails .
Я б заперечував, що якщо в цей момент ви відчуваєте трохи задухи і хочете стверджувати, що між Ruby on Rails та Node.js існує величезна розрив у цьому способі, то я , звичайно, там з вами . Вид концептуальних світів, в яких обидва живуть, різко відрізняється - я просто хочу сказати, що вони однакові речі: набори конвенцій про розширення повноважень базової мови в межах певної сфери.
Я також радий припустити, що домен Node.js є крихітним і жорстким, і тому домовленості, які він додає, є простими в обґрунтуванні та порівняно легко правильними. OTOH, Ruby on Rails живе у складному, погано визначеному домені "ділових веб-додатків", що означає, що конвенції, які він встановлює, безумовно, нечіткі та порушені.
Але все це довгий спосіб сказати, так, рекрутери, мабуть, не мають поняття, що вони означають, коли говорять це. Я здогадуюсь, що "фреймворк" просто звучить як краще, більш вибагливе слово, ніж "час виконання" чи "двигун".