Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Язык си плюсы и минусы

Язык си плюсы и минусы

1)Масштабируемость. На языке C++ разрабатывают программы для самых различных платформ и систем.
2)Возможность работы на низком уровне с памятью, адресами, портами. Что, при неосторожном использовании, может легко превратиться в недостаток.
3)Возможность создания обобщенных алгоритмов для разных типов данных, их специализация, и вычисления на этапе компиляции, используя шаблоны.

Недостатки языка C++

1)Наличие множества возможностей, нарушающих принципы типобезопасности приводит к тому, что в С++-программы может легко закрасться трудноуловимая ошибка. Вместо контроля со стороны компилятора разработчики вынуждены придерживаться весьма нетривиальных правил кодирования. По сути эти правила ограничивают С++ рамками некоего более безопасного подъязыка. Большинство проблем типобезопасности С++ унаследовано от С, но важную роль в этом вопросе играет и отказ автора языка от идеи использовать автоматическое управление памятью (например, сборку мусора). Так визитной карточкой С++ стали уязвимости типа «переполнение буфера».
2)Плохая поддержка модульности. Подключение интерфейса внешнего модуля через препроцессорную вставку заголовочного файла ( #include ) серьёзно замедляет компиляцию, при подключении большого количества модулей. Для устранения этого недостатка, многие компиляторы реализуют механизм прекомпиляции заголовочных файлов Precompiled Headers.
3)Недостаток информации о типах данных во время компиляции (CTTI).
4)Язык C++ является сложным для изучения и для компиляции.
5)Некоторые преобразования типов неинтуитивны. В частности, операция над беззнаковым и знаковым числами выдаёт беззнаковый результат.
6)Препроцессор С++ (унаследованный от С) очень примитивен. Это приводит с одной стороны к тому, что с его помощью нельзя (или тяжело) осуществлять некоторые задачи метапрограммирования, а с другой, в следствии своей примитивности, он часто приводит к ошибкам и требует много действий по обходу потенциальных проблем. Некоторые языки программирования (например, Scheme и Nemerle) имеют намного более мощные и более безопасные системы метапрограммирования (также называемые макросами, но мало напоминающие макросы С/С++).
7)С конца XX века в сообществе С++ получило распространение так называемое метапрограммирование на базе шаблонов. По сути, оно использует особенности шаблонов C++ в целях реализации на их базе интерпретатора примитивного функционального языка программирования выполняющегося во время компиляции. Сама по себе данная возможность весьма привлекательна, но, в следствии вышесказанного, такой код весьма трудно воспринимать и отлаживать. Языки Lisp/Scheme, Nemerle и некоторые другие имеют более мощные и одновременно более простые для восприятия подсистемы метапрограммирования. Кроме того, в языке D реализована сравнимая по мощности, но значительно более простая в применении подсистема шаблонного метапрограммирования.
8)Хотя декларируется, что С++ мультипарадигменный язык, реально в языке отсутствует поддержка функционального программирования. Отчасти, данный пробел устраняется различными библиотеками (Loki, Boost) использующими средства метапрограммирования для расширения языка функциональными конструкциями (например, поддержкой лямбд/анонимных методов), но качество подобных решений значительно уступает качеству встроенных в функциональные языки решений. Такие возможности функциональных языков как сопоставление с образцом вообще крайне сложно эмулировать средствами метапрограммирования.

Критика языка C++

