Для кого следующее сообщение будет информативным, программа представляет собой алгоритм, написанный на языке программирования
Обновлено: 21.11.2024
Обнаружение различных типов ошибок в программировании – важная часть процесса разработки. Лучшие разработчики легко ориентируются в ошибках, которые они создают, и быстро их исправляют.
Сегодня мы поговорим о семи наиболее распространенных типах ошибок программирования и о том, как их избежать.
1. Синтаксические ошибки
Как и человеческие языки, компьютерные языки имеют правила грамматики. Но в то время как люди могут общаться с далеко не совершенной грамматикой, компьютеры не могут игнорировать ошибки, т. е. синтаксические ошибки.
Например, предположим, что правильный синтаксис для вывода чего-либо — print('hello') , и мы случайно забыли одну из скобок при написании кода. Произойдет синтаксическая ошибка, и это остановит запуск программы.
По мере того, как ваш уровень владения языком программирования повышается, вы будете реже делать синтаксические ошибки. Самый простой способ не допустить, чтобы они вызывали у вас проблемы, — узнать о них заранее. Многие текстовые редакторы или IDE имеют возможность предупреждать вас о синтаксических ошибках во время написания.
Совет: пишите быстрее с TextExpander
TextExpander позволяет легко сохранять часто используемые фрагменты кода, комментарии к документации и многое другое, а затем вставлять их в любое место с помощью простого сочетания клавиш или встроенного поиска.
2. Логические ошибки
Логические ошибки сложнее всего отследить. Все выглядит так, как будто это работает; вы только что запрограммировали компьютер на неправильные действия. Технически программа правильная, но результаты будут не такими, как вы ожидали.
Если вы не проверили требования заранее и не написали код для возврата самого старого пользователя в вашей системе, когда вам нужен самый новый, у вас возникла бы логическая ошибка.
Известный случай произошел в 1999 году, когда НАСА потеряло космический корабль из-за просчетов между английскими и американскими подразделениями. Программное обеспечение было закодировано одним способом, но должно было работать по-другому.
При написании тестов покажите их менеджеру продукта или владельцу продукта, чтобы убедиться, что логика, которую вы собираетесь написать, верна. В приведенном выше примере кто-то, кто ближе к бизнесу, заметил бы, что вы не упомянули тот факт, что требуется самый новый пользователь.
3. Ошибки компиляции
Для некоторых языков программирования требуется этап компиляции. При компиляции ваш язык высокого уровня преобразуется в язык более низкого уровня, который компьютер может лучше понять. Ошибка компиляции или времени компиляции возникает, когда компилятор не знает, как превратить ваш код в код более низкого уровня.
В нашем примере синтаксической ошибки, если бы мы компилировали print('hello' , компилятор остановился бы и сообщил нам, что не знает, как преобразовать это в язык более низкого уровня, потому что он ожидал a ) после ' .
Если в вашем программном обеспечении возникнет ошибка во время компиляции, вы не сможете его протестировать или запустить.
Так же, как и синтаксические ошибки, со временем вы научитесь их избегать, но в целом лучшее, что вы можете сделать, – это своевременно получать обратную связь, когда это происходит.
Компиляция происходит одновременно для всех файлов вашего проекта. Если вы внесли много изменений и видите много предупреждений или ошибок компилятора, это может быть очень сложно. Часто запуская компилятор, вы быстрее получите необходимую обратную связь, и вам будет легче понять, где решать проблемы.
4. Ошибки выполнения
Ошибки выполнения возникают, когда пользователь выполняет вашу программу. Код может работать правильно на вашем компьютере, но на веб-сервере может быть другая конфигурация, или с ним могут взаимодействовать таким образом, что это может вызвать ошибку во время выполнения.
Если ваша система взяла ввод из формы и попыталась сделать первую букву имени заглавной, выполнив что-то вроде params[:first_name].capitalize , это сломается, если форма будет отправлена без имени.
Ошибки во время выполнения особенно раздражают, поскольку они напрямую влияют на конечного пользователя. Многие из этих других ошибок случаются, когда вы работаете за компьютером над кодом. Эти ошибки возникают во время работы системы и могут помешать кому-либо выполнить то, что ему нужно.
Убедитесь, что у вас есть хорошие отчеты об ошибках, чтобы фиксировать любые ошибки во время выполнения и автоматически открывать новые ошибки в вашей системе тикетов. Старайтесь учиться на каждом отчете об ошибке, чтобы в будущем вы могли защититься от этого типа ошибок.
Использование фреймворков и кода, поддерживаемого сообществом, — отличный способ свести к минимуму эти типы ошибок, потому что код находится во многих разных проектах, поэтому он уже обнаружил и исправил множество проблем.
5. Арифметические ошибки
Арифметическая ошибка – это разновидность логической ошибки, но она связана с математикой. Типичным примером при выполнении уравнения деления является то, что вы не можете делить на ноль, не вызывая проблем.Очень немногие люди напишут 5 / 0, но вы можете не подумать, что размер чего-то в вашей системе иногда может быть нулевым, что может привести к ошибке такого типа.
ages.max / ages.min могли возвращать ошибку, если ages.max или ages.min были равны нулю.
Арифметические ошибки могут вызывать логические ошибки, как мы обсуждали, или даже ошибки времени выполнения в случае деления на ноль.
Наличие функциональных тестов, которые всегда включают крайние случаи, такие как ноль или отрицательные числа, — отличный способ остановить эти арифметические ошибки на своем пути.
6. Ошибки ресурсов
Компьютер, на котором установлена ваша программа, будет выделять фиксированное количество ресурсов для ее работы. Если что-то в вашем коде заставляет компьютер пытаться выделить больше ресурсов, чем у него есть, это может привести к ошибке ресурсов.
Если вы случайно написали цикл, из которого ваш код никогда не сможет выйти, у вас рано или поздно закончатся ресурсы. В этом примере цикл while будет продолжать добавлять новые элементы в массив. В конце концов у вас закончится память.
Ошибки, связанные с ресурсами, может быть трудно отследить, потому что машина, на которой вы разрабатываете, часто может быть более качественной, чем серверы, на которых выполняется ваш код. Также трудно имитировать реальное использование с вашего локального компьютера.
Хорошие отчеты об использовании ресурсов на ваших веб-серверах будут помечать код, который со временем потребляет слишком много ресурсов любого типа.
Ошибки ресурсов — это пример ошибки в программировании, которую может исправить операционная группа, а не разработчики.
Существует множество приложений и служб для нагрузочного тестирования, которые можно использовать для проверки того, что произойдет, когда несколько человек попытаются запустить ваш код одновременно. Затем вы можете настроить тестирование в соответствии с реалистичностью вашего приложения.
7. Ошибки интерфейса
Ошибки интерфейса возникают, когда существует несоответствие между тем, как вы хотели использовать свою программу, и тем, как она используется на самом деле. Большинство вещей в программном обеспечении соответствуют стандартам. Если входные данные, которые получает ваша программа, не соответствуют стандартам, вы можете получить ошибку интерфейса.
Например, ошибка интерфейса может произойти, если у вас есть API, требующий установки определенных параметров, а эти параметры не заданы.
Если ошибки интерфейса не обрабатываются должным образом, они будут выглядеть как ошибка на вашей стороне, когда это ошибка на стороне вызывающего абонента. Это может вызвать разочарование с обеих сторон.
Имея четкую документацию и отлавливая эти ошибки, чтобы передать их вызывающей стороне удобным способом, вы лучше всего скажете: "Эй, вы не предоставили нам то, что нам нужно для обработки этого запроса". Это поможет сократить расходы на поддержку и порадует ваших клиентов, потому что они знают, что им нужно исправить.
Если вы не отловите эти ошибки и не передадите их обратно вызывающей стороне, они в конечном итоге будут отображаться в отчетах как ошибки времени выполнения, и вы в конечном итоге будете чрезмерно защищаться от них.
Ошибки неизбежны
К счастью, мы уже давно не нуждаемся в правильном размещении перфокарт с первого раза. Разработка программного обеспечения сложна, требования часто размыты, а код часто меняется. Старайтесь не корить себя и знайте, что все мы совершаем ошибки.
Ошибки программирования неизбежны. Научитесь лучше замечать их на ранней стадии, но знайте, что вы никогда не будете идеальными.
Надеюсь, это руководство подготовило вас к различным типам ошибок в программировании и разъяснило некоторые наиболее распространенные сообщения об ошибках.
Если вы писали код в течение длительного времени, пожалуйста, прокомментируйте ниже некоторые ошибки, которые вы недавно допустили, чтобы успокоить людей, которые не писали код так долго!
Несмотря на то, что были приложены все усилия для соблюдения правил стиля цитирования, могут быть некоторые расхождения. Если у вас есть какие-либо вопросы, обратитесь к соответствующему руководству по стилю или другим источникам.
Наши редакторы рассмотрят то, что вы отправили, и решат, нужно ли пересматривать статью.
язык компьютерного программирования, любой из различных языков для выражения набора подробных инструкций для цифрового компьютера. Такие инструкции могут быть выполнены непосредственно, когда они находятся в числовой форме, характерной для производителя компьютера, известной как машинный язык, после простого процесса замены, когда они выражены на соответствующем языке ассемблера, или после перевода с какого-либо языка «более высокого уровня». Хотя компьютерных языков много, широко используются относительно немногие.
Машинные языки и языки ассемблера являются «низкоуровневыми», требуя от программиста явного управления всеми уникальными функциями компьютера по хранению данных и работе. Напротив, языки высокого уровня ограждают программиста от беспокойства по поводу таких соображений и предоставляют нотацию, которая легче пишется и читается программистами.
Компьютеры размещают веб-сайты, состоящие из HTML, и отправляют текстовые сообщения так же просто, как. РЖУ НЕ МОГУ. Взломайте этот тест, и пусть какая-нибудь технология подсчитает ваш результат и раскроет вам его содержание.
Типы языков
Машинные и ассемблерные языки
Машинный язык состоит из числовых кодов операций, которые конкретный компьютер может выполнять напрямую. Коды представляют собой строки из нулей и единиц или двоичные цифры («биты»), которые часто преобразуются как из шестнадцатеричной системы счисления, так и в шестнадцатеричную (с основанием 16) для просмотра и модификации человеком. Инструкции машинного языка обычно используют некоторые биты для представления операций, таких как сложение, и некоторые для представления операндов или, возможно, местоположения следующей инструкции. Машинный язык трудно читать и писать, так как он не похож на обычную математическую запись или человеческий язык, а его коды различаются от компьютера к компьютеру.
Язык ассемблера на один уровень выше машинного языка. Он использует короткие мнемонические коды для инструкций и позволяет программисту вводить имена для блоков памяти, которые содержат данные. Таким образом, вместо «0110101100101000» можно написать «добавить оплату, всего» для инструкции, которая складывает два числа.
Язык ассемблера разработан таким образом, чтобы его можно было легко перевести на машинный язык. Хотя к блокам данных можно обращаться по имени, а не по их машинному адресу, язык ассемблера не предоставляет более сложных средств организации сложной информации. Как и машинный язык, язык ассемблера требует детального знания внутренней архитектуры компьютера. Это полезно, когда такие детали важны, например, при программировании компьютера для взаимодействия с периферийными устройствами (принтерами, сканерами, устройствами хранения и т. д.).
Алгоритмические языки
Алгоритмические языки предназначены для выражения математических или символьных вычислений. Они могут выражать алгебраические операции в обозначениях, аналогичных математическим, и позволяют использовать подпрограммы, которые упаковывают часто используемые операции для повторного использования. Это были первые языки высокого уровня.
ФОРТРАН
Первым важным алгоритмическим языком был FORTRAN (formula translation), разработанный в 1957 году группой IBM под руководством Джона Бэкуса. Он был предназначен для научных вычислений с вещественными числами и их коллекциями, организованными в виде одномерных или многомерных массивов. Его управляющие структуры включали условные операторы IF, повторяющиеся циклы (так называемые циклы DO) и оператор GOTO, который допускал непоследовательное выполнение программного кода. FORTRAN упростил использование подпрограмм для общих математических операций и создал их библиотеки.
FORTRAN также был разработан для перевода на эффективный машинный язык. Он сразу стал успешным и продолжает развиваться.
АЛГОЛ
АЛГОЛ (алгоритмический, lязык) был разработан комитетом американских и европейских ученых-компьютерщиков в 1958–1960 годах для публикации алгоритмов, а также для выполнения вычислений. Подобно LISP (описанному в следующем разделе), ALGOL имел рекурсивные подпрограммы — процедуры, которые могли вызывать сами себя для решения проблемы, сводя ее к меньшей задаче того же типа. Алгол представил блочную структуру, в которой программа состоит из блоков, которые могут содержать как данные, так и инструкции и иметь ту же структуру, что и вся программа. Блочная структура стала мощным инструментом для создания больших программ из небольших компонентов.
ALGOL предоставил нотацию для описания структуры языка программирования, форму Бэкуса-Наура, которая в некоторых вариантах стала стандартным инструментом для определения синтаксиса (грамматики) языков программирования. Алгол широко использовался в Европе и в течение многих лет оставался языком, на котором публиковались компьютерные алгоритмы. Его потомками являются многие важные языки, такие как Паскаль и Ада (оба описаны ниже).
Язык программирования C был разработан в 1972 году Деннисом Ритчи и Брайаном Керниганом в корпорации AT&T для программирования компьютерных операционных систем. Его способность структурировать данные и программы посредством составления более мелких единиц сравнима с возможностями Алгола. Он использует компактную запись и предоставляет программисту возможность оперировать как с адресами данных, так и с их значениями. Эта способность важна в системном программировании, и язык C разделяет с языком ассемблера способность использовать все возможности внутренней архитектуры компьютера. C, наряду с его потомком C++, остается одним из самых распространенных языков.
Бизнес-ориентированные языки
КОБОЛ
COBOL (комоно, ббизнес-ориентированный, оязык, я) активно используется предприятиями с момента его начало в 1959 году.Комитет производителей и пользователей компьютеров и правительственных организаций США учредил CODASYL (Комитет по Data Systems and L >языки) для разработки языкового стандарта и контроля за ним, чтобы обеспечить его переносимость между различными системами.
COBOL использует нотацию, похожую на английскую, но новую при введении. Бизнес-вычисления организуют и обрабатывают большие объемы данных, и COBOL представил структуру данных записи для таких задач. Запись объединяет разнородные данные, такие как имя, идентификационный номер, возраст и адрес, в единый элемент. Это контрастирует с научными языками, в которых распространены однородные массивы чисел. Записи — это важный пример «объединения» данных в единый объект, и они есть почти во всех современных языках.
Несмотря на распространенность языков высокого уровня, язык программирования C продолжает расширять возможности мира. Есть много причин полагать, что программирование на C будет оставаться актуальным еще долгое время. Вот несколько причин, по которым C непревзойден и почти обязателен для некоторых приложений.
Дэниел создал высокопроизводительные приложения на C++ для крупных компаний, таких как Dreamworks. Он также преуспевает в C и ASM (x86).
Многие из существующих сегодня проектов C были начаты несколько десятилетий назад.
Разработка операционной системы UNIX началась в 1969 году, а ее код был переписан на C в 1972 году. Фактически язык C был создан для переноса кода ядра UNIX с ассемблера на язык более высокого уровня, который выполнял бы те же задачи с меньшими затратами. строки кода.
Разработка базы данных Oracle началась в 1977 году, а ее код был переписан с ассемблера на C в 1983 году. Она стала одной из самых популярных баз данных в мире.
В 1985 году была выпущена Windows 1.0. Хотя исходный код Windows не является общедоступным, было заявлено, что его ядро в основном написано на C, а некоторые части находятся на ассемблере. Разработка ядра Linux началась в 1991 году, и оно также написано на C. В следующем году оно было выпущено под лицензией GNU и использовалось как часть операционной системы GNU. Сама операционная система GNU была запущена с использованием языков программирования C и Lisp, поэтому многие ее компоненты написаны на C.
Но программирование на C не ограничивается проектами, начатыми несколько десятилетий назад, когда языков программирования не было так много, как сегодня. Многие проекты на C все еще начаты сегодня; для этого есть несколько веских причин.
Как мир работает на C?
Несмотря на распространенность языков высокого уровня, C продолжает расширять возможности мира. Ниже перечислены некоторые из систем, которые используются миллионами и запрограммированы на языке C.
Майкрософт Windows
Ядро Microsoft Windows разработано в основном на языке C, а некоторые части — на ассемблере. На протяжении десятилетий самая используемая операционная система в мире, на долю которой приходится около 90 % рынка, работает на ядре, написанном на C.
Линукс
Linux также написан в основном на C с некоторыми частями на ассемблере. Около 97 процентов из 500 самых мощных суперкомпьютеров мира работают под управлением ядра Linux. Он также используется во многих персональных компьютерах.
Компьютеры Mac также работают на C, поскольку ядро OS X написано в основном на C. Каждая программа и драйвер на Mac, как и на компьютерах с Windows и Linux, работают на ядре C.
Мобильный
Ядра iOS, Android и Windows Phone также написаны на C. Они представляют собой просто мобильные адаптации существующих ядер Mac OS, Linux и Windows. Итак, смартфоны, которыми вы пользуетесь каждый день, работают на ядре C.
Базы данных
Самые популярные в мире базы данных, в том числе Oracle Database, MySQL, MS SQL Server и PostgreSQL, написаны на C (первые три из них на самом деле и на C, и на C++).
Базы данных используются во всех типах систем: финансовых, правительственных, медиа, развлекательных, телекоммуникационных, медицинских, образовательных, розничных, социальных, веб- и т. д.
3D-фильмы
3D-фильмы создаются с помощью приложений, которые обычно написаны на C и C++. Эти приложения должны быть очень эффективными и быстрыми, поскольку они обрабатывают огромные объемы данных и выполняют множество вычислений в секунду. Чем эффективнее они работают, тем меньше времени требуется художникам и аниматорам для создания кадров фильма, и тем больше денег экономит компания.
Встроенные системы
Представьте, что однажды вы просыпаетесь и идете за покупками. Будильник, который будит вас, вероятно, запрограммирован на C. Затем вы используете микроволновую печь или кофеварку, чтобы приготовить себе завтрак. Они также являются встроенными системами и поэтому, вероятно, запрограммированы на C. Вы включаете телевизор или радио во время завтрака. Это также встроенные системы, работающие на C. Когда вы открываете дверь гаража с помощью пульта дистанционного управления, вы также используете встроенную систему, которая, скорее всего, запрограммирована на C.
Затем вы садитесь в машину. Если он имеет следующие функции, также запрограммированные на C:
- автоматическая коробка передач
- системы контроля давления в шинах
- датчики (кислорода, температуры, уровня масла и т. д.)
- память настроек сидений и зеркал.
- панель управления
- антиблокировочная система тормозов
- автоматический контроль устойчивости
- круиз-контроль
- климат-контроль
- замки с защитой от детей
- вход без ключа
- подогрев сидений
- управление подушкой безопасности
Вы добираетесь до магазина, паркуете машину и идете к автомату за газировкой. Какой язык они использовали для программирования этого торгового автомата? Вероятно, С. Тогда вы покупаете что-то в магазине. Кассовый аппарат тоже запрограммирован на C. А когда вы платите кредитной картой? Как вы уже догадались: устройство чтения кредитных карт опять же, скорее всего, запрограммировано на C.
Все эти устройства являются встроенными системами. Они похожи на небольшие компьютеры, внутри которых есть микроконтроллер/микропроцессор, который запускает программу, также называемую прошивкой, на встроенных устройствах. Эта программа должна обнаруживать нажатия клавиш и действовать соответствующим образом, а также отображать информацию для пользователя. Например, будильник должен взаимодействовать с пользователем, определяя, какую кнопку нажимает пользователь, а иногда и как долго она нажата, и соответствующим образом программировать устройство, одновременно отображая пользователю соответствующую информацию. Антиблокировочная тормозная система автомобиля, например, должна обнаруживать внезапную блокировку шин и на короткое время сбрасывать давление на тормоза, разблокируя их и тем самым предотвращая неконтролируемое занос. Все эти расчеты выполняются запрограммированной встроенной системой.
Хотя язык программирования, используемый во встроенных системах, может варьироваться от производителя к бренду, чаще всего они программируются на языке C из-за таких особенностей языка, как гибкость, эффективность, производительность и близость к аппаратному обеспечению.
Почему до сих пор используется язык программирования C?
Сегодня существует множество языков программирования, которые позволяют разработчикам работать более продуктивно, чем C, для различных типов проектов. Существуют языки более высокого уровня, которые предоставляют гораздо большие встроенные библиотеки, которые упрощают работу с JSON, XML, пользовательским интерфейсом, веб-страницами, клиентскими запросами, подключениями к базе данных, манипулированием мультимедиа и т. д.
Но, несмотря на это, есть много причин полагать, что программирование на C будет оставаться актуальным еще долгое время.
В языках программирования один размер не подходит всем. Вот несколько причин, по которым C непревзойден и почти обязателен для некоторых приложений.
Портативность и эффективность
C — это почти переносимый язык ассемблера. Он максимально приближен к машине и почти повсеместно доступен для существующих процессорных архитектур. Почти для каждой существующей архитектуры существует по крайней мере один компилятор C. И в настоящее время из-за высокооптимизированных двоичных файлов, генерируемых современными компиляторами, не так просто улучшить их вывод с помощью написанного вручную ассемблера.
Его переносимость и эффективность настолько высоки, что «компиляторы, библиотеки и интерпретаторы других языков программирования часто реализуются на C». Интерпретируемые языки, такие как Python, Ruby и PHP, имеют свои основные реализации, написанные на C. Он даже используется компиляторами других языков для связи с машиной. Например, C является промежуточным языком, лежащим в основе Eiffel и Forth. Это означает, что вместо того, чтобы генерировать машинный код для каждой поддерживаемой архитектуры, компиляторы для этих языков просто генерируют промежуточный код C, а компилятор C обрабатывает генерацию машинного кода.
C – отличный язык для выражения общих идей программирования удобным для большинства людей способом. Кроме того, многие принципы, используемые в C, например, argc и argv для параметров командной строки, а также конструкции циклов и типы переменных, появятся во многих других языках, которые вы изучаете, так что вы сможете говорить людям, даже если они не знают C так, как это свойственно вам обоим.
Манипулирование памятью
Доступ к произвольным адресам памяти и арифметические операции с указателями — важная функция, благодаря которой C идеально подходит для системного программирования (операционные системы и встроенные системы).
На границе аппаратного и программного обеспечения компьютерные системы и микроконтроллеры сопоставляют свои периферийные устройства и контакты ввода-вывода с адресами памяти. Системные приложения должны читать и записывать в эти пользовательские ячейки памяти для связи с миром. Таким образом, способность C манипулировать произвольными адресами памяти необходима для системного программирования.
Микроконтроллер можно спроектировать, например, так, чтобы байт в памяти с адресом 0x40008000 был отправлен универсальным асинхронным приемником/передатчиком (или UART, общим аппаратным компонентом для связи с периферийными устройствами). каждый раз, когда бит номер 4 адреса 0x40008001 устанавливается в 1, и что после того, как вы установите этот бит, он будет автоматически сбрасываться периферийным устройством.
Это будет код для функции C, которая отправляет байт через этот UART:
Первая строка функции будет расширена до:
Эта строка указывает компилятору интерпретировать значение 0x40008000 как указатель на char , затем разыменовать (дать значение, на которое указывает) этот указатель (с крайним левым оператором *) и, наконец, присвоить байтовое значение этому разыменованному указателю. . Другими словами: запишите значение переменной byte по адресу памяти 0x40008000 .
Следующая строка будет расширена до:
В этой строке мы выполняем побитовую операцию ИЛИ над значением по адресу 0x40008001 и значением 0x08 (00001000 в двоичном формате, т. е. 1 в бите номер 4) и сохраняем результат обратно по адресу 0x40008001. Другими словами: мы устанавливаем бит 4 байта, который находится по адресу 0x40008001. Мы также объявляем, что значение по адресу 0x40008001 является изменчивым. Это сообщает компилятору, что это значение может быть изменено процессами, внешними по отношению к нашему коду, поэтому компилятор не будет делать никаких предположений о значении в этом адресе после записи в него. (В данном случае этот бит сбрасывается аппаратно UART сразу после того, как мы устанавливаем его программно.) Эта информация важна для оптимизатора компилятора. Если бы мы сделали это внутри цикла for, например, не указав, что значение является изменчивым, компилятор мог бы предположить, что это значение никогда не изменяется после установки, и пропустить выполнение команды после первого цикла.
Детерминированное использование ресурсов
Общая языковая функция, на которую системное программирование не может полагаться, — это сборка мусора или даже просто динамическое выделение для некоторых встроенных систем. Встроенные приложения очень ограничены по времени и ресурсам памяти. Они часто используются для систем реального времени, где недетерминированный вызов сборщика мусора невозможен. И если динамическое выделение нельзя использовать из-за нехватки памяти, очень важно иметь другие механизмы управления памятью, такие как размещение данных по настраиваемым адресам, как это позволяют указатели C. Языки, сильно зависящие от динамического выделения памяти и сборки мусора, не подходят для систем с ограниченными ресурсами.
Размер кода
C имеет очень маленькое время выполнения. И объем памяти для его кода меньше, чем для большинства других языков.
Например, по сравнению с C++ двоичный файл, сгенерированный на C, который отправляется на встроенное устройство, примерно вдвое меньше двоичного файла, сгенерированного аналогичным кодом на C++. Одной из основных причин этого является поддержка исключений.
Исключения — это отличный инструмент, добавленный C++ поверх C, и, если их не запускать и правильно реализовывать, они практически не требуют дополнительных затрат времени на выполнение (но за счет увеличения размера кода).
Давайте рассмотрим пример на C++:
Методы классов A , B и C определены где-то еще (например, в других файлах). Поэтому компилятор не может их анализировать и не может знать, вызовут ли они исключения. Поэтому он должен быть готов к обработке исключений, вызванных любым из их конструкторов, деструкторов или вызовов других методов. Деструкторы не должны генерировать исключение (очень плохая практика), но пользователь все равно может генерировать исключение, или они могут вызывать генерацию косвенно, вызывая какую-либо функцию или метод (явно или неявно), которые генерируют исключение.
Если какой-либо из вызовов в myFunction вызывает исключение, механизм раскрутки стека должен иметь возможность вызывать все деструкторы для уже созданных объектов. Одна реализация механизма раскручивания стека будет использовать адрес возврата последнего вызова этой функции для проверки «номера контрольной точки» вызова, вызвавшего исключение (это простое объяснение). Он делает это, используя вспомогательную автоматически сгенерированную функцию (своего рода справочную таблицу), которая будет использоваться для раскручивания стека в случае возникновения исключения из тела этой функции, которое будет похоже на это:
Если исключение выдается из контрольных точек 1 и 9, уничтожение объектов не требуется. Для контрольной точки 3 b и a должны быть уничтожены. Для контрольной точки 6, c и a должны быть уничтожены. Во всех случаях порядок уничтожения должен соблюдаться. Для контрольных точек 2, 4, 5, 7 и 8 необходимо уничтожить только объект a.
Эта вспомогательная функция увеличивает размер кода. Это часть служебного пространства, которое C++ добавляет к C. Многие встраиваемые приложения не могут позволить себе такое дополнительное пространство. Поэтому компиляторы C++ для встраиваемых систем часто имеют флаг для отключения исключений. Отключение исключений в C++ не является бесплатным, поскольку стандартная библиотека шаблонов в значительной степени зависит от исключений для информирования об ошибках.Использование этой модифицированной схемы без исключений требует дополнительного обучения разработчиков C++ для выявления возможных проблем или поиска ошибок.
И мы говорим о C++, языке, принцип которого гласит: «Вы не платите за то, чем не пользуетесь». Это увеличение размера двоичного файла усугубляется для других языков, которые добавляют дополнительные накладные расходы с другими функциями, которые очень полезны, но не могут быть предоставлены встроенными системами. Хотя C не дает вам возможности использовать эти дополнительные функции, он обеспечивает гораздо более компактный размер кода, чем другие языки.
Причины изучения C
C — несложный язык для изучения, поэтому все преимущества его изучения обойдутся довольно дешево. Давайте рассмотрим некоторые из этих преимуществ.
Лингва франка
Как уже упоминалось, C — это язык межнационального общения для разработчиков. Многие реализации новых алгоритмов в книгах или в Интернете впервые (или только) доступны на языке C их авторами. Это дает максимально возможную переносимость реализации. Я видел, как программисты пытались в Интернете переписать алгоритм C на другие языки программирования, потому что они не знали самых основных концепций C.
Имейте в виду, что C — это старый и широко распространенный язык, поэтому в Интернете можно найти всевозможные алгоритмы, написанные на C. Поэтому вам, скорее всего, будет полезно знать этот язык.
Понимание машины (думай на C)
Когда мы обсуждаем поведение определенных частей кода или определенных функций других языков с коллегами, мы заканчиваем тем, что «говорим на C»: эта часть передает «указатель» на объект или копирует весь объект? Мог ли здесь происходить какой-то «каст»? И так далее.
Мы редко обсуждаем (или думаем) об инструкциях ассемблера, которые выполняет часть кода, анализируя поведение части кода языка высокого уровня. Вместо этого, обсуждая, что делает машина, мы довольно ясно говорим (или думаем) на C.
Более того, если вы не можете остановиться и подумать таким образом о том, что вы делаете, вы можете в конечном итоге программировать с каким-то суеверием относительно того, как (волшебным образом) все делается.
Работа над многими интересными проектами на C
Многие интересные проекты, от больших серверов баз данных или ядер операционных систем до небольших встроенных приложений, которые вы даже можете делать дома для собственного удовольствия и развлечения, выполняются на C. Нет причин прекращать делать то, что вам может нравиться. единственная причина, по которой вы не знаете такой старый и маленький, но сильный и проверенный временем язык программирования, как C.
Заключение
Похоже, у языка программирования C нет срока годности. Его близость к оборудованию, отличная переносимость и детерминированное использование ресурсов делают его идеальным для низкоуровневой разработки таких вещей, как ядра операционных систем и встроенное программное обеспечение. Его универсальность, эффективность и хорошая производительность делают его отличным выбором для программ обработки данных высокой сложности, таких как базы данных или 3D-анимация. Тот факт, что сегодня многие языки программирования лучше, чем C, для предполагаемого использования, не означает, что они превосходят C во всех областях. C по-прежнему непревзойден, когда производительность является приоритетом.
Мир работает на устройствах с процессором C. Мы используем эти устройства каждый день, осознаем мы это или нет. C — это прошлое, настоящее и, насколько мы можем судить, будущее для многих областей программного обеспечения.
Поощрение учащихся к изучению и использованию официальных терминов в области компьютерных наук позволит им правильно и эффективно общаться с другими и укрепить свои знания таким образом, чтобы их можно было развивать в дальнейшем без повторного изучения терминов и понятий в более позднее время. Термины и понятия, используемые на уроках без подключения к электросети, определяются с помощью слов, понятных учащимся.
Рекомендуется вводить термины простым для понимания языком, связывать термины с предыдущим опытом, многократно использовать термины вне самого урока на протяжении всего курса (и в других ситуациях), когда это уместно, а также закреплять учащиеся. использовать в устной и письменной коммуникации.
Следующие термины вводятся в уроке без подключения к сети либо как словарное слово, либо как термин, связанный с онлайн-интерфейсом программирования Blockly. Термины впоследствии усиливаются в следующих онлайн-головоломках и действиях. Большинство терминов повторяются несколько раз на курсах и уроках, предоставляя учащимся много возможностей углубить свое понимание и ассимилировать слова в разговорах как в классе, так и за его пределами.
абстракция
Упрощенное представление чего-то более сложного.
доступность
Разработка продуктов, устройств, услуг или сред с учетом возможности доступа для всех пользователей, включая людей с ограниченными возможностями или тех, кто ограничен устаревшими или более медленными технологиями.
алгоритм
Список шагов для завершения задачи.
двоичный
Способ представления информации с использованием только двух параметров.
двоичный алфавит
Две опции, используемые в вашем двоичном коде.
Сокращение от «Двоичная цифра». Бит — это единица информации в компьютере, обычно представленная как 0 или 1.
блочный язык программирования
Любой язык программирования, который позволяет пользователям создавать программы, манипулируя «блоками» или графическими элементами программирования, а не написав код с использованием текста. Примеры включают Code Studio, Scratch, Blockly и Swift. (Иногда это называется визуальным кодированием, программированием с помощью перетаскивания или блоками графического программирования)
Блочный
Ошибка в программе, из-за которой программа не работает должным образом.
Наиболее распространенная основная единица цифровых данных, например. Килобайт, мегабайт и т. д. Один байт равен 8 битам данных.
позвонить (переменная)
Использовать переменную в программе.
вызвать (функцию)
Это фрагмент кода, который вы добавляете в программу, чтобы указать, что программа должна запускать код внутри функции в определенное время.
нажмите
Нажмите кнопку мыши.
Язык, который программисты создают и используют, чтобы сообщить компьютеру, что делать.
команда
Инструкция для компьютера. Многие команды вместе составляют алгоритмы и компьютерные программы.
вычислительное мышление
Изменение проблемы таким образом, чтобы ее можно было смоделировать или решить с помощью компьютера или машины. Стратегии включают в себя: декомпозицию, сопоставление с образцом, абстракцию, алгоритмы.
информатика
Использование мощности компьютеров для решения проблем.
условия
Утверждения, которые запускаются только при определенных условиях.
краудсорсинг
Помощь большой группы людей, чтобы закончить что-то быстрее.
киберзапугивание
Что-то делать в Интернете, как правило, снова и снова, чтобы вызвать у другого человека гнев, грусть или страх.
Информация. Часто количества, символы или символы, которые являются входными и выходными данными компьютерных программ.
отладка
Поиск и устранение проблем в алгоритме или программе.
разложить
Разбейте проблему на более мелкие части.
определить (функцию)
Выясните детали проблем, которые вы пытаетесь решить.
цифровой гражданин
Тот, кто ведет себя в Интернете безопасно, ответственно и уважительно.
цифровой след
Информация о ком-либо в Интернете.
DNS (служба доменных имен)
Служба, преобразующая URL-адреса в IP-адреса.
двойной щелчок
Нажмите кнопку мыши два раза очень быстро.
Нажмите и удерживайте кнопку мыши при перемещении указателя мыши в новое место.
Отпустите кнопку мыши, чтобы "отпустить" перетаскиваемый элемент.
DSL/кабель
Метод передачи информации по телефонным или телевизионным кабелям.
событие
Действие, в результате которого что-то происходит.
обработчик событий
Мониторинг определенного события или действия на компьютере. Когда вы пишете код для обработчика событий, он будет выполняться каждый раз, когда происходит это событие или действие. Многие обработчики событий реагируют на действия человека, такие как щелчки мышью.
Первая попытка обучения
оптоволоконный кабель
Соединение, использующее свет для передачи информации.
для цикла
Цикл с заданным началом, концом и приращением (интервалом шага).
разочарован
Чувство раздражения или гнева из-за того, что что-то идет не так, как вам хочется.
функция
Кусок кода, который можно легко вызывать снова и снова.
вызов функции
Часть кода, которую вы добавляете в программу, чтобы указать, что программа должна запускать код внутри функции в определенное время.
определение функции
Код внутри функции, который указывает программе, что делать при вызове функции.
условие if
Общая структура программирования, которая реализует "условные операторы".
ввод
Способ передачи информации на компьютер.
Интернет
Группа компьютеров и серверов, соединенных друг с другом.
IP-адрес
Номер, присвоенный любому элементу, подключенному к Интернету.
итерация
Повторяющееся действие или команда, обычно создаваемая с помощью циклов программирования.
Делать что-то снова и снова.
онлайн
Подключен к Интернету.
вывод
Способ получения информации с компьютера.
пакеты
Небольшие фрагменты информации, тщательно сформированные из более крупных фрагментов информации.
сопоставление с образцом
Нахождение сходства между вещами.
Параметр
Дополнительная информация, передаваемая функции для ее настройки в соответствии с конкретными потребностями.
постоянство
Пытаться снова и снова, даже если что-то очень сложно.
пиксель
Сокращение от "элемент изображения", основная единица цифрового изображения, обычно крошечный квадрат или точка, содержащая одну точку цвета большего изображения.
программа
Алгоритм, закодированный во что-то, что может быть запущено машиной.
программирование
Искусство создания программы.
повторить
Чтобы сделать что-то снова.
запустить программу
Заставить компьютер выполнять команды, которые вы написали в своей программе.
поисковая система
Программа, которая ищет и идентифицирует элементы в базе данных, которые соответствуют ключевым словам или символам, указанным пользователем, особенно используемая для поиска определенных сайтов во всемирной паутине.
серверы
Компьютеры, которые существуют только для того, чтобы предоставлять что-то другим.
инструментарий
заслуживает доверия
На него можно положиться как на честного или правдивого.
Попытаться что-то сделать
URL (универсальный указатель ресурса)
имя пользователя
Имя, которое вы придумываете, чтобы видеть что-то на веб-сайте или что-то делать на нем, иногда называемое псевдонимом.
Читайте также: