Чому JavaScript не використовується для класичної розробки додатків (складене програмне забезпечення)? [зачинено]


14

За роки свого веб-розробки з JavaScript я прийшов до висновку, що це неймовірно потужна мова, і ви можете робити дивовижні речі з нею.

Він пропонує багатий набір функцій, таких як:

  • Динамічне введення тексту
  • Першокласні функції
  • Вкладені функції
  • Закриття
  • Функції як методи
  • Функціонує як конструктори об'єктів
  • На основі прототипу
  • На основі об'єктів (майже все є об'єктом)
  • Регекс
  • Літерали масиву та об'єктів

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

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

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

Лише недавно, можливо, завдяки V8 Engine він більше використовується для виконання інших завдань (див., Наприклад, node.js).

Чому до цих пір це стосується лише веб-розробки? Що тримає його подалі від розробки програмного забезпечення?


8
Якщо розробка веб-сайтів не є (окремим випадком) розробки програмного забезпечення, що це таке саме? ...
Péter Török

@ Péter Török: Я думаю, ви зрозуміли, що ви зрозуміли. Я маю на увазі те, що дотепер вона використовувалася лише як сценарій мови програмного забезпечення для вдосконалення функцій. Він ніколи не використовувався для програмування програмного забезпечення для ОС.
Хосе Фаети

4
Динамічне введення тексту я бачу як величезний недолік, і я також хотів би позбутися нульових значень.
Йонас

2
Ви маєте на увазі "класичну розробку додатків", а не "розробку програмного забезпечення", правда? Краще змініть заголовок відповідно.
Doc Brown

2
@JoseFaeti для запису Windows 8 дозволяє зробити певну розробку в HTML5 та JS
Raynos

Відповіді:


14

Нещодавно node.js висунув розробку на стороні сервера. Отже, тепер можна писати JavaScript для розробки.

Це правда. В історії він не використовувався як мова розвитку. Але, ей, навіть сценарії в клієнтському середовищі (User Agents) є типом розробки. Чи не так?

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


Це повинно бути таким, і я схоже на те, що щось насправді рухається :)
Жозе Фаєті

15

Від сюди :

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

а) Чарівне «це». Це це, за винятком випадків, коли це так. JavaScript підштовхує вас до використання анонімних функцій по всьому місцю, за винятком того, що вони завжди втрачають відповідний контекст для змінної 'this', тож у вас все-таки є кодовий код типу "var _this = this", а потім використовується всередині зворотних викликів або інших функцій. Деякі дні я клянусь, що кількість функцій, які мені вдається записати, які не використовують перейменований "цей", насправді менша, ніж кількість.

б) 1 + "1" - 1 = 10. Також "1" + 0 = "10". Так, це насправді спричинило помилки для наших додатків, коли дані, які, як очікується, буде число, завантажувались з файлу JSON як рядок через помилку в іншій програмі, і результат був не гарним. Весь наш код завантаження довелося оновити, щоб додати тонну перетворень типів у всьому світі. Коли мені потрібно, щоб щось було число, я справді боюся, я хочу, щоб це було число, а не рядок чи об'єкт, нуль чи щось інше. Lua, яка в багатьох відношеннях дуже схожа на JavaScript, вирішила цю проблему, просто не вистачивши на відсталість, щоб використовувати того самого оператора для додавання та конкатенації рядків.

в) глобальні за замовчуванням змінні. Тож навіть якщо ви приймаєте аргумент, що динамічне введення тексту просто "простіше", тому що вам не потрібно думати про змінні декларації, JavaScript викидає цей аргумент у вікно, змушуючи вас ставити "var" перед новими ідентифікаторами всюди . І тоді він мовчки накрутить вас, якщо ви забудете.

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

д) Неможливість створення типів прохідних значень. Це є частою проблемою практично у всіх мовах, окрім C ++ / D, насправді. Для тих, хто використовує JavaScript для написання програм WebGL, подивіться на всі бібліотеки лінійних алгебр для JavaScript. У 3D-програмах ви майже використовуєте вектори частіше, ніж у скалярів. Уявіть, якби кожне ціле число у вашій програмі було передане посиланням, так що "a = 1; b = a; b ++" зробив і a, і b рівним 2. Кожен маленький трикомпонентний вектор є повним повним об'єктом. Вони передаються за посиланням (фактично джерело майже половини помилок у нашій грі WebGL). Вони існують у великій кількості, виділяються купу і збираються сміттям, що чинить сильний тиск на GC, що може і призводить до пауз GC навіть у простих іграх WebGL, якщо тільки розробник не перескакує смішно складні обручі, щоб уникнути створення нових векторів у всіх місцях, де логічно створювати нові вектори. У вас не може бути перевантаження оператора, тому у вас є дуже великі та некрасиві вирази для виконання основних операцій. Доступ до окремих компонентів відбувається повільно. Об'єкти не запаковані, і, отже, надзвичайно повільно натискати на вершинний буфер, якщо тільки ви не реалізуєте їх як екземпляри Float32Array, що плутає скасування з оптимізаторів як V8, так і SpiderMonkey. Я згадав, що вони передані за посиланням? Доступ до окремих компонентів відбувається повільно. Об'єкти не запаковані, і, отже, надзвичайно повільно натискати на вершинний буфер, якщо тільки ви не реалізуєте їх як екземпляри Float32Array, що плутає скасування з оптимізаторів як V8, так і SpiderMonkey. Я згадав, що вони передані за посиланням? Доступ до окремих компонентів відбувається повільно. Об'єкти не запаковані, а значить, надзвичайно повільно натискати на вершинний буфер, якщо тільки ви не реалізуєте їх як екземпляри Float32Array, що плутає скасування з оптимізаторів як V8, так і SpiderMonkey. Я згадав, що вони передані за посиланням?

f) Жоден вбудований модуль не включає і не вимагає функціональності. Серйозно, все-таки. Сторонні бібліотеки існують, але майже всі вони мають якусь помилку чи іншу проблему, що не менш важливо - це заплутана проблема кешування в принаймні Chrome, що робить фактичну розробку болем у задниках.

ж) Динамічне введення тексту. Так, я готовий розпочати цей аргумент. Ви починаєте помічати це найбільше, коли ви припиняєте писати маленькі веб-програми чи веб-сторінки та починаєте писати великі додатки, де у вас є дані, які зберігаються довше, ніж один клік миші або цикл запиту / відповіді: додайте неправильний вид об’єкта до масив обробляти пізніше і отримати збій пізніше від відсутнього методу або члена у зовсім іншому біті коду, ніж де була фактична помилка. Веселі часи. Так, Java робить статичне введення тексту здатися злим. Ні, Java / C # / C ++ - це не єдиний і єдиний спосіб статичного введення тексту. Висновки типу, неявна прив'язка інтерфейсу тощо надають всі переваги "легкого впорядкування та не багато натискань клавіш" на динамічному введенні тексту без усіх помилок. Друга за популярністю веб-мова - ActionScript 3 - насправді набрана статично, незважаючи на те, що інакше ідентична JS / ECMAScript. В сторону я отримую більше збоїв від програм Python на своєму робочому столі Fedora, ніж від програм C / C ++ (насправді жоден із програм C / C ++ на моєму робочому столі не виходить з ладу, тепер, коли я думаю про це). Винятки з відсутніми членами == набагато простіше розробити та підтримувати програми, правда?

h) Швидкість. Так, велика кількість зусиль, які розробляли супер погані дупи, докладають до смішних величезних зусиль, щоб зробити JS майже вдвічі швидшим, ніж низькосортний компілятор C, який один юніор-коледж міг написати за кілька місяців. І LuaJIT знаходиться в тому ж плавні, що і JS, з точки зору основних мовних обмежень, але вдається зробити це краще, ніж будь-яка реалізація JavaScript у будь-якому випадку. Люди, які не розуміють, що насправді роблять усі оптимізації JS у V8 чи подібнихяк стверджувати, що JS може робити дивовижні речі швидкісно, ​​але реальність полягає в тому, що всі ці оптимізації в основному просто "спробуйте дуже дуже важко проаналізувати код, щоб з'ясувати типи змінних, а потім компілюйте його як трохи відсталий статично набраний компілятор мови зробив би це ". О, і трасування є, але потім трасування також працює на статично введених мовах (і працює краще через відсутність потреби в захисних колах типу в створеному машинному коді). Насправді, жодна з цих оптимізацій візбанга не була придумана компанією JS або для неї; більшість взяли з дослідницьких JVM (Java - це зло!) або класичних мов OOP (прототипи приголомшливі!).

i) Навіть IntelliSense не можливий. Хочете побачити, які методи існують для тієї змінної, яку ви отримали там у рядку 187 foo.js у своєму текстовому редакторі? Дуже погано. Простежте через код, поки не з'ясуєте, де він був ініціалізований, а потім пройдіть через код, щоб дізнатися, що його прототип має. І тоді сподіваємось, що код не динамічно змінює прототип за вашою спиною. Насправді, просто запустіть його у веб-переглядачі та встановіть точки перерви, тому що дізнатись нічого корисного про значення будь-яким іншим способом в принципі неможливо для будь-якої бази даних коду, більшої ніж сайти toy_web_app.html, які JavaScript-апологісти використовують для прославлення простоти та простоти JavaScript. Деякі редактори коду дуже важко намагаються зробити краще, і майже начебто вдаються до справді простих випадків, іноді, один раз.

