С# живет по принципу «всякая сущность есть объект». Его причисляют к объектно-ориентированным, а точнее объектным, языкам программирования. «Язык основан на строгой компонентной архитектуре и реализует передовые механизмы обеспечения безопасности кода» – так принято характеризовать его. Однако скептики сомневаются как минимум в его безопасности.
Сторонники C# называют его самым мультипарадигменным, универсальным, продвинутым и удобным в использовании языком программирования. Учитывая тот факт, что за ним стоит платформа Microsoft .NET, число таких сторонников достаточно велико.
Предки
Далекие предки C# появились еще в 60-х годах. Все началось с появления языка B, который в 1969 году был создан коллективом разработчиков из Технологического института Массачусетса (MIT). Главным автором B является Кен Томпсон. Тогда команда работала над операционной системой UNIX. Уже существовавший язык PL/I, применявшийся в то время для мэйнфреймов производства компании IBM, был достаточно громоздким и меньше подходил для поставленной задачи. Поэтому ученые решили создать новый язык, который и получил название B. Он является типичным представителем ранних императивных языков программирования.
После B, как это ни странно, последовал С, который был изобретен в 1972 году. Основой для нового языка послужил сам B.
Создателями C были Кен Томпсон и Денис Ритчи, которые работали в исследовательской лаборатории компании AT&T (AT&T Bell Telephone Laboratories). В 1971 году Ритчи начал создавать расширенную версию B. Сначала он назвал её NB (New B), но когда язык стал сильно отличаться от B, название сменили на C. B расширился за счет явного использования типов, структур и ряда новых операций.
По поводу возникновения языка Си Питер Мойлан в своей книге «The case against C» писал: «Нужен был язык, способный обойти некоторые жесткие правила, встроенные в большинство языков высокого уровня и обеспечивающие их надежность. Нужен был такой язык, который позволил бы делать то, что до него можно было реализовать только на ассемблере или на уровне машинного кода».
Изображение из книги «Язык Си»: M. Уэйт, С. Прата, Д. Мартин
В 1984 году Бьярне Страуструп (Bell Labs) выступил с проектом языка С++. Когда Страуструп занимался исследованиями в фирме, ему потребовалось написать несколько имитационных программ для моделирования распределенных вычислений. SIMULA-67 — объектно-ориентированный язык – мог бы стать идеальным инструментом для решения подобных задач, если бы не его сравнительно низкая скорость выполнения программ.
Если вам приходится выбирать между написанием «хорошего» и «быстрого» кода, значит, здесь что-то не так. Потому что «хороший» код должен быть «быстрым», – объясняет Страуструп свою позицию в интервью.
Так был создан язык программирования С++, первоначально получивший название «Си с классами» (С with classes). Название «С++» придумал Рик Мэсчитти. "++" — это оператор инкремента в С, который как бы намекает на то, что язык С++, нечто больше, чем просто С.
C#
Microsoft решила отметить Миллениум выпуском новых программных продуктов. К 2000 году компания подготовила промышленные версии новых компонентных технологий и решений в области обмена сообщениями и данными, а также создания Internet-приложений (COM+, ASP+, ADO+, SOAP, Biztalk Framework). В поддержку этих новшеств Microsoft выпустила инструментарий для разработки приложений – платформу .NET. Она также объединяла «под одной крышей» несколько языков программирования, что было в новинку для того времени.
Еще одним новшеством платформы .NET была технология активных серверных страниц ASP.NET (Active Server Page). С её помощью можно было относительно быстро разработать веб-приложения, взаимодействующие с базами данных.
Язык программирования C# был создан специально для ASP.NET. На C# полностью была написана и сама ASP.NET.
Название «Си шарп» (от англ. sharp — диез) несет «сакральный» смысл. Знак «#» (в музыкальной нотации читается как «диез») означает повышение высоты звука на полтона. С другой стороны, название «C#» получается путем следующей «эволюционной цепочки»: C > C++ > C++++(C#), так как символ «#» можно составить из 4-х знаков «+».
Вследствие технических ограничений на отображение (стандартные шрифты, браузеры и т. д.) и того, что знак диез ? не представлен на стандартной клавиатуре, знак # был выбран для представления знака диез при записи имени языка программирования. Это соглашение отражено в Спецификации Языка C# ECMA-334. Названия языков программирования не принято переводить, поэтому язык следует называть по-английски «Си шарп».Авторами этого языка программирования стали Скотт Вилтамут и Андерс Хейльсберг — создатель Турбо Паскаля и Дельфи, перешедший в 1996 году в Microsoft.
По одной из версий, он вынашивал замысел нового языка и даже новой платформы (которая сейчас носит название .NET), еще работая в компании Borland.C# поддерживает все три «столпа» объектно-ориентированного программирования: инкапсуляцию, наследование и полиморфизм. Кроме того, в нем была реализована автоматическая «сборка мусора», обработки исключений, динамическое связывание.
Сравнение с Java
Как и Java, C# изначально предназначался для веб-разработки, и примерно 75% его синтаксических возможностей аналогичны языку программирования Java. Его также называют «очищенной версией Java». 10% позаимствовано из C++, а 5% – из Visual Basic. И около 10% C# – это реализация собственных идей разработчиков.
Несмотря на весьма существенные различия между компонентной объектной моделью COM (основного стандарта Microsoft для компонентного проектирования и реализации программного обеспечения) и моделью Java, языки программирования имеет довольно много общего.
Единая среда выполнения программ основана на использовании промежуточного языка IL (Intermediate Language — промежуточный язык), исполняющего почти ту же роль, что и байт-код виртуальной машины Java. Используемые в рамках технологии .NET компиляторы с различных языков транслируют программы в IL-код. Так же, как и байт-код Java, IL-код представляет собой команды гипотетической стековой вычислительной машины. Но есть и разница в устройстве и использовании IL.
Во-первых, в отличие от JVM, IL не привязан к одному языку программирования. В составе, предварительных версий Microsoft.NET имеются компиляторы языков Си++, Си#, Visual Basic. Независимые разработчики могут добавлять другие языки, создавая свои компиляторы в IL-код.
Во-вторых, IL предназначен не для программной интерпретации, а для последующей компиляции в машинный код. Это позволяет достичь существенно большего быстродействия программ. Содержащие IL-код файлы несут достаточно информации для работы оптимизирующего компилятора.
Кик Рэдек из Microsoft считает С# более сложным языком, чем Java. По его мнению, «язык Java был построен таким образом, чтобы уберечь разработчика от выстрела в собственную ногу» (англ. «Java was built to keep a developer from shooting himself in the foot»), а «С# был построен так, чтобы дать разработчику пистолет, но оставить его на предохранителе» (англ. «C# was built to give the developer a gun but leave the safety turned on»).
Версии
Работа над C# началась в декабре 1998 года. Проект получил кодовое название COOL (C-style Object Oriented Language).
Первая бета-версия C# 1.0 увидела свет летом 2000 года, а в феврале 2002 вместе с Microsoft Visual Studio вышла окончательная версия языка. Так как C# сочетает лучшие стороны предшествующих ей популярных языков программирования в виде C, Java и C++, программистам легко осуществить переход на C#, основываясь на знаниях любого из перечисленных языков.
Главным отличием от предшественников стала возможность написания компонентов. В C# появились такие средства, как события, методы и свойства.
В 2005 году вышел окончательный релиз версии C# 2.0. Это укрепило его позиции на рынке. Добавление новых возможностей, таких как анонимные методы, обобщения, частичные и параметризованные типы значительно расширили возможности применения C#.
Во второй версии была добавлена поддержка 64-х разрядных вычислений, что открыло возможность увеличения адресного пространства. Также было реализовано создание триггеров, хранимых процедур и типов данных на .NET языках.
Версия 3.0, вышедшая в 2008 году, позволила C# вырваться вперед в «гонке вооружений» языков программирования. Среди нововведений C# 3.0 – язык интегрированных запросов (LINQ); не явно типизированные переменные и методы расширения; Lambda-выражения, которые назначают реализацию кода делегатам с помощью нового, более простого синтаксиса. Особенно «отличились» Lambda-выражения вместе с языком интегрированных запросов.
Анонимные типы переменных позволили избежать громоздкости и откровенного неудобства при описании переменных, дав возможность объявлять новый тип непосредственно при ее создании. Новинкой в C# 3.0 также стали так называемые «ленивые вычисления», которые производят необходимые вычисления только при запросе нужных соответствующих данных.
В 2010 году была выпущена версия C# 4.0. Ее главным дополнением к предыдущим версиям стали именованные и необязательные аргументы. Первые дают возможность привязки аргумента и параметра по имени, а вторые позволяют указать аргумент, который используется по умолчанию, для каждого параметра. Не менее важное новшество – тип dynamic. Он позволяет осуществлять проверку на соответствие типов объектов не на этапе компиляции, а непосредственно во время выполнения программы.
Параллельно появились новшества в .NET Framework 4.0 – библиотека распараллеливания задач (TPL) и параллельный вариант языка интегрированных запросов (PLNQ). Их поддержка позволяет осуществить параллельность выполнения кода в компьютерах с многоядерными процессорами или несколькими одноядерными.
Версия C# 5.0 появилась в 2012 году. В ней было реализовано совсем немного нововведений:
• Асинхронные методы
• Операция получения сведений о вызывающем объекте
Версия C# 6.0
Эта версия была выпущена через три года после выхода пятой версии — в 2015. Ее основные новшества:
• Инициализация свойств со значениями
В C# 6.0 можно инициализировать свойства со значениями. Это поможет избежать ошибки с null и пустыми значениями свойства.
• Интерполяция строк
Каждый день нам приходится сталкиваться с конкатенацией строк. Кто-то в основном использует оператор “+”, кто-то — метод string.Format(). Но проблемы с ним всем известны: при слишком большом количестве параметров тяжело понимать, что означают каждое число – {1}, {2}, {3}. В C# 6.0 придумали новую возможность, которая должна объединить достоинства обоих методов.
• Использование лямбда-выражений
В C# 6.0 свойства и методы можно определять через лямбда-выражения. Это сильно уменьшает количество кода.
• Импорт статических классов
Все статические члены класса могут быть определены с помощью другого статического класса. Но нам приходится постоянно повторять имя данного статического класса. При большом количестве свойств приходится много раз повторять одно и то же.
В C# 6.0 появилась возможность импортировать с помощью ключевого слова using статические классы.
• Null-условный оператор
C# 6.0 вводит новый так называемый Null-условный оператор (?.), который будет работать поверх условного оператора (?:). Он призван облегчить проверку на NULL значения.
Он возвращает значение null, если объект класса, к которому применен оператор, равен null.
• nameof оператор
В C# 6.0 оператор nameof будет использоваться, чтобы избежать появления в коде строковых литералов свойств. Этот оператор возвращает строковый литерал передаваемого в него элемента. В качестве параметра можно передать любой член класса или сам класс.
• Await в catch и finally блоках
До C# 6.0 нельзя было использовать в блоках catch и final оператор await. Ее можно применять для освобождения ресурсов или для ведения логов ошибок.
• Фильтры исключений
Фильтры исключений были в CLR, но только в VB. Теперь данная возможность появилась в C#, и можно накладывать дополнительный фильтр на исключения.
• Инициализация Dictionary
В C# 6.0 добавлена возможность инициализации Dictionary по ключу значения. Это должно упростить инициализацию словарей.
Также Microsoft улучшила новый компилятор в плане производительности.
C# 7.0
В 2016 году стало известно о новшествах готовящейся версии С# 7.0:
• Бинарные литералы
• Локальные функции
Они позволяют структурировать код, например, в стиле JavaScript.
• Сопоставление с образцом (Pattern matching)
Теперь можно использовать разнообразные средства для сопоставления.
• Условия и использование объектов в переключателях
Маленькая революция для разработчиков. Теперь switch почти ничем не ограничен. Можно использовать сопоставления.
• Записи
Автоматическое создание простых классов с произвольными полями.
• Кортежи
Иногда хочется вернуть несколько значений из метода. Для упрощения этой задачи в C# 7 были добавлены кортежи и литералы кортежей.
Перспективы С#
«Все больше компаний для крупных проектов выбирает платформу Microsoft .NET, пишет в своем блоге Михаил Флёнов. – И тут все просто, Java потерял свободу, когда ушел под крыло Oracle. До этого перехода Sun тратил огромные ресурсы на этот язык и много делалось ради свободы, открытого кода и просто Java. С переходом под крыло Oracle язык все же потерял, стал развиваться медленнее.
В случае с .NET, Microsoft делает намного больше усилий. Язык развивается все ещё достаточно серьёзно, компания выпустила бесплатный редактор кода под все платформы, и как раз начинает вкладываться в открытость, делает все, что освобождает .NET.
Трудно сейчас сказать, что будет с Windows в будущем, но пока что эта платформа останется самой популярной. А тут C# набирает популярность. Майкрософт продолжает вкладываться и в свою мобильную платформу и если у них эти действия принесут плоды, то C# может ещё более серьёзно выстрелить», заключает он.
Комментарии (174)
Terras
27.10.2016 02:18+1Кстати, есть ли на C# аналог Hadoop'а?
gandjustas
27.10.2016 04:49+1что есть "аналог Hadoop"?
Распределенный map-reduce был в виде исследовательского проекта Dryad с linq-синтаксисом. Но на него забили, так как есть hadoop.
В интернетах можно найти кучу опенсорных map-reduce на .NET.
Но вообще в политике MS работа с данными делается не в .NET коде, а в SQL Server и Azure.
fox_anthony
27.10.2016 06:13SCOPE (Structured Computing Optimized for Parallel Execution) или как он теперь называется — U-SQL. Код исполняется в кластерах Cosmos.
gandjustas
27.10.2016 02:30+5Мне больше всего доставило сравнение C# с Java и C, хотя реально больше всего было надергано из делфи. Платформа .NET является продолжателем идей Java, но язык C# на Java похож только синтаксисом, как и все C-подобные языки.
Idot
27.10.2016 12:56Сравнение C — вполне логично, потому что C# происходит не просто напрямую от Delphi, а через C++ Builder, который изначально вобрал в себя фишки от Delphi, являясь диалектом C++ и развитием Borland C++.
gandjustas
27.10.2016 17:30+2Именно напрямую делфи. Хейсберг — автор языка C# внезапно также автор языка делфи. Именно в делфи были придуманы свойства и события, которые перекочевали в C#. WinForms является почти калькой с VCL, а com-interop очень похож на делфи.
С-подобный синтаксис выбрали, чтобы охватить большую аудиторию.
Fen1kz
27.10.2016 03:51-17Как-то довелось фиксить проект на C#. Переплевался с Visual Studio и процесса компиляции. Виснет, сложность UI приближается к 3DsMax'у, не может менять код во врмя дебаггинга, итд. Так ещё и возможность делать классы разбитые на несколько, в разных файлах и папках, классы с частью кодогенерации и пихать в один файл несколько интерфейсов и классов (в т.ч. partial). В общем не знаю, возможно проект был говнокодистым, а к ИДЕ привыкаешь, но как-то нет, даже Юнити не вдохновила.
gandjustas
27.10.2016 04:41+5Это когда было?
Edit&Continue уже лет 5 существует, если не больше.
Сложность UI такая же, как у всех IDE, с чем сравниваешь?
Зависания при дебаге бывают раз в год. В 2008 студии было часто, в последних версиях почти не сталкивался.
NeoCode
27.10.2016 09:07+5По моему, Visual Studio вообще лучшая IDE.
Я вот с Eclipse недавно плевался… нет классического понятия «файл проекта», файлы исходников где-то толи кэшируются то-ли что, в результате если изменить их снаружи (в текстовом редакторе) то с удивлением можно увидеть что изменения в самом эклипсе не отображаются (или отображаются не сразу).
Вообще я давно уже пришел к выводу, что при разработке нового языка программирования структуру файлов проекта тоже неплохо было бы стандартизировать, чтобы не было зоопарков с разными форматами, средами разработки и т.д.nerumb
27.10.2016 09:11+3У меня как раз сложилось обратное впечатление, после Eclipse в VS было очень непривычно и неудобно работать (тут думаю на вкус и цвет как говорится..). Но лучше обоих Intellij Idea, ее не пробовали?
whirl
27.10.2016 09:56Ну для сторонников Intellij Idea для разработки на .Net есть Rider
Но это конечно восхитительно в качестве среды разработки под .Net использовать IDE написанную на JavaINC_R
27.10.2016 12:07На джаве ведь только «фронтенд» и дополнительные инструменты, а внутри решарпер. Студия тоже не целиком на шарпе написана, но живем же как-то )
CepbluBoJlk
27.10.2016 12:59+5Как вы задолбали с этим высказыванием, VS написана на C++/C + C# и скорее всего еще зоопарк всего, тем не менее она используется для многих других языков, есть IntelliJ Platform, на которой написано много разных IDE для других языков, которые к джаве имеют отношение чуть менее чем никакое (PhpStorm, WebStorm, RubyMine, AppCode, PyCharm...) саблаймы, VS Code / Atom. И ни где я не слышал что люди жалуется на то что IDE написана на другом языке, только когда говорят про райдер. Какая разница на чем это написано если это упрощает разработку, и никто не заставляет писать вас на джаве / котлине. Так же когда вы пишите что то на С в саблайме вам плевать что он написан на плюсах и питоне. Есть же бизнес, есть отличный кроссплатформенный UI, есть классный решарпер, и почему бы не взять лучшее из этих 2 миров, чем переписывать один из них на c# просто для чистоты?
kekekeks
27.10.2016 14:17У них там в фоне на Mono крутится цельнотянутый ReSharper, с которым Idea общается по хитрому протоколу.
indestructable
27.10.2016 17:37Вроде для Студии тоже экспериментировали с ReSharper Server, хз, чем закончилось.
evocatus
27.10.2016 14:37А я бы хотел иметь возможность просто написать один .c файл (даже не .cpp) и просто его скомпилировать из IDE. В MSVS ттак нельзя. Извольте создать «проект», даже если внутри будет 1 файл.
KirillFormado
27.10.2016 14:54Для таких целей, если не охота возиться с созданием проекта, а надо только быстро что то набросать или проверить, есть два варианта. Использовать linqPad или REPL встроенный прямо в студию C# Interective.
Free_ze
27.10.2016 15:19А где вы хотели бы хранить, скажем, параметры для компиляции?
DrPass
27.10.2016 16:22В общем случае их нигде можно не хранить. Достаточно два дефолтных набора опций для отладки и релиза, и хранить их в конфигурации IDE. И только если какой-то проект потребовал специфических настроек, оверрайдить в нём эти самые дефолтные опции.
Free_ze
27.10.2016 16:32А где хранить оверрайженые значения?
DrPass
27.10.2016 16:34Ну вот когда они нужны, тогда надо создавать какой-то отдельный файл для них, конечно же.
Free_ze
27.10.2016 17:45Они нужны всегда.
Другой вопрос, зачем вам полноценная IDE, заточенная на работу с проектами, если есть VS Code? Да даже просто скрипт из двух команд и текстовый редактор.DrPass
27.10.2016 18:08+1Почему всегда? В общем случае как раз нет. У разработчика для всех проектов на одной платформе обычно один и тот же набор опций для отладки, и один и тот же под релиз.
Другой вопрос, зачем вам полноценная IDE, заточенная на работу с проектами, если есть VS Code?
Я сейчас не имею в виду вопрос, в чём лучше писать простые софтинки. Фломастеров очень много и все разные на вкус. Я отвечал исключительно на вопрос, где хранить настройки для компиляции проекта.Free_ze
28.10.2016 10:10+1В общем случае как раз нет. У разработчика для всех проектов на одной платформе обычно один и тот же набор опций для отладки, и один и тот же под релиз.
У какого разработчика? Для каких всех проектов? У меня, к примеру, разные проекты с разными конфигами.
Я понимаю, что вы имеете ввиду хранение настроек на уровне пользователя, а не проекта, но тогда как проект безопасно переносить? Как сложить его в СКВ? Причем, у разных девелоперов обязательно будут разные настройки, т.е. то, что лежит с проектом (а оно будет лежать обязательно) будет несовместимо.DrPass
28.10.2016 10:27У какого разработчика? Для каких всех проектов? У меня, к примеру, разные проекты с разными конфигами.
Я написал «обычно». Это значит, не у всех, а у большинства. Вот вам зачем разные проекты с разными конфигами? Что у вас там должно отличаться, кроме папки для сборки, и с какой практической целью?
Я понимаю, что вы имеете ввиду хранение настроек на уровне пользователя, а не проекта, но тогда как проект безопасно переносить?
А что такое «безопасно переносить»? Если у вас на разных машинах отличаются опции компиляции, это не повлияет на безопасность переноса. Если у вас разные версии библиотек, их перечень в конфиге ситуацию не улучшит.Free_ze
28.10.2016 10:51Я написал «обычно». Это значит, не у всех, а у большинства.
У большинства разные проекты, поэтому специфика — это правило, а не исключение.
Что у вас там должно отличаться, кроме папки для сборки, и с какой практической целью?
Сборка — это многоэтапный процесс. Последовательность и состав этапов разный. + деплой.
А что такое «безопасно переносить»? Если у вас на разных машинах отличаются опции компиляции, это не повлияет на безопасность переноса.
Я хочу иметь возможность склонировать проект с репозитория, чтобы он собирался так, как задумывал автор, и не аффектил мне на остальную систему.DrPass
28.10.2016 11:09У большинства разные проекты, поэтому специфика — это правило, а не исключение.
Я там написал ещё и «на одной платформе», специально для этого «правила».
Сборка — это многоэтапный процесс. Последовательность и состав этапов разный. + деплой.
Ну вот видите, вы ушли от ответа с многозначительным намёком :) Я знаю, что в некоторых случаях в крупных проектах сборка предполагает много разных этапов, а мейкфайл разрастается до длиннючего скрипта. Иногда. А также я прекрасно знаю, что в 99% случаях такого не бывает.
Я хочу иметь возможность склонировать проект с репозитория, чтобы он собирался так, как задумывал автор, и не аффектил мне на остальную систему.
Я в упор не пойму, почему вы считаете, что наличие конфига вам позволит собрать именно то, что задумывал автор, и не будет аффектить на вашу систему, а отсутствие конфига, если в нём нет необходимости наоборот, нарушит задумку автора и может как-то что-то вам поломать. Где логика-то?
И вдобавок напрочь забыть о том, что речь шла о простых проектах а-ля «собрать на коленке».Free_ze
28.10.2016 18:26Ну вот видите, вы ушли от ответа с многозначительным намёком :)… я прекрасно знаю, что в 99% случаях такого не бывает.
Я предпочел не вдаваться в дебри. Если это не нужно лично вам, то не говорите за всех.
Допустим, есть веб-проект, состоящий из нескольких сервисов, которые нужно сначала паковать, а затем деплоить отдельно, с накатыванием миграций на базу, и прочее. Это типичная ситуация для такого рода проектов.
Пример другой: десктопное приложение, которое нужно собрать в пакеты по различным редакциям.
И это примеры того, что нужно выполнять каждый раз, не говоря уже о том, что какого-нибудь Васю просто не устрят мои настройки, мои внешние инструменты или еще чего в тулчейне. Стоит ли производителю ориентироваться на всех Вась персонально?
Я в упор не пойму, почему вы считаете, что наличие конфига вам позволит собрать именно то, что задумывал автор
Вы не понимаете, для чего нужны настройки проектов?
отсутствие конфига, если в нём нет необходимости
речь шла о простых проектах а-ля «собрать на коленке».
Для хэлловордов можно использовать другие инструменты или вообще другие языки. IDE ориентированы на упрощение работы с крупными проектами, я уже говорил об этом.
Не ругайте микроскоп за то, что он соскальзывает с гвоздя.DrPass
28.10.2016 22:41Это типичная ситуация для такого рода проектов.
Кстати, какого рода? ASP.NET? Или EJB для деплоя под вебсферу? Или может быть PHP? А может быть, вы что-то под докер себе представляете? Видите, в общем случае ни разу не типичная. Деплоить несколько сервисов отдельно, с разными опциями упаковки, с миграциями… Можно подумать, все только чем-то таким и занимаются.
Пример другой: десктопное приложение, которое нужно собрать в пакеты по различным редакциям.
А тут типичная ситуация — это одна редакция. Мало кто компилирует разные сборки под разные редакции, и не от хорошей архитектуры.
Для хэлловордов можно использовать другие инструменты или вообще другие языки.
Эээ… какие инструменты и какие языки-то? Мы вообще, если вы внимательно почитаете, никакие конкретные инструменты и языки не упоминали.
Кстати, если вы в контексте статьи, про C# говорите, то тем более, миграция базы на новую версию по феншую сейчас делается где-нибудь в инициализаторе EF, т.е. непосредственно в коде. А не в скрипте мейкфайла.Free_ze
01.11.2016 09:20Кстати, какого рода?
Веб и интерпрайз.
Мало кто компилирует разные сборки под разные редакции, и не от хорошей архитектуры.
Те, кто делает на софте деньги достаточно часто так поступает. Кстати, выступает стимулом к модуляризации архитектуры, так что она только выигрывает.
Эээ… какие инструменты и какие языки-то?
Которые можно компилировать в Visual Studio из коробки, если вы внимательно почитаете.
тем более, миграция базы на новую версию по феншую сейчас делается где-нибудь в инициализаторе EF
Вы удивитесь, но не все используют миграции EF и даже сам EF. Феншуй у всех свой.
indestructable
27.10.2016 17:40+1using System; public class Program { public static void Main() { Console.WriteLine("Hello World"); } }
csc Program.cs /out Program.exe
evocatus
27.10.2016 22:32Я спрашивал про C, а не про C#.
Да, наверное, самый лучший способ — через командную строку.
Lure_of_Chaos
27.10.2016 16:18нет классического понятия «файл проекта»
есть, .eclipse, или что в Вашем понятии «файл проекта»?
если изменить их снаружи (в текстовом редакторе) то с удивлением можно увидеть что изменения в самом эклипсе не отображаются
так было раньше, теперь eclipse спрашивает, обновить ли файл
структуру файлов проекта тоже неплохо было бы стандартизировать
что тут говорить, если структура меняется от версии к версии одной IDE, и вообще, это связало бы разработчикам рукиNeoCode
27.10.2016 18:41Структура проекта должна быть в нормальном формате — xml, а лучше json. Стандартизирована должна быть основа, каркас. Если какому-то хитровывернутому компилятору или IDE нужно что-то еще — никто не запрещает добавлять свои кастомные теги и атрибуты. Но в целом стандартизация должна быть, чтобы переход между IDE и компилятрами и одновременное использование нескольких IDE и компиляторов было максимально простым и прозрачным. Да, всякие *make — это костыли концептуально родом из 70-х годов, их даже упоминать не стоит.
Тот же M$ в своей студии меняет форматы vcproj (для С++, насчет C# не знаю) каждый раз c выпуском новой студии. Зачем? Неужели структура проекта это что-то такое архи сложное, что не продумать сразу? Структура любого языка программирования как такового будет на порядки сложнее, и ничего — языки проектируются и существуют десятилетиями.Free_ze
28.10.2016 10:25Тот же M$ в своей студии меняет форматы vcproj (для С++, насчет C# не знаю) каждый раз c выпуском новой студии.
Для решения таких проблем для C/C++ проектов существует CMake.
Зачем? Неужели структура проекта это что-то такое архи сложное, что не продумать сразу?
Этот формат помимо настроек сборки отвечает за фишки студии. Добавляются фишки — меняется формат. Но студия способна конвертировать старые форматы проектных файлов в новые.
Что же касается самой сборки, есть же MSBuild, сценарии к которому должны быть обратно совместимы.
насчет C# не знаю
Для .NET Core конфиги в общем случае в json-формате (global.json для солюшена и project.json для проекта), хотя студия и добавляет свой .sln/.xproj, но это скорее конфиги самой студии, ничто не мешает собирать проект штатными кроссплатформенными средствами.
Классические .NET-проекты нет особого смысла рассматривать с точки зрения кроссплатформенности, но MonoDevelop может кушать .sln/.csproj файлы.KirillFormado
28.10.2016 12:13И от xproj с project.json скоро откажутся и переведут все на msbuild с csproj. Хотя до конца еще не известно как все в итоге будет выглядеть.
Free_ze
28.10.2016 18:30Буду признателен, если вы поделитесь ссылками на материалы об этом.
KirillFormado
29.10.2016 13:40Вот тут белее свежая информация. Обещают убрать package.xml и упростить формат проектного файла. И сделать необязательным добавление каждого файла в csproj. Плюс поддержку со стороны cli. Вообщем взять все хорошие идеи связанные с xproj и project.json, но сделать унифицированное решение для всех типов проектов. Ну все это уже только в vs15.
dFarkhod
27.10.2016 10:24+5А я вот, наоборот, влюблён в Visual Studio. Ну никак немогу привыкнуть к Android Studio и Eclipse.
Refridgerator
27.10.2016 07:13+6Примечание к изображению ноты.
Если читать по русски c?, это прозвучит как «си диез». А изображена — до диез. А всё потому, что нота «до» обозначается буквой «С». Такой вот любопытный нюанс.timiskhakov
27.10.2016 10:47+7Не могу не привести замечательный слайд из доклада DreamWalker о C#7 на прошлогоднем DotNext:
СлайдNLO
27.10.2016 07:55НЛО прилетело и опубликовало эту надпись здесь
ad1Dima
27.10.2016 08:15+9В соседней статье он же назвал C# не модным, это просто холиварный вброс для поддержания комьюнити.
denismaster
27.10.2016 08:19+1Не соглашусь. Да, новый .NET Core делался с прицелом на облака и работа с Azure позволит иметь всегда актуальную версию. Однако ничто не мешает его завести на любом другом хосте, будь то любой VDS с линуксом=)
И вряд ли это изменится в ближайшие года)
NeoCode
27.10.2016 09:09Ну в принципе ничего плохого в этом нет. Зачем держать зоопарки разных версий если есть одна последняя?
KotV4
27.10.2016 09:22+6Здесь пахнет «толстым» троллингом.
Вместо этого вам будет предоставлена шикарная альтернатива: only current .Net в облаке Azure.
Запах усилился!
Xandrmoro
27.10.2016 15:28> Уже очень скоро у вас будет утрачена возможность использовать свой хост.Net и выбирать версионность, дату апгрейда, кастомные настройки. Вместо этого вам будет предоставлена шикарная альтернатива: only current .Net в облаке Azure.
В чьём воспалённом воображении?
kulikovDenis
27.10.2016 09:22+4А где же трогательная история, о том как майкрософт пыталась узурпировать Java, выпускаю свою не совместимую ява машину?
И только когда им сан в судах им дала по зубам, майкрософт придумала конкурирующий проект.
Один J# чего стоит.
Без этого история будет не полной.kryvichh
27.10.2016 10:24+1Может Вам еще историю про то, как к кампусу Borland прислали лимузин за Хейльсбергом?
Developers, developers, developers! :)
Idot
27.10.2016 12:29+1А ещё была J++.
Было очень интересно и познавательно прочитать историю J++ и J#.
GreenBee
27.10.2016 09:44+25Автор, мне кажется, что Вы не разбираетесь в теме и написали эдакий «реферат из Интернета».
Если уж мы говорим об истории, то как можно было настолько облажаться?
1) Начинать историю с языков B/С/С++, это просто бред — таким же образом можно любой «Си-подобный» язык сюда приплести. Ничего общего, кроме схожих синтаксических конструкций, и то в самом начале.
2) А вот Java как раз стоило упомянуть в качестве предка. Ведь именно с нее все началось.
3) Ваш график Hystory of ASP.NET & C# & Visual Studio… где вы его взяли? Это же бред сивой кобылы. ASP.NET Web Forms оказывается появилась в 2010 году. На чем я интересно в 2004-ом сайты делал?
4) ASP появился задолго до .NET и не надо его путать с ASP.NET
5) С чего Вы взяли, что C# был создан «специально для ASP.NET»?
Не могу дальше читать этот бред
NikitOS9
27.10.2016 12:10>Ведь именно с нее все началось
до нее были Self, Strongtalk и тд…
но затем всему настала Java (с)
История проекта Strongtalk
ссылка не работает, тогда вот так
http://ru.smalltalk.wikia.com/wiki/%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0_Strongtalk
Idot
27.10.2016 12:34Начинать историю с языков B/С/С++, это просто бред
С чего это бред?
Историю Российской Федерации — тоже начинают с Киевской Руси
Потому что Российская Федерация официально считается правопреемницей Киевской Руси, точно так же C# позиционирует себя преемником языка C.GreenBee
27.10.2016 12:40+3Во-первых, где именно СиШарп позиционирует себя как преемник языка Си? Откуда Вы это взяли?
Во-вторых, если хотите аналогию, то считая Киевскую Русь аналогом языка Си, аналогом языка СиШарп может быть какая-нить страна в африке, где решили сделать государственным русский язык (а точнее взяли только основные конструкции, но добавили кучу своих слов) и назвались «РусьШарп».
Еще раз повторяю: ничего общего у языков Си и СиШарп, кроме похожего названия и некоторых синтаксических конструкций, нет.Idot
27.10.2016 12:50+2ничего общего у языков Си и СиШарп, кроме похожего названия и некоторых синтаксических конструкций, нет
Что-то мне Ваши рассуждения (и вообще сам спор между C# и Java) по фанатичности напоминают спор между российскими и украинскими патриотами.
Как я писал ниже: C# происходит от C++ Builder, являясь его дальнейшим развитием.
Надеюсь, Вы не станете утверждать что «между C++ и C++ Builder нет ничего общего», и что «C++ Builder происходит от Java»?
kekekeks
27.10.2016 14:20+1Вообще говоря при переключении в
unsafe
-режим и использовании вездеstruct
,stackalloc
для массивов на стеке иMarshal.AllocHGlobal
вместоmalloc
получается вполне себе сишка. Разве что указатели на функции просто так не сделать без управляемой кучи. Тут возникает основной вопрос: но зачем?
Master_Dante
27.10.2016 14:25-2>> Во-первых, где именно СиШарп позиционирует себя как преемник языка Си?
Я не специалист по JAVA но есть ли в ней указатели и прямая работа с памятью? C# компилируется и исполняется только в нативе, никаких ВМ в нем нет, а как насчет JAVA?TargetSan
27.10.2016 15:00sun.misc.unsafe?
Master_Dante
27.10.2016 17:10-2using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication2
{
unsafe class Program
{
static void Main(string[] args)
{
Print();
Call(Print);
Console.ReadLine();
}
static void Print()
{
Console.WriteLine(«Hello world»);
}
static void Call(Action fnc)
{
int bp = 10;
var ptr = (int*)&bp;
var tmp = *(int*)Marshal.GetFunctionPointerForDelegate(fnc).ToPointer();
for (int i = 0; i < 20; i++)
{
ptr++;
*ptr = tmp;
}
return;
}
}
}
Вызов функции через замену адреса ret слабо на яве? )).TargetSan
27.10.2016 17:39+5Прежде всего, я не явист. Я просто знаю, что там есть этот пакет. К тому же, Java много где работает в режиме интерпретации байткода. Так что нет, нельзя хотя бы поэтому.
Далее, по поводу "слабо". Подобные финты с манипуляцией стеком применяются крайне редко и в нативном коде. Причём пишутся на ассемблере, под конкретную архитектуру-платформу-ABI. Ваш же пример напоминает мне старую шутку про троллейбус из буханки.
Теперь конкретно по примеру.
Вы можете потенциально расстрелять стек своим неумелым топтанием вверх.
Ваш код всё сломает нафиг при переходе даже на x64 (не говоря о других платформах), по двум причинам сразу.
Вы рискуете отстрелить себе пол-программы по самые гланды если случится инлайнинг.
Вы рискуете сделать непонятно что если JIT вдруг не произойдёт.
Из-за слома return address ваша программа вылетит в никуда.
Короче, вы написали то, что считается отборнейшим говнокодом даже на С/С++.
Master_Dante
27.10.2016 18:07-1Простите но это и было что то вроде шутки, если у вас плохое чувство юмора это не моя проблема. Что касается вызов функции через подмену адреса, само собой я набросал этот код за 2 минуты. Если все делать правильно, то это займет больше времени. Но нет цели что бы это делать. Я сделал этот пример для того, что бы показать уровень возможностей по сравнению с JAVA и не для чего больше. Кто то в этой ветке сказал что при желании из C# можно сделать C. И он прав, можно даже ассемблерные вставки делать при желании.
TargetSan
27.10.2016 18:15Знаете, шутка неудачная. Вы пытались показать, насколько крут C#. В результате вы показали, что на нём можно легко и непринуждённо отстрелить себе ногу по самое лицо. Зачем мне тогда C#, если я могу точно так же стрелять себе по ногам в родном С++, без привязки к MS и рантайма в 200Мб? :)
Master_Dante
27.10.2016 18:36Все очень просто вы получаете скорость разработки как у C#, а производительность как у C++. И шутка про рантайм 200мб. уже не усместна, во первых есть уже Core в которой собирается только набор используемых пакетов. Есть так же предустановка .Net во всех новых МС-ОС. Да и 200мб это не теже 200мб что и 20 лет назад, можно скачать и поставить при необходимости. Скоро также выйдет .Net Native который изначально компилится в натив.
Master_Dante
29.10.2016 10:53C# действительно крут, и он круче Java. Хотите можем провести эксперимент, на простой задаче. Дано массив байтов, заполненный случайными данными. Необходимо просуммировать все элементы этого массива. Вы сделаете на Java а я сделаю на C#. Есть функция Sum(byte[] buf), нужно замерить время ее выполнения. А после мы оценим производительность и красоту кода ).
TargetSan
29.10.2016 22:29Я написал выше, что не явист. Точнее, я знаком с явой на начально-среднем уровне. Мой основной посыл — вы написали крайне неудачный код чтобы продемонстрировать "крутизну" C#. И предложенную вами задачу я буду писать вообще на Rust. На крайняк на С++.
Master_Dante
30.10.2016 01:00Ну как до дела дошло так мы включаем задний ход, а пофлудить на ровном месте любой может. Читая длинные терады про выстрелы себе в ногу, на код который само-собой разумеется никто и никогда не стал бы использовать…
TargetSan
30.10.2016 01:13Тогда зачем вы вообще его написали? И где задний ход? Я вам что-то по поводу явы обещал? Я написал что в яве это не сработает из-за прогрева JIT как минимум, и что вы написали говнокод — неудачно "проиллюстрировали крутизну" любимой вами технологии. Голым С .NET не станет никогда, хотя бы из-за разных ниш. Станет равен по производительности в тривиальных числодробилках — да. Но одним перформансом на оных числодробилках сыт не будешь.
Кстати, https://habrahabr.ru/post/313694/?reply_to=9884716#comment_9881538 ломает ваше утверждение что .NET выполняется всегда нативно.
Master_Dante
30.10.2016 01:42-1Нет не ломает, а только подтверждает. Боже с какими некомпетентными людьми приходится разговаривать. Да еще и как гориллы бьющими себя кулаками в грудь. А что вы на другую тему переходите? К чему бы еще придраться… я в ваш горшок не написал?
TargetSan
30.10.2016 01:57+1Эмм… где подтверждает? Там явное указание что .NET Micro Framework работает в режиме интерпретатора.
Оке, в своём примере вы имели в виду конкретно Win32, C calling convention. Пусть это будет скетч. Более того, вы хотели показать, что в Java нельзя выполнять хаки с адресом возврата и вообще прямой манипуляцией памятью, а в .NET — можно. И таки да, показали. Теперь у меня вопрос. Вы серьёзно считаете это преимуществом дотнета? Возможность делать ASM-style хаки? Можете не отвечать — подумайте для себя. А с уровнем своей компетенции я как-нибудь сам разберусь. Засим откланиваюсь.Master_Dante
30.10.2016 13:09-1>> Эмм… где подтверждает?
1. Для начала можно пользовать логикой. Я вот как подумал: «Виртуальная машина на контроллере, да ладно???».
2. Найти эту статью: https://geektimes.ru/post/274094/
3. Прочитать этот текст:
Прошивка для конкретного устройства тоже появляется в результате выполнения большого количества шагов:
Компиляция нативного кода в .obj файлы.
Компиляция нативного кода в .lib файлы.
Линковка нативных .obj и .lib файлов в бинарный файл.
Выполнение Link/Locate над бинарным файлом для получения образа XIP для flash.
…
Будьте здоровы.
Master_Dante
30.10.2016 13:17-1>> Вы серьёзно считаете это преимуществом дотнета?
Есть целый класс задач, которые невозможно выполнить без указателей. Я уже тонко намекал вам(предложение просуммировать байты), что некоторые алго работают значительно быстрее, когда есть указатели. Случай из жизни, внезапно в одном проекте пришлось использовать MemoryMapped файлы, у реализации API в .Net есть стойкий запах индусятины и очень жуткие лаги. Выручило то что в C# есть указатели, ох как это выручило вы даже не представляете.DrPass
30.10.2016 19:41+1> Есть целый класс задач, которые невозможно выполнить без указателей.
… и среди них нет ни одной, где платформа с управляемым кодом, даже с возможностью делать хаки, была бы подходящим инструментом.Master_Dante
31.10.2016 00:01В последнее время вышли .Net Core, Micro Framework, скоро выйдет .Net Native, так же есть ASP.Net. Вам не кажется, что C# уже перерос уровень нишевой применимости? Посмотрите и веб, и десктоп, и с мобилками, и с контроллерами работает донет. Уверен что скоро появится C# с возможностью делать ASM вставки, и писать на нем драйвера, возможно это произойдет вместе с .Net Native, возможно позже. Но уже сейчас видно, что C# это больше чем просто язык в какой то одной области. Писать на одном языке везде это прекрасно.
DrPass
31.10.2016 01:21Вам не кажется, что C# уже перерос уровень нишевой применимости?
Какую вы нишу имеете в виду? C# с момента своего появления позиционировался как «хедлайновый» язык для решений на платформе Майкрософт. С тех пор не поменялось ровным счетом ничего. Хотя и есть реализации для других платформ, их применение как было экзотикой, так и осталось. Вы можете делать решения под Android, но вы все равно возьмете Java или C++ под NDK. Вы можете делать решения под Linux, но вы все равно возьмете… что-то другое. Так что ниша, вернее, группа ниш применений C# достаточно стабильна.
GreenBee
27.10.2016 15:02+1> C# компилируется и исполняется только в нативе
Если это утверждение, то у меня для Вас плохие новости.Master_Dante
27.10.2016 16:42-3Что еще один молодняк хочет поспорить? Да это утверждение, любой дотнет выполняется процессором нативно и нет виртуальной машины как в vb6 например. Если вы этого не знали то у меня для Вас плохие новости :).
DrPass
27.10.2016 17:06+2Ну, не преувеличивайте. C# компилируется в MSIL. А уже промежуточный код как-то там доводится до бинарного, обычно в рантайме JIT-компилятором, реже предварительной компиляцией с помощью ngen. В Java архитектура такая точно. JVM — это не какой-то эмулятор компьютера внутри компьютера. Это просто рантайм, абстракция, которая создаёт машинно-независимую прослойку между кодом и конкретной архитектурой. В случае дотнета эта же штука называется CLR, но принципиально ничем они не отличаются. Просто маркетологи Microsoft придумали другое название.
denismaster
27.10.2016 17:18А с другой стороны .NET осваивает LLVM(проект LLILC) и развивает CoreRT(он же .NET Native). Так что будущее неоднозначное)
asdf87
28.10.2016 16:01К сожалению, похоже LLILC ушел в нирвану или транс за новыми идеями т. к. коммитов нет с июня. Надеюсь работы по нему возобновят в скором времени.
Master_Dante
27.10.2016 17:21-1>> C# компилируется в MSIL. А уже промежуточный код как-то там доводится до бинарного
>> любой дотнет выполняется процессором нативно
Где противоречие? Не надо меня расстраивать ).
ApeCoder
27.10.2016 20:39JFYI
https://en.wikipedia.org/wiki/.NET_Micro_Framework#Features
The CLR is an interpreter rather than a just-in-time compiler, and uses a simpler mark-and-sweep garbage collector instead of a generational approach.
szKarlen
28.10.2016 10:59это Micro Framework. он должен выполняться на устройствах, где памяти раз-два и обсчелся. По возможностям никакого отношения к стандартному CLR не имеет отношения.
ApeCoder
28.10.2016 11:14+1Я говорил про утверждение
любой дотнет выполняется процессором нативно
А не про
любой стандартный дотнет выполняется процессором нативно
;)
Master_Dante
30.10.2016 01:29-3Я отвечаю вам и szKargen. Один говорит если яблоко весит больше 300грамм, то это не яблоко, второй говорит нет, если больше 350 грамм то это не яблоко. А на самом деле компиляция — это трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду. Это из википедии, а на самом деле не близком машинному коду, а коду который может исполнить некая машина. Так вот C# имеет двух этапную компиляцию, сначала идет трансляция в IL, а потом уже IL компилируется в код x86\x64. И вы можете легко в этом убедиться если во время остановки программы откроете окошко дизасемблированный код, и вы увидите там куски вашего кода в комментариях к ассемблеру. Но вы там не увидите там никакого IL. Само понятие компиляция предпологает некую машину способную выполнять код, например для VB6 есть виртуальная машина, которая умеет выполнять этот код. Но для донета такой машины нет, поэтому любая стандартная или не стандартная .Net программа выполняется машиной x86\x64 нативно. Знать такие вещи программисту необходимо, что бы иметь представление о том, что же на самом деле происходит когда его программа работает, это позволяет «видеть» некоторые подводные камни, и делать более правильный выбор структур данных или алгоритмов, необходимых для достижения цели. В общем и целом повышает профессионализм. Все эти глупые разговоры и минусы в карму, не сделают вас несчастных бездарей более успешными на этом сложном пути.
szKarlen
01.11.2016 13:57+2уважаемый Master_Dante!
если честно, то даже лень отвечать на нубские комментарии. особенно товарищу, которому лень зайти в профиль оппонента, но любящему использовать оскорбляющие эпитеты направо и налево. отвечу коротко:
… полу-невежда,
Полу-подлец, но есть надежда,
Что будет полным наконец.
©Master_Dante
02.11.2016 22:07-3Я и не ожидаю от поэтов каких то ответов. Для меня авторитетов не существует, только доказанные аргументы. Поэтому плевать мне на ваш профиль, или чей то еще.
eydemidov
27.10.2016 16:26Официально Российская Федерация даже не правопреемница Российской Империи.
По факту — традиционно выходит что «да», но официально — скорее нет (это несколько запутанный вопрос). Потому что после революции большевики открестились от любых связей с царским правительством, и Российская Федерация это официально правопреемник только Советского Союза.
Ну и дальше — насчёт «начинают с Киевской Руси» — нет, это не так. Что старые книги по истории (например, Карамзин или Соловьёв) начинают с древних времён и вопросов о возникновении славянских племён, что новые учебники.
Idot
27.10.2016 12:44Java как раз стоило упомянуть в качестве предка. Ведь именно с нее все началось.
Значит, Вы никогда не слышали про C++ Builder.
Язык C# является фактическим развитием C++ Builder, а сам C++ Builder начался с Delphi.
PS если писать про Java, то нужно писать и про J++ и J#.GreenBee
27.10.2016 12:53+2Да, про J++, про Delphi — нужно было писать. А еще про VB6. Именно на этот сегмент рынка был ориентирован .NET и успешно заменил VB6/Delphi.
Java победить не удалось, но со временем потеснили достаточно сильно.
Что касается J#, то он появился вместе с C# и оказался так себе идеей. Для Java-программистов (на которых она ориентировалась) проще было перейти сразу на C#.
Не стоит забывать, что большое количество Java-библиотек были портированы на C#.
Не С, не В, не С++, а именно Java.
DrPass
27.10.2016 13:00+2> Язык C# является фактическим развитием C++ Builder,
Ну, не преувеличивайте :) Если вы про идеологию библиотек, то… в C++Builder нет своих библиотек. Тамошняя VCL написана на Паскале, и собрана на нём же. Её никто на С++ заново не переписывал, просто добавили поддержку BPL формата в компоновщик, чтобы связывать с бинарниками Delphi. А в остальном Builder имеет всё то же, что имел любой классический компилятор С++. Поэтому C++Builder — это не предок C#, а просто ещё одна платформа, которая что-то взяла от Delphi.
По факту, C# даже не «фактическое развитие» Delphi, а просто позаимствовал некоторые хорошие моменты. Ну а сама платформа .NET действительно больше взяла от Java в своей архитектуре, нежели от любой платформы разработки нативных приложений.Vedomir
27.10.2016 15:19+1Все-таки у C# и Delphi есть один очень важный общий момент — общий архитектор и идеолог Андерс Хейлсберг.
mmMike
27.10.2016 09:49+1Немного не в тему… да простят меня…
Упоминание о 2000 году и различных активностях Microsoft в попытках выйти на другие рынки ПО напомнило мне о мало известной попытке MS выйти на рынок smart card со своей "Windows for Smart Card".
Cейчас безраздельно правит JavaCard технология.
"Букетик" к "памятнику" — самая первая официально представленная JavaCard OS карта. В том же 2000 году…
Сам образец Windows OS карты потерял где то (прочем ничем не примечательный "белый пластик")..
DrPass
27.10.2016 10:10+15А я бы позанудствовал по поводу массы неточностей в статье.
> В поддержку этих новшеств Microsoft выпустила инструментарий для разработки приложений – платформу .NET.
Microsoft выпустила платформу .NET не в поддержку этих новшеств, а в поддержку своего разрыва отношений с Sun. Т.к. изначально речь шла о Microsoft JVM.
> Еще одним новшеством платформы .NET была технология активных серверных страниц ASP.NET (Active Server Page).
> С её помощью можно было относительно быстро разработать веб-приложения, взаимодействующие с базами данных.
Для взаимодействия с базами данных предназначена технология ADO.NET, которая никакой особой связи с ASP.NET не имеет, ну кроме того, что их можно использовать в одном приложении.
> Язык программирования C# был создан специально для ASP.NET
???
> Кроме того, в нем была реализована автоматическая «сборка мусора», обработки исключений, динамическое связывание.
А разве это реализовано в C#, а не средствами платформы?
> Как и Java, C# изначально предназначался для веб-разработки
Java изначально не предназначался для веб-разработки
> Во-первых, в отличие от JVM, IL не привязан к одному языку программирования
JVM тоже не привязана к одному языку программирования, можно использовать другие компиляторы, которые генерируют байт-код для JVM, и они в природе есть.
> Во-вторых, IL предназначен не для программной интерпретации, а для последующей компиляции в машинный код. Это позволяет достичь существенно большего быстродействия программ.
А эта же JIT-компиляция на JVM появилась в 1999-м году, ещё до появления дотнета.
> Во второй версии была добавлена поддержка 64-х разрядных вычислений, что открыло возможность увеличения адресного пространства.
> Также было реализовано создание триггеров, хранимых процедур и типов данных на .NET языках.
Где добавлено и реализовано, в C#? Или опять перепутано, где язык, где платформа, а где Microsoft SQL Server?NLO
27.10.2016 10:18НЛО прилетело и опубликовало эту надпись здесь
DrPass
27.10.2016 10:33+10Я не стараюсь лично вам угодить. Если для вас знак вопроса не является очевидным намёком на то, что «конкретный тезис» просто странный и непонятно откуда взятый, и вы считаете тех, кто так пишет, дураками, это ваше личное право. У большинства других читателей, к счастью, это не вызывает таких неочевидных эмоций.
ruzhovt
27.10.2016 10:15+1История языков программирования: C# — впереди планеты всей
К сожалению это уже далеко не так.denismaster
27.10.2016 10:23+16Конкурировали Java и c#, конкурировали, а в итоге впереди все равно Javascript=)
indestructable
27.10.2016 12:39+2Ну в плане возможностей языка, я думаю, из мейнстрима — C# один из лидеров.
По экосистеме и популярности — вы правы.
NLO
27.10.2016 10:49НЛО прилетело и опубликовало эту надпись здесь
ad1Dima
27.10.2016 12:32+1Ребята из российского офиса МС пишут нормальные статьи. А тут претензии предъявляйте semen_grinshtein или Boomburum короче к habrahabr
zodchiy
27.10.2016 12:10+13Мне нравится C#, я люблю читать холивары с участием kekekeks или lair.
Но данная статья настолько безграмотна, что тянет максимум на черновик реферата, причем еще до фактчекинга.
Ужас.NLO
27.10.2016 12:20НЛО прилетело и опубликовало эту надпись здесь
forcewake
27.10.2016 12:37+2Я, к примеру, зарабатывают на жизнь .net стеком. Статья бесполезна и, в некоторых моментах, вредна.
zodchiy
27.10.2016 14:12C 2005 года зарабатываю на жизнь с C#.
Начинал вообще с classic ASP (vbs с 2003) и php (с 2000) и perl (с 98).
NLO
27.10.2016 12:27НЛО прилетело и опубликовало эту надпись здесь
DrPass
27.10.2016 13:03+2Да на что оно вам сдалось? Вы их на дуэль вызывать собрались, что ли? Или вас возмущает, что в Интернете кто-то поступил несправедливо?
KirillFormado
27.10.2016 13:34+3А можно пояснить о какой странице идет речь и зачем она вам нужна?)
NLO
27.10.2016 13:45НЛО прилетело и опубликовало эту надпись здесь
Drag13
27.10.2016 13:45+2А что там интересного?
NLO
27.10.2016 13:47НЛО прилетело и опубликовало эту надпись здесь
Drag13
27.10.2016 13:52+2Да нет, мне честно интересно. Я просто не могу понять откуда столько бурления по простой в общем то статье и откуда столько меркаптанов в сторону с#.
0xd34df00d
27.10.2016 21:51+2А я вообще на плюсах под линуксы пишу и еще немножко хаскелирую, но я в упор не понимаю, чего вы хотите.
KirillFormado
27.10.2016 14:16
NLO
27.10.2016 14:08НЛО прилетело и опубликовало эту надпись здесь
phillennium
27.10.2016 14:32+9Глядя на ваши многочисленные комментарии под этим постом, я тоже испытываю ощущение, что зомби захватили хабр.
Master_Dante
27.10.2016 16:15Такие тролли как ты, выдают себя как бешеная овца в стаде. C# это бест язык, он вобрал в себя все лучшее из мира кодинга, из всех существовавших до него языков и платформ. А теперь он еще и бессмертный т.е. опенсорц. Покайся грешник.
taujavarob
27.10.2016 18:08>В 2010 году была выпущена версия C# 4.0. Ее главным дополнением к предыдущим версиям стали именованные и необязательные аргументы. Первые дают возможность привязки аргумента и параметра по имени, а вторые позволяют указать аргумент, который используется по умолчанию, для каждого параметра. Не менее важное новшество – тип dynamic. Он позволяет осуществлять проверку на соответствие типов объектов не на этапе компиляции, а непосредственно во время выполнения программы.
>В 2016 году стало известно о новшествах готовящейся версии С# 7.0: • Бинарные литералы • Локальные функции, Они позволяют структурировать код, например, в стиле JavaScript.
Они превратили C# в JavaScript?Flammar
27.10.2016 21:30Они превратили C# в JavaScript?
А что в этом плохого? Если не удаётся сделать в JavaScript статическую типизацию с поддержкой в IDE, то остаётся «тащить» в язык со статической типизацией наиболее актуальные для него черты языка JavaScript.Free_ze
28.10.2016 02:04Плохо в этом то, что синтаксис усложняется и увеличивается количество фич сомнительной полезности.
taujavarob
28.10.2016 16:07> Если не удаётся сделать в JavaScript статическую типизацию с поддержкой в IDE, то остаётся «тащить» в язык со статической типизацией наиболее актуальные для него черты языка JavaScript.
MS взял JavaScript в клещи:
— С одной стороны тащит туда типизацию через TypeScript
— С другой стороны меняет C# так чтобы «структурировать код, например, в стиле JavaScript.»
Не к добру это. ;-)
asdf87
28.10.2016 16:15Вы боитесь за судьбу JavaScript'a? Не стоит. Его монополии положит конец скорее wasm чем MS.
taujavarob
28.10.2016 17:42>Вы боитесь за судьбу JavaScript'a? Не стоит. Его монополии положит конец скорее wasm чем MS.
Я просто помню как MS из «благих намерений» даже весь интернет хотел под себя изменить.
Потом перетянуть всех на свой IE — что ему даже удалось на какое-то время!
Я вижу — тактика MS не изменилась с тех пор.asdf87
28.10.2016 18:08> Я вижу — тактика MS не изменилась с тех пор.
C тех пор у MS уже 2 руководителя сменилось и тенденции изменений с приходом последнего весьма положительные: в open source вышел .net и много чего еще.
Или вы хотите сказать что MS хочет под себя изменить весь open source? :-)taujavarob
28.10.2016 18:44>хотите сказать что MS хочет под себя изменить весь open source? :-)
Весь мир!
Но пока это ему не удалось. :-)
Source
28.10.2016 02:34+1Они превратили C# в JavaScript?
Нет. Почему Вам везде мерещится JavaScript?
dynamic
и компания пришли из IronRuby/IronPython.
madkite
27.10.2016 19:16+3> компания выпустила бесплатный редактор кода под все платформы
И чего ж не упомянуть на каком языке то написан этот редактор? Тем более в статье про языки и кто впереди планеты всей.
Regis
27.10.2016 20:23+2А тут C# набирает популярность
Пруф?
Это позволяет достичь существенно большего быстродействия программ
Пруф? (Подсказка: в Java есть JIT, весьма эффективный).
Myrddin
28.10.2016 00:23+5Любопытно, что так называемые редакторы практически никогда не вступают в диалог под своими так называемыми публикациями, видимо, ввиду практически полного невладения излагаемой темой.
NLO
28.10.2016 08:35НЛО прилетело и опубликовало эту надпись здесь
INC_R
28.10.2016 09:04StackOverflow — достаточно позитивеный пример? Еще позитивные примеры можно найти здесь:
https://en.wikipedia.org/wiki/List_of_C_Sharp_software
https://www.quora.com/What-are-some-known-programs-written-in-C
KirillFormado
28.10.2016 12:18Под проекты на C# можно сейчас подвести кучу инди и не очень игр на Unity)
denismaster
28.10.2016 12:46+1Если вас обидели конкретные люди, оказавшиеся специалистами по С# в вашем городе/конторе/где-нибудь еще, то это не повод всех брать под одну гребенку.
C# в плане языка очень сбалансирован и удобен, в плане технологий тоже развивается, если люди решают с его помощью свои задачи и делают это эффективно, то почему бы и нет?
senia
Вы не могли бы уточнить пару моментов?
Scala, Kotlin, Ceylon, JRuby, Clojure, Groovy и многие другие jvm языки не противоречат этому утверждению?Здесь подразумевается AOT или JIT? AOT компиляторы для java тоже есть.
Уже есть аналог JCP для .NET? Или в каком смысле тут «свобода?».
Как раз с переходам в Oracle Java снова начала развиваться.
GrigoryPerepechko
+1. Фанбойство изо всех дыр. Наши иконы самые красивые.
rumkin
Это не фанбойство, а джинса от редакции Хабра.
Source
Я думаю, в исходном утверждении имелось в виду, что возможности IL не ограничены возможностями C#. Ну, к примеру, было бы так, что в Java нет хвостовой рекурсии, а в Clojure — есть. Но получается, что в Clojure её тоже нет, потому что в Java она не особо нужна, а ради какой-то Clojure в JVM никто ничего добавлять не будет. Т.е., к сожалению, все JVM-языки вынуждены подстраиваться под Java и вторичны к ней.
Возможно, имели в виду .NET Native, а так и AOT и JIT тоже есть.
Sirikid
Только вот хвостовая рекурсия то есть, в Scala и Kotlin, уверен что и в Clojure есть (Lisp без хвостовой рекурсии плохой Lisp). А есть она потому что её запросто можно реализовать на стадии компиляции в байт-код.
UPD: В Clojure есть хвостовая рекурсия, но немного кривенькая в плане внешнего вида.
Source
Давайте уж по-честному,
recur
— это воркэраунд, необходимый как раз из-за отсутствия оптимизации хвостовой рекурсии на уровне байт-кода.Поддержать что-то на стадии компиляции в байт-код — это тоже вариант, но это как раз то, что я назвал подстройкой под Java. Хотя ниже вспомнили случай (JSR 292), когда JVM всё-таки реализовала что-то не для Java. Но это скорее редкость по сравнению с CLR/DLR, на развитие которых существенное влияние оказывают, что C#, что F#, что VB.NET, что Iron-языки.
potan
Есть преобразование хвостовой рекурсии в цикл. Оптимизация хвостовых вызовов — существенно более мощная техника. В Clojure она реализуется с помощью «трамплина» — функция, вместо того, что бы вызвать другую функцию перед завершением, возвращает замыкание, которое вызывается кодом, вызвавшим первую функцию. Полезно это не только экономией стека, но и возможностью раньше собрать мусор, на который были ссылки из локальных переменных.
Теоретически, специальные команды, как в IL, для TCO не требуются — JIT вполне мог бы распознать хвостовых вызов и откомпилировать его соответствующим образом. Но, к сожалению, оптимизация хвостовых вызовов противоречит модели безопасности Java, в которой проверка разрешений на операцию предполагает анализ стека вызовов и исчезновение из него фрейма некой функции означает потенциальную уязвимость.
gandjustas
Даже под Java не правят JVM, все фишки делаются на уровне компилятора, что ограничивает возможности.
Например generics.
senia
JSR 292: Supporting Dynamically Typed Languages on the JavaTM Platform
Это самое известное нововведение в Java за последнее время. Заметьте: даже в названии цель на другие ЯП под JVM.
Жаль видео с последнего Joker еще не в свободном доступе — там было очень хороший доклад от Charles Nutter: «Let's Talk About Invokedynamic».
BalinTomsk
--Как раз с переходам в Oracle Java снова начала развиваться.
Недавно писали что Оракл прикрыла группу занимаюшyюся развитием языка.
taujavarob
Java мёртв?
FSA
Помню как в детстве слушал в новостях по телеку про Java в середине 90-х (в 1997 по 2000 я выпл из телека). Сейчас смотрю в его сторону, но никак не решаюсь сделать шаг.
taujavarob
>Сейчас смотрю в его сторону, но никак не решаюсь сделать шаг.
А чего туда идти то?
Весь фан сейчас на стороне JavaScript.
senia
Если не затруднит, поделитесь, пожалуйста, ссылкой. Я видел только панические слухи про Java EE, но это бы языку повредило не сильно.