Как стать автором
Обновить

Комментарии 49

Ну если обобщать, то это касается не только C#. Другие современные высокоуровневые компилируемые языки со статической типизацией, такие как Go и Swift, также обладают этими преимуществами - как перед более низкоуровневыми С/С++, так и перед интерпретируемыми динамическими JS/Python.

Постоянно удивляет как народ смешивает не смешиваемое в одном предложении, что автор поставив несравнимое в сравнения, что комментаторы и очень часто и не только тут.

Кстати, почему нет сравнения C# vs Haskel или C# vs Lisp? по статье и аргументам, кмк "самое оно" было бы. Ещё надо было с Visual Basic сравнить. Я понимаю ещё сравнить C# c Java .. оба языка имеют прослойку, за счет которой машинно-независимы, но гарантированно теряют в скорости, оба имеют JIT компиляцию. Но сравнивать с Питоном или Джаваскриптом, особенно с последним, где-то за гранью моего понимания. Питон - чистый интерпретатор как и PHP, имеет совсем имые преимущества, не достижимые в компилируемых языках от слова "теоретически", за которые надо платить скоростью.

Javascript - вообще уникален, ибо это язык "на словаре". Вполне нормально имитирует как процедурные, так и функциональные языки и также является интерпретатором. За это плата всё та же самая - скорость исполнения.

Параллелизм исполнения .. есть два подхода: "семафорный" и "хоаровский". Первый реализован в большинстве ОС, второй в Ада, Go и не помню, где-то ещё.. какой применен в C#? Автор про это умолчал, однако..

Как можно сравнивать несравнимое?!? Сорри за много букв, может в чем и не прав, не настаиваю. Категорически режет глаз соединение в одном предложении совершенно разнородных вещей.. мягкое с теплым.

Что вы все к скорости придрались. Можно подумать на ардуинах дум запускаете. Современные процессоры смолотят любой код. Да и в целом скорее всего этот код будет распределён на кластерах в облаке и работает ли он в два или в полтора раза быстрее никакой погоды не сделает.

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

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

Про скорость, замечу только одно: да, мощность компьютеров возросла на порядки со времен моей первой ЭВМ МИНСК-222М с её 6(шестью!) килословами ОЗУ и 8-и терминальном классе на Фортране-2 Ершова П.П. в НГУ в 1979г.. но!

Отчего многократно возросшая моща компьютерной техники открывает страницу онлайн-службы какого-нибудь банка по 10-30-60секунд(!!!) как только выезжаешь "в деревню"? Может в консерватории что-то не так, и утверждение "Современные процессоры смолотят любой код" банально не верное в своей основе?

Если программа плохо работает в местах с медленными интернет соединениями то это проблема не языка программирования, а выбранной архитектуры. Или даже так - перед разработчиками не ставили задачу работы под 2G, а тестировщики не тесировали, потому что клиентов в деревне мало и нет смысла тратить ресурсы.

почему нет сравнения C# vs Haskel или C# vs Lisp?

Потому что это статья, ориентированная на тех, кто только выбирает на чём ему программировать и становиться ли программистом вообще. Предлагать кому-то начинать "вход в АйТи" с Хаскеля или Лиспа можно только если вам этот человек чем-то насолил и сильно не нравится.

А если посмотреть банальный TIOBE index, то в топе будут как раз Python, C, C++, Java, VisualBasic (но, опять же, судя по количеству и зарплатах вакансий на HH не вижу смысла его изучать) и C#.

Так что, да, во-первых, сравнение шло только с самыми популярными языками, которые могут быть на слуху у не-программистов. Во-вторых, попрошу обратить внимание, что, во-первых, статья написана для новичков (уровень "Простой"), поэтому прошу не залезать в области параллелизмом исполнения, Ады и прочего, кажется, здесь это не совсем уместно. В-третьих, у статьи стоит тег "Мнение". Если сами захотите написать статью по разнице параллелизмов исполнения в разных языках и какой из них на ваш счет лучше, то я вам только плюсик поставлю.

