LINUX.ORG.RU

Посоветуйте асинхронный бэкенд

 , , ,


2

7

Пишу в dev, а не web-dev потому, что C++ и другие якобы «не вэб языки» здесь в тему.

Буду в одиночку пилить сайт для определённых задач (не на заказ). Бэк, фронт, деплой, сопровождение, бизнес-специфичные занятия - всё своими руками и головой.

Есть некоторый опыт и хорошие впечатления от Django.

Нужны:

  • Хорошая производительность
  • Асинхронщина для любого IO а-ля нода
  • Выразительный ЯП со СТАТИЧЕСКОЙ типизацией
  • Хорошая документация и немаленькое сообщество (не просто API Reference, а ещё и Tutorials) и чтобы фреймворко-специфичные проблемы легко гуглились
  • Много батареек, как в джанге, обязательна ORM
  • И REST API, и Server Side Rendering // решил отказаться
  • Всякие Light, zero-dependency и embedded мне безразличны // но рассматривались тоже
  • Удобная работа с WebSocket // да, этот пункт я дописал гораздо позже

Лучше советовать не «язык Х» а «язык Х + фреймворк Y».

Также меня царь образумил в том смысле, чтобы делать SPA вместо server side rendering. Ведь перерисовывать ВСЁ по нажатию кнопки - это же антипаттерн отзывчивого интерфейса. Плюс везде, где можно заменю http на websocket - вместо целой страницы по тормозному хттп всего лишь небольшой json по шустрому вебсокету - это сильная разгрузка bottleneck’а на клиенте - обмен данными по сети.

Плюс можно реализовать свою логику на время ожидания ответа от сервера - хоть надпись «подождите», хоть прогрессбар, хоть что угодно, что вписывается в «домохозяйка видит плавный интерфейс».

UPD Решил брать NestJS + React + MobX. Если по ходу дела откажусь, то буду рассматривать Dart + Flutter, Scala + Play, Java/Kotlin + Spring/Boot.

В будущем обязательно поэксперементирую и запилю сайт крупнее хелловорлда на C++ и Rust и поделюсь с вами впечатлениями.



Последнее исправление: arturianec100 (всего исправлений: 5)

Ответ на: комментарий от Miguel

Сильный ответ.

По воводу си:

И, кстати: сам по себе C, без ++, по-моему, вполне приличный язык. У него как раз есть узенкие области, где он идеален.

Здесь ещё проще - всё, что есть в си, есть и в цпп, а те мелкие отличия(типа кастов из void*) - никого не волнуют.

cloun1901
()
Ответ на: комментарий от InterVi

Vertx глянул. Асинхронный код на джаве с чейнингом. ОРМ нету. Но тот же Spring Boot пофичастей. Взял на заметку.

arturianec100
() автор топика
Ответ на: комментарий от anonymous

Не утверждаю, что C++ плох, но для создания своей rapid системы одной из фич которой являются динамические объекты /о которых компилятор ни чего не знает/, метаданные, … он не подходит.

Еще раз.
Как в run-time создать сложный объект, который использует STL, class, … ?

В принципе возможно, но для этого нужно создать C+++.
Зачем?

Тем паче C++ сейчас столько ограничений имеет во всем, что лишь одни

Огорчения

Опять таки не хулю C++.
Просто создавать rapid систему над C++ не считаю необходимым.

Владимир

anonymous
()
Ответ на: комментарий от Miguel

может вы мне подскажете. Насколько я понял из его жава-высера. В его говне бездарном типы затираются, поэтому у A типа нет, просто есть vtable на интерфейс.

далее макака пишет: _main(n-1, i+1, first, new Cons(i*i, second)); // Doesn’t work

ну не работает оно, наверное, потому что T != govno

но какой жопой к этому имеет отношение равенство?

он может туда передать какое угодно дерьмо

цепочку хоть их 10 хоть из 1 элемента и сложить.

к тому же этот идиот создаст эту цепочку руками? Где он её создаёт

эта обезьяна родила там рекурсивное говно

anonymous
()
Ответ на: комментарий от Miguel

В общем, берёшь свой высер, добавляешь туда: int x = Convert.ToInt32(Console.ReadLine()); int y = Convert.ToInt32(Console.ReadLine());

Создаёшь от x и y своё дерьмо и показываешь, что оно не собирается, если x и y разные.

anonymous
()
Ответ на: комментарий от cloun1901

Это не свойство ts, это свойство любого нормального статически типизированного языка.

Согласен. И это значит, что ts — нормальный статически типизированный язык, а большинство остальных статически типизированных языков — ненормальные.

Собственно, именно это я с самого начала и утверждал. О чем спор-то вообще? %)

Nervous ★★★★★
()
Ответ на: комментарий от anonymous

Я категорически не буду писать на ЯП без удобного управления ресурсами (GC или крестовой RAII с умными указателями).

arturianec100
() автор топика
Ответ на: комментарий от Nervous

Собственно, именно это я с самого начала и утверждал. О чем спор-то вообще? %)

Тренд ныне потрындеть

Типа

Что правильнее трусы одеть или майку, затем рубашку а за тем брюки или

Майку, рубашку и брюки, а через голову ТРУСЫ

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Шутка

Это Rust уронил мне UB на ногу.  
Падло.

Владимир

anonymous
()
Ответ на: комментарий от eao197

высокие нагрузки

нужно делать «тяжелую» обработку запросов

Примеры задач? Числодробилки, аудио, видео и подобное? Были задачи, где значимая часть логики завязана на базы данных?

arturianec100
() автор топика
Ответ на: комментарий от Nervous

О чем спор-то вообще?

Вот об этом:

большинство остальных статически типизированных языков — ненормальные

Я уже сообщал, что здесь нет специфики ts. Тот же any, о котором ты упомянул, пишется на любом языке, а если не пишется - этот недоязычек никого не интересует. Очевидно, что ты не знал об этом, а сейчас погуглил, после того как я об этом сообщил. Иначе не было бы твоих потуг про «жабий хелловорлд без статики».

cloun1901
()
Ответ на: комментарий от arturianec100

слабак, тролль и девственник.

anonymous
()
Ответ на: комментарий от Miguel

Нет ни одной области, где лучше плюсов ничего бы не было.

Что есть лучше CUDA C++ для программирования видеокарт Nvidia?

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Nvidia

Ненужно

видеокарт

Ненужно

для программирования

Ненужно

anonymous
()
Ответ на: комментарий от cloun1901

any, о котором ты упомянул, пишется на любом языке

Ну да, в жабе, скажем, можно (почти) везде использовать Object.

Hello.java

class Hello {
    public static void main(String[] args) {
        Object hello = "Hello!";
        System.out.println(((String)hello).toLowerCase());
    }
}

Не укажешь тип — не соберется. Не приведешь тип - не соберется. Прелесть, не правда ли?

В то время с TS можно просто написать

Hello.ts

let hello = 'Hello!';
console.log(hello);

И это без проблем соберется.

Вот поэтому TS и более нормальный, чем та же жаба. Более для людей.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от Nervous

Не укажешь тип — не соберется. Не приведешь тип - не соберется. Прелесть, не правда ли?

Как я и говорил, нельзя писать просто чтобы было. Вот ты имел тип, полностью затёр его в той же строке и в следующей начал обратно его восстанавливать. Никакой цели это в себе не несёт, никакую реальную ситуацию не моделирует. Поэтому и ощущения соответствующие.

Вот поэтому TS и более нормальный, чем та же жаба.

Нет, не поэтому. Это свойство ts, который на самом деле типы проверяет, но в рантайме там как и везде всё на строках. Вот оно строку и берёт.

cloun1901
()
Ответ на: комментарий от arturianec100

Из собственного опыта: создание HTTP-точек входа в старые C++ приложения. С той особенностью, что обработка запроса могла занимать десятки секунд. Поэтому нужно было уметь набирать большое количество входящих запросов и чтобы это никак отрицательно не сказывалось.

Из того, о чем мы наслышаны (в том числе и от тех, кто пользуется нашим лисапедом): прием/обработка больших потоков данных в JSON, отдача больших объемов данных, числодробилки при обработке запросов.

Такого, чтобы основная логика выполнялась посредством БД не припомню.

eao197 ★★★★★
()
Ответ на: комментарий от cloun1901

Ну да, сваяли прототипы на жаве. Как только оно кому-то станет нужно

Какие прототипы, болезный? Давно в продакшне у всех, кому нужно.

korvin_ ★★★★★
()
Ответ на: комментарий от eao197

Более того, даже array<T, N> вам придется из кода выбросить, если окажетесь в команде со среднестатическими разработчиками, в которой вы будете больно умным.