j) Немає переваги. JavaScript навіть не особливий порівняно з іншими динамічно набраними мовами. Він не здатний взагалі нічого цікавого зробити, що також не можуть зробити Lua, Python, Ruby тощо. Жодна реалізація JS не швидша, ніж LuaJIT або PyPy, або різні інші вдосконалені JIT-ing реалізації інших динамічних мови. JS не має до нього плюсів порівняно з іншими загальнодоступними мовами. Ох, хіба що він працює у веб-браузері без плагіна. Яка єдина в світі причина, чому вона така популярна. Насправді, це єдина причина , чому ця подія існує. Якщо хтось 10 років тому щойно подумав: "чорт, давай кинемо в наш веб-переглядач існуючу добре розроблену та налагоджену мову, і змусимо інших хлопців зробити те саме, а не змушувати всіх використовувати цей густий маленький хак-жоб, який NetScape придумав , "Інтернет виглядав би набагато інакше (краще) сьогодні. Уявіть собі майбутнє, якби Chrome кинув Python на Chrome як підтримувану мову. Або, власне, уявіть собі це: Google вводить C / C ++ у Chrome як підтримувану мову (http://code.google.com/p/nativeclient/).


Це дійсно цікавий пост. Мені було б цікаво побачити випадки його використання, які є основою його аргументів. Я не погоджуюся з його пунктами, але я розробляю програми JS корпоративного розміру майже 10 років і не переживав деяких речей, про які він згадував (зокрема, його перший пункт про "магію цього"). Переходячи до власного досвіду, аргументи проти javascript, як ті, що є у цій публікації, як правило, висловлюються людьми з важким традиційним фоном oop ... в такому випадку я б зрозумів його плутанину.
Пан JavaScript

Досить цікаво бачити, що в 2016 році відповідь тепер цілком застаріла еволюцією мови.
Стефан Біцзіттер

@Містер. JavaScript Привіт. Чи знаєте ви про низку навчальних посібників, які зосереджуються на вирішенні прикладів реальних проблем, а не просто на вивченні JavaScript та його особливостей та механізмів? Я не маю шансу в пошуку ключових слів. Наприклад, замість того , щоб йти через такі докладний підручник посилання і її мільйони прикладів і функцій, де я можу знайти сховище маленьких підручників, як зробити додаток з графічним інтерфейсом для управління деякої системи страхування або лікарів або школою або оперативну частиною супермаркет? Дякую
Ханнес

12

Чому?

JavaScript - сама невірно зрозуміла мова

Ми були в похмурі епохи і все ще вважаємо, що загальна спільнота розвитку визнає, що JavaScript - це потужна і універсальна мова. Це просто не мейнстрім.

Єдиний недавній прогрес - це те, що node.js став багатослівним, і люди починають сприймати, що у JavaScript є інше використання.

Я стежив за розробкою JS & HTML5 для Windows 8, і реакція спільноти .NET була "дорогий боже, чому?".

Просто факт, що більшість розробників, що не входять у Інтернет, все ще бачать JavaScript як таку мову іграшок, якою ви користуєтесь, щоб вони прокручували меню у ваших браузерах.

Справді, JavaScript не узгоджується з "сучасними методами розробки". Для мене JavaScript все ще є хакерською мовою, яку я зламаю за допомогою vim, а Інтернет - це моя документація. Немає IDE, не існує інструментів розробки, немає автоматичного завершення чи "інтелісенса", немає графічних інтерфейсів для кліку та перетягування.

У світі розробників Java та .NET вони входять у свої GUI та IDE і не зможуть програмувати vim.


1
Я згоден з вами, окрім того, що "немає IDE, немає інструментів розробки, немає автоматичного завершення чи" intellisense ", немає графічних інтерфейсів для кліку та перетягування". Насправді ви можете отримати все те, використовуючи багато різних IDE там, наприклад, я використовую Visual Studio, і це просто чудово.
Хосе Фаети

1
@JoseFaeti Вибачте, Visual Studio не є IDE javascript. Я швидший у vim, ніж у VS2010. Це означає, що VS2010 - це протікаючий JS IDE.
Райнос

2
@Raynos, "Я швидший у vim, ніж у VS2010. Це означає, що VS2010 - це протікаючий JS IDE". - а може це просто означає, що ви не знаєте VS так добре, як vim.
Péter Török

2
Абсолютно ні, але я не збираюся будувати інтерфейс RIA в Silverlight, тому що я люблю Resharper і LINQ, або ASP.Net MVC додаток з тонким шаром jQuery, тому що знову його. які краще підходять для роботи.
sa93

1
Просто додаю свій голос до хору людей, заявивши, що існують JavaScript IDE. Відверто нерозумно стверджувати інакше. Можливо, вам не сподобаються IDE, і вони можуть бути не ідеальними, але вони все одно IDE. Або я уявляв інтелісценцію та завершення коду VS під час роботи з JS?
Ян Ньюсон,

10

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

Люди не думають використовувати JS для створення програми, оскільки це фактична мова сценаріїв для Інтернету, і ви завжди використовуєте правильний інструмент для роботи.

Навіщо писати акри JS, щоб виписати файл, коли це тривіальна операція в Java / .NET / C / C ++?

Зважаючи на це, як уже згадували інші, node.js та його бібліотеки зробили операції на стороні сервера тривіальними, і коли node.js стає популярним, навчання це стане навиком для резюме, оскільки ви зможете підтримувати / розширювати / будувати додатки з ним.


1
+1 повністю забув, наскільки важлива бібліотека stdio.
Райнос

1
Для файлової системи, як ви сказали, у нас зараз є локальні API зберігання, хоча ви не розраховуєте на їх серйозну довговічність. Однак запис у файлову систему не повинен бути прямим, ваш JavaScript може робити спокійні дзвінки на сервер, який (написаний у LOLCode або C або JS), який записує в певну форму зберігання.
sa93

1
На стороні сервера. API файлу NodeJS - це просто тривіально, як C тощо ... <- якщо ви робите IO правильно в C (не блокуючи). Також дзвінок Ajax з будь-якою розумною обгорткою може становити 2-3 рядки. MyLib.Ajax.post ('/ наполегливість / щось ", {data: blahObj})
sa93

@ sa93, не плутайте середовища хостингу браузера з JavaScript. localStorage - це хост-API в браузерах. Це не визначено в специфікації ES5.
Райнос

1
@reinierpost Writing files to the file system has been replaced with HTTP POST.Не використовується, якщо ви пишете API, які обробляють публікації.
StuperUser

5

Більшість загальноприйнятих мов є більш потужними та кращими, ніж JavaScript. Усі згадані вами функції підтримуються іншими динамічними мовами, такими як Python або Ruby, які в цілому краще розроблені. І деякі згаданих вами функцій у будь-якому разі не обов'язково бажані - багато хто вважає статичне введення тексту з висновком типу переважнішим для динамічного набору тексту, якщо у вас є вибір.

Я не кажу про це в JavaScript JavaScript. Мені дуже подобається працювати з JS при розробці Інтернету. Але, дивлячись на це об’єктивно, JS має ряд недоліків порівняно з іншими мовами:

  • Численні непоправні недоліки. Багато помилок було допущено при початковому розробці СВ. Тут їх не потрібно перераховувати, вони добре задокументовані. Усі мови мають помилки в початковій конструкції, які згодом виправляються. Різниця JS полягає в тому, що мова була розроблена та випущена далеко швидко, і ці помилки ніколи не можуть бути виправлені через вимогу зворотної сумісності у браузерах.
  • Надзвичайно повільний процес впровадження вдосконалень та нових функцій. Оскільки всі постачальники браузерів повинні погодитись і, можливо, навіть з різних політичних причин хочуть уповільнити розвиток мови. Подивіться на C #, що насправді є новітньою мовою, ніж JS. Коли C # був представлений, його не було, наприклад. закриття або функції вищого порядку, такі як JS, але після декількох ітерацій тепер це все, а крім того, такі функції як синтаксис Linq та async, яким розробники JavaScript можуть лише позаздрити.
  • Збідніла стандартна бібліотека. Сучасні мови, такі як Python, Ruby або все, що базується на Java або .net, мають широкі стандартні бібліотеки майже для всього, що вам може знадобитися. У JS ви навіть не можете прочитати файл без сторонніх бібліотек. Ви згадуєте Регекс, але всі сучасні мови мають на це і на тисячу речей більше.
  • Інші мови наздогнали кілька переваг JavaScript. Такі функції, як закриття та функції першого класу, були потужними в порівнянні з незграбними статичними мовами, такими як Java десять років тому, але динамічні та функціональні мови вже давно мали ці функції, і навіть Java, досить консервативна мова, додала це в Java 8.

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

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

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