Как работают компьютерные программы

Обновлено: 06.07.2024

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

ЦП понимает низкоуровневый язык "машинного кода" (также известный как "собственный код"). Язык машинного кода встроен в конструкцию аппаратного обеспечения ЦП; это не то, что можно изменить по желанию. Каждое семейство совместимых ЦП (например, очень популярное семейство Intel x86) имеет свой собственный уникальный машинный код, несовместимый с машинным кодом других семейств ЦП. Что означает, что ЦП «запускает» машинный код? Машинный код определяет набор отдельных инструкций. Каждая инструкция машинного кода чрезвычайно примитивна, например, сложение двух чисел или проверка числа меньше нуля. При сохранении каждая инструкция занимает всего несколько байтов. Программа, которая делает что-то полезное, например, отображает изображение или читает электронную почту, представляет собой просто большую последовательность этих очень простых инструкций машинного кода.

Что такое программа

Программа, такая как Firefox, в основном представляет собой файл, содержащий байты инструкций машинного кода программы — файл «.exe» в Windows или файл «app» в Mac OS X. Каждый машинный код инструкция занимает около 4 байтов, и вся последовательность инструкций, по сути, представляет собой просто большой блок байтов. Это первое определение слова "программа", и ниже у нас будет альтернативное определение.

Что такое "Работает"

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

ЦП выполняет инструкции, используя цикл выборки-выполнения: ЦП получает первую инструкцию в последовательности, выполняет ее (добавляя два числа или что-то еще), затем выбирает следующую инструкцию и выполняет ее и так далее. Некоторые инструкции влияют на порядок, в котором ЦП выполняет последовательность инструкций. Например, инструкция может указать ЦП вернуться к более ранней точке в потоке инструкций (таким образом реализуются циклы) или пропустить следующую инструкцию. если определенное условие истинно (условия if реализованы таким образом).

Операционная система

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

Вспомните, что файл .exe или что-то еще — это, по сути, просто файл с инструкциями собственного кода. Когда вы дважды щелкаете программу, операционная система «запускает» программу, выполняя служебные шаги по выделению области памяти в ОЗУ для программы, загружая первый раздел собственного кода программы в эту память и, наконец, указание ЦП начать выполнение этого собственного кода.

Цифровой фотоаппарат — это тоже маленький компьютер. Когда он загружается, он не запускает программу файлового менеджера. Вместо этого, после того как основные настройки настроены, камера может просто запустить одну программу, которая рисует меню и т. д. на экране камеры и реагирует на нажатия кнопок камеры и т. д.

Откуда берутся программы?

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

1. Старая школа: скомпилированные родные языки

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

В качестве примера того, как работают скомпилированные нативные языки, в языке C++ есть понятие "строка", линейный набор символов (код JavaScript также имеет это понятие строк). Машинный код более низкого уровня не работает на таком сложном уровне, как сложная строка. Машинный код работает на уровне простого сложения или сравнения отдельных чисел и все. На языке C++ программист может написать строку вроде ..

Этот код добавляет строку "!" до конца «привет», в результате чего получается строка «привет!» хранится в переменной b. В родном коде ЦП нет такой сложной инструкции, как «дополнение строки». Однако операцию добавления строки можно выполнить с помощью длинной последовательности примитивных собственных инструкций.

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

2. Новая школа: динамические языки

Существует широкая категория более современных языков, таких как Java (самый популярный в мире язык, используемый в CS106A), Javascript и Python, в которых не используется компилируемая структура. Вместо того, чтобы работать в формате компиляции в исходный код, эти языки могут быть реализованы с помощью «интерпретатора».

Интерпретатор – это программа, которая считывает код в качестве входных данных и "запускает" введенный код. Интерпретатор проходит через предоставленный ему код, строка за строкой. Для каждой строки интерпретатор деконструирует то, что говорит строка, и выполняет эти действия по частям. Например, Javascript, который мы использовали, реализуется интерпретатором Javascript, встроенным в Firefox.

Так что в Javascript, когда у нас есть такие строки кода:

Интерпретатор запускает этот код, беря строки по одной и для каждой интерпретируя свои действия. Для "а = 1;" интерпретатор резервирует несколько байтов для хранения значения a, а затем сохраняет значение 1 в этих байтах. Тогда для "b = a + 2;" интерпретатор оценивает (a + 2), получая значение 3, резервирует несколько байтов для переменной b, затем сохраняет 3 в байтах b. Компилятор переводит код в машинный код. Интерпретатор просматривает каждую строку кода и выполняет ее в данный момент.

Компилятор и интерпретатор

