К.Б. Сыроватский
преподаватель
ГБПОУ КРК «Интеграл»,
с. Курсавка
«Языки программирования С++ и С#. Их анализ»
Аннотация
Языки С++ и С# , являются популярными, особенно среди программистов, разрабатывающих различные прикладные программы.
В данной работе было проведено исследование двух языков программированияи составленна их сравнительная характеристика, в которой описываются основные различияС++ и С#.
Ключевые слова:
С++, C#, язык программирования, библиотека, код, приложение, разработка.
Введение
CSharp и другие языки программирования…
На старте проекта часто может возникнуть вопрос о выборе средств разработки и если в одних случаях ответ на этот вопрос следует из потребности совместимости с библиотеками (сборники подпрограмм или объектов, используемых для разработки программного обеспечения (ПО)) и приложениями (программное обеспечение, которым может быть как одна программа, так и комплекс (набор) программ), то в других ответ не очевиден.
Отдельных статей требует рассмотрение выбора Java или же интерпретируемых языков. Они будут предпочтительнее, чем С++ или С# в некоторых случаях, однако вынесем такие случаи за рамки данной статьи и сфокусируемся на сравнении С++ и С#.
С# появился достаточно давно(уже появился C# 3.0), но многие до сих пор не понимают всех прелестей и нововведений, которые присутствуют в этом языке. Все хорошее познается в сравнении
Сравнение С# и C++:
Андерс Хейлсберг, главный разработчик C#, утверждает: «По-моему мнению, основное отличие между C# и другими языками программирования, особенно Java, заключается в том, что мы постарались остаться как можно ближе к С++».
Сходства:
в С# сохранены основные возможности языка C++, которые не были включены в Java. Это, касается, например, перечислений. Более того в C# для перечеслений обеспечивается безопасность типов.
С# заимствовал из С++ понятия операторов и ключевых слов. Обеспечивается перегрузка операторов.
В C# реализована возможность добавления блоков ненадежного кода.
Различия:
В C# использован комплексный метод программирования. При C++ программерам приходилось объявлять классы в заголовочном файле и реализовать класы в отдельном файле. Заголовочные файлы (Interface Definition Language — язык описания интерфейсов) и сложные интерфейсы не являются необходимыми.
В C++ переменные экземпляров объектов должны быть явно инициализированы в конструкторе. В C# это делается заранее.
Для массива, размер которого [n-1], в С++ можно устанавливать ссылки на это нереальное значение n — то есть выходить за границы массива. В C# это недопустимо.
С++ поддерживает множественное наслдедование классов. Это приводит к определенному усложнению коду. C# не поддерживает множественного наслдедования. Оно может быть реализовано посредством интерфейсов.
В C# все классы имеют единый базовый класс. Если класс не является производным от другого класса, он автоматически наследует свойства и члены из System.Object.
Код программ на С/С++ компилируется в формат машиннго языка, который будет выполнятся на определенном процессоре и в определенной ОС. Для C# предусмотрена компиляция программ на промежуточный язык IL (Intermediate Language). Код IL может запускаться на любой платформе при использовании среды .NET. С помощью JIT-компилятора он может быть преобразован в машинно-зависимый код для выполнения на платформе .NET
Сранение языков
Сравнивать будем по критериям, давая по каждому некоторое заключение основанное на практике, фундаментальных основах и известному опыту использования.
2.1. Скорость разработки. (Скорость разработки программы. Данное требование возникает тогда, когда начальник говорит «программа нужна не позже, чем вчера!» или еще какая срочность.)
С# позволяет стартовать разработку быстрее, а это позволяет быстрее получить прототип решения. Скорость разработки на С# на начальных этапах проекта значительно выше по сравнению с С++.
Однако, когда инфраструктура проекта создана, основные подходы и библиотеки выбраны, а среда настроена, скорость разработки на С++ и скорость разработки на С# становятся примерно одинаковыми.
Таким образом, в коротких малобюджетных проектах С# будет иметь преимущество по скорости разработки, но в длинных и относительно дорогих данное преимущество будет незначительным.
2.2. Кросплатформенность (способность программного обеспечения работать более чем на одной аппаратной платформе и (или) операционной системе).
С++ кросплатформенный по факту, хотя и с некоторыми оговорками, дополнительными затратами, а также бинарной несовместимость между платформами.
C#, по факту, оказался не кросплатформенный, несмотря на существование неофициальных on .net on окружений on под on разными on платформами on и on даже on потенциальную on бинарную on совместимость on между on платформами.
C# on спроектирован on быть on кросплатформенным, on однако on его on развитие on не on пошло on в on этом on направлении. on Поэтому on под on Windows on образовалась on достаточно on полная on .net on инфраструктура. on На on других on же on платформах on равноценной on инфраструктуры on не on появилось.
При on этом on для on разработки on на on С++ on сложилась on практически on равноценная on инфраструктура on на on большинстве on существующих on платформ, on есть on масса on библиотек, on которые on скомпилированы on или on могут on быть on скомпилированы on под on любые on существующие on платформы. on Именно on поэтому on существует on огромное on количество on кросплатформенных on приложений on и on библиотек on разного on масштаба, on написанных on на on С++, on на on ряду on с on кросплатформенными on библиотеками on есть on и on библиотеки on специфичные on для on отдельных on платформ. on Все on это on дает on практический on равноценные on шансы on для on развития on приложений on на on различных on платформах.
И on хотя on С# on возможно on использовать on для on построения on приложений on под on не-Windows on платформы, on проблемы, on вызываемые on использованием on .net on в on не-Windows on окружении, on сводят on на on нет on многие on преимущества on выбора on C#. on Поэтому on рекомендовать on его on для on кроссплатформенного on использования on можно on разве on что on если on код on на on C# on уже on написан. on При on этом on надо on четко on понимать, on что on в on перспективе on это on будет on приносить on дополнительные on затраты on на on поддержку.
2.3. Производительность кода и требовательность к ресурсам.(Скорость работы программы и необходимые аппраратные и программные возможности системы).
Очевидным on является on факт on того, on что on возможности on по on оптимизации on С++ on кода on куда on шире, on чем on возможности on по on оптимизации on С# on кода. on Таким on образом, on пиковая on производительность on кода on достижима on только on в on C++ on исполнении, on т.е. on в on пределе, on почти on любая on задача on на on С++ on может on быть on решена on с on меньшими on требованиями on к on ресурсам. on Поэтому on в on тяжелых on задачах, on связанных on с on обработкой on большого on количества on данных, on С++ on имеет on сильные on преимущества on перед on С#.
Но on стоит on понимать, on что on при on выборе on неправильного on подхода, on на on С++ on вполне on можно on написать on код, on который on будет on работать on медленнее on кода on на on C#, on выполняющего on туже on задачу.
Если on говорить on о on совокупности on субъективных on «простоты on разработки», on «красоты on кода» on и on объективной on производительности, on то on используя on C# on проще on написать on код, on удовлетворяющий on этим on критериям on одновременно. on Однако on это on не on значит, on что on производительный on код on на on С++ on обязательно on будет on страшным on или on сложным on для on восприятия, on просто on при on его on написании on потребуется on более on «творческий» on подход on для on удовлетворения on перечисленных on критериев on одновременно.
Фундаментальные on основы on преимуществ on С++ on в on возможности on писать on код, on который on будет on выполняться on непосредственно on процессором, on и on возможности on прямой on работы on с on памятью. on Конечно, on свобода on дает on больше on возможностей on создать on себе on проблемы, on но on в on ряде on случаев on это on лучше, on чем on невозможность on преодоления on потолка on производительности. on И on этот on потолок on вполне on может on привести, on например, on к on тому, on что on под on решение on задачи, on для on которого on бы on хватило on одного on хорошего on сервера, on вам on придется on собирать on ферму on из on нескольких on серверов, on или on же on к on тому, on что on ваше on приложение on будет on требовать on «топового» on железа on на on задачи, on для on которых on хватило on бы on железа on выпущенного on лет on 7-10 on назад.
2.4. Библиотеки.
Отличие on ассортимента on С++ on и on С# on библиотек on в on том, on что on С++ on библиотек on больше, on они on имеют on большую on историю, on за on которую on стали on неплохо on отлажены on и on оптимизированы, on часто on кросплатформенны, on многие on с on открытым on кодом. on Однако on при on всех on положительных on сторонах on С++ on библиотеки on как on имеют on очень on разную, on часто on даже on архаичную on архитектуру, on часто on не on объектный, on а on структурно-процедурный on интерфейс. on Связано on это on с on тем, on что on многое on С++ on библиотеки on это on С on библиотеки.
Другая on неприятная on особенность on С++ on библиотек on — on это on создание on и on переопределение on своих on базовых on типов. on Многие on С++ on библиотеки on заводят on свои on типы on строк, on контейнеров, on переопределяют on некоторые on базовые on типы. on Этому on есть on логичные on объяснения on (лучшая on производительность, on поддержка on кросплатформенности, on отсутствие on подходящих on типов on на on момент on написание on библиотеки), on однако on все on это on не on добавляет on удобства on использования on и on красоты on коду. on Базовые on же on С++ on библиотеки on дают on не on так on много, on как on дают on стандартные on библиотеки on С#, on поэтому on подбор on правильных on библиотек on для on проекта on С++ on — on это on задача, on необходимая on даже on в on сравнительно on простых on проектах.
Однако on не on все on так on страшно, on для on С++ on есть on немало on и on «красивых» on библиотек. on Да on и on базовые on библиотеки on постоянно on расширяются. on Вопрос on часто on лишь on в on том, on каких on жертв on потребует on данная on красота.
В on С# on перечисленных on выше on проблем on значительно on меньше. on Огромное on количество on библиотек on с on .net on идет on в on базе, on плюс on к on ним on множество on свободно on доступных on библиотек, on это on покрывает on практически on все on первостепенные on задачи on разработки on под on Windows. on Наличие on большого on количества on стандартных on типов on почти on избавляет on от on библиотек, on где on базовые on типы on переопределены. on И on в on силу on того, on что on библиотеки on С# on сравнительно on молодые,- on интерфейсы on библиотек, on как on правило, on лучше on вписываются on в on те on или on иные on шаблоны on проектирования, on что on часто on упрощает on их on изучение.
Однако on же on при on ближайшем on рассмотрении on велик on шанс, on что on под on вашу on специфическую on задачу on С# on библиотеки on не on окажется, on более on того, on может on оказаться, on что on и on решать on такую on задачу on на on С# on достаточно on не on эффективно, on поэтому on подобной on библиотеки on не on появится on и on в on будущем, on а on если on и on появится, on то on будет on работать on недостаточно on быстро.
Вторая on неприятная on особенность on библиотек on С# on в on том, on что on многие on из on них on являются on просто on оберткой on над on C++ on библиотеками, on что on будет on всегда on приводить on к on потерям on производительности on на on конверсиях on типов, on и on создавать on дополнительные on проблемы on отладки on и on распространения.
2.5. Удобство отладки.( этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка).
Можно on было on бы on просто on сказать, on что on под on Window, on С# on заметно on удобнее on отлаживать on и on на on этом on остановиться.
Однако on если on по on какой-то on причине on у on вас on на on ряду on с on C# on кодом on из on C# on сборки on используется on C++, on то on его on отладка on будет on станет on более on сложная on по on сравнению on с on обычной on отладкой on C++ on кода on из on С++.
2.6. Язык и Синтаксис.( набор правил, описывающий комбинации символов алфавита, считающиеся правильно структурированной программой (документом) или её фрагментом).
С on первого on взгляда on код on С++ on и on С# on очень on похож on внешне. on Но on многообразие on кода on на on С++ on больше, on ведь on С++ on является on одновременно on и on С on и on С++ on и on С++0х on и on все on это on вы on можете on использовать on одновременно on (конечно, on если on это on поддерживает on ваш on компилятор).
С# on же, on это on только on C#, on хотя on его on синтаксис on постоянно on расширяется. on Код on на on С#, on как on правило, on выглядит on проще on и on лаконичнее, on чем on код on С++ on (хотя on это on не on всегда on можно on было on сказать on про on первые on версии on С#). on Языковые on конструкции on С++ on и on С# on очень on схожи, on однако on существенные on различия on можно on найти on в on деталях. on
Если on С++ on можно on упрекнуть on за on отсутствие on «в on базе» on reflection, on позднего on связывания on и on сборки on мусора. on То on С# on надо on упрекнуть on за on отсутствие on полноценных on деструкторов, on отсутствие on полноценных on макросов, on достаточно on грубую on настройку on наследования, on отсутствие on константных on методов on и on членов, on отсутствие on глобальным on методов on (процедур), on очень on ограниченную on поддержку on шаблонов, on список on можно on продолжать… on Однако on жить on без on всего on этого on вполне on можно on как on в on случае on С++, on так on и on в on случае on C#.
Синтаксис on С#, on пожалуй, on можно on назвать on упрощенной on версией on С++, on таким on образом on С#, on как on и on любое on упрощение, on одновременно on несет on и on позитивный on и on негативный on эффекты.
Стоит on сказать, on что on более on сложный on код on часто on легче on пишется on и on анализируется, on если on написан on более on простым on языком. on С on этой on позиции, on используя on С#, on меньше on шансов on допустить on ошибку on в on принципиально on сложном on коде on и on больше on шансов on написать on чистый on код, on обладая on теми on же on ресурсами. on Это on может on быть on полезно on при on решении on достаточно on сложных, on но on не on требовательных on к on производительности on задач. on Однако on при on этом on большее on количество on «синтетики» on в on С# on делает on меньше on оценку on производительности on кода on по on его on «внешнему on виду».
2.7. Стоимость поддержки(Сопровожде́ние (поддержка) программного обеспечения — процесс улучшения, оптимизации и устранения дефектов программного обеспечения (ПО) после передачи в эксплуатацию).
В on поддержке on приложений on большой on разницы on между on С++ on и on С# on нет. on Хотя on стоит on понимать, on что on некоторые on баги on в on приложениях, on написанных on на on C#, on средствами on .net on исправить on невозможно on и on при on необходимости on их on исправить on стоимость on поддержки on может on существенно on возрасти. on Однако on если on говорить on о on рефакторинге, on то on зачастую on приложения, on написанные on на on C#, on рефакторить on несколько on дешевле.
2.8 Риски(минусы использования того или иного языка программирования).
Пожалуй, on основной on риск on использования on C# on — on это on сильная on завязка on на on Microsoft. on Конечно, on вряд on ли on Microsoft on куда-то on исчезнет on в on ближайшем on будущем, on но on стоит on понимать, on что on Microsoft on — on это on коммерческая on организация, on целью on которой on является on извлечение on прибыли, on а on для on прибыли on нужны on продажи on своей on продукции. on Поэтому on в on интересах on Microsoft on разворачивать on разработку on C# on и on .net on так, on чтобы on это on приводило on к on продажам on новой on продукции on Microsoft. on Так on что on если on интересы on вашей on разработки on будут on не on соответствовать on интересам on Microsoft, on рано on или on поздно on это on может on привести on к on проблемам.
Риски on использования on С++ on тоже on есть, on но on это on другие on риски. on Основным on я on бы on назвала on проблемы, on связанные on с on бинарной on совместимостью on библиотек. on Все on это on может on существенно on удорожить on развитие on проекта.
Наряду on с on рисками on развития, on есть on и on риски on низкокачественного on кода. on Поскольку on С# on менее on требователен on к on разработчику, on вероятность on появления on кода on низкого on качества on на on С# on в on среднем on выше, on чем on в on случае on С++. on При on критической on массе on подобного on кода on это on может on создать on серьезные on проблемы on в on работе on приложения.
В on случае on С++ on ситуация on с on низкокачественных on кодом on несколько on лучше, on т.к. on шансы on на on выживание on у on плохого on кода on ниже, on однако on панацеей on от on плохого on кода on С++ on конечно on не on является.
2.9. Самодостаточность приложений(независимость)
Полной on самодостаточности on приложений on нет on ни on у on C++ on ни on у on С#. on Для on С++ on так on или on иначе on нужен on runtime, on а on для on C# on .net on framework. on
Однако on хотелось on бы on отметить, on что on рантайм on С++, on как on и on любая on другая on библиотека, on может on быть on статический on линкован on в on исполняемый on модуль, on таким on образом on исполняемый on модуль on может on содержать on все on необходимое on для on работы, on и on за on счет on чего on станет on самодостаточным, on в on случае on С# on такое, on стандартными on средствами on не on реализуемо.
2.10. Удобство сборки (процесс получения информационного продукта из исходного кода. Чаще всего включает компиляцию и компоновку, выполняется инструментами автоматизации ).
Сборка on С++ on проектов on заметно on сложнее on сборки on проектов on С#. on Однако on стоит on понимать, on что on большая on сложность on предоставляет on и on дополнительную on гибкость, on которая on рано on или on поздно on может on стать on полезной on вам. on Правда on до on этого on момента on будет on лишь on увеличивать on расходы on вашего on времяни.
2.11. Перспективы
on На on сегодня on и on С++ on и on C# on активно on развиваются on (хотя on С++ on начал on активно on развиваться on не on так on давно) on Однако on что on будет on дальше?
Темпы on роста on производительности on процессоров on (по on крайней on мере on в on расчете on на on ядро) on заметно on снизились on и on вряд-ли on в on ближайшем on будущем on мы on увидим on их on существенный on рост. on То on же on самое, on думаю, on можно on сказать on и on про on производительность on ввода-вывода.
Все on это, on скорее on всего, on создаст on запрос on на on оптимизацию on программных on продуктов on и on запрос on на on параллельные on вычисления. on
Выводы
Не on могу on сказать, on что on есть on универсальный on ответ on на on вопрос on «С++ on или on же on С# on использовать on для on очередного on проекта?», on однако on же on могу on сказать, on что on в on разные on периоды on своей on деятельность on я on бы on по on разному on ответил on на on вопрос on о on выборе, on и on если on лет on 5 on назад on я on бы on не on рассматривала on C++ on как on предпочтительный on выбор, on то on сейчас on в on большем on количестве on случаев on склонюсь on к on тому, on чтобы on использовать on его. on Однако, on думаю, on что on для on быстрого on создания on приложений on под on Windows on C# on является on и, on возможно, on будет on являться on предпочтительным on решением on относительно on С++.
Приложение: Сравнительлные характеристики языков
Компилятор/интерпретатор
Возможность | Язык |
C++ | C# |
Open-source компилятор(интерпретатор) | + | + |
Возможность компиляции | + | + |
Bootstrapping | + | + |
Многопоточная компиляция | + | - |
Интерпретатор командной строки | +/-
| -
|
Условная компиляция | + | + |
Управление памятью (Ресурсы)
Возможность | Язык |
C++ | C# |
Создание объектов настеке | + | + |
Неуправляемые указатели | + | + |
Ручное управление памятью | + | +] |
Сборка мусора | -/+
| + |
Управление потоком вычислений (Язык и синтаксис)
Возможность | Язык |
C++ | C# |
Инструкция goto | + | + |
Инструкции break без метки | + | + |
Инструкция break сметкой | - | - |
Поддержка try/catch | + | + |
Блок finally | - | + |
Блок else(исключения) | - | + |
Перезапуски | ? | - |
Ленивые вычисления | -/+ | -/+
|
Continuations | ? | - |
Легковесные процессы(Сoroutines) | - | - |
Типы и структуры данных (Язык и синтаксис)
Возможность | Язык |
C++ | C# | |
Кортежи | +/-
| +/-
| |
Алгебраические типы данных | - | - | |
Многомерные массивы | + | + | |
Динамические массивы | + | +/- | |
Ассоциативные массивы | +
| + | |
Контроль границ массивов | +/- | + | |
Цикл foreach | +
| + | |
Listcomprehensions | - | -/+
| |
Целые числа произвольной длины | - | + [ | |
Целые числа с контролем границ | - | - | |
Объектно-ориентированные возможности (Язык и синтаксис)
Возможность | Язык |
C++ | C# | |
Интерфейсы | + | + | |
Мультиметоды | -/+ | -/+[ | |
Mixins | -/+ | - | |
Переименование членов при наследовании | -/+ | - | |
Множественное наследование | + | - | |
Решение конфликта имен при множественном наследовании | -/+
| x | |
Разное
Возможность | Язык |
C++ | C# | |
Макросы | + | - | |
Шаблоны/Generics | + | + | |
Поддержка Unicode в идентификаторах | +
| + | |
Перегрузка функций | + | + | |
Динамические переменные | - | ? | |
Именованные параметры | - | +
| |
Значения параметров поумолчанию | + | +
| |
Локальные функции | +
| +/- | |
Сопоставление с образцом | - | +/- | |
Контрактное программирование | - | +
| |
Наличие библиотек для работыс графикой и мультимедия(OpenGL/WebGL/OpenML/OpenALили DirectX) | + | + | |
Список использованных источников
Роберт У. Себеста. Основные концепции языков программирования = Concepts of Programming Languages / Пер. с англ. – 5-е изд. – М.: Вильямс, 2001. – 672 с. – 5000 экз. ISBN: 5–8459–0192–8TIOBE Software: Tiobe Index
Городняя Л.В. Основы функционального программирования. /– М.: Изд-во "Интернет-университет информационных технологий – ИНТУИТ.ру", 2004. – 280 c.: ил. ISBN 5–9556–0008–6
Анатолий А. Андрей К. Логическое программирование и Visual Prolog (с CD).. – СПб.: «БХВ–Петербург», 2003. – С. 990. ISBN 5–94157–156–9.
Иан Грэхем. Объектно–ориентированные методы. Принципы и практика = Object–Oriented Methods: Principles & Practice. – 3–е изд./ – М.: «Вильямс», 2004. – С. 880. ISBN 5–8459–0438–2
Андрей Александреску. Современное проектирование на С /Вильямс, 2004 г. 336 стр. Тираж: 3500 экз. ISBN 5–8459–0351–3
Легалов А. И. – SoftCraft: разработка трансляторов: конспект лекций http://www.softcraft.ru/translat/lect/t01-02.shtml
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html