В каком из арифметических выражений допускается представление в удобном для компьютерной обработки виде

Обновлено: 04.07.2024

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

Традиционно несколько процессоров предоставлялись в рамках специально разработанного «параллельного компьютера»; в соответствии с этим Linux теперь поддерживает системы SMP (часто продаваемые как «серверы»), в которых несколько процессоров совместно используют одну память и интерфейс шины на одном компьютере. Также возможно, что группа компьютеров (например, группа компьютеров, каждый из которых работает под управлением Linux) может быть соединена сетью для формирования кластера с параллельной обработкой. Третьим вариантом параллельных вычислений с использованием Linux является использование расширений мультимедийных инструкций (например, MMX) для параллельной работы с векторами целочисленных данных. Наконец, также можно использовать систему Linux в качестве «хоста» для специализированного подключенного вычислительного механизма параллельной обработки. Все эти подходы подробно обсуждаются в этом документе.

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

<УЛ>
  • В вашем приложении достаточно параллелизма, чтобы эффективно использовать несколько процессоров. Отчасти это вопрос определения частей программы, которые могут выполняться независимо и одновременно на разных процессорах, но вы также обнаружите, что некоторые вещи, которые могут выполняться параллельно, могут на самом деле замедлять выполнение, если выполняются параллельно с использованием конкретной системы. Например, программа, выполнение которой на одной машине занимает четыре секунды, может выполняться всего за одну секунду процессорного времени на каждой из четырех машин, но никакого ускорения не будет достигнуто, если этим машинам потребуется три секунды или более. координировать свои действия.
  • Либо конкретная прикладная программа, которая вас интересует, уже была распараллелена (переписана, чтобы использовать преимущества параллельной обработки), либо вы готовы написать как минимум новый код, чтобы воспользоваться преимуществами параллельной обработки.
  • Вы заинтересованы в изучении или хотя бы знакомстве с проблемами, связанными с параллельной обработкой. Параллельная обработка с использованием систем Linux не обязательно сложна, но она не знакома большинству пользователей компьютеров, и не существует книги под названием «Параллельная обработка для чайников». по крайней мере пока нет. Этот HOWTO — хорошая отправная точка, это не все, что вам нужно знать.
  • Хорошей новостью является то, что если все вышеперечисленное верно, вы обнаружите, что параллельная обработка с использованием Linux может обеспечить производительность суперкомпьютера для некоторых программ, которые выполняют сложные вычисления или работают с большими наборами данных. Более того, он может сделать это, используя дешевое оборудование. которым вы, возможно, уже владеете. В качестве дополнительного бонуса можно также легко использовать параллельную систему Linux для других целей, когда она не занята выполнением параллельного задания.

    Если параллельная обработка — это не то, что вам нужно, но вы хотели бы добиться хотя бы небольшого повышения производительности, вы все равно можете кое-что сделать. Например, вы можете повысить производительность последовательных программ, перейдя на более быстрый процессор, добавив памяти, заменив диск IDE на быстрый широкий SCSI и т. д. Если это все, что вас интересует, перейдите к разделу 6.2; в противном случае читайте дальше.

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

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

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

    SPMD (Single Program, Multiple Data) — это ограниченная версия MIMD, в которой все процессоры выполняют одну и ту же программу. В отличие от SIMD, каждый процессор, выполняющий код SPMD, может использовать разные пути потока управления через программу.

    Пропускная способность системы связи – это максимальный объем данных, который может быть передан в единицу времени. после начала передачи данных. Пропускная способность для последовательных соединений часто измеряется в бодах или битах в секунду (б/с), что обычно соответствует от 1/10 до 1/8 числа байтов в секунду (Б/с). Например, модем со скоростью 1200 бод передает около 120 бит/с, тогда как сетевое соединение ATM со скоростью 155 Мбит/с почти в 130 000 раз быстрее, передавая около 17 МБ/с. Высокая пропускная способность позволяет эффективно передавать большие блоки данных между процессорами.

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

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

    Общая память — это модель взаимодействия между процессорами в параллельной системе. Такие системы, как многопроцессорные машины Pentium под управлением Linux, физически совместно используют одну память среди своих процессоров, так что значение, записанное в общую память одним процессором, может быть напрямую доступно любому процессору. В качестве альтернативы логически разделяемая память может быть реализована для систем, в которых каждый процессор имеет свою собственную память, путем преобразования каждой нелокальной ссылки на память в соответствующее межпроцессорное взаимодействие. Любая реализация разделяемой памяти обычно считается более простой в использовании, чем передача сообщений. Физически разделяемая память может иметь как высокую пропускную способность, так и низкую задержку, но только тогда, когда несколько процессоров не пытаются одновременно получить доступ к шине; таким образом, макет данных по-прежнему может серьезно влиять на производительность, а эффекты кэширования и т. д. могут затруднить определение оптимального макета.

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

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

    SMP (Symmetric Multi-Processor) относится к концепции операционной системы о группе процессоров, работающих вместе как одноранговые, так что любая часть работы может одинаково хорошо выполняться любым процессором. Как правило, SMP подразумевает комбинацию MIMD и разделяемой памяти.В мире IA32 SMP обычно означает совместимость с MPS (спецификация Intel MultiProcessor); в будущем это может означать «Слот 2».

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

    IA32 (архитектура Intel, 32-разрядная версия) на самом деле не имеет ничего общего с параллельной обработкой, а скорее относится к классу процессоров, чьи наборы инструкций в целом совместимы с Intel 386. По сути, любой процессор Intel x86 после 286 совместим с 32-битной плоской моделью памяти, характерной для IA32. AMD и Cyrix также производят множество процессоров, совместимых с IA32. Поскольку Linux развивался в первую очередь на процессорах IA32, и именно на этом рынке сосредоточен товарный рынок, удобно использовать IA32, чтобы отличить любой из этих процессоров от PowerPC, Alpha, PA-RISC, MIPS, SPARC и т. д. Предстоящий IA64 (64 -bit с EPIC, Explicitly Parallel Instruction Computing), безусловно, усложнит ситуацию, но производство Merced, первого процессора IA64, запланировано на 1999 год.

    После закрытия многих компаний, производящих параллельные суперкомпьютеры, COTS (Commercial Off-The-Shelf) обычно обсуждается как требование для параллельных вычислительных систем. Будучи фанатично чистыми, единственными методами параллельной обработки COTS с использованием ПК являются такие вещи, как серверы SMP Windows NT и различные приложения MMX Windows; действительно не стоит быть таким фанатичным. Основополагающая концепция COTS на самом деле заключается в минимизации времени и стоимости разработки. Таким образом, более полезное и более распространенное значение COTS состоит в том, что, по крайней мере, большинство подсистем извлекают выгоду из товарного маркетинга, но другие технологии используются там, где они эффективны. Чаще всего параллельная обработка COTS относится к кластеру, в котором узлы являются обычными ПК, но сетевой интерфейс и программное обеспечение несколько настраиваются. как правило, работающие под Linux и коды приложений, которые находятся в свободном доступе (например, авторское лево или общественное достояние), но не в буквальном смысле COTS.

    Чтобы лучше понять использование различных подходов к параллельному программированию, описанных в этом HOWTO, полезно иметь пример задачи. Хотя подойдет практически любой простой параллельный алгоритм, выбрав алгоритм, который использовался для демонстрации различных других систем параллельного программирования, становится немного легче сравнивать подходы. В книге М. Дж. Куинна «Теория и практика параллельных вычислений», второе издание, МакГроу Хилл, Нью-Йорк, 1994 г., используется параллельный алгоритм, вычисляющий значение Pi, для демонстрации различных сред параллельного программирования суперкомпьютеров (например, передача сообщений nCUBE, совместное использование Sequent). Память). В этом HOWTO мы используем тот же базовый алгоритм.

    Алгоритм вычисляет приблизительное значение числа Пи путем суммирования площади под x в квадрате. Как чисто последовательная программа C, алгоритм выглядит следующим образом:

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

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

    Оставшаяся часть этого документа разделена на пять частей. Разделы 2, 3, 4 и 5 соответствуют трем различным типам аппаратных конфигураций, поддерживающих параллельную обработку с использованием Linux:

    <УЛ>
  • В разделе 2 обсуждаются системы SMP Linux. Они напрямую поддерживают выполнение MIMD с использованием общей памяти, хотя передача сообщений также легко реализуется. Хотя Linux поддерживает конфигурации SMP до 16 процессоров, большинство систем SMP PC имеют два или четыре одинаковых процессора.
  • В разделе 3 обсуждаются кластеры сетевых машин, каждая из которых работает под управлением Linux. Кластер можно использовать как систему параллельной обработки, которая напрямую поддерживает выполнение MIMD и передачу сообщений, возможно, также предоставляя логически разделяемую память. В зависимости от используемого сетевого метода также могут поддерживаться симуляция выполнения SIMD и передача агрегатных функций.Количество процессоров в кластере может варьироваться от двух до тысяч, что в основном ограничивается физическими ограничениями сети. В некоторых случаях в кластере могут быть смешаны различные типы машин; например, сеть, объединяющая системы DEC Alpha и Pentium Linux, будет гетерогенным кластером.
  • Раздел 4 обсуждает SWAR, SIMD в регистре. Это очень ограничительный тип модели параллельного выполнения, но, с другой стороны, это встроенная возможность обычных процессоров. Недавнее расширение набора инструкций MMX (и других) для современных процессоров сделало этот подход еще более эффективным.
  • В разделе 5 обсуждается использование ПК с Linux в качестве хостов для простых параллельных вычислительных систем. Либо в качестве платы расширения, либо в качестве внешнего блока подключенные процессоры могут обеспечить системе Linux огромную вычислительную мощность для определенных типов приложений. Например, доступны недорогие карты ISA, которые обеспечивают несколько процессоров DSP, предлагающих сотни MFLOPS для задач, связанных с вычислениями. Однако эти дополнительные платы — это всего лишь процессоры; они, как правило, не работают под управлением ОС, имеют дисковый или консольный ввод-вывод и т. д. Чтобы сделать такие системы полезными, «хост» Linux должен обеспечивать эти функции.
  • Последний раздел этого документа охватывает аспекты, представляющие общий интерес для параллельной обработки с использованием Linux, а не специфичные для конкретного из перечисленных выше подходов.

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

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

    Наши редакторы рассмотрят то, что вы отправили, и решат, нужно ли пересматривать статью.

    Разностная машина

    цифровой компьютер, любое из класса устройств, способных решать задачи путем обработки информации в дискретной форме. Он работает с данными, включая величины, буквы и символы, которые выражены в двоичном коде, т. е. с использованием только двух цифр 0 и 1. Считая, сравнивая и манипулируя этими цифрами или их комбинациями в соответствии с набором инструкций, хранимых в своей памяти цифровая вычислительная машина может выполнять такие задачи, как управление производственными процессами и регулирование работы машин; анализировать и систематизировать огромные объемы бизнес-данных; и моделировать поведение динамических систем (например, глобальные погодные условия и химические реакции) в научных исследованиях.

    Далее следует краткое описание цифровых компьютеров. Полное описание см. в см. информатике: основные компьютерные компоненты.

    Техник работает с системной консолью на новом компьютере UNIVAC 1100/83 в Центре анализа флота, Corona Annex, Naval Weapons Station, Seal Beach, CA. 1 июня 1981 г. Приводы или считыватели магнитных лент Univac на заднем плане. Универсальный автоматический компьютер

    Как Интернет перемещает информацию между компьютерами? Какая операционная система сделана Microsoft? Войдите в этот тест и проверьте свои знания о компьютерах и операционных системах.

    Функциональные элементы

    Типичная цифровая компьютерная система имеет четыре основных функциональных элемента: (1) оборудование ввода-вывода, (2) основную память, (3) блок управления и (4) арифметико-логическое устройство. Любое из ряда устройств используется для ввода данных и программных инструкций в компьютер и для получения доступа к результатам операции обработки. Общие устройства ввода включают клавиатуры и оптические сканеры; устройства вывода включают принтеры и мониторы. Информация, полученная компьютером от своего блока ввода, сохраняется в основной памяти или, если не для непосредственного использования, во вспомогательном запоминающем устройстве. Блок управления выбирает и вызывает инструкции из памяти в соответствующей последовательности и передает соответствующие команды соответствующему блоку. Он также синхронизирует различные рабочие скорости устройств ввода и вывода со скоростью арифметико-логического устройства (ALU), чтобы обеспечить правильное перемещение данных по всей компьютерной системе. ALU выполняет арифметические и логические алгоритмы, выбранные для обработки входящих данных, с чрезвычайно высокой скоростью — во многих случаях за наносекунды (миллиардные доли секунды).Основная память, блок управления и АЛУ вместе составляют центральный процессор (ЦП) большинства цифровых компьютерных систем, а устройства ввода-вывода и вспомогательные запоминающие устройства составляют периферийное оборудование.

    Разработка цифрового компьютера

    Блез Паскаль из Франции и Готфрид Вильгельм Лейбниц из Германии изобрели механические цифровые вычислительные машины в 17 веке. Однако обычно считается, что английский изобретатель Чарльз Бэббидж создал первый автоматический цифровой компьютер. В 1830-х годах Бэббидж разработал свою так называемую аналитическую машину, механическое устройство, предназначенное для объединения основных арифметических операций с решениями, основанными на собственных вычислениях. Планы Бэббиджа воплотили в себе большинство фундаментальных элементов современного цифрового компьютера. Например, они призывали к последовательному управлению, т. е. программному управлению, которое включало ветвление, циклирование, а также арифметические и запоминающие устройства с автоматической распечаткой. Однако устройство Бэббиджа так и не было завершено и было забыто до тех пор, пока его труды не были заново открыты более века спустя.

    Огромное значение в эволюции цифрового компьютера имели работы английского математика и логика Джорджа Буля. В различных эссе, написанных в середине 1800-х годов, Буль обсуждал аналогию между символами алгебры и символами логики, используемыми для представления логических форм и силлогизмов. Его формализм, работающий только с 0 и 1, стал основой того, что сейчас называется булевой алгеброй, на которой основаны теория и процедуры компьютерного переключения.

    Джону В. Атанасову, американскому математику и физику, приписывают создание первого электронного цифрового компьютера, который он построил с 1939 по 1942 год с помощью своего аспиранта Клиффорда Э. Берри. Конрад Цузе, немецкий инженер, фактически изолированный от других разработок, в 1941 году завершил строительство первой действующей вычислительной машины с программным управлением (Z3). В 1944 году Ховард Эйкен и группа инженеров корпорации International Business Machines (IBM) завершили работу над Harvard Mark I – машиной, операции обработки данных которой контролировались главным образом электрическими реле (коммутационными устройствами).

    Клиффорд Э. Берри и компьютер Атанасова-Берри

    Клиффорд Э. Берри и компьютер Атанасова-Берри, или ABC, c. 1942 г. ABC, возможно, был первым электронным цифровым компьютером.

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

    В 1946 году Дж. Преспер Эккерт и Джон У. Мочли из Пенсильванского университета сконструировали ENIAC (аббревиатура от eэлектронный nмерический i интегратор ии cкомпьютер), цифровая машина и первый электронный компьютер общего назначения. Его вычислительные возможности были заимствованы у машины Атанасова; оба компьютера включали электронные лампы вместо реле в качестве активных логических элементов, что привело к значительному увеличению скорости работы. Концепция компьютера с хранимой программой была представлена ​​в середине 1940-х годов, а идея хранения кодов инструкций, а также данных в электрически изменяемой памяти была реализована в EDVAC (electronic, d создать vпеременный аавтоматический cкомпьютер).

    Manchester Mark I

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

    первый транзистор

    Транзистор был изобретен в 1947 году в Bell Laboratories Джоном Бардином, Уолтером Х. Браттейном и Уильямом Б. Шокли.

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

    интегральная схема

    Развитие крупномасштабной интеграции (БИС) позволило производителям оборудования разместить тысячи транзисторов и других связанных компонентов на одном кремниевом чипе размером с ноготь ребенка. Такая микросхема дала два устройства, которые произвели революцию в компьютерной технике. Первым из них был микропроцессор, представляющий собой интегральную схему, содержащую все арифметические, логические и управляющие схемы центрального процессора. Его производство привело к разработке микрокомпьютеров, систем размером не больше портативных телевизоров, но со значительной вычислительной мощностью. Другим важным устройством, появившимся из схем БИС, была полупроводниковая память. Это компактное запоминающее устройство, состоящее всего из нескольких микросхем, хорошо подходит для использования в миникомпьютерах и микрокомпьютерах. Кроме того, он находит применение во все большем числе мейнфреймов, особенно в тех, которые предназначены для высокоскоростных приложений, из-за его высокой скорости доступа и большой емкости памяти. Такая компактная электроника привела в конце 1970-х годов к разработке персонального компьютера, цифрового компьютера, достаточно небольшого и недорогого, чтобы его могли использовать обычные потребители.

    микропроцессор

    К началу 1980-х интегральные схемы продвинулись до очень крупномасштабной интеграции (СБИС). Этот дизайн и технология производства значительно увеличили плотность схем микропроцессора, памяти и вспомогательных микросхем, т. Е. Те, которые служат для сопряжения микропроцессоров с устройствами ввода-вывода. К 1990-м годам некоторые схемы СБИС содержали более 3 миллионов транзисторов на кремниевой микросхеме площадью менее 0,3 квадратных дюйма (2 квадратных см).

    Цифровые компьютеры 1980-х и 90-х годов, использующие технологии БИС и СБИС, часто называют системами четвертого поколения. Многие микрокомпьютеры, произведенные в 1980-х годах, были оснащены одним чипом, на котором были интегрированы схемы процессора, памяти и функций интерфейса. (См. также суперкомпьютер.)

    Использование персональных компьютеров выросло в 1980-х и 90-х годах. Распространение Всемирной паутины в 1990-х годах привело миллионы пользователей к Интернету, всемирной компьютерной сети, и к 2019 году около 4,5 миллиардов человек, более половины населения мира, имели доступ к Интернету. Компьютеры становились меньше и быстрее, и в начале 21 века они были широко распространены в смартфонах, а затем и в планшетных компьютерах.

    iPhone 4

    Редакторы Британской энциклопедии Эта статья была недавно отредактирована и обновлена ​​Эриком Грегерсеном.

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

    Арифметические операции

    Вы можете добавить два значения в выражение вместе с оператором + или вычесть одно из другого с помощью оператора - (Visual Basic), как показано в следующем примере.

    Для отрицания также используется оператор - (Visual Basic), но только с одним операндом, как показано в следующем примере.

    Для умножения и деления используются операторы * и / (Visual Basic) соответственно, как показано в следующем примере.

    В возведении в степень используется оператор ^, как показано в следующем примере.

    Целочисленное деление осуществляется с помощью оператора \ (Visual Basic). Целочисленное деление возвращает частное, то есть целое число, представляющее количество раз, когда делитель может делиться на делимое без учета остатка.Для этого оператора и делитель, и делимое должны быть целыми типами (SByte, Byte, Short, UShort, Integer, UInteger, Long и ULong). Все остальные типы должны быть сначала преобразованы в интегральный тип. В следующем примере демонстрируется целочисленное деление.

    Арифметика модуля выполняется с помощью оператора Mod. Этот оператор возвращает остаток после деления делителя на делимое целое число раз. Если и делитель, и делимое являются целыми типами, возвращаемое значение является целым. Если делитель и делимое являются типами с плавающей запятой, возвращаемое значение также является числом с плавающей запятой. Следующий пример демонстрирует это поведение.

    Попытка деления на ноль

    В делениях с плавающей запятой, использующих тип данных Double, исключение не создается, и результатом является член класса, представляющий NaN, PositiveInfinity или NegativeInfinity, в зависимости от делимого. В следующей таблице приведены различные результаты попыток деления значения Double на ноль.

    Арифметические сдвиги не являются циклическими, что означает, что биты, сдвинутые с одного конца результата, не вводятся повторно на другом конце. Битовые позиции, освобождаемые сдвигом, устанавливаются следующим образом:

    0 для арифметического сдвига влево

    0 для арифметического сдвига положительного числа вправо

    0 для арифметического сдвига вправо беззнакового типа данных ( Byte , UShort , UInteger , ULong )

    1 для арифметического сдвига вправо отрицательного числа (SByte, Short, Integer или Long)

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

    Арифметические сдвиги никогда не вызывают исключений переполнения.

    Побитовые операции

    Помимо того, что операторы Not , Or , And и Xor являются логическими, они также выполняют побитовые арифметические операции при использовании с числовыми значениями. Дополнительные сведения см. в разделе «Побитовые операции» книги «Логические и побитовые операторы в Visual Basic».

    Безопасность типов

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

    Один из способов обеспечить хорошую практику безопасного кодирования — использовать оператор Option Strict. Если для параметра Option Strict установлено значение On , Visual Basic автоматически выполняет типобезопасные преобразования. Например, если вы попытаетесь добавить переменную Integer к переменной Double и присвоить значение переменной Double, операция будет выполняться нормально, поскольку значение Integer можно преобразовать в значение Double без потери данных. С другой стороны, небезопасные преобразования типов вызывают ошибку компилятора с Option Strict On . Например, если вы попытаетесь добавить переменную Integer к переменной Double и присвоить значение переменной Integer, возникнет ошибка компилятора, поскольку переменную Double нельзя неявно преобразовать в тип Integer .

    Однако, если вы установили Option Strict Off , Visual Basic позволяет выполнять неявные сужающие преобразования, хотя они могут привести к неожиданной потере данных или точности. По этой причине мы рекомендуем использовать Option Strict On при написании производственного кода. Дополнительные сведения см. в разделе Расширение и сужение конверсий.

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

    Сегодня мы поговорим о семи наиболее распространенных типах ошибок программирования и о том, как их избежать.

    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, требующий установки определенных параметров, а эти параметры не заданы.

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

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

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

    Ошибки неизбежны

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

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

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

    Если вы писали код в течение длительного времени, пожалуйста, прокомментируйте ниже некоторые ошибки, которые вы недавно допустили, чтобы успокоить людей, которые не писали код так долго!

    Читайте также: