LINUX.ORG.RU

Java против C# в 2022г.

 ,


1

6

вот наткнулся на сравнение:

https://www.cisin.com/coffee-break/technology/c-vs-java-which-is-better-for-building-your-product-2022.html

если коротко, C# выигрывает в скорости сгенерированного кода, а Java в безопасности

★★★★★

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

Ответ на: комментарий от ya-betmen

Эта магия называется маркетинг.

Не только, там симпатичная тема, в сравнении с swing в ней выше плотность текста и элементов т.е. она выглядит компактнее. А также под Linux у них использовалась патченая версия JRE где был исправлен рендер шрифтов.
Я их JRE использовал и для другого Java приложения чтоб и в нем видеть красивые шрифты.

Aber ★★★★★
()

C# выигрывает в скорости сгенерированного кода

C# performs better than Java, according to benchmarks found on the internet.

Против интернета не попрёшь.

rupert ★★★★★
()

C# сейчас вообще никому не нужен. Только на десктопном винде он ещё держится. В серверной области его позиции так и остались никакими. За последние 10 лет винда на сервере совсем сдала Линуксу. Поэтому майкрософт и выпустили .net core, чтобы хоть как то по минимуму на сервере закрепиться. Я не думаю, что у них это получается. Я не разу не видел, чтобы кто-то серьезно использовал .net core.

И чисто по наблюдениям со стороны, в Java и в JVM в последние годы больше движухи видно. Значит Java больше востребована. В C#/.NET майкрософт что-то делает, новые версии и т.д., но всем пофиг, они варятся в собственной кострюле.

rupert ★★★★★
()
Ответ на: комментарий от ya-betmen

из дефолтной поставки выпилили.

Зачем ты врёшь? Реализация AWT/Swing как была в дефолтной поставке Java с начальных версий, так и осталась в последнем релизе:

https://docs.oracle.com/en/java/javase/18/docs/api/java.desktop/javax/swing/package-summary.html

Кросс-платформенно работает практически везде без зависимостей, даже на Haiku, кстати. Выпилили только JavaFX, точнее выделили его в отдельный проект.

При чем тут гуй

Да при том, что в Java он есть из коробки, что удобно в отличие от других языков. Кстати, в C++’шную stdlib хотели тоже запихать графику лет 10 назад: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4021.pdf но не особо взлетело, хотя было бы интересно.

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

Она так и не вошла в стандартные, только как левая зависимость, просто изначально разрабатывалась в недрах Sun.

Почему не вошла? Она ведь точно была в составе Oracle JDK и Oracle JRE, в Java 7 можно было использовать JavaFX из коробки, как AWT/Swing, просто установив среду исполнения.

Про OpenJDK правда уже не помню что там было. Но из Java 8 или Java 9 этот JavaFX вычленили в отдельный пакет, где он благополучно протух и помер.

AWT и Swing это стандартные GUI

Ну да, я и говорю – у Java хорошая «стандартная библиотека» богатая различными возможностями, в. т. ч и по созданию GUI. Бери и пиши. И кстати с отличной Backward-совместимостью. Недавно требовалось достаточно сложное GUI-приложение написанное в 2002 году запустить на современной Java – оно запустилось и нормально работало. В Linux с каким-нибудь приложением 2002 года на Qt2 такое возможно только с пердолингом и компилянием.

Есть тема для Swing под названием FlatLaf, она сделана подобно Idea.

Я его кстати упоминал выше. Очень приятная библиотека, которая одной строчкой смывает всю неказистость Swing’а. Кстати NetBeans тоже эту либку стал юзать, а это уже серьёзно.

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

Плюс стоит упомянуть еще SWT который используют Eclipse и DBeaver, но это чисто сторонний UI тулкит. JavaFX сейчас тоже какой-то левой компанией поддерживается и они берут деньги за LTS версию.

Да мне это можешь не рассказывать, я приложения с SWT на AWT/Swing много раз переносил. DBeaver, кстати, насколько я помню тоже Eclipse-based? Как и STS, например: https://spring.io/tools А ещё вроде как Arduino Studio и куча всяких разных IDE для Embedded.

SWT мне никогда не нравился, потому что он на корню херит «Write once, run anywhere», да и под Linux’ом были извечные глюки с ним и версиями GTK+, а в KDE так вообще Eclipse был неюзабельный некоторое время во многих местах, например, всплывающие Pop-up’ы на которых нельзя было разглядеть текст из-за цвета совпадающего с подложкой и др. глитчи. Надеюсь оно сейчас более юзабельно.

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

Это с тех пор у него дерево проекта отображаться перестаёт каждые пару часов?

Не сталкивался, хотя с NetBeans работал года два-три назад довольно активно.

Формошлёп-редактор мне там понравился больше чем то что есть в IDEA и Eclipse.

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

Да жабуФХ выкинули. А при всём удобсте свинга, он спокойно может существовать отдельно. Это не что-то критически важное, а вот какой-нибудь вебсервер, который из коробки был бы удобным, a не это убожество, не помешал бы.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от EXL

Стандартная библиотека с огромным количеством всего что может понадобиться для разработки.

У шарпа не хуже

Батареек на каждый чих в репозитории больше чем у .NET

Спорно, у шарпа в windows не хуже

Нормальная кросс-платформенность из коробки, а не убогая MS-style «кросс-платформенность», когда, например, GUI только под Windows.

Да, но помним о том, что у шарпа в винде нативное GUI, а у Java везде своё, марсианское, кроме андроида, где другого то и нет

Высокий уровень з/п, наверное самый высокий из тех языков которые распространнены.

Полтора оставшихся в живых программиста на фортране из США, обслуживающих старый банковский говнокоднастоящее легаси в банковской сфере, смотрят на вас с удивлением.

Куча enterprise-ready фреймворков, тот же Spring

Спорно

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

Недавно требовалось достаточно сложное GUI-приложение написанное в 2002 году запустить на современной Java – оно запустилось и нормально работало.

в c# разве не аналогично? В крайнем случае, можно держать в системе несколько версий .net

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

Да ладно. Сайтов на ASP.Net наверняка до сих пор хоть жопой жуй. Есть даже целый один русский онлайн-кинотеатр – не буду называть имён – у которого бэкенд почти полностью на C#.

Ну и это… думаешь, можно эпичнее обосраться чем сделать remote code execution через библиотечку для логов?

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

тот обсер с логгером был, на сколько я понял из-за:

  1. архитектурной избыточности библиотеки;
  2. неумения/нежелания обеспечить и реализовать меры безопасности у тех, кто всял библиотеку для использования в своем проекте.

в принципе, инициирование какого-то действия через библиотеку, изначально разрабатываемую для логгирования - не такая уж и редкость. Так что юзеры библиотеки прошляпили. А что, она была частью стандартной библиотеки Java?

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

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

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

А что, она была частью стандартной библиотеки Java?

Фактически, log4j используется в каждом крупном жабопроекте. Так что считай что да.

Но если хочешь эпичного обосрамся именно в стандартной библиотеке, смотри на их реализацию ECDSA.

https://arstechnica.com/information-technology/2022/04/major-crypto-blunder-in-java-enables-psychic-paper-forgeries/

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

. Кстати, в C++’шную stdlib хотели тоже запихать графику лет 10 назад: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4021.pdf но не особо взлетело, хотя было бы интересно.

Зачем миру ещё один ненужный тулкит?

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

Мир не развалится даже если завтра Oracle объявит, что жаба теперь всё, новых релизов не будет, а все кто против могут идти лесом.

Мир вообще довольно устойчивая штука.

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

У шарпа не хуже

Хуже.

Спорно, у шарпа в windows не хуже

Хуже.

Да, но помним о том, что у шарпа в винде нативное GUI, а у Java везде своё, марсианское, кроме андроида, где другого то и нет

На AWT/Swing натягивается обычная системная тема, как я показал выше на скриншотах.

Спорно

Отнюдь.

А вы давно в оффтопике были? Стиль ранних windows xp и windows 95 уже не в моде лет 10 как минимум

Речь идёт про дефолтные контроллы. Они, внезапно, широко используется и в самой Windows 10 и Windows 11. Настолько широко, что индусы до сих пор не могут запилить нормальную панель управления на новых контроллах UWP или как там его и им приходится тянуть два варианта системных конфигураторов.

Если смотреть на ванильную поставку шарпа в оффтопике в той же студии, то там тоже воз и маленькая тележка вариантов gui.

И что толку, когда оно не является нормальной кросс-платформой?

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

в c# разве не аналогично? В крайнем случае, можно держать в системе несколько версий .net

Нет, не аналогично. Берём C# приложение с GUI для Windows написанное в прошлом десятилетии, пытаемся запустить на Linux-дистрибутиве или macOS… получаем тыкву.