Это что за уровень такой? Даже всякие теоретики с нулевым практическим опытом знают основы STL. Распиши плиз уровень типичного крестовика с твоей точки зрения.

arturianec100
() автор топика
Ответ на: комментарий от bonta

И как с этой свободой нуб не прострелит себе ногу?

arturianec100
() автор топика
Ответ на: комментарий от cloun1901

полностью затёр его в той же строке и в следующей начал обратно его восстанавливать. Никакой цели это в себе не несёт

Именно. Поэтому в нормальном языке можно тип вообще не указывать, если он не нужен, а в жабе нужно устраивать игры в доминирование с компилятором. В подчиненной позиции.

Хотя кому-то, может, и нравится.

Nervous ★★★★★
()
Ответ на: комментарий от bonta

Ну допустим звучит интересно, а почему он не взлетел как тот же шарп или тот же раст больше на слуху чем Д?

D в одно время очень был на слуху. Но его погубил переход к не полность совместимой 2.0 версии (как переход питона 2 -> 3).

anonymous
()
Ответ на: комментарий от menangen

Если учесть, что он в дефолтной поставке GCC, как и Go, то оба они взлетели. В отличии от rust

Угу D летает но низенько низенько.

anonymous
()
Ответ на: комментарий от Nervous

Поэтому в нормальном языке можно тип вообще не указывать, если он не нужен

Нет, ты не понял. Он всегда нужен в статически типизированном языке. Чтобы произвести любое действие с объектом(даже простое чтение), нужно знать его тип. В ts тип можно не указывать только потому, что там в рантайме есть ровно один тип - строка.

Если проще - возьми те же кресты, и не используй ничего, кроме std::string(числа перед записью конвертируешь и наоборот). Вот тебе твой ts, только в ручном режиме.

cloun1901
()
Ответ на: комментарий от anonymous

Кстати так там Rust защищает от чего-либо я так и не понял. Какой-то реально «язык-хайп». Я могу на крестах выделять память написав std::vector mem(bytes); и она сама потом освободится, раст говорит примерно такое: «у нас вся память выделяется вот так». Таки мне интересно, что мне мешает писать на крестах в таком раст-стиле, получив раст?

igloev
()
Ответ на: комментарий от cloun1901

Без этого легаси не было бы ничего.

Но это случайность что там окзался си а потом и с++. Мог бы и паскаль или что-то типа ада, ругали бы сейчас их и говорили бы что си был лучше.

anonymous
()
Ответ на: комментарий от anonymous

Но это случайность что там окзался си а потом и с++.

Может быть. Это уже не важно.

Мог бы и паскаль или что-то типа ада, ругали бы сейчас их и говорили бы что си был лучше.

Нет, сейчас же не паскаль с адой на роль лучшего языка претендуют. Раст и ко в любом случае появились бы.

Это свойство любой новой вещи - большинство проблем старой вещи уже известны, а в новой авось проблем не будет. Но это ошибочная надежда.

cloun1901
()
Ответ на: комментарий от igloev

что мне мешает писать на крестах в таком раст-стиле, получив раст

Отсутствие самодисциплины? Там тебя заставляет компилятор, а в С++ всё только на твоей совести. Вроде только это в прошлых срачах было аргументом со стороны любителей раста. А так варнинги + санитайзеры + анализаторы покрывают все проверки раста…

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от bonta

Отсутствие GC - это мощный недостаток во всех сферах разработки, кроме системной, где надо операционку и драйвера писать. Этим занимается от силы 2 человека на ЛОРе

menangen ★★★★★
()
Ответ на: комментарий от cloun1901

Ну по твоей супер логике, новый стандарт тоже имеет те же проблемы, что и старый (про с++ стандарты пишу)

menangen ★★★★★
()
Ответ на: комментарий от cloun1901

Чтобы произвести любое действие с объектом(даже простое чтение), нужно знать его тип.

Само собой. Но ведь статическая типизация не про типы объектов, а про типы имен объектов, не так ли? Именно поэтому она позволяет рассуждать о типах объектов во время компиляции, когда никаких объектов еще нет, есть только их имена.

И ящетаю, что нормальная статическая типизация должна позволять тебе опускать типы для имен, которым ты не хочешь задавать тип. Просто потому что система типов для людей, а не люди для системы типов.

Сами объекты (значения), конечно, будут иметь вполне определенные типы, даже в js. В рантайме.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 3)
Ответ на: комментарий от cloun1901

