Чи є Node.js рамкою? [зачинено]


35

Я постійно бачу, як рекрутери, розробники тощо посилаються на Node.js як на рамки. На мою думку, це невідомість того, що насправді є Node.js.

Часто, в описах завдань, Node.js групується як бібліотека серед AngularJS , React тощо. Взагалі, я вважаю, що це входить хтось, хто не знає різниці (HR, рекрутер тощо).

На мою думку, Node.js - це платформа , або середовище виконання; він вимикає API DOM (JavaScript у браузері) для різних інших API, наприклад файлової системи (оскільки він працює як сервер, а не в браузері).

Чому люди вважають, що Node.js є рамкою; я помиляюся? Це насправді рамки?



5
Не особливо, але я міг бачити плутанину.
ndugger

1
Давно, коли вперше вийшов вузол, я опублікував відповідь на ТА, що сказав, що вузол не є рамкою. Тоді ця відповідь була надзвичайно спростована. Сьогодні дуже-дуже мало людей, які використовують вузол, вважають, що це рамка. Це рамка в тому ж сенсі, що Swift - це рамка, або Go - це рамка, або Rust - це рамка. Сучасні мови програмування просто мають API високого рівня, які раніше реалізовувались як рамки. "Платформа" - це гарне слово. Я б сказав, що це сам перекладач (використовуючи традиційне значення Unix цього слова)
slebetman

Зауважте, що вузол не вимикає API DOM, і все, що можна запустити за допомогою JavaScript, все ще доступне для вас, з вузлом або без нього.
Роб

@slebetman Що таке "інше" значення перекладача? Я не усвідомлював, що там теж дебати! : S
Дж. Абрахамсон

Відповіді:


44

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

Це все стає непростим, і я часто бачу по-справжньому погане використання мови, тому я буду зрозумілим і почну знизу


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

  • Інтерпретатори фактично виконують семантику виконання, керуючи деякою машиною - як правило, комп'ютером. Ви можете подумати про них як про маленьку людину, що знаходиться всередині вашого комп'ютера, перемикаючи перемикачі типу "надрукувати цього персонажа" на основі інструкцій, написаних у вашій програмі JavaScript.
  • Компілятори намагаються перетворити текст JavaScript у новий набір тексту, який має семантику виконання для іншої мови - можливо, той, який має спеціальне властивість, за допомогою якого комп'ютери можуть його безпосередньо виконувати.
  • Транспілятори - це узагальнена форма компілятора, оскільки вони беруть текст JavaScript і виводять текст іншої мови. Різниця, таким чином, трохи суб'єктивна, але зазвичай компілятор вважає виведенням коду дуже низького рівня, а транспілятором як кодом високого рівня .
  • Линтер , Текстмаркер , типу шашок , і т.д. все беруть в тексті і вихід якої - то аналітичний продукт JavaScript, виділений текст наприклад, на який впливає семантикою виконання, але на самому ділі не є представником цього.

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

  • Середовище виконання або виконання являє собою набір передбачуваних примітивів , що мова конвенція вимагає , щоб існувати для того , щоб працювати. Що стосується мови, можливо, існує певне припущення щодо їх поведінки, але вони непомітні. У зображенні перекладача, поданого вище, "людина всередині" просто натискає на перемикачі виконання - він не може особисто перевірити, що вони роблять.

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


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

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

  • V8 Chrome , який часто називають двигуном , - це пакетна угода, що містить інтерпретатора, компілятора та виконання, сумісну з інтерфейсом виконання, який вимагається стандартними конвенціями JavaScript ECMA.

То де ж Node.js вписується в це?

Ми повинні розбити його на частини:

  1. Node.js розширює мову JavaScript , надаючи більший набір примітивів для середовища виконання - тих, що не входять до стандартів ECMA. До них належать такі речі, як введення / виведення файлів . Це означає, що Node.js змінює мову і є в деякому сенсі новою мовою: "Node.js JavaScript"
  2. Node.js як пакет містить перекладача та компілятора. Це просто краде їх у V8.
  3. Node.js забезпечує реалізацію середовища виконання Node.js, що дозволяє виконувати "Node.js JavaScript".
  4. 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 живе у складному, погано визначеному домені "ділових веб-додатків", що означає, що конвенції, які він встановлює, безумовно, нечіткі та порушені.


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


ей, чудово врівноважений! Отже, probably have no idea"frame" - це слово, яке ви можете зрозуміти, не будучи програмістом, корисна функція, якщо не шкодуєте, коли це насправді змінить значення.
n611x007

"Node.js додає функціональність сировинному JavaScript на шляху розширення мови." Неправда, це розширює функціональність, а не мову, це не змінює спосіб написання коду, як вимагає багато фреймворків. Є інші функції або об'єкти, додані, як додана бібліотека. Ви можете викликати його або використовувати його, як будь-яку нову функцію або об’єкт. Стиль програмування не змінюється, основи мови однакові "лише" додають певної функціональності. Таким чином, це не фреймворк або розширення мови, javascript з доданими бібліотеками платформи за замовчуванням і, таким чином, функціональністю.
Codebeat

Звичайно, я можу повністю піти на вашу сторону. Я думаю, що лінія тут нечітка. Будь-який спосіб мислення має сенс. Як суворий момент, вузол розширює JS, надаючи FFI, який є основним фрагментом, який дозволяє вузлу згодом надавати більше системних бібліотек. З іншого боку, тоді як "основний" вузол - це просто час виконання (і це FFI), більшість часу, коли люди обговорюють вузол, вони насправді мають на увазі "основний час виконання, розширення FFI та основні функції бібліотеки, побудовані на ньому". - як упаковується вузол.
Дж. Абрахамсон

20

Node.js® - це час виконання JavaScript, побудований на двигуні JavaScript V8 JavaScript.

джерело

Вузол - це час виконання або середовище. Це не рамки. Люди (я відчуваю) часто помиляються, оскільки рамки, такі як експрес, всюди зустрічаються з вузлом.

більше читання про час виконання та фреймворки, якщо вас цікавить.


inb4 ", але на сторінці about написано:" Як асинхронна структура, керована подіями "" Я знаю.
румон

3
Чи не вбудований v8 під час виконання? ;-)
johannes

@johannes Я схильний погодитися з вами з цього приводу. V8 - це час виконання і вузол просто розширює інструменти, доступні розробнику (http-сервер, утиліта тощо), тому я думаю, що ярлик рамки все ще працює. Все-таки це модифіковане середовище v8; вузол - це не те, що ви просто "включаєте" у свій проект. Я думаю, це все питання перспективи.
нік

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