Потому что это статья, ориентированная на тех, кто только выбирает на
чём ему программировать и становиться ли программистом вообще.

В каком месте статьи это акцентировано? Не нашел. Обращение ко всем "хабражителям" и только.

А если посмотреть банальный TIOBE index ... Так что, да, во-первых, сравнение шло только с самыми популярными языками, которые могут быть на слуху у не-программистов.

Ну .. если посмотреть, то основное сейчас - веб-разработка, а там в лидерах PHP, которого у Вас тоже нет в сравнении. И PHP8 - уже вполне "приличный" язык, да и по скоростным параметрам уже вполне на уровне.

В-третьих, у статьи стоит тег "Мнение".

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

В каком месте статьи это акцентировано?

Почему-то был уверен, что для этого нужен тег "Простой", но теперь уже понял, что заблуждался.

там в лидерах PHP, которого у Вас тоже нет в сравнении

На PHP у меня есть опыт только где-то в начале нулевых, и то я больше правил то, что уже было написано в джумле, друпале и вордпрессе, ничего с нуля не писал. Поэтому, боюсь, вам не понравится моё сравнение PHP и C#, если я его напишу :)

мне странно читать сравнения теплого с мягким

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

Здесь же я взял языки, которые больше всех на слуху и попытался их сравнить между собой простым языком, хотя и думаю, что сравнивать C# можно адекватно только с Java. Плюс, сравнение тоже не до конца справедливое, потому что, давайте будем честными, основная задача статьи - заинтересовать тех, кто ещё не умеет программировать и склонить их на тёмную сторону пригласить на пробный урок курса по шарпу.

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

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

C++ является зависимым от платформы выполнения, что означает, что код, написанный для одной платформы, например, x32, уже может не работать на x64 без доработок и изменений. 

Уже интересно, а как же куча legacy приложение работают, хотя может от ос зависит. На винде таких проблем нет

Благодаря слою совместимости, который транслирует вызовы x32 в x64. Т.е. на x32 системе 64-приложения работать не будут, обратное возможно и зависит от ОС.

https://learn.microsoft.com/en-us/dotnet/framework/64-bit-apps

Да и в целом автор с трудом понимает что такое код, а что - исполняемый файл.Сама по себе стандартная библиотека вполне себе совместима со всеми процессорами и нужно просто указать определённый флаг для компилятора чтобы без проблем создать бинарник под нужную платформу. Да, если используются низкоуровневые структуры данных с выравниванием по границам слова и прочими делами придётся заморочиться. Но для 99% программ перекомпиляция под другую платформу не потребует никаких изменений в коде, только в makefile.

У меня возник вопрос, почему статическая типизация в C# приводит к меньшему количеству ошибок по сравнению с динамической типизацией в JavaScript? Ведь для JS уже придумали TS, который решает эту проблему.

Потому что типизация разная: в c# номинальная типизация, а в ts - структурная. К примеру, в js в runtime нет интерфейсов, а в c# - есть.

Правильнее будет так

C# же был разработан с прицелом на простоту...

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

это моё имхо.

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

Откровенно говоря, код на 20х плюсах я тоже не пойму, не занимаясь изучением их. Хотя я вроде C++ разработчик.

Так что да.

99% не понимают как устроен лазер. Тем не менее оптоволокном все пользуются.

Многое из того что внесли в С++ упрощает разработку. Но язык устроен так что старое никуда не делось и можно преспокойно проигнорить новые фичи если код старый и переписывать неохота или нет ресурсов.

можно преспокойно проигнорить новые фичи

Непонятно лишь, как игнорировать код, который нужно поддерживать.

Cоответственно, в момент, когда мы обращаемся к переменной cat, у нас нет никакого понимания и гарантий что внутри действительно объект класса Кошка.

У вас нет, у нас есть функция type

Пояснительную бригаду прошу. Кому не нравится type в питоне?

И type annotations

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

