Як я зрозумів, що C# і TypeScript набагато більше схожі, ніж я думав

Ви коли-небудь переживали момент "Ага!", коли щось, над чим ви працювали так довго, раптом починає відкриватись в абсолютно новому світлі? Так ось, це сталося зі мною, коли я зробив цікаве відкриття про C# і TypeScript — дві мови, які я вважав зовсім різними. Істина? Вони мають більше спільного, ніж я міг уявити.

Давайте повернемось трохи назад. Моя подорож у програмуванні розпочалась з C#. Це була моя перша справжня занурення в мову з статичною типізацією та об'єктно-орієнтованим підходом. Вона була гладкою, структурованою і змусила мене відчути себе професіоналом у програмуванні. З C# я навчився будувати додатки з акцентом на типи, класи та успадкування. Я почувався комфортно, впевнено, і все почало набувати сенсу.

Але потім стався справжній злам. З розвитком моєї кар'єри я почав працювати з TypeScript. Спочатку це здавалося переобтяжуючим — ще одна нова мова, ще один набір концепцій, які треба освоїти. Але щось в ній відчувалося дивно знайомим. Синтаксис, спосіб визначення класів та інтерфейсів, і навіть система типів — все це раптом стало на своє місце, як я не очікував.

І тоді я натрапив на щось, що все пояснило.

Я дізнався, що Андрес Хейльсберг, геній, який створив C#, також стояв за TypeScript. Коли я це дізнався, в моїй голові запалала лампочка. Звісно! Ось чому обидві мови відчувалися такими знайомими. Подібності були не випадковими — це результат спільного бачення однієї й тієї ж людини.

Давайте трохи відкотимось назад. Хейльсберг, який спочатку працював над Turbo Pascal, згодом був призначений для розробки C#. Його метою було створити сучасну, потужну мову, яка могла б конкурувати з C++ та Java. Перенесемося в майбутнє, і Хейльсберг став автором TypeScript, який мав на меті вирішити обмеження слабко типізованих мов, особливо коли йдеться про великі додатки. В той час як C# була розроблена для .NET фреймворку, TypeScript був створений, щоб покращити те, що було раніше, надаючи розробникам спосіб писати більш зручний для обслуговування, типізований код без втрати гнучкості.

Але ось де для мене стало цікаво. Незважаючи на різні цілі та контексти, обидві мови мають багато спільного: класи, інтерфейси, узагальнення (generics), і, звісно, сильну типізацію. Для когось, хто приходить з C#, TypeScript відчувається дивно знайомим, як вхід в кімнату, яка не зовсім така, але має всі потрібні меблі.

Пам’ятаю, як я відчував себе трохи загубленим, коли тільки почав працювати з TypeScript. Він здався таким відмінним від C#, з яким я провів роки. Але коли я копав глибше, я зрозумів, що крива навчання не була такою крутою, як я думав. Синтаксис був знайомим, принципи були ті ж самі, і логіка влаштована так, як мала бути. Це було як перехід на нову мову програмування, але з тими ж основними принципами.

Але ось у чому був підступ: хоча синтаксис відчувався знайомим, виконання було зовсім іншим.

Дивіться, справжня різниця між C# і TypeScript полягає не тільки в синтаксисі. Це те, як і де виконується код. C# компілюється, працюючи на .NET runtime, в той час як TypeScript транспілюється в JavaScript і працює в браузері або на сервері Node.js. У C# ви звикли до керованого середовища з runtime, який багато чого робить за вас. Натомість TypeScript не має цієї розкоші. Коли ви працюєте в браузерному середовищі з TypeScript, за виконання відповідає основний JavaScript engine, що означає, що такі речі, як управління пам'яттю і збір сміття, працюють по-іншому.

І ось тут я помітив справжню прірву між двома мовами. У C# у вас є тісний контроль над середовищем з .NET runtime, але в TypeScript ви працюєте з чимось більш непередбачуваним — браузером або Node.js engine.
Ви не маєте такого ж точного контролю, і вам доводиться мати справу з такими речами, як асинхронна поведінка та особливості JavaScript, яких ви не зустрічаєте в C#.

Мабуть, саме тому я завжди почувався трохи комфортніше, працюючи з C# — структуроване середовище .NET дозволяє легше передбачити, як поводитиметься код. В TypeScript, особливо коли він працює в браузері, іноді здається, що все трохи виходить з-під контролю. Ви повинні слідкувати за нюансами JavaScript, за особливостями різних браузерів і магією async/await, на яку покладається JavaScript.

Але ось у чому справа: чим більше я працював з TypeScript, тим більше я почав цінувати цю непередбачуваність. Вона змушує вас думати по-іншому, приймати гнучкість в таких аспектах, яких C# не завжди вимагає. Ви все одно отримуєте перевагу статичних типів і сильної структури, але виконання повністю залежить від JavaScript engine. Це як водити машину з чудовим двигуном, але з кермом, яке має трохи більше свободи.

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

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

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

References:

  1. Андрес Хейльсберг: Wikipedia - Anders Hejlsberg
  2. Мова C#: Microsoft Docs - C#
  3. Мова TypeScript: Офіційна документація TypeScript
  4. Історія TypeScript: History of TypeScript
  5. .NET проти Node.js Execution: Difference Between .NET and Node.js

Перекладено з: How I Realized C# and TypeScript Are More Alike Than I Thought