Как С#, вдохновленный С++, больше, чем Java?

При просмотре истории С# я узнал, что С# рассматривался как обновление для C и/или С++. Это стало для меня неожиданностью, так как на первый взгляд я вижу гораздо более общие идеи между С# и Java (на ум приходит сборка мусора). Я не пишу код на Java, но у меня обычно нет проблем с кодом Java и регулярно читает книги о шаблонах в Java, которые я могу легко транспонировать на С#, и могу честно не сказать то же самое о С++. Итак, мой вопрос: как С# ближе к С++, чем к Java? Это просто отказ признать Java, или я что-то упускаю или что-то недопонимаю?

18 ответов

Лично я бы сказал, что он ближе к Java, чем С++, но несколько дополнений для плавильного котла:

  • Делегаты (ориентировочно указатели на функции)
  • Пользовательские значения типов

Дженерики разные для всех 3, но дженерики типа стирания Java, вероятно, (хотя это нечетное сравнение) ближе к шаблонам С++, чем генерируемые генераторы на основе С#.


Для начала он позволяет манипулировать указателем (в небезопасных блоках).


Ну, я думаю, вы начнете немного спорить об этом.

Я думаю, что Java - это своего рода обновление/эволюция С++, поэтому это, конечно же, объяснит сходство в некоторой степени. Правда, конечно, что С# был вдохновлен как Java, так и С++ и взял концепции из обоих языков. И, конечно же, в области функционального программирования и динамического программирования многое зависит от С#.

Поэтому я думаю, что неправильно говорить, что С# "ближе" к Java, чем к С++ или наоборот. Это как-то близко к обоим.


У меня было интервью, спросив меня, на каком языке С# был смоделирован, и я быстро сказал, что лучше С++ или Java (C--). Интервьюер сказал: "Неправильно!", Это Дельфы. Я не знаю Delphi, поэтому...


В аспектах OO и наследования С# больше похож на С++. Например:

class MyClass : ***********

вместо

class MyClass implements ***********

и

public MyClass() : base()

вместо

public MyClass() { super(); }

Также С# использует идею виртуальных функций, чтобы разрешить перегрузку. В java наследование и перегрузка - это скорее открытое дело, которое должно быть заблокировано. В С++ и С# он по умолчанию больше заблокирован и должен быть открыт.

Другие сходства включают:

  • Перейдите по ссылке
  • перегрузка оператора
  • указатели функций/делегаты


Это маркетинг. Microsoft, конечно, не хотела признавать, что "Эй, мы делаем Java 1.1!" Во-первых, это будет то же самое, что признать, что Java действительно стоит копировать, что плохое движение, если вы пытаетесь победить Java.

И во-вторых, это отпугнет всех разработчиков на С++, которые испугались неловкости Java и ранних проблем с производительностью.

Итак, они говорят, что они строят на С++ и все счастливее.

В действительности, конечно, ничто не может быть дальше от истины.

Если у С# и Java есть общий предок, это не С++, а "C с классами" ; в частности, самые ранние версии С++, задолго до его стандартизации, и до того, как большая часть того, что делает его полезным сегодня, была добавлена.

Это была не что иное, как попытка закрепить некоторые функциональные возможности ООП на C.

С++, с тех пор, пошел в совершенно другом направлении, отпуская одержимость ООП и изучая гораздо более функциональный стиль, используя форму времени утиного ввода для создания универсального программирования. На этот язык добавлены некоторые невероятно мощные и элегантные библиотеки. Ничто из этого не представлено на Java или С#.

С# определенно вдохновлен Java больше всего на свете. И там, где он вдохновлен С++, он вдохновлен этим ранним вариантом "C с классами" , а не чем-то похожим на современный С++.

Но С++ был и считается "классным" языком многими. Microsoft хотела использовать этот "классный" и довести его до .NET.

Лично я бы подумал, что С++, С# и Java являются братьями и сестрами. Все они происходят из одного прототипа "C с классами" . С# и Java заняли менее прямой маршрут оттуда, чем С++, но он все еще там, где больше всего их вдохновения. То, что они унаследовали странное понятие ООП, которое практически не имеет никакого отношения к тому, что предложил Алан Кэй/Малтталк, и где они унаследовали неуклюжий синтаксис С-типа.

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


FWIW: с исторической точки зрения, предшествовавшей С#, появляющейся на сцене, MSFT продвигала Visual J ++, которая была реализацией Java с некоторыми улучшениями, позволяющими использовать специальные функции Windows.

Sun Microsystems подала в суд, поскольку их цель в Java заключалась в том, что запись выполнялась где-то в любом месте, а Visual J ++ - в приложениях, которые будут работать только в Windows, но не в реализации Sun Unix.

Солнце преобладало в суде, и MSFT отозвала Visual J ++ с рынка и очень скоро позже объявила Visual С#, которая была тривиально различной синтаксически и функционально идентичной языку Visual J ++, только что снятому.


Одним из примеров является оператор сравнения == для строк. С# использует подход С++ и выполняет лексическое сравнение в строке. Java сравнивает ссылки на строки.

Здесь хорошая статья статьи MSDN, которая проведет вас через сравнение между С# и Java и С# и С++.


Для чего стоит С# Forms очень тесно связаны с Java Swing. Библиотеки С++ Gui в большинстве случаев совершенно разные.


Я, вероятно, возьму flak для этого, но да, С# по большому счету Microsoft отвечает на Java. Его язык они могут расширить, какой они выбирают (в отличие от Java, где они подвергались цензуре, чтобы продлить его на не одобренные способы). Он имеет важнейшие функции Java: управление памятью и большую системную библиотеку. Это С++-подобный или C-like в той мере, в какой это необходимо, чтобы заманить разработчиков С++ и C, которые еще не являются поклонниками Java.


Все трое - близкие родственники. Чья мать была маленькой.

Кто отец каждого языка - это другой вопрос?

Ada + Smalltalk => Java
C + Smalltalk => C++
? + Smalltalk => C#


Я вижу С# как управляемую версию С++, а не переписывание Java. При создании такого языка он, естественно, принимал форму Java (синтаксически), но сохранял элементы невероятно мощного С++.


IMO, идея о том, что С# больше вдохновляет С++, чем Java, только маркетинг; попытка привести программистов на C++ в управляемый мир таким образом, что Java никогда не могла это сделать. С# происходит от Java главным образом; любой, кто смотрит на историю, особенно войн Java VM середины 90-х между Sun и Microsoft, может видеть, что Java является основным родителем.

Синтаксис С# ближе к С++ только в определенных областях: манипуляция указателем (у которой Java нет), объявление деривации (т.е. public class Foo : Bar, ****, а не public class Foo extends Bar implements ****)) и перегрузка оператора.

Все остальное либо похоже на Java (статическое main объявлено в объявлении класса, ни файлы заголовков, ни одно наследование, многие другие), как и Java и С++ (базовый синтаксис), либо однозначно С# (свойства, делегаты, многие многие другие).


Его имя начинается с буквы C.


Я думаю в том смысле, что С# - это скорее язык мультипарадигмы, а не форсирование единой парадигмы (ООП), как в JAVA. На самом деле это хорошо, потому что это дает больше свободы для своих программистов.


Если вы помните историю, Microsoft на самом деле пыталась использовать свою методологию "Embrace and Extend" на Java, где они добавляют к ней, так что она будет работать только с окнами и называется "J ++".

Sun подала в суд на них, так что они вышли с J #, который был очень близок к Java как стоп-пробел, который дал им время для разработки собственного языка (С#).

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

Но если вам нравится эта идея начать с нуля и работать со всеми лучшими функциями языков на сегодняшний день, обязательно зайдите в Scala - это выходит за рамки того, что может сделать Java или С#, даже с революция основных функций.


Синтаксис, вдохновленный С++, VM, вдохновленный Java, и библиотеки (в .net 1.1) были почти 1-1 корреляцией с библиотеками Delphi.


Я думаю, что соединение Java → С# намного сильнее, чем С++ → С#, главным образом потому, что, как было указано, С# был результатом костюма Sun по поводу MSVM, предполагающего нарушение спецификации Java. В частности, J ++ использовал дополнительные ключевые слова/функциональные возможности, такие как "делегат", который стал одной из основных отличительных особенностей С#, которая была одной из главных жалоб Sun.

Другие функции, такие как директива @dll и @com (которые предваряли атрибуты как на Java, так и на С#), также были частью жалобы. Обратите внимание на сходство между директивами С# COM PIA и директивами @com в J ++. Сравните J ++ JDirect с встроенным interop в С#. (Еще одна причина для иска заключалась в том, что MS отключил Java JNI вообще в пользу JDirect для Windows.)

Наконец, Андерс Хейлсберг является человеком, ответственным за J ++ и С#, поэтому связь между Java/J ++ и С# довольно прочная. Несомненно, у Хейльсберга было много аспектов умения С++ (в частности, функция указателя/делегата метода, которую он сначала размещал в J ++), но было бы безопасно сказать, что Java должна была быть на переднем крае.

Во многом вы можете взглянуть на измененную версию Microsoft Java, J ++ как С# 0.1

licensed under cc by-sa 3.0 with attribution.