Эм... в нормальных языках этот тип тоже можно не указывать, хотя он будет. За счёт вывода типов.

val hello = "Hello world!"
println(hello.toLowerCase)
Miguel ★★★★★
()
Ответ на: комментарий от Nervous

Но ведь статическая типизация не про типы объектов, а про типы имен объектов, не так ли?

Нет, конечно, это бред. В рантайме никаких имён уже нет. А информация по типу объекта есть - это отражено в способе работы кода с данными. Если проще - для разных типов в машкоде у тебя будут разные инструкции, смещения и пр. И чтобы компилятор сгенерировал правильные инструкции, ты обязан указывать тип везде, при каждой операции. Это в програме на статически типизированном языке.

В динамическом языке в рантайме всё на строках. Там нет никаких различий. Поэтому ты можешь якобы не указывать тип - просто потому, что там всего один тип.

cloun1901
()
Ответ на: комментарий от menangen

Требование GC - это как-бы заявление «я мудак, не знаю где у меня объекты, подотрите мне жопу кто-нибудь». Такое себе…

igloev
()
Ответ на: комментарий от Miguel

Читай целиком, вывод не считается. Если кратко - здесь не про написать или не написать, а про знает ли компилятор/транслятор тип или нет.

cloun1901
()
Ответ на: комментарий от menangen

Ложь. У си много лет есть сборщик мусора, вот только не хотят его брать. В задачах, где си доминирует, гц делает специфические требования невозможными. Те же умные указатели гораздо эффективнее и в целом имеют не шибко сложные правила использования. «Parent deletes its children» сильно упрощает в культях и геймдеве. Кстати, в геймдеве гц вообще лишний, всякие Actor’ы и GameObject’ы удаляются вручную в тригеррах или родителем.

arturianec100
() автор топика
Ответ на: комментарий от cloun1901

Ну, то есть твоё «должен указывать» не означает «программист должен написать». OK, просто не вполне понятно было.

Miguel ★★★★★
()
Ответ на: комментарий от cloun1901

В рантайме никаких имён уже нет. А информация по типу объекта есть

Причем она есть и в статически типизированных языках, и в динамически типизированных. В рантайме. Статическая типизация отличается тем, что по типам имен мы можем узнать тип будущего объекта заранее, до рантайма (статически, то есть не запуская код на выполнение), и сделать из этого какие-нибудь выводы.

все на строках

Какие строки, ваше величество, пощадите панталоны %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 5)
Ответ на: комментарий от cloun1901

В динамическом языке в рантайме всё на строках

Вроде чуть ли не везде велосипедный variant. Это быстрее конвертации в строку на каждый чих + агрегаты уже на 10 полей создавали бы сильный оверхед. А так с помощью енума внутри в рантайме определяется базовый захардкоженный тип например один из этих.

arturianec100
() автор топика
Ответ на: комментарий от arturianec100

Если я правильно понимаю, даже в тикле, у которого идеология «всё есть строка», внутрях какой-то variant, который преобразуется в строку только тогда, когда надо.

Miguel ★★★★★
()
Ответ на: комментарий от Nervous

Да, с оговорками. Например, в языках, где есть дженерики, ты можешь не знать тип в точности, но знать, что этот тип, скажем, есть массив данных, тип которых совпадает с типом-аргументом (неизвестным на момент компиляции).

Miguel ★★★★★
()
Ответ на: комментарий от Nervous

Статическая типизация отличается тем, что по типам имен мы можем узнать тип будущего объекта заранее, до рантайма (статически, то есть не запуская код на выполнение), и сделать из этого какие-нибудь выводы.

Нет, ты решил моими тезисами мне ответить? Вот чтобы можно было «узнать тип будущего объекта заранее, до рантайма», ты и обязан указывать типы. В школу.

Какие строки, ваше величество, пощадите панталоны

Такие, клоун. В которых недоязычек хранит переменные.

cloun1901
()
Ответ на: комментарий от arturianec100

Вроде чуть ли не везде велосипедный variant

Не важно. К тому же, строка и есть один из вариантных типов(«0» - число, «#» - символ), только сильно примитивный.

cloun1901
()
Ответ на: комментарий от cloun1901

Вот чтобы можно было «узнать тип будущего объекта заранее, до рантайма», ты и обязан указывать типы

Так ведь не всегда это нужно, ваше величество. Может, меня в этом конкретном месте не интересует тип будущего объекта. А канпелятор упорствует и ведет себя по-хамски.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.