Компиляция в нативную стратегию делает все заранее. Например, просмотр всего кода C++ и создание блока машинного кода в формате .exe, который полностью реализует то, что указано в коде C++. Во время выполнения у нас есть только .exe; нам не нужен исходный код C++. Невозможно отменить процесс компиляции, начиная с .exe и восстанавливая исходный код C++. Обратное можно сделать только очень ограниченным способом, не создавая полного полезного кода C++ (все комментарии отсутствуют, как первый пример).

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

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

Код JavaScript, который "запускается" интерпретатором, – это еще одна форма программы, которая может выполняться на компьютере. За кулисами интерпретатор сам по себе является программой, например, написанной на C++. Таким образом, мы строим один слой поверх другого. Это работает!

Сильные и слабые стороны динамического языка

У динамических языков есть две основные особенности. (a) они работают намного медленнее, скажем, в 10 раз, как очень грубое практическое правило, чем скомпилированный собственный код. (b) языки, реализованные интерпретаторами, могут иметь значительные удобные для программиста функции, которые невозможны в скомпилированном собственном коде. Лучшим примером является автоматическое управление памятью, которое есть в динамических языках, но в C и C++ программисту приходится решать эту проблему вручную. (Кроме того, многие сбои в программах на C и C++ происходят из-за ошибок в схеме управления памятью программиста. Эту проблему трудно решить вручную.) Поскольку динамические языки, такие как Java и Python, имеют больше возможностей, программист часто может написать код для быстрее решить проблему на динамическом языке, чем на C++.Времени и внимания программистов, как правило, довольно мало (перевод: программистов мало и они дороги, вот почему вы хотите быть майором CS или, по крайней мере, минором!). Следовательно, динамические языки, которые позволяют программисту создавать правильную программу быстрее и надежнее, весьма привлекательны, даже если полученная программа использует больше ЦП и больше ОЗУ. Кроме того, закон Мура в действии делает программиста относительно более дорогим по сравнению с процессором.

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

Точный JIT-компилятор

Самая современная форма динамического языка реализуется с помощью интерпретатора в сочетании с компилятором Just In Time (JIT), пытающимся получить лучшее из обоих миров. JIT просматривает разделы динамического кода, которые запускаются очень часто, и для них выполняет компиляцию в собственный код для этого раздела на лету. Таким образом, интерпретатор используется для простых случаев, но для важных разделов динамического кода (например, внутри цикла) JIT создает блок собственного кода для этого раздела. Собственный код запускается для этого раздела динамического кода, обеспечивая производительность, аналогичную C++, и отбрасывается при выходе из программы. Java и Javascript широко используют технологию JIT. Значительное ускорение браузеров за последние несколько лет во многом связано с внедрением технологии JIT для Javascript. JIT стирает большую часть, но не все штрафы «10x». Даже с JIT динамические языки по-прежнему требуют более высоких накладных расходов по сравнению с C и C++.

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

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

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

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

Таблица 1. Ввод и вывод для различных программ

Тип программы

Ввод

Что делает программа

Вывод

Символы, которые вы вводите с клавиатуры

Форматирует текст; исправляет орфографию

Отображает и печатает аккуратно организованный текст

Нажатия клавиш или движения джойстика

Рассчитывает, насколько быстро и далеко можно переместить мультяшную фигурку на экране

Перемещает мультяшную фигурку на экране

Текущие и прошлые цены на акции

Пытается распознать тенденции колебаний цен на акции

Предсказывает будущую цену акции

Программа наведения ракет

Текущее местоположение ракеты и цели

Рассчитывает, как сделать так, чтобы местоположение ракеты и местоположение цели совпадали

Корректирует траекторию так, чтобы она оставалась нацеленной на цель

Оптическое распознавание символов (OCR)

Текст со сканера

Распознает формы символов

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

Коды языка гипертекстовой разметки (HTML) на других компьютерах

Преобразует HTML-коды в текст и графику

Отображает веб-страницы на экране

Программирование — это решение проблем

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

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

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

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

Программирование не сложно; это просто занимает много времени

Программирование на самом деле не такое уж сложное или таинственное дело. Если вы можете написать пошаговые инструкции, направляющие кого-то к вам домой, вы можете написать программу.

Самое сложное в программировании — выявить все мелкие проблемы, составляющие большую проблему, которую вы пытаетесь решить. Поскольку компьютеры совершенно тупые, вам нужно объяснить им, как все делать.

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

<р>1. Двигайтесь на юг по шоссе I-5.

<р>2. Выходите на съезде со Свитуотер-роуд.