Страшнее дело обстоит, на мой взгляд, только в Objective-C, где ты можешь создать объект класса Кошка, а потом в реалтайме удалить у неё методы Мяукать() и Прыгать(), добавить методы ДышатьПодВодой() и Плавать(), однако, у тебя всё равно будет объект класса Кошка.

В C# же ни первой, ни второй ситуации не бывает.

Хотя и C# и Java работают на промежуточных средах исполнения (CLR и JavaVM соответственно), что может влиять на производительность, C# часто выходит вперед благодаря компилятору Just-In-Time (JIT), который может оптимизировать код во время выполнения. Более того, если вам нужна только одна какая-то функция в программе, компилятор даже не будет компилировать все остальные! То есть в оперативной памяти будут только те части программы, которые вам действительно нужны, а не вся программа целиком.

То есть вы хотите этим сказать что в jvm нет jit компиляции? Это когда же из jvm успели выпилить jit???

Ну, jit-компиляция в jvm появилась относительно недавно, в конце прошлого века, автор мог ещё про это не знать.

Otus держит уровень. Только недавно была умопомрачительная статья про безопасность ASP. NET, а тут уже новая статья подъехала. Ждём статью про особенности разработки в разных операционных системах, где будет рассказ, что для отладки в окнах можно использовать командную строку, а в Линуксе терминал. И что дисков нет, и файловая система не NTFS.

Только недавно была умопомрачительная статья про безопасность ASP. NET

Ох, спасибо вам, посмеялся. Хотя на самом деле хочется и плакать с того, как обстоят у нас дела. Как человек, который в теме, вы можете проявить инициативу и помочь ОТУСу со статьями, если хотите, конечно.

для отладки в окнах можно использовать командную строку, а в Линуксе терминал

Как человек, который интереса ради прожил полгода в командной строке, не удивлюсь, что и такое возможно. Ведь я тогда и аськой, и браузером (Lynx), и даже фильмы смотрел в консоли. Правда их приходилось сначала сконвертировать в разноцветные ASCII-символы, но ведь возможно. Так же и отладку окон можно как-то в консоль прикрутить.

И что дисков нет

А дисков уже и нет, есть ячейки.

и файловая система не NTFS

А вот тут уже не понял, файловая система может быть любой. Причём тут NTFS? Если уж высмеивать старомодность, то я бы FAT-32 или хотя бы FAT-16 посоветовал. Это примерно из тех же времён, что WinForms.

И ещё не понял, в чём именно вам не угодила моя статья. Или это тоже "мнение", как и статья? "Не понравилось"?

Ведь я тогда и аськой, и браузером (Lynx), и даже фильмы смотрел в консоли.

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

И ещё не понял, в чём именно вам не угодила моя статья.

Вы рассказываете про слишком элементарные и поверхностные вещи для технического портала. Все равно, что писать статью про отличие айфонов от другим, рассказывая про лайтнинг и невозможность установки внешних приложений, к примеру. Слишком очевидно для хабра. Добавляем к этому, что вы публикуетесь под шапкой Отуса со слоганом "цифровые навыки от ведущих экспертов".

Не то, чтобы я не считаю лично Вас экспертом, ни в коем случае - я и сам начинающий только, если что. Я понимаю что у Вас есть ЦА - те, кто придут на курсы, и для них возможно по содержанию это отличная статья, но это и не мешало в статье копнуть чуть глубже и раскрыть детали. Например про тот же сборщик мусора, не просто, что он есть, а как он работает, хотя бы в общем виде про поколения объектов, IDisposable и object.Finalize().

Подозреваю, что здесь та же проблема, что и с тегом "перевод". В первое время этот тег на хабре никто не видел и многие по делу и нет наезжали на переводчика, будто он автор, а иногда и даже ругали, что не указал, что это перевод, хотя он указал.

Сейчас история с тегом "Сложность". У меня стоит уровень "Простой".

"Простой" - Статьи для самой широкой аудитории, которые будут понятны даже неподготовленным читателям. Как правило, с «лёгким» кодом (готовые сниппеты, пошаговые команды для установки, tutorial-style) или без него, общедоступные публикации в любых хабах. Все «небольшие» посты, рассуждения, биографии и истории, интервью, повествования, ликбез.

Так-то, конечно, я могу и про finalization queue, но это, скорее будет тема для другой статьи. Для уровня "средний" или "сложный", в зависимости от глубины.

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

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

Спасибо большое, Владимир, раньше по-другому воспринимал этот тег. Учту и исправлюсь.

В главе C# vs Python в секции 3 "Синтаксис" ничего не сказано про синтаксис, кроме того, что он легче понимается и читается, что спорно. Весь остальной текст в этом пункте уделён типизации, да и в целом не специфичной проблемы для Python (я бы даже сказал, что этой проблемой больше страдают js, php и т.п.)

P.S.
Почему спорно? Потому что ООП на Python выглядит чисто визуально устрашающе.

Что именно вас пугает в ООП на Python? Раскройте тезис пожалуйста. По мне так нет ничего проще и понятнее.

таскать self удобно? и куча инициализаторов конструкторов

  1. В питоне утинация типизация и не используют интерфейсы. Да они и бесполезны, т.к. перегрузка абстрактного метода будет выглядеть просто как объявление такого же метода с новыми аргументами.

  2. В питоне есть abc для абстрактных методов, но не понятно когда надо (и надо ли) его использовать

  3. Дженерики вроде бы и есть, но как-то очень криво сделаны и почти не используются. Ковариантность и контрвариантность типов - не, не слышали.

  4. Возможно множественное наследование, включая ромбовидное.

  5. У класса единственный конструктор, что в сочетании с множественным наследованием вообще не понятно как использовать. Допустим, наследуемся от классов А и Б, причём А хочет в конструктор аргумент "а", а Б - аргумент "б". Как их оба инициализировать?

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

  7. Можно сделать проперти у объекта, можно сделать статический метод класса, но нельзя сделать статический проперти класса.

  8. Часть функционала ООП (типа модуля abc и property) делается через декораторы. Во-первых это ещё один механизм, который придётся понимать и учитывать. Во-вторых если декораторов несколько - не понятно, в каком порядке их писать. Иногда работает в любом, но никаких гарантий нет. Для примера, в обычных языках можно написать "public override final" или "final override public" и всё будет корректно.

  9. Модификаторов видимости нет. Есть только соглашение, что то что начинается с подчёркивания - не надо использовать снаружи.

  10. Можно написать код типа "if cond: class A() ... else class A() ..." и в зависимости от условия получить либо одно объявление класса, либо другое. Ещё можно случайно определить класс с тем же именем.

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

Удивительно, что автор не упомянул Kotlin!?
потому что Kotlin и C# - близнецы-братья :)

Kotlin и C# братья близнецы? Чего блин?

Как Шварцнеггер и Девито в одноименном фильме. ;)

Скорее, C# и Java, с которой первый был слизан и улучшен.

А java в свою очередь слизана с C++ откуда удалили множественное наследование, шаблоны и работу с памятью.

Это ошибочная схема. С++, это прямое развитие С, Java — это самостоятельный язык, с собственной парадигмой программирования, который к С++ отношения не имеет, но имеет синтаксические заимствования из С. C# в свою очередь, это гибридный язык, который вместе со своей платформой архитектурно ближе к Java, но заимствовал парадигму сразу из двух языков — из Java и из Pascal.

Ого! Век живи - век учись, спасибо за новую информацию.

Там ещё помнится Модула светилась в прародителях Джавы, которая наследница Паскаля, который Вирт, насколько его помню, написал исключительно как язык для обучения и только. ;)

Согласен. И это сравнение в статье уже есть.

Учитывая, что это РЕКЛАМА курса, обсуждать тут нечего, ну кто, всерьёз, обсуждает рекламу?

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

В JS есть async. "Аутор урот".

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий