Как C# вдохновлен C++ больше, чем Java?
Просматривая историю C#, я обнаружил, что C# рассматривается как обновление C и / или C++. Для меня это стало неожиданностью, так как на первый взгляд я вижу гораздо больше общих идей между C# и Java (на ум приходит сборка мусора). Я не пишу код на Java, но у меня обычно нет проблем с Java-кодом, и я регулярно читаю книги о шаблонах на Java, которые я могу легко перенести в C#, и, честно говоря, не могу сказать то же самое о C++.
Итак, мой вопрос, как C# ближе к C++, чем к Java? Это просто отказ признать Java, или я что-то упускаю или неправильно понимаю?
18 ответов
IMO, идея о том, что C# больше вдохновлен C++, чем Java, является только маркетингом; попытка ввести программистов на С ++ в управляемый мир таким способом, которого Java никогда не могла сделать. C# является производным от Java в первую очередь; Любой, кто смотрит на историю, особенно войны Java VM середины 90-х годов между Sun и Microsoft, может увидеть, что Java является основным родителем.
Синтаксис C# ближе к C++ только в определенных областях: манипулирование указателем (которого нет в Java), объявление деривации (т.е. public class Foo : Bar, IBaz
скорее, чем public class Foo extends Bar implements IBaz
) и перегрузка операторов.
Все остальное либо просто как Java (статический main объявлен в объявлении класса, нет файлов заголовков, одиночное наследование, многие другие), так же, как Java и C++ (основной синтаксис), или уникально C# (свойства, делегаты, многие многие другие),
Я думаю в том смысле, что C# - это скорее мультипарадигмальный язык, нежели форсирование одной парадигмы (ООП), как в JAVA. На самом деле это хорошая вещь, потому что она дает больше свободы своим программистам.
Если вы помните историю, Microsoft фактически пыталась использовать свою методологию "Embrace and Extend" на Java, где они добавляли ее, чтобы она работала только с окнами, и называли ее "J ++".
Sun подала в суд на них, чтобы они выпустили J#, который был очень близок к Java в качестве временного промежутка, который дал им время для разработки собственного языка (C#).
На тот момент это была смесь лучших концепций из всех языков, доступных в то время - на самом деле не имеет смысла говорить, что она больше основана на одном, чем на другом, это просто скопление отдельных функций.
Но если вам нравится эта идея начинать с нуля и работать со всеми лучшими на сегодняшний день возможностями языков, обязательно загляните в Scala- это далеко за пределы возможностей Java или C#, даже с революцией основных функций.
Синтаксис, основанный на C++, VM, вдохновленный Java, и библиотеки (в.net 1.1) были почти в соотношении 1: 1 с библиотеками Delphi.
Я думаю, что соединение Java -> C# намного сильнее, чем C++ -> C#, главным образом потому, что, как было отмечено, C# был результатом иска Sun по поводу предполагаемого нарушения MSVM спецификации Java. В частности, одной из главных претензий Sun было использование в J ++ дополнительных ключевых слов / функций, таких как "делегат", что стало одной из основных отличительных особенностей C#.
Другие функции, такие как директивы @dll и @com (предварительно настроенные атрибуты в Java и C#), также были частью жалобы. Обратите внимание на сходство между директивами COM PIA C# и директивами @com в J++. Сравните JDirect J ++ с собственным взаимодействием в C#. (Другой причиной иска было то, что MS полностью отключила JNI Java в пользу специфичного для Windows JDirect.)
Наконец, Андерс Хейлсберг - человек, отвечающий за J ++ и C#, поэтому связь между Java/J++ и C# довольно прочная. Без сомнения, у Хейлсберга было много аспектов сознания C++ (в частности, функция указателя / делегата метода, которую он впервые применил в J++), но можно с уверенностью сказать, что Java должна была быть в авангарде.
Во многих отношениях вы можете посмотреть на измененную версию Microsoft Java, J ++ как C# 0.1
Для начала, это позволяет манипулировать указателями (в небезопасных блоках).
Лично я бы сказал, что он ближе к Java, чем к C++, но несколько плюсов для плавильного котла:
- Делегаты (примерно функциональные указатели)
- Пользовательские значения-типы
Обобщения для всех 3 различны, но обобщения типа стирания Java, вероятно, (хотя это и странное сравнение) ближе к шаблонам C++, чем дженерики на основе времени исполнения C#.
Ну, я думаю, вы начнете небольшой спор по этому поводу.
Я думаю, что Java также является своего рода обновлением / развитием C++, так что, конечно, это в некоторой степени объясняет сходство. Правда состоит в том, что C# был вдохновлен как Java, так и C++ и брал концепции из обоих языков. И, конечно, многое в области функционального программирования и динамического программирования адаптируется к C#.
Поэтому я считаю неправильным говорить, что C# "ближе" к Java, чем к C++ или наоборот. Это в некотором роде близко к обоим.
У меня было интервью, однажды спросив меня, на каком языке был смоделирован C#, и я быстро сказал, что лучше C++ или Java (C--). Интервьюер сказал: "Неправильно!", Это Дельфи. Я не знаю Delphi, так что...
Это маркетинг. Microsoft, конечно, не хотела признавать, что "Эй, мы делаем Java 1.1!" Во-первых, это было бы то же самое, что признать, что Java на самом деле стоит копировать, что является плохим шагом, если вы пытаетесь победить Java.
А во-вторых, это отпугнет всех разработчиков языка C++, которых пугает неуклюжесть Java и ранние проблемы с производительностью.
Поэтому они говорят, что они строят на C++ и все счастливее.
В действительности, конечно, ничто не может быть дальше от истины.
Если C# и Java имеют общего предка, это не C++, а "C с классами"; в частности, самые ранние версии C++, задолго до того, как он был стандартизирован, и до того, как было добавлено большинство того, что делает его полезным сегодня.
Это была всего лишь попытка прикрутить некоторые функции ООП к C.
C++ с тех пор пошла в совершенно ином направлении, избавившись от навязчивой идеи ООП, и исследуя гораздо более функциональный стиль, используя во время компиляции форму утиной типизации для создания универсального программирования. Некоторые невероятно мощные и элегантные библиотеки были добавлены к языку. Ничего из этого вообще не представлено в Java или C#.
C# определенно вдохновлен Java больше всего на свете. И там, где он вдохновлен C++, он вдохновлен этим ранним вариантом "C с классами", а не чем-то похожим на современный C++.
Но C++ считался и считается многими "классным" языком. Microsoft хотела подключиться к этому "крутому" и перенести его в.NET.
Лично я бы рассматривал C++, C# и Java как братьев и сестер. Все они получены из одного и того же языка "C с классами". C# и Java пошли оттуда менее прямым путем, чем C++, но это все же источник их вдохновения. Именно здесь они унаследовали странное понятие ООП, которое практически не имеет ничего общего с тем, что предложил Алан Кей /Smalltalk, и именно там они унаследовали неуклюжий C-подобный синтаксис.
Это как сказать, что мы, люди, произошли от обезьян. Не были. У нас просто есть общий предок, и этот общий предок был несколько похож на обезьяну. C# не является производным от C++, у них просто есть общий предок, немного похожий на C++.
В аспектах OO и наследования C# больше похож на C++. Например:
class MyClass : MyInterface
вместо
class MyClass implements MyInterface
а также
public MyClass() : base()
вместо
public MyClass() { super(); }
Также C# использует идею виртуальных функций для разрешения перегрузки. В Java наследование и перегрузка - это скорее открытый вопрос, который должен быть заблокирован. В C++ и C# он по умолчанию более заблокирован и должен быть открыт.
Другие сходства включают в себя:
- Передать по ссылке
- перегрузка оператора
- указатели / делегаты функций
FWIW: С исторической точки зрения, до появления C# на сцене MSFT продвигал Visual J++, который был реализацией Java с некоторыми улучшениями, позволяющими использовать специфичные для Windows функции.
Sun Microsystems подала в суд, поскольку их цель с Java - запускать один раз для любого языка, а Visual J++ приведет к созданию приложений, которые будут работать только в Windows, но не в реализации Sun для Unix.
Sun восторжествовала в суде, и MSFT отозвала Visual J++ с рынка и вскоре представила Visual C#, который тривиально отличался синтаксически и функционально идентичен только что отозванному языку Visual J++.
Для чего это стоит C# формы очень тесно связаны с Java Swing. Библиотеки Gui в C++ в большинстве случаев совершенно разные.
Одним из примеров является оператор сравнения == для строк. C# использует подход C++ и выполняет лексическое сравнение строки. Java сравнивает строковые ссылки.
Вот хорошая статья MSDN, в которой вы проведете сравнение между C# и Java и C# и C++.
Я, вероятно, возьму на себя ответственность за это, но да, C# в общем и целом является ответом Microsoft на Java. Это язык, который они могут расширять любым способом, который они выберут (в отличие от Java, где они были осуждены за расширение его недопустимыми способами). У него есть важные особенности Java: управление памятью и большая системная библиотека. Он похож на C++ или C-подобен настолько, насколько это необходимо для привлечения разработчиков на C++ и C, которые еще не являются поклонниками Java.
Все трое просто близкие родственники.
Чья мать была болтливой.
Кто отец каждого языка другой вопрос?
Ada + Smalltalk => Java
C + Smalltalk => C++
? + Smalltalk => C#
Я рассматриваю C# как управляемую версию C++, а не как переписывание Java. При создании такого языка он, естественно, принял форму Java (синтаксически), но сохранил элементы невероятно мощного C++.