EXL ★★★★★
()

Сейчас дотнет фрагментирован на .Net и .Net Core, так как я не на фултайме на нем пишу, то я не очень сейчас понимаю, что как между собой мапится. Вроде есть некий .Net standart, версии которого имплементятся в core и в framework. Но есть ли в core все то что есть во framework мне не ведомо. Вроде были какие-то общие таблицы по которым можно сделать маппинг. С другой стороны в C# говорят отличный AOT в отличие от Java, хотя у Java есть GraalVM (и Spring Native). К тому же у Java куча реализаций JVM (https://en.wikipedia.org/wiki/List_of_Java_virtual_machines), есть даже китайская от алибабы https://dragonwell-jdk.io/ , у C# насколько я понимаю реализация только от майкрософта. Я бы выбирал Java, так как нет такой фрагментации и в JVM было вложено миллиард человекочасов.

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

Зачем миру ещё один ненужный тулкит?

Если бы он был бы в stdc++, то это бы открывало некоторые дополнительные возможности. А отдельно, действительно, не нужен.

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

да нет, почему же. Просто столкнулся на работе с утилиткой, написанной на C#. Причем, без гуя, веба и сети. Грубо говоря, на входе N файлов в одном формате, на выходе M файлов в другом формате. Т.е. такое можно было бы и на питоне написать, но автору проще было взять SharpDevelop и на C#.

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

фрагментирован на .Net и .Net Core

Забудьте про .NET Core, есть один .NET

.NET Standard был создан как раз чтобы определить сеты апи, которые будут доступны в различных реализациях(.NET Framework, .NET Core, Mono)

Если по каким то причинам необходимо чтобы библиотеку можно было использовать и в старом фреймворке, то прописываете нужный RID(ы) в TargetFrameworks.

Например библиотеку с

<TargetFramework>netstandard2.0</TargetFramework>

Можно будет использовать с данными рантаймами https://docs.microsoft.com/en-us/dotnet/standard/net-standard?tabs=net-standard-2-0

В иных случаях ставите актуальный RID(net6.0) и забываете про всё остальное.

ritsufag ★★★★★
()
Ответ на: комментарий от ya-betmen
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class Test {

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/test", new MyHandler());
        server.setExecutor(null); // creates a default executor
        server.start();
    }

    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange t) throws IOException {
            String response = "This is the response";
            t.sendResponseHeaders(200, response.length());
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }

}

что здесь «неудобно» ?

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

Речь идёт про дефолтные контроллы. Они, внезапно, широко используется и в самой Windows 10 и Windows 11.

А всё же не надо быть дизайнером, чтобы отличить java программу от нативной по скриншоту

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

А всё же не надо быть дизайнером, чтобы отличить java программу от нативной по скриншоту

Отметь эти чертовски разительные отличия от нативного GUI на этом скриншоте:

https://raw.githubusercontent.com/EXL/JIconCreator/master/images/jiconcreator_windows10.png

EXL ★★★★★
()

В Java нет перегрузки операторов

  • математики вышли из чата
  • программисты игр удалили Java 2 ME
  • разработчики САПР направили петицию на расширение стандарта
  • школьники устроили бунт на уроке информатики

/me рекомендует не касаться Java даже A+B*C метровой палкой

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

в аду есть отдельный котел для перегружающих операторы.

  • использование средств расширения языка делает программу понятной только её автору - тому, кто это расширение разработал.
  • программисты начинают пользоваться перегрузкой где попало, в результате средство, призванное упростить и упорядочить программу, становится причиной её избыточного усложнения и запутывания.
  • перегруженные операции могут делать не совсем то, что ожидается от них, исходя из их вида.
  • перегрузка операций делает фрагменты программы более контекстно-зависимыми. не зная типов участвующих в выражении операндов, невозможно понять, что это выражение делает, если в нём используются перегруженные операции.
olelookoe ★★★
()
Ответ на: комментарий от olelookoe

Смею предположить, что Вы просто прочитали это где-то и, не подумавши своей головой, просто ретранслируете данные догмы. Хорошо, допустим, я буду следовать этой логике:

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

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

  • Использование перегрузки функций делает фрагменты программы более контекстно-зависимыми, не зная типов, передаваемых внутрь функции, невозможно понять, какая функция будет вызвана, если при объявлении функции используется множественное ее определение с использованием перегрузки.

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

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