<р>3. На светофоре поверните направо.

<р>4. Поверните налево на вторую дорогу.

Конечно, если вы попытаетесь дать эти инструкции компьютеру, компьютер запутается и захочет узнать следующую дополнительную информацию:

<р>1. С чего начать и как далеко на юг мне ехать по шоссе I-5?

<р>2. Как узнать съезд на Суитуотер-роуд и как выйти на этом съезде?

<р>3. После того, как я поверну направо на светофоре, как далеко я поверну направо, и вы имеете в виду светофор или уличный фонарь на углу?

<р>4. После того, как я поверну налево на вторую дорогу, что мне делать дальше? Припарковать машину? Сигналить рог? Включите двигатель и разгонитесь через дверь гаража?

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

Запутались в кодировании? Не разбираетесь в сценариях? Вот что вам нужно знать о строительных блоках программирования.

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

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

Что такое код?

Компьютеры имеют собственный язык, называемый машинным кодом, который говорит им, что делать. Как видите, для людей это не имеет особого смысла!

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

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

Что такое язык программирования?

Теперь это выглядит немного понятнее! На этом рисунке показано, как сказать компьютеру «Привет, мир». Языки программирования обеспечивают интерфейс между кодировщиками или программистами и машинным языком. Поэтому вместо машинного кода на изображении выше используется язык программирования под названием Python.

Почти все языки программирования работают одинаково:

  1. Вы пишете код, чтобы сообщить ему, что делать: print("Hello, world").
  2. Код компилируется, что превращает его в машинный код, понятный компьютеру.
  3. Компьютер выполняет код и отправляет нам сообщение Hello, world.

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

Что такое программирование?

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

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

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

Что такое программа?

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

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

Сложно ли программировать?

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

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

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

Как выглядит код

На изображении выше показан скрипт hello_name. Вы уже видели, что одна строка кода может заставить компьютер печатать на экране. Допустим, вы хотите, чтобы пользователь не просто говорил «привет, мир», а вводил свое имя, а компьютер приветствовал его по имени? Давайте разберем, что здесь происходит.

  1. При запуске скрипта компьютер выводит вопрос на экран.
  2. Затем компьютер ждет, пока пользователь введет свое имя, и сохраняет его.
  3. На экране будет напечатано "Привет" вместе с сохраненным именем.
  4. В окне Cmder скрипт компилируется и выполняется с помощью Python.
  5. Перед завершением скрипт выполнялся именно так, как и было задумано.

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

Как код становится программой

Если вы новичок в программировании, вы все еще можете задаться вопросом, как скрипты, подобные приведенному выше, становятся программами, к которым вы привыкли. На изображении выше окно слева — это инструмент для превращения скриптов Python в программы. Окно справа имеет значок с именем hello_name.exe. Я думаю, вы можете догадаться, что произойдет, если вы нажмете на нее!

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

Программировать — это круто

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

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

Понимать более низкие и более высокие уровни инструкций по программированию. Понимание компиляторов, компиляции, компоновки и развертывания.

На аппаратном уровне компьютеры понимают один язык, называемый машинным языком (также называемый объектным кодом). Это набор инструкций, поддерживаемых аппаратным обеспечением процессора компьютера, и он специфичен для каждого типа процессора. Этот язык объектного кода является числовым по своей природе и выражается в двоичном коде, который представляет собой числовое кодирование, состоящее только из 1 и 0 (основание 2). Программировать в двоичном формате очень утомительно, поэтому были созданы языки более высокого уровня, чтобы упростить создание программ. В языке более высокого уровня вы используете синтаксис, похожий на английский и более простой для понимания, чтобы выразить то, что вы хотите, чтобы компьютер делал.Задачей языка более высокого уровня является перевод этих письменных инструкций в двоичный объектный код для выполнения компьютером. На самом деле, когда программный файл создается на языке более высокого уровня, он будет содержать только двоичные инструкции для компьютера, а не ваш исходный код.

Обычно программист пишет инструкции на выбранном языке более высокого уровня, в нашем случае на Java, и эти инструкции или исходный код хранятся в текстовом виде в файле. Затем этот исходный файл передается программе, называемой компилятором, которая переводит исходный язык в объектный код в двоичной форме и записывает его в другой файл, называемый программой. Примером может служить файл .exe в Windows. Может быть дополнительный шаг, называемый связыванием, который представляет собой процесс объединения инструкций программиста с библиотеками инструкций, созданными кем-то другим. Иногда файл программы может быть отправлен на другой компьютер для выполнения. Это называется развертыванием.

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

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

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