1)C++ унаследовал многие проблемы языка C:
o Операция присваивания обозначается как = , а операция сравнения как == . Их легко спутать, и такая конструкция будет синтаксически правильной, но приведёт к труднонаходимому багу. Особенно часто это происходит в операторах if и while, например, программист может написать if (i=0) вместо if (i==0)(Вместе с тем, основная масса компиляторов выдаёт в таких случаях предупреждение.) Избежать ошибку такого типа можно, если писать все операции сравнения в таком виде: if (0==i). К тому же многие языки (Бейсик, Паскаль) используют символ «=» именно в операциях сравнения.
o Операции присваивания (=), инкрементации (++), декрементации (—) и другие возвращают значение. В сочетании с обилием операций это позволяет, но не обязывает, программиста создавать трудночитаемые выражения. С другой стороны, один из основных принципов языков C и C++ — позволять программисту писать в любом стиле, а не навязывать «хороший» стиль. К тому же это иногда позволяет компилятору создавать более оптимальный код.
o Макросы ( #define ) являются мощным, но опасным средством. В языке C++, в отличие от C, необходимость в опасных макросах появляется значительно реже благодаря шаблонам и встроенным функциям. Но в унаследованных стандартных С-библиотеках много потенциально опасных макросов.
2) Некоторые считают недостатком языка C++ отсутствие системы сборки мусора. С другой стороны, в C++ есть достаточно средств (классы с конструкторами и деструкторами, стандартные шаблоны, передача параметров по ссылке), позволяющих почти исключить использование опасных указателей. Тем не менее, отсутствие встроенной сборки мусора позволяет пользователю самому выбрать стратегию управления ресурсами.

C# — Преимущества и недостатки

Опубликовано shwan в 06.11.2018 06.11.2018

Я хочу обсудить с тобой один очень важный вопрос, который достаточно часто упускают из внимания: действительно ли тебе нужно учить язык C#?

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

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

Поэтому, я предлагаю тебе предварительно рассмотреть основные преимущества и недостатки языка C#, перспективы развития, сферы применения и уровни зарплатных ожиданий. Это может помочь тебе понять действительно ли ты правильно инвестируешь свое время. А время – это самый ценный ресурс, запомни это.

История языка C#

Я постараюсь долго не задерживаться на этом пункте, но основную информацию расскажу.

Данный язык создан всеми так горячо любимой корпорацией Зла Microsoft в 2000 году. Он очень многое унаследовал от своих родителей (С++, Java, Basic), но и привнес нового.

Возможной версией использования символа хештега принято считать наследование плюсиков от предков, примерно следующим образом: C → C++ → C++++(C#), потому что символ «#» при хорошем воображении можно получить путем объединения 4-х знаков «+».

Как на самом деле был создан язык C#

Язык активно развивается. Регулярно выходят новые версии C#, которые добавляют новые синтаксические конструкции в язык, а также увеличивают его быстродействие и надежность.

Преимущества C#

Данный язык использует объектно-ориентированный подход к программированию во всем. Это означает, что тебе нужно будет описывать абстрактные конструкции на основе предметной области, а потом реализовывать между ними взаимодействие. Данный подход пользуется большой популярностью, потому что позволяет не держать в голове всю информацию, а работать по принципу черного ящика: подал входные данные -> МАГИЯ -> PROFIT.

Программирование — это магия

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

Еще стоит упомянуть, что все это работает на базе платформы .NET Framework. Что это означает? Для многих непосвященных, это просто какая-то приблуда, которую нужно установить на комп, чтобы программа запустилась, но дело обстоит значительно глубже. Написанный тобой код на языке C# транслируется в промежуточный язык (IL), который в свою очередь уже преобразуется в машинный код на твоем компьютере прямо во время выполнения приложения (JIT). Спрашивается, зачем это все? А суть в том, что ты можешь пилить со своим другом Васей на разных языках один и тот же проект и ни одному из вас не придется переучиваться. Но я никогда не видел, чтобы это реально использовали на практике. Но это еще не все. Так как окончательная компиляция из промежуточного кода выполняется в живую на твоей конкретной машине, то возможно увеличение производительности за счет использования специфических команд именно твоего процессора.

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

Герб программистов

Ты просто скачиваешь нужное тебе решение из nuget и начинаешь его использовать. В большинстве своем они бесплатны. Сюда же можно отнести большое количество обучающего и справочного материала. Практически на любой свой вопрос ты сможешь найти ответ на стековерфлоу. Ну а на крайний случай всегда можешь спросить в моем телеграм чате для программистов.

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

Visual Studio 2019

Но IDE действительно хороша, к тому же имеется ее полнофункциональная бесплатная версия Community.

Еще к плюсам можно отнести строгую типизацию, которая позволяет защититься от дурака, и не так давно появившаяся кросспратформенность в .NET Core (да-да, мелкомягкие потихоньку захватывают линукс).

Читать еще:  Единица си коэффициента заполнения импульсного тока

Недостатки C#

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

Кто на самом деле виноват в ошибках программирования

C# очень легко дизассемблируется. Это означает, что с большой долей вероятности твой код будет получен и изучен конкурентами. Конечно же, есть специальные инструменты, которые могут усложнить этот процесс, но на 100% защититься от этого практически невозможно.

.NET использует концепцию JIT-компиляции. Это означает, что программа будет скомпилирована в машинные коды по мере необходимости прямо во время работы приложения. С одной стороны, это конечно прикольно, но при первом запуске возможны весьма серьезные тормоза.

C# не является повсеместно распространенным языком. Большинство программистов сосредоточены в коммерческой Enterprise сфере, что накладывает весьма серьезные ограничения на поиск работы в небольших городах, где кроме Delphi или PHP ничего жизни не видели. К тому же, как бы то ни было, C# в первую очередь ассоциируется с Windows. Вряд ли в обозримом будущем что-то изменится и Винда все также будет продолжать доминировать на рынке, но все же небольшой риск остается, особенно учитывая недавние фейлы с обновлениями в Windows 10.

Перспективы развития C#

C# входит в первую пятерку самых популярных языков программирования на 2018 год. Он используется во многих крупных компаниях, а также и в небольших стартапах. Сейчас компания Microsoft делает большой упор на развитие универсальности и кросспалтформенности для этого языка. Уже сейчас с его помощью можно разрабатывать практически любой тип приложений.

Компания Microsoft остается одной из крупнейших IT компаний мира, а C# ее флагманский язык программирования, который постоянно развивается и впитывает в себя все новые возможности. Поэтому в обозримом будущем проблем у данного языка возникнуть не должно.

Сферы применения языка C Sharp

В этой области C#, наверное, впереди планеты всей. Хочешь разрабатывать обычные приложения для компьютера – пожалуйста, стандартные WinForms Application и консоль тебе в помощь. Хочешь такие же, но покрасивее? – используй WPF. И специальные приложения для магазина в Windows Store тоже. Веб-приложения? – Легко ASP.NET всегда придет на помощь. На Linux? – тоже не вопрос, .NET Core уже здесь. Мобильное приложение? – Xamarin сделает сразу под все платформы. Хочешь написать игру? – движок Unity показывает себя очень даже неплохо, и при этом также адаптирует игру под различные платформы. Хочешь приблизить апокалипсис с восстанием машин и создаешь искусственный интеллект? – есть целая платформа с кучей инструментов для этого Microsoft AI Platform. Также и для компьютерного зрения и ботов. Я вообще с трудом могу придумать пример того, что невозможно реализовать на C#. Я где-то встречал даже операционную систему написанную на шарпе. Поэтому в этой области все хорошо.

Зарплаты .NET разработчиков

Здесь все в целом неплохо. По данным на 2018 год, C# явно не является самым высокооплачиваемым языком, но и не самый низкооплачиваемый тоже. Среднее значение зарплаты для данного языка в России около 90к рублей. Это весьма неплохой результат, но бесспорно есть и более дорогие языки. В целом, уровень заработной платы намного больше зависит от прямоты рук и уровня знаний, поэтому не так важно на каком языке писать, главное делать это хорошо. Но данная цифра задает примерный уровень для Middle разработчика в среднем по России. От этого уже можно отталкиваться.

Итоги

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

В целом это перспективный язык, достаточно простой для освоения начинающим. Но следует помнить, что существует множество альтернатив, которые лучше подходят под некоторые задачи. Например, могу порекомендовать языки C++, Java, Python.

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

Основная идея C# — это универсальность. Ты можешь реализовать все на одном языке и для любой платформы, но с большой долей вероятности это будет работать медленнее, чем разработанное специально под конкретную платформу.

Он неплохо подходит как для начинающих в качестве первого языка, так и для реализации крупных коммерческих проектов.

Читайте продолжение данного цикла в следующей статье Создание первого Hello World приложения на C#. А также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.
С вами был Вадим. Пока!

Непостижимая эффективность языка C

Не так давно издательство O’Reilly выпустило книгу «21st Century C: C Tips from the New School», которая собрала на Amazon.com довольно противоречивые отзывы. Поэтому я решил написать исключительно оптимистичный материал о «древнем языке» C и предлагаю обсудить его настоящее (а если желаете — прошлое и будущее).
Слово Дамьену Катцу, автору CouchDB. В настоящее время он является главным техническим директором (CTO) в Couchbase.

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

Язык C универсален. Это единственный язык, который может одновременно похвастаться и высокой продуктивностью и исключительной скоростью, превосходным инструментарием для любых областей, огромным сообществом разработчиков, высокопрофессиональной культурой. Да, не без компромиссов — но этот язык их не стыдится.

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

Простота и выразительность

С — поразительно высокоуровневый язык. Да, я не оговорился, и повторю еще раз: C — фантастически высокоуровневый язык. Конечно, не такой высокоуровневый, как Java или C#, и далеко не такой, как Erlang, Python или JavaScript. Но он не менее высокоуровневый, чем C++, зато гораздо, гораздо проще. Разумеется, C++ предлагает больше абстракций, но эти абстракции недалеко ушли от C. Работая с C++, вы все равно должны в совершенстве знать C, а также еще кое-какую смешную дребедень.

Если кто-то вам скажет: «Мне нужен язык программирования, на котором мне всего лишь достаточно сказать, чего я хочу — и все будет готово», дайте ему карамельку».
Алан Дж. Перлис

Сложно вспомнить какие-нибудь низкоуровневые языки, которые могли бы заменить C на практике. Это объясняется тем, что C так чертовски успешно абстрагирует свойства той машины, на которой работает, и делает это на таком высоком уровне, что остальные низкоуровневые языки просто не нужны, если есть C. Язык C действительно хорош в том, для чего предназначается.

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

Язык C задал планку для по-настоящему хорошего низкоуровневого языка и избавился от всего, что этой планке не соответствует. Таким образом, С полностью перевернул представление о том, что такое «качественный низкоуровневый язык». Черт возьми, это впечатляет!

Более простой код, более простые типы

C — статически типизированный язык со слабым контролем типов, его система типов довольно проста. В отличие от C++ или Java, здесь нет классов, в которых требуется определять всевозможные новые варианты поведения типов, действующие во время исполнения. Вы работаете практически только со структурами и объединениями, и все вызывающие элементы должны предельно точно описывать, как они используют типы.

«Даром» вызывающая сторона не получает почти никакой информации.

«Вы хотели банан, но оказались наедине с гориллой, которая держит этот банан. А вокруг вас — джунгли».
Джо Армстронг

Иногда кажущаяся слабость оказывается преимуществом. Именно такова ситуация с API языка C: их «поверхностная область» кажется очень маленькой и простой. Вместо массивных фреймворков здесь делается ставка на хорошо прослеживаемые тенденции и культуру создания компактных библиотек, которые представляют собой легковесные абстракции простых типов.
Сравните это с объектно-ориентированными языками, где в базах кода зачастую развиваются огромные взаимозависимые интерфейсы из сложных типов, где аргументы и возвращаемые типы оказываются сложнее. Такая сложность становится фрактальной: каждый тип является классом, определенным в контексте методов с аргументами и возвращаемыми типами, которые, в свою очередь, также могут быть сложными возвращаемыми типами.

Читать еще:  Что определяет директива define ассемблера mpasm

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

Самый быстрый

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

«Если вы пытаетесь перехитрить компилятор, то практически сводите на нет его пользу».
Керниган и Плоджер, The Elements of Programming Style

Всякий раз, когда вам рассказывают о том, что на высокоуровневом языке, например, Java или Haskell, удалось достичь производительности «почти как на C» — изучите детали. В лучшем случае это окажется плоской шуткой. Таким «обгонятелям» приходится вытворять неуклюжие обратные сальто, пользоваться специальными знаниями об «умных» компиляторах и внутренних механизмах виртуальной машины, чтобы достичь сравнимой скорости. Обычно такие эксперименты приводят к тому, что простая и выразительная природа языка тонет в мудреных оптимизациях, специфичных для конкретных версий. Выигрыш в скорости обычно получается минимальным.

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

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

Ускоренные циклы сборки-запуска-отладки

Эффективность и продуктивность труда разработчика исключительно сильно зависят от цикла «сборка-запуск-отладка». Чем быстрее этот цикл, тем более интерактивна сама разработка и тем дольше вы остаетесь в движении, тратя время именно на решение задачи. C обладает наивысшей интерактивностью разработки среди всех широко распространенных статически типизированных языков.

«Оптимизм — это профессиональная болезнь всего программирования. Обратная связь — это лекарство от этой болезни».
Кент Бек

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

Вездесущие отладчики и удобные аварийные дампы

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

«Ошибка, отсутствует клавиатура — для продолжения нажмите F1».

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

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

Вызывается отовсюду

В языке C есть стандартизированный бинарный интерфейс приложений (ABI), поддерживаемый всеми существующими операционными системами, языками и платформами. Он не требует ни среды времени исполнения, ни каких-либо иных неизбежных издержек. Таким образом, код, написанный вами на C, полезен не только для вызывающих элементов из C, но и для любой мыслимой библиотеки, языка или среды, какие только существуют в природе.

«Ключ к портируемости — немногочисленные концепции и полное описание».
Дж. Пальме

Код на C можно использовать в автономных исполняемых файлах, скриптовых языках, коде ядра, коде прошивок, в качестве DLL и даже вызывать из SQL. Это лингва франка системного программирования и подключаемых библиотек. Если вы хотите написать какой-то код только однажды и обеспечить его используемость в большинстве сред и ситуаций, то C — единственный разумный выбор.

Да, у него есть и недостатки

В C много «недостатков». В нем нет контроля границ, в памяти легко что-нибудь повредить, встречаются висящие указатели и утечки памяти/ресурсов, поддержка параллелизма прикручена кое-как, нет модулей и пространств имен. Обработка ошибок может быть страшно затруднительной и пространной. Легко допустить целый класс ошибок, о которые разбивается стек вызовов, а ваш процесс захватывается зловредным вводом. Замыкания? Смешно!

«Если ничего не получается, прочтите инструкцию».
Л. Ласельо

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

Как-то раз в Couchbase нам довелось потратить более двух человеко-месяцев работы, чтобы справиться со сбоем в виртуальной машине Erlang. У нас ушла уйма времени на то, чтобы отследить одну проблему, которая коренилась в самом ядре реализации Erlang. Сначала мы вообще не понимали, что происходит и почему, думали, что ошибка в нашем подключаемом коде на C, безуспешно пытались ее найти и исправить. А оказалось, что в ядре Erlang есть баг, вызывающий условия гонки. Такая фундаментальная проблема возможна в любом языке.

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

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

Язык программирования Си в микроконтроллерах. Общие сведения, плюсы и минусы использования.

Основой любого микроконтроллерного устройства является заложенная в него программа. Она задает алгоритм функционирования устройства, последовательность действий, связывает входы и выходы в единую систему. Что собой представляет эта программа? Это просто набор команд в машинных кодах микроконтроллера, заботливо созданный компилятором. Читать программу в таком виде нереально, а писать тем более (хотя в юности автор баловался с ручным переводом программ в маш. коды для Z-80, но это скорее от избытка времени, нежели от большого ума). Поэтому пионеры компьютерной науки разработали языки программирования и их трансляторы, самым первым из которых был ассемблер. Ассемблер – язык низкоуровневый, команды по сути обозначают те же коды процессора в более удобочитаемом виде (мнемоники). Тем не менее, он имеет все возможности для описания любых алгоритмов (если у их составителей хватит на это терпения), причем выполняться они будут максимально быстро. Но есть недостатки – долгое время разработки, отладки – попробуй, разберись в тысячах строках текста и в сотнях переходах с метки на метку. В таком случае не спасает даже структуризация кода, а со сменой платформы, приходится переписывать много кода из-за жесткой привязки к машинным кодам процессора. Чтобы исправить эти проблемы, были придуманы языки программирования высокого уровня – начиная с Фортрана, Кобола и заканчивая современными Си++, Java и т.п. Одним из них является рассматриваемый в статье Си. Си был создан для написания операционной системы Unix вначале 70-х. Получился близким к ассемблеру по быстродействию (максимально близок по быстродействию из почти всех языков), но намного удобнее в применении. Он оказался настолько удачным, что получил широкое применение и под его влиянием были созданы те же Си++/Си# и Java.

Читать еще:  Ассемблерная вставка в си

История микроконтроллеров началась позже истории компьютеров, но пошла по тому же пути – после царствования ассемблера, появилась возможность использовать более сложные языки – Бейсик, Паскаль, Си и даже графические – FlowCode и Algorithm Builder. Все они несложны в освоении и позволяют быстро начать разработку, тут выбор остается за каждым. Но в защиту Си необходимо добавить: он стандартизирован – для всех устройств одинаков, работает на большом числе платформ; зная его можно освоить в будущем Си++ или Си# и писать утилиты для ПК (например для управления устройством с компьютера); в будущем поможет при переходе на более серьезные платформы – ARM или FPGA(близок к Verilog). А вот Бейсик для МК мало похож на его современный компьютерный вариант Visual Basic и в дальнейшем малопригоден, а при неструктурном применении еще и вреден (в чем убедился автор, переучиваясь с трудом с Бейсика на Си).

Программисты на Си

Рассмотрим тех людей, которые приходят к необходимости изучения Си для микроконтроллеров.

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

– электронщики (и просто радиолюбители) – люди противоположные первым, легко составляют схемы, разводят платы, но программирование для них дается нелегко. Да, ассемблер близок к аппаратной части, но писать на нем начинающим программистам не так просто, нежели на Си;

– любители – новички во всем, те, кто со школы или университета еще помнят, что такое сопротивление и емкость, изучали на информатике Бейсик или Паскаль. Им будет тяжело во всем, и скорее всего первым их языком будет Бейсик, Паскаль, либо графический. Но если такой человек устремится к совершенствованию, то тут ему уже не обойтись без более глубоких знаний что, в конце концов, приведет к необходимости изучения Си. Кстати стоит упомянуть любителей Ардуино – программы там пишутся на Си, но система встроенных библиотек такова, что быстродействие принесено в жертву скорости разработки.

2) Профессионалы: это либо программисты встраиваемых систем, либо бывшие новички, кто продвинулся в навыках. Все они используют ассемблер по максимуму, особенно в случаях, когда без него не обойтись (очень компактные программы, мало-ресурсные системы, участки программы критичные к быстродействию). Но для более сложных устройств, ускорения производства кода и отладки, увеличения функциональности наступает пора перехода на высокоуровневые языки – прежде всего Си (причем в ARM системах проще сразу начинать с него).

Почему выбирают Си? Разберем достоинства и недостатки этого языка по отношению к ассемблеру для микроконтроллеров.

1) Простота изучения. Освоить базу языка не составит никакого труда. Для этого достаточно понять реализацию основных составляющих алгоритма – условие, цикл, выбор (case-switch), логические и арифметические операции и можно приступать к работе.

2) Скорость разработки. Более высокий уровень позволяет намного проще реализовывать функциональность.

3) Лучшие возможности для составления сложных программ, которые обеспечиваются применением структурного подхода к проектированию программ. Программа разбивается на отдельные завершенные логические блоки – функции и процедуры, которые могут объединяться в библиотеки. Разработка идет «сверху в низ» от логики работы алгоритма в целом к функционированию отдельных узлов, что позволяет проводить отладку уже на ранних стадиях. Язык устроен так (и создавался для того), чтобы избежать использования оператора goto, намного облегчая чтение и отладку.

4) Большое число готовых библиотек, примеров, статей и книг.

5) Как было отмечено выше – язык стандартизирован (изучить придется один раз), перспективен для будущего развития разработчика.

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

2) Отдаленность от аппаратной части. Ассемблер требует четкого знания принципа работы микроконтроллера, времени выполнения команд, позволяет самому выбирать какие переменные оставить в регистрах, а какие разместить в ОЗУ. Си же абстрагирует от платформы. Время выполнения можно оценить, обладая только определенным опытом (просматривая в дизассемблере созданный код). А уж размещение переменных компилятор берет на себя – чаще всего в ОЗУ, используя регистры только для временных данных (если не указывать специально модификаторы register или volatile с резервируемым регистром). Получается черный ящик, который создает правильно функционирующую программу – но что в ней происходит точно, ответить будет не просто. Стоит учесть, что современные компиляторы хорошо оптимизированы и выдают хороший код. Но для серьезных разработок все равно нужно представлять, как работает МК и знать ассемблер.

3) Увеличение объема кода. Почти всегда код на Си будет занимать больше места при одинаковом алгоритме работы. Причины все те же – в компиляторе, так как генерация кода с более высокоуровневого языка вызывает дополнительные расходы на реализацию операций, недоступных в самом ассемблере.

4) Снижение производительности. Си называют «ассемблером высокого уровня», что говорит о большой скорости выполнения программ. Но некоторое падение производительности происходит. Это зависит от эффективности компилятора, происходит при генерации прошивки с оптимизацией по размеру кода, существуют накладные расходы (например, начальное обнуление регистров и ОЗУ). Несмотря на это для большинства задач применения МК разницы между Си и ассемблером в производительности не будет сильно заметно.

5) Накладываются ограничения связанные с простой АЛУ, малым числом ресурсов и низкой разрядностью. Необходимо аккуратно задавать типы переменных, все, что выше 1 байта – 2 и 4 байтные целые уже вычисляется в несколько циклов, а вещественные переменные и вовсе десятки циклов. Во многих МК нет аппаратного умножения, компилятор заменяет его циклическим сложением. В особо мелких МК стек аппаратный, число вложений подпрограмм ограничено. Также маловато ОЗУ. В таком случае выгоднее использовать ассемблер.

6) Возможно непонимание кода, написанного другими программистами. Проводя оптимизацию или просто в силу наработанных привычек, они могут применять тяжело воспринимаемые инструкции. Например: копирование строк while(*dst++ = *src++);

7) Есть вероятность появления плохо отлавливаемых ошибок: утечка памяти, обращение к элементу массива по индексу, лежащему вне его границы, неправильные операции над указателями. Это связано со слабым пониманием работы с указателями, с динамическим выделением памяти. Поэтому нужно внимательнее изучить эти темы.

Довольно много минусов набралось. Но если посмотреть внимательно, то почти все указанные недостатки устраняются с увеличением опыта работы. Зато достоинства дают хорошее преимущество, ускоряя разработку и экономя драгоценное время.

Для новичков автор рекомендует начать с изучения Си, параллельно почитывая об аппаратной части МК, системе команд контроллера. Более-менее освоив язык, можно будет взяться за ассемблер, знание которого поможет в оптимизации программ. Электронщикам следует поступить также. А вот профессиональным программистам будет легко сделать выбор самим.

Язык программирования лишь инструмент в руках программиста. Поэтому опытные программисты чаще выбирают его под задачу, а начинающие все пытаются сделать на одном языке. В этом случае Ассемблер и Си можно сравнить между собой как лобзик и набор пил (от мелкой до бензопилы). Если необходимо проделать тонкую работу, особой изящности от пилы не стоит ожидать – придется ошлифовывать углы. Но если дело в постройке дома, то лобзиком тут пилить, не перепилить (вот когда дом построил, там уж можно резные оконца придумать). Большое значение имеет еще владение инструментом (есть умельцы которые и пилой узоров понаделают). Отсюда возникают советы программистам МК: изучайте асм и Си, они хорошо дополняют друг друга; совершенствуйте свои навыки, больше практикуйтесь, читайте чужой код и анализируйте, все это только в пользу.

Ссылка на основную публикацию
Adblock
detector