Привет, хабражитель! Ты когда-нибудь задумывался, почему C# такой особенный по сравнению с другими языками программирования? Если нет (и если да), то приготовься, потому что сейчас мы погрузимся в различия между C# и самыми популярными его языковыми "братьями": C++, Java, Python и JavaScript. Надеюсь, что это сравнение лучше поможет лучше понять роль и место C#, а также то, что это лучший язык в мире (шучу). Ладно, вперед к сравнениям!
C# vs. C++
1. Управление памятью
Одно из основных различий между C# и C++ касается управления памятью. В то время как в C++ приходится вручную управлять выделением и освобождением памяти, в C# работает сборщик мусора, который автоматически освобождает память, которая больше не используется. Можно сказать, что это как нанять усердного домработника, который следит за порядком в "жилом пространстве" твоего кода, позволяя тебе сосредоточиться на по-настоящему важных вещах.
2. Синтаксис и простота
C++ известен своим сложным синтаксисом, C# же был разработан с прицелом на простоту. Благодаря отсутствию заголовочных файлов, более простой системе пространств имен и меньшим проблемам с управлением памятью, C# похож на элегантного двоюродного брата C++, который проще для новичков, в то же время позволяя опытным разработчикам писать более понятный и легко поддерживаемый код.
3. Зависимость от платформы
C++ является зависимым от платформы выполнения, что означает, что код, написанный для одной платформы, например, x32, уже может не работать на x64 без доработок и изменений. С другой стороны, C# основан на платформе .NET, которая обеспечивает совместимость между платформами, то есть выбирая C#, ты выбираешь возможность запуска своей программы в любой среде, будь то Windows, Linux или MacOS.
C# vs. Java
1. Производительность
Хотя и C# и Java работают на промежуточных средах исполнения (CLR и JavaVM соответственно), что может влиять на производительность, C# часто выходит вперед благодаря компилятору Just-In-Time (JIT), который может оптимизировать код во время выполнения. Более того, если вам нужна только одна какая-то функция в программе, компилятор даже не будет компилировать все остальные! То есть в оперативной памяти будут только те части программы, которые вам действительно нужны, а не вся программа целиком.
2. Особенности языка
C# и Java имеют много общего, но C# может похвастаться несколькими дополнительными функциями, такими как свойства, индексаторы и более обширный набор встроенных типов данных.
3. Language Integrated Query
У C# есть одно не совсем честное преимущество, потому что по факту, используя C# вы получает сразу два языка вместо одного. LINQ - встроенный язык запросов, который позволяет разработчикам писать код для работы с данными намного быстрее и проще. А в последних версиях языка за счет внутренних оптимизаций и хитрых хаков LINQ получил местами огромное ускорение в работе.
C# vs. Python
1. Скорость
Python известен своей читаемостью и простотой использования, что делает его популярным выбором среди новичков. Однако в плане чистой производительности C# часто оказывается впереди. Как компилируемый язык, C# обычно работает быстрее, чем Python, который является интерпретируемым языком. Говоря гоночными терминами, C# - это спортивный автомобиль, а Python - уютный семейный седан.
2. Типы приложений
C# более универсален в отношении типов приложений, включая разработку настольных, веб- и мобильных приложений. Python, с другой стороны, преуспевает в области науки о данных, искусственного интеллекта. Однако, основные библиотеки для работы с ИИ уже давно портированы на C#, а Майкрософт даже выпустила в общее пользование часть своих наработок по работе с искуственным интелектом в библиотеке под названием ML.NET.
3. Синтаксис
Синтаксис Python легко читается и понимается, что делает его дружелюбным для новичков. Однако, эта простота скрывает под собой непредсказуемое порой поведение, например, переменная cat может в один момент работы содержать в себе объект класса Кошка, а в другой момент число 42, в следующий - строку "Привет, читатель статьи!". Соответственно, в момент, когда мы обращаемся к переменной cat, у нас нет никакого понимания и гарантий что внутри действительно объект класса Кошка. C#, хотя и чуть-чуть сложнее, но намного стабильнее в процессе работы.
C# vs. JavaScript
1. Система типов
C# - это статически типизированный язык, что означает, что типы переменных проверяются на этапе компиляции. Это приводит к меньшему количеству ошибок во время выполнения и, в целом, более надежному коду. JavaScript, являясь динамически типизированным языком, проверяет типы переменных во время выполнения, что иногда может приводить к неожиданному поведению.
2. Среда выполнения
Хотя C# универсален и используется для различных приложений, он прежде всего известен своими возможностями в разработке серверных приложений. JavaScript, с другой стороны, используется в основном для разработки на стороне клиента в веб-разработке.
3. Асинхронное программирование
Как C#, так и JavaScript поддерживают асинхронное программирование, но C# выигрывает благодаря ключевым словам async
и await
, которые упрощают процесс написания асинхронного кода. Промисы JavaScript и синтаксис async/await справляются с задачей, но C# делает это проще, позволяя избежать "ада колбэков" и поддерживать чистоту и управляемость кода.
Заключение
C# имеет свои уникальные особенности, преимущества и различия по сравнению с другими языками программирования. Хотя выбор языка в конечном итоге зависит от твоих личных предпочтений, целей и конкретных проектов, C# предлагает мощный, универсальный и выразительный вариант для разработчиков. И если ты собираешься остановить свой выбор на нем, то предлагаю подключиться к курсу.
Комментарии (40)
Myxach
00.00.0000 00:00+1C++ является зависимым от платформы выполнения, что означает, что код, написанный для одной платформы, например, x32, уже может не работать на x64 без доработок и изменений.
Уже интересно, а как же куча legacy приложение работают, хотя может от ос зависит. На винде таких проблем нет
AlexSteelax
00.00.0000 00:00Благодаря слою совместимости, который транслирует вызовы x32 в x64. Т.е. на x32 системе 64-приложения работать не будут, обратное возможно и зависит от ОС.
https://learn.microsoft.com/en-us/dotnet/framework/64-bit-apps
Samhuawei
00.00.0000 00:00+3Да и в целом автор с трудом понимает что такое код, а что - исполняемый файл.Сама по себе стандартная библиотека вполне себе совместима со всеми процессорами и нужно просто указать определённый флаг для компилятора чтобы без проблем создать бинарник под нужную платформу. Да, если используются низкоуровневые структуры данных с выравниванием по границам слова и прочими делами придётся заморочиться. Но для 99% программ перекомпиляция под другую платформу не потребует никаких изменений в коде, только в makefile.
alexei_ovsyannikov
00.00.0000 00:00У меня возник вопрос, почему статическая типизация в C# приводит к меньшему количеству ошибок по сравнению с динамической типизацией в JavaScript? Ведь для JS уже придумали TS, который решает эту проблему.
dopusteam
00.00.0000 00:00Потому что типизация разная: в c# номинальная типизация, а в ts - структурная. К примеру, в js в runtime нет интерфейсов, а в c# - есть.
AndronNSK
00.00.0000 00:00+9Правильнее будет так
C# же был разработан с прицелом на простоту...
..., однако, с годами, обрастая фичами и синтаксическим сахаром, синтаксис стал настолько сложным, что даже имея опыт работы с первыми версиями языка, без изучения документации современный код не понятен.
это моё имхо.
DistortNeo
00.00.0000 00:00+2Это удел любого живого языка. Развиваться, обрастая функционалом, а затем загнуться из-за чрезмерной сложности.
AndronNSK
00.00.0000 00:00+2Откровенно говоря, код на 20х плюсах я тоже не пойму, не занимаясь изучением их. Хотя я вроде C++ разработчик.
Так что да.
Samhuawei
00.00.0000 00:0099% не понимают как устроен лазер. Тем не менее оптоволокном все пользуются.
Многое из того что внесли в С++ упрощает разработку. Но язык устроен так что старое никуда не делось и можно преспокойно проигнорить новые фичи если код старый и переписывать неохота или нет ресурсов.Free_ze
00.00.0000 00:00+1можно преспокойно проигнорить новые фичи
Непонятно лишь, как игнорировать код, который нужно поддерживать.
Samhuawei
00.00.0000 00:00Cоответственно, в момент, когда мы обращаемся к переменной cat, у нас нет никакого понимания и гарантий что внутри действительно объект класса Кошка.
У вас нет, у нас есть функция typeLexo Автор
00.00.0000 00:00Основная идея этого предложения в том, что в питоне ты можешь легко поменять как просто значение переменной, оставаясь в пределах одного типа, так и вообще поменять тип с одного на другой.
Страшнее дело обстоит, на мой взгляд, только в Objective-C, где ты можешь создать объект класса Кошка, а потом в реалтайме удалить у неё методы Мяукать() и Прыгать(), добавить методы ДышатьПодВодой() и Плавать(), однако, у тебя всё равно будет объект класса Кошка.
В C# же ни первой, ни второй ситуации не бывает.
AnarchyMob
00.00.0000 00:00+2Хотя и C# и Java работают на промежуточных средах исполнения (CLR и JavaVM соответственно), что может влиять на производительность, C# часто выходит вперед благодаря компилятору Just-In-Time (JIT), который может оптимизировать код во время выполнения. Более того, если вам нужна только одна какая-то функция в программе, компилятор даже не будет компилировать все остальные! То есть в оперативной памяти будут только те части программы, которые вам действительно нужны, а не вся программа целиком.
То есть вы хотите этим сказать что в jvm нет jit компиляции? Это когда же из jvm успели выпилить jit???
PuerteMuerte
00.00.0000 00:00+6Ну, jit-компиляция в jvm появилась относительно недавно, в конце прошлого века, автор мог ещё про это не знать.
Vasjen
00.00.0000 00:00+5Otus держит уровень. Только недавно была умопомрачительная статья про безопасность ASP. NET, а тут уже новая статья подъехала. Ждём статью про особенности разработки в разных операционных системах, где будет рассказ, что для отладки в окнах можно использовать командную строку, а в Линуксе терминал. И что дисков нет, и файловая система не NTFS.
Lexo Автор
00.00.0000 00:00Только недавно была умопомрачительная статья про безопасность ASP. NET
Ох, спасибо вам, посмеялся. Хотя на самом деле хочется и плакать с того, как обстоят у нас дела. Как человек, который в теме, вы можете проявить инициативу и помочь ОТУСу со статьями, если хотите, конечно.
для отладки в окнах можно использовать командную строку, а в Линуксе терминал
Как человек, который интереса ради прожил полгода в командной строке, не удивлюсь, что и такое возможно. Ведь я тогда и аськой, и браузером (Lynx), и даже фильмы смотрел в консоли. Правда их приходилось сначала сконвертировать в разноцветные ASCII-символы, но ведь возможно. Так же и отладку окон можно как-то в консоль прикрутить.
И что дисков нет
А дисков уже и нет, есть ячейки.
и файловая система не NTFS
А вот тут уже не понял, файловая система может быть любой. Причём тут NTFS? Если уж высмеивать старомодность, то я бы FAT-32 или хотя бы FAT-16 посоветовал. Это примерно из тех же времён, что WinForms.
И ещё не понял, в чём именно вам не угодила моя статья. Или это тоже "мнение", как и статья? "Не понравилось"?
Vasjen
00.00.0000 00:00+1Ведь я тогда и аськой, и браузером (Lynx), и даже фильмы смотрел в консоли.
Было дело давно, был системник под кроватью, на котором поднял дебиан ленни серверную с настроенным шлюзом, и перед сном подрубал моник с клавой, и читал хабр, баш, лор и другие сайты, благо тогда они не были обвешаны джава скриптами по самое не хочу.
И ещё не понял, в чём именно вам не угодила моя статья.
Вы рассказываете про слишком элементарные и поверхностные вещи для технического портала. Все равно, что писать статью про отличие айфонов от другим, рассказывая про лайтнинг и невозможность установки внешних приложений, к примеру. Слишком очевидно для хабра. Добавляем к этому, что вы публикуетесь под шапкой Отуса со слоганом "цифровые навыки от ведущих экспертов".
Не то, чтобы я не считаю лично Вас экспертом, ни в коем случае - я и сам начинающий только, если что. Я понимаю что у Вас есть ЦА - те, кто придут на курсы, и для них возможно по содержанию это отличная статья, но это и не мешало в статье копнуть чуть глубже и раскрыть детали. Например про тот же сборщик мусора, не просто, что он есть, а как он работает, хотя бы в общем виде про поколения объектов,
IDisposable
иobject.Finalize()
.Lexo Автор
00.00.0000 00:00Подозреваю, что здесь та же проблема, что и с тегом "перевод". В первое время этот тег на хабре никто не видел и многие по делу и нет наезжали на переводчика, будто он автор, а иногда и даже ругали, что не указал, что это перевод, хотя он указал.
Сейчас история с тегом "Сложность". У меня стоит уровень "Простой".
"Простой" - Статьи для самой широкой аудитории, которые будут понятны даже неподготовленным читателям. Как правило, с «лёгким» кодом (готовые сниппеты, пошаговые команды для установки, tutorial-style) или без него, общедоступные публикации в любых хабах. Все «небольшие» посты, рассуждения, биографии и истории, интервью, повествования, ликбез.
Так-то, конечно, я могу и про finalization queue, но это, скорее будет тема для другой статьи. Для уровня "средний" или "сложный", в зависимости от глубины.
Что ж, надеюсь, что скоро все привыкнут к тегу сложности и будут выбирать более подходящие для своего уровня статьи. А пока, да, благодарю за комментарий и надеюсь, что мы пришли к общему знаменателю.
VladimirFarshatov
00.00.0000 00:00+1Тег "простой" предполагает простоту изложения, а не поверхностность, граничащую с безграмотностью, уж извините. Как правило, писать под тег простой - это особосложный уровень изложения, не каждый может. Никогда вот не брался за такое, ибо это "слишком сложно".
UndefinedRef
00.00.0000 00:00+3В главе C# vs Python в секции 3 "Синтаксис" ничего не сказано про синтаксис, кроме того, что он легче понимается и читается, что спорно. Весь остальной текст в этом пункте уделён типизации, да и в целом не специфичной проблемы для Python (я бы даже сказал, что этой проблемой больше страдают js, php и т.п.)
P.S.
Почему спорно? Потому что ООП на Python выглядит чисто визуально устрашающе.Samhuawei
00.00.0000 00:00Что именно вас пугает в ООП на Python? Раскройте тезис пожалуйста. По мне так нет ничего проще и понятнее.
lgorSL
00.00.0000 00:00+4В питоне утинация типизация и не используют интерфейсы. Да они и бесполезны, т.к. перегрузка абстрактного метода будет выглядеть просто как объявление такого же метода с новыми аргументами.
В питоне есть abc для абстрактных методов, но не понятно когда надо (и надо ли) его использовать
Дженерики вроде бы и есть, но как-то очень криво сделаны и почти не используются. Ковариантность и контрвариантность типов - не, не слышали.
Возможно множественное наследование, включая ромбовидное.
У класса единственный конструктор, что в сочетании с множественным наследованием вообще не понятно как использовать. Допустим, наследуемся от классов А и Б, причём А хочет в конструктор аргумент "а", а Б - аргумент "б". Как их оба инициализировать?
Не понятно, как при множественном наследовании разрешается совпадение имён полей. Я смутно помню, что можно дать полю имя с двойным подчёркиванием типа "__a" и тогда вроде бы будет независимых две переменных с одинаковыми именами - для кждого подкласса своя. Но, блин, с этим просто не хочется связываться. Вдобавок я могу использовать посторонние классы, код которых не получится изменить.
Можно сделать проперти у объекта, можно сделать статический метод класса, но нельзя сделать статический проперти класса.
Часть функционала ООП (типа модуля abc и property) делается через декораторы. Во-первых это ещё один механизм, который придётся понимать и учитывать. Во-вторых если декораторов несколько - не понятно, в каком порядке их писать. Иногда работает в любом, но никаких гарантий нет. Для примера, в обычных языках можно написать "public override final" или "final override public" и всё будет корректно.
Модификаторов видимости нет. Есть только соглашение, что то что начинается с подчёркивания - не надо использовать снаружи.
Можно написать код типа "if cond: class A() ... else class A() ..." и в зависимости от условия получить либо одно объявление класса, либо другое. Ещё можно случайно определить класс с тем же именем.
По вышеперечисленным причинам я ООП в питоне очень аккуратно и ограниченно применяю. В языках со статической типизацией ошибки с ООП на этапе компиляции выскочат. В питоне код либо упадёт в рантайме либо не упадёт, но будет работать некорректно, что ещё хуже.
x2v0
00.00.0000 00:00Удивительно, что автор не упомянул Kotlin!?
потому что Kotlin и C# - близнецы-братья :)DistortNeo
00.00.0000 00:00+1Скорее, C# и Java, с которой первый был слизан и улучшен.
Samhuawei
00.00.0000 00:00+1А java в свою очередь слизана с C++ откуда удалили множественное наследование, шаблоны и работу с памятью.
Lexo Автор
00.00.0000 00:00Не уверен, что полностью соглашусь. Всегда считал истиной что-то вот такое:
(С) https://www.decodejava.com/introduction-to-csharp-language.htm
klimkinMD
00.00.0000 00:00Учитывая, что это РЕКЛАМА курса, обсуждать тут нечего, ну кто, всерьёз, обсуждает рекламу?
NeoCode
Ну если обобщать, то это касается не только C#. Другие современные высокоуровневые компилируемые языки со статической типизацией, такие как Go и Swift, также обладают этими преимуществами - как перед более низкоуровневыми С/С++, так и перед интерпретируемыми динамическими JS/Python.
VladimirFarshatov
Постоянно удивляет как народ смешивает не смешиваемое в одном предложении, что автор поставив несравнимое в сравнения, что комментаторы и очень часто и не только тут.
Кстати, почему нет сравнения C# vs Haskel или C# vs Lisp? по статье и аргументам, кмк "самое оно" было бы. Ещё надо было с Visual Basic сравнить. Я понимаю ещё сравнить C# c Java .. оба языка имеют прослойку, за счет которой машинно-независимы, но гарантированно теряют в скорости, оба имеют JIT компиляцию. Но сравнивать с Питоном или Джаваскриптом, особенно с последним, где-то за гранью моего понимания. Питон - чистый интерпретатор как и PHP, имеет совсем имые преимущества, не достижимые в компилируемых языках от слова "теоретически", за которые надо платить скоростью.
Javascript - вообще уникален, ибо это язык "на словаре". Вполне нормально имитирует как процедурные, так и функциональные языки и также является интерпретатором. За это плата всё та же самая - скорость исполнения.
Параллелизм исполнения .. есть два подхода: "семафорный" и "хоаровский". Первый реализован в большинстве ОС, второй в Ада, Go и не помню, где-то ещё.. какой применен в C#? Автор про это умолчал, однако..
Как можно сравнивать несравнимое?!? Сорри за много букв, может в чем и не прав, не настаиваю. Категорически режет глаз соединение в одном предложении совершенно разнородных вещей.. мягкое с теплым.
Samhuawei
Что вы все к скорости придрались. Можно подумать на ардуинах дум запускаете. Современные процессоры смолотят любой код. Да и в целом скорее всего этот код будет распределён на кластерах в облаке и работает ли он в два или в полтора раза быстрее никакой погоды не сделает.
Да, есть узкоспециализированные задачи которые требуют выжать всё из железа. Но там речь не о языке программирования, а об использовании специальных библиотек производителя процессора или видеокарты. Которые вполне себе портируются под любой язык было бы желание.
VladimirFarshatov
"Придирка" не к скорости, а к непониманию различий между "теплым" и "мягким" и сваливании в одну кучу совершенно разнородных языков, имеющих свои, конкретные преимущества.
Про скорость, замечу только одно: да, мощность компьютеров возросла на порядки со времен моей первой ЭВМ МИНСК-222М с её 6(шестью!) килословами ОЗУ и 8-и терминальном классе на Фортране-2 Ершова П.П. в НГУ в 1979г.. но!
Отчего многократно возросшая моща компьютерной техники открывает страницу онлайн-службы какого-нибудь банка по 10-30-60секунд(!!!) как только выезжаешь "в деревню"? Может в консерватории что-то не так, и утверждение "Современные процессоры смолотят любой код" банально не верное в своей основе?
Samhuawei
Если программа плохо работает в местах с медленными интернет соединениями то это проблема не языка программирования, а выбранной архитектуры. Или даже так - перед разработчиками не ставили задачу работы под 2G, а тестировщики не тесировали, потому что клиентов в деревне мало и нет смысла тратить ресурсы.
Lexo Автор
Потому что это статья, ориентированная на тех, кто только выбирает на чём ему программировать и становиться ли программистом вообще. Предлагать кому-то начинать "вход в АйТи" с Хаскеля или Лиспа можно только если вам этот человек чем-то насолил и сильно не нравится.
А если посмотреть банальный TIOBE index, то в топе будут как раз Python, C, C++, Java, VisualBasic (но, опять же, судя по количеству и зарплатах вакансий на HH не вижу смысла его изучать) и C#.
Так что, да, во-первых, сравнение шло только с самыми популярными языками, которые могут быть на слуху у не-программистов. Во-вторых, попрошу обратить внимание, что, во-первых, статья написана для новичков (уровень "Простой"), поэтому прошу не залезать в области параллелизмом исполнения, Ады и прочего, кажется, здесь это не совсем уместно. В-третьих, у статьи стоит тег "Мнение". Если сами захотите написать статью по разнице параллелизмов исполнения в разных языках и какой из них на ваш счет лучше, то я вам только плюсик поставлю.
VladimirFarshatov
В каком месте статьи это акцентировано? Не нашел. Обращение ко всем "хабражителям" и только.
Ну .. если посмотреть, то основное сейчас - веб-разработка, а там в лидерах PHP, которого у Вас тоже нет в сравнении. И PHP8 - уже вполне "приличный" язык, да и по скоростным параметрам уже вполне на уровне.
Ну так и высказал свое мнение, что мне странно читать сравнения теплого с мягким. Собственно, из-за разного назначения, такие разные языки и находятся в топах рядом друг с другом.