Программа как это работает

В прошлом посте был собран простейший процессор. Пора заняться программированием. Система команд процессора или же набор инструкций представлен в таблице.

Схема процессора и набор инструкций

Для начала решим простую задачу сложения двух чисел. Пусть нам даны два числа . Необходимо вычислить их сумму.

Блок схема. Алгоритм.

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

Блок-схема алгоритма

Система команд процессора несколько ограничивает варианты возможных действий, однако, напрашивается простое решение. Пусть два слагаемых уже лежат в памяти данных. Загрузим в аккумулятор одно из них. Далее произведем сложение содержимого аккумулятора со вторым слагаемым из памяти. Результат сложения при этом запишется в аккумулятор.

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

Туалетная бумага | Как это устроено | Discovery

Вывод результата.

Если с сохранением результата нет сложностей, то что же такое его вывод? Для упрощения материала ранее не был показан регистр светодиодного индикатора. Назовем его регистр OUT. Каждый из параллельно соединенных триггеров восьмибитного регистра соединен своим выходом с одним из светодиодов. При состоянии логического нуля в разряде регистра индикатор не горит.

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

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

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

Источник: dzen.ru

Как это работает

Как это работает

Научно-популярный проект телеканала «Санкт-Петербург». Передача, в которой журналисты исследуют природу вещей.

Выпуски

Диафильм

21 июня 10:41

Утилизация опасных отходов

19 июня 10:42

Система тестирования спортсменов

Tesla Model S | Как это устроено | Discovery

Читайте также:
Программа на планшет для создания текстовых документов

15 июня 11:06

Запись звука симфонического оркестра

14 июня 11:24

Изготовление растворимого кофе

13 июня 10:38

Фонтан

12 июня 10:43

Изготовление шоколада

12 июня 10:22

Метро Петербурга

11 июня 10:23

Фехтование

10 июня 10:24

Детектор лжи — Полиграф

9 июня 10:37

Переработка макулатуры

8 июня 10:24

Изготовление ковролина

7 июня 10:26

Источник: tvspb.ru

Как работают функции в программах? Детальный обзор

Как работают функции в программах? Детальный обзор

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

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

Возвращаемые типы

Начнем с конца, то есть с возвращаемых значений методов или функций (так в некоторых языках программирования функции называют «методами»). Функцией называется подпрограмма, которая была записана вне класса, а методом называется всё та же функция, но записанная в классе.

В большинстве языков программирования (например, в Java ) вы возвращаете значение через ключевое слово return . Но что это означает, и зачем нужно что-то возвращать? А куда вообще это что-то возвращается?

Данная концепция основана на идее о том, что вызов метода – это передача управления программой. При вызове метода (например, методом addNumbers) осуществляется переход к нужной области. Вы говорите: перейти в ту область, для которой задается addNumbers. Когда вы пишете return , то это означает возврат в то место, откуда выполнялся последний вызов метода. Когда вы пишите value , то просите добавить это значение туда, откуда выполняется вызов метода.

public class MethodCall1 < public static void main(String[] args)< int x = 5; int y = 2; int z = 4; addNumbers(x, y); int res = addNumbers(y, z); System.out.print(«The result of y + z is: » + res); >public static int addNumbers(int a, int b) < int res = a + b; return res; >>

Рис 1: Пример MethodCall1 показывает простой вызов метода

В классе MethodCall1 есть три первых переменных: x, y, z , которые заданы целыми числами. Вызываем метод addNumbers с параметрами x и y. addNumbers вычисляет результат и возвращает его значение. Когда метод доходит до оператора return, он уже знает, откуда вызывается, и возвращается туда с конечным значением. К сожалению, в коде выше не был задан тип возвращаемого значения метода, поэтому результат не сохранился.

В следующей строке опять выполняется вызов, но уже с другими параметрами – y и z. Происходит все то же самое, и при достижении ключевого слова return, вызов четко знает, что идет из строки 9 и возвращается туда же. В этот раз результату присвоена переменная res .

Читайте также:
В каком классе читают дубровского по программе

Внимание: res в данном примере совершенно независима от res , заданной в addNumbers. Это две локальные переменные, которым можно присвоить любое имя, что никак не отразится на выполнении кода.

Передача параметров по значению

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

Например, в примере 1 название параметров: a и b. Однако мы называем их x, y, и z. Как это работает? Откуда метод узнает, какое имя необходимо присвоить?

Существует простой алгоритм, которому следует большинство языков программирования:

  1. Замена параметров в месте вызова. Это значит, что если параметром является переменная, то в нее добавляется значение. И при вызове метода в строке 8 данная переменная становится addNumbers(5,2) .
  1. Копирование переменных и присваивание их локальным переменным. Происходит все в так называемом стеке вызовов. То есть вы как будто добавляете для каждого параметра в каждой строке следующее выражение:
    int a = 5;
    int b = 2;
    Возникает вопрос: откуда метод узнает, что есть что. Для этих целей используется порядок отображения. Сигнатура метода addNumbers(int a, int b) означает, что сначала передается а, потом b. Так что все, что стоит в начале, – это а, а все последующее – это b.

Передача параметров по ссылке

Эта разновидность часто используется для языков, в которых значения или объекты могут изменяться после их объявления. Наглядный пример – Java.

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

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

Каждое место в памяти обладает своим адресом – последовательностью чисел. Тут можно провести параллель с улицей, на которой стоят дома – каждый со своим номером. И в каждом из этих домов (ячеек памяти) можно сохранить экземпляр. Как только вам понадобится этот экземпляр, вы просто идете, например, в дом 27 и берете его.

Читайте также:
Как устанавливать программу из образа

При передаче параметров по ссылке вместо копирования самого объекта (см. примеры с целыми числами выше), запоминается адрес объекта. В качестве примера можно рассмотреть массив в Java. Если параметром выступает массив, то копируется не сам массив, а только его адрес. Это означает, что если вы изменяете массив в вызываемом методе, то как бы заходите в нужный дом и изменяете исходный массив.

Пример:

public class Main < public static void main(String[] args)< int[] xs = new int[]; int[] ys = new int[]; addNumbers(xs, ys); addNumbers(xs, ys); for (int i = 0; i < xs.length;i++) System.out.println(xs[i]); >public static void addNumbers(int[] as, int[] bs) < for (int i = 0; i< as.length;i++) as[i] = as[i]+bs[i]; >>

Пример 2: Вызов по ссылке в MethodCall2.java

В данном случае объявляются две переменные: xs и ys. Это два массива, каждый из которых состоит из трех целых чисел [4-5] . Затем дважды вызывается метод addNumbers — в качестве параметров передаются два массива [7–8] . В конце каждый элемент xs выводится в отдельной строке [10–12] .

В методе addNumbers оба массива представлены в виде параметров as и bs. Но здесь алгоритм передачи параметров немного другой:

  1. Значения все также заменяются, однако в этот раз передается адрес. В псевдокоде он выглядит так: addNumbers(addressof(xs), addressof(ys)) , то есть параметрами массивов становятся их адреса. Помните, что адрес параметра похож на адрес дома – это просто какое-то число, которое определяет местоположение чего-либо.
  2. Двум переменным as и bs присваивается адрес:
    int[] as = addressof(xs)
    int[] bs = addressof(ys)

То есть при записи as[i] = as[i] + bs[i]; в действительности происходит следующее:

  1. Справа: поиск того, что задано адресом as[i] и bs[i]. Их совместное добавление.
  2. Слева: повторный переход к адресу as[i] и присвоение ему значения из части справа.

Обратите внимание, что метод addNumbers является void, то есть он не возвращает значений. В нем отсутствует даже явный оператор return. Тем не менее, он не явно присутствует ( и не прописывается! ) в конце кода и позволяет возвращаться туда, откуда вызывается метод. Добавить метод в код можно после > в строке 21.

Больше интересных новостей

10 IT-профессий, которые могут не бояться ИИ и автоматизации

10 IT-профессий, которые могут не бояться ИИ и автоматизации

Пугающий поисковый механизм Интернета

Пугающий поисковый механизм Интернета

Создание 2D платформера на Python

Создание 2D платформера на Python

Вот почему опасно использовать сторонний CSS и JS на своем сайте!

Вот почему опасно использовать сторонний CSS и JS на своем сайте!

Источник: itproger.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru