[Внеклассовый интерфейс] Внимание! Знание принципа компьютерной композиции было передано вам в уста!

JavaScript

Среди фронтенд-разработчиков немалая доля студентов не пришла с курса, поэтому для базового класса必修课,Например:计算机组成原理,操作系统,计算机网络,数据结构和算法Мало знаний и тд.

Чем больше вы изучаете, тем больше вы понимаете важность этого знания.

Например, все знают, что в js0.1 + 0.2да不等于0.3Да, почему? Это включает в себя принцип компьютерной композиции浮点数представительство и浮点数Операции сложения и вычитания (в тексте будет просторечный вариант ответа).

Другой пример — ввод с клавиатуры.a+bКак передать эту командуcpuВывод расписания на屏幕上Шерстяная ткань? Это включает в себя冯诺依曼体系, если ты программист, то данные с клавиатуры на экран не знаешь基本流向, пришло время взглянуть на это «Ten Quan Da Supplement»

Эта статья计算机组成原理Самая основная вступительная статья, не думаю, что фронтенду нужно так глубоко вникать в эту тему и осваивать базовые计算机组成原理здравый смысл.

1. Принцип работы компьютера

Прежде всего, пять основных компонентов компьютера следующие:输入设备(как клавиатура),存储器(например, память),运算器(cpu), 控制器(cpu), 输出设备(монитор).

Это работает следующим образом

1.1 Контроллер ---> Управляющее устройство ввода --> Поток команд в память

Когда мы вводим данные, процессор в控制器позволит输入设备хранить эти инструкции в存储器(Память).

1.2 Команда анализа контроллера ---> управление памятью ---> отправка данных в вычислитель

После того, как контроллер проанализирует инструкцию, пусть存储器отправить данные на运算器внутри(控制器а также运算器здесьcpuв)

Обратите внимание,存储器обе存储数据, но также存储指令

1.3 Контроллер управляет оператором для выполнения операции с данными и возвращает результат операции в память

1.4 Контроллер управляет памятью, чтобы вернуть результат на устройство вывода

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

2. ЦП и его рабочий процесс

Две наиболее важные части процессора:运算器а также控制器, давайте посмотрим на главную роль оператора

2.1 Основные компоненты калькулятора

Как показано выше, наиболее важными компонентами калькулятора являютсяALU, называется по-китайски算术逻辑单元, используется для выполнения算术а также逻辑运算из. разноеMQ,ACCМы не заботимся об этом, это некоторые寄存器.

2.2 Основные компоненты контроллера

Наиболее важной частью контроллера являетсяCU(блок управления), пока он分析指令, давая控制信号.

IR(регистр инструкций), в котором хранится инструкция, которую необходимо выполнить в данный момент

PCАдрес сохраненной инструкции.

2.3 Пример. Процесс выполнения команды выборки

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

  • первый шаг,PC, то есть где хранится адрес инструкции.Если мы хотим знать, какая будет следующая инструкция, мы должны обратиться к памяти, чтобы получить ее.CPUПросто знай, что делать дальше.PCзапомнилсяMARВозьмите адрес инструкции для выполнения,MAR(Место в памяти, предназначенное для хранения адреса инструкции)
  • Второй и третий шаги,MARПосле перехода в память для получения инструкции поместите адрес инструкции вMDR(специальное место для хранения данных в памяти)
  • четвертый шагMDRДанные в возврате кIRв,IRЗдесь хранятся инструкции, сюда мы помещаем инструкции, которые только что взяли из банка памяти.

Затем проанализируйте инструкцию, и процесс выполнения инструкции выглядит следующим образом

  • пятый шаг,IRвведите команду вCU, для анализа инструкции, например, анализируется, что это инструкция выборки, а затем инструкция будет выполняться (инструкция выборки здесь фактически код адреса, по этому адресу для выборки данных из банка памяти)
  • шаг шестой, шаг седьмойIRзатем отправится в хранилищеMAR(где хранится адрес),MARПросто зайти в банк памяти, чтобы получить данные по адресу в инструкции выборки?
  • Восьмой шаг, полученные данные возвращаются вMDR(где хранятся данные)
  • девятый шаг,MDRДанные в нем помещаются в регистр арифметического устройства, и процесс выборки инструкции здесь завершен.

Приходите на эпизод, мы знаем, что данные в内存является二进制есть, то есть0和1, 0和1Как это выразить?

Давайте рассмотрим один из способов хранения нулей и единиц, чтобы проиллюстрировать это.

  • Если конденсатор заряжен, заряд означает 1, отсутствие заряда означает 0
  • Как показано ниже

3. Языки программирования

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

Давайте посмотрим на двоичный код0000,0000,000000010000

  • первый из которых0000, что означает, что на ассемблереLOAD, то есть загрузить, что загрузить
  • адрес загрузки000000010000данные на второй0000(место регистрации).

Далее посмотрим, если汇编语言как выразить

LOAD A, 16Это означает поместить данные 16-го блока в тело хранилища по адресу регистра A.ADD C, A, BЭто означает добавить данные A и B в регистр, чтобы получить CSTORE C, 17Это означает, что данные в регистре хранятся в 17-й ячейке банка памяти.

Наконец, давайте посмотрим, как использовать高级语言выражать

Является ли язык высокого уровня очень простым, всего одинa+b, вам не нужно думать об этом寄存器,存储体Эти вещи.

Краткое содержание этой части

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

  • Один из них заключается в непосредственном использовании编译器, который преобразует язык высокого уровня в二进制код, напримерc,такcОн очень быстро запускается, потому что после компиляции это машинный язык, и он может работать непосредственно в системе, но проблема в том, что скорость компиляции может быть относительно низкой.
  • Один объяснительный, напримерjs, который переводит код в одну строку机器语言(середина может быть переведена сначала как汇编код или字节码), объяснить строку, выполнить строку

Следует отметить, что согласно первому способу перевода большого объема высокоуровневого кода на машинный язык остается много места для编译器Для оптимизации кода интерпретируемым языкам сложно выполнить такую ​​оптимизацию, но вv8в двигателе,jsеще нужно оптимизировать, т.编译阶段(кодовые точки编译а также执行Два этапа) будут выполнять некоторую оптимизацию кода, а способ выполнения сразу после компиляции обычно называетсяJIT (Just In Time) Comipler.

4. Преобразование системы

В следующем разделе 4.3 объясняется, почему 0,1 + 0,2 равно 0,3.

4.1 Как двоичное число преобразуется в десятичное

Например2основание101.1как преобразовать в10система. (Некоторые ученики считают, что его можно использоватьparseInt('101.1', 2), это невозможно, потому чтоparseIntвернуть целое число)

Метод преобразования следующий:

Какие правила изображены на картинке выше?

二进制каждое количество乘以2Соответствующая степень , обратите внимание, что десятичная точка умножается на нее负相应次方. Возьмите другой пример, и вы поймете,

бинарный1101преобразовать в десятичную

4.2 Преобразование десятичных целых чисел в двоичные

JSможно использовать внутрьtoString(2)этот метод для преобразования. Если вы хотите использовать общий метод, например: преобразовать десятичное число(29)При преобразовании в двоичные числа алгоритм выглядит следующим образом:

  • Разделите данное десятичное число 29 на 2, в частном будет 14, остаток 1 - младший разряд двоичного числа.
  • Разделите 14 на 2, в частном будет 7, а в остатке 0.
  • Разделите 7 на 2, частное равно 3, остаток равен 1, затем разделите 3 на 2, частное равно 1, остаток равен 1.
  • Затем разделите 1 на 2, частное равно 0, а остаток равен 1, что является старшей цифрой двоичного числа.

Результат: 11101

4.3 Преобразование десятичных дробей в двоичные

Метод заключается в использовании метода «умножение на 2, округление, упорядоченное расположение». Конкретный метод:

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

Возьмем пример

Например: преобразовать десятичное число 0,25 в двоичное.

  • 0.25 * 2 = 0.5Вынесите целую часть:0

  • 0.5 * 2 = 1.0вынуть целую часть 1

то есть десятичный0.25Двоичный файл0.01(Первый раз самый высокий, а последний самый низкий)

На данный момент мы можем попробовать десятичный0.1а также0.2Как преобразовать в двоичный

0.1(十进制) = 0.0001100110011001(二进制)
十进制数0.1转二进制计算过程:
0.1*2=0.2……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。
0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.8”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.6”接着计算。
0.6*2=1.2……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
0.2*2=0.4……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.4”接着计算。
0.4*2=0.8……0——整数部分为“0”。整数部分“0”清零后为“0”,用“0.2”接着计算。
0.8*2=1.6……1——整数部分为“1”。整数部分“1”清零后为“0”,用“0.2”接着计算。
……
……
所以,得到的整数依次是:“0”,“0”,“0”,“1”,“1”,“0”,“0”,“1”,“1”,“0”,“0”,“1”……。
由此,大家肯定能看出来,整数部分出现了无限循环。

см. далее0.2

0.2化二进制是
0.2*2=0.4,整数位为0
0.4*2=0.8,整数位为0
0.8*2=1.6,整数位为1,去掉整数位得0.6
0.6*2=1.2,整数位为1,去掉整数位得0.2
0.2*2=0.4,整数位为0
0.4*2=0.8.整数位为0
就这样推下去!小数*2整,一直下去就行
这个数整不断
0.0011001

так0.1а также0.2не могут быть идеально преобразованы в двоичные файлы, поэтому они складываются, конечно, не0.3охватывать

5. Числа с фиксированной и плавающей запятой

Прежде всего, что такое число с фиксированной точкой?

5.1 Числа с фиксированной точкой

Как показано выше, пример чистого целочисленного двоичного кода1011а также-1011,если整数, используется знаковый бит0указывает, что если это负数символ использования1выражать

Точно так же пример чистого десятичного представления выглядит следующим образом:

то если нет纯小数или纯整数, как это выразить?

Например10.1, можно умножить на коэффициент масштабирования10.1 ---> 101Масштабный коэффициент10, или10.1 ---> 0.101Масштабный коэффициент100

Числа с фиксированной точкой очень просты.Далее мы вводим числа с плавающей запятой.В JS используются числа双精度的浮点数, поэтому изучение чисел с плавающей запятой помогает нам понять числа в JS.

5.2 Числа с плавающей запятой

Как представляются числа с плавающей запятой?

выше十进制научное обозначение, из которого нам нужно понять несколько понятий, одно из которых尾数,基数а также阶码

  • 尾数Должен быть чистым десятичным числом, поэтому изображение выше1.2345Не соответствует формату мантиссы и нуждается в изменении на0.12345
  • 基数, что в двоичном формате2
  • 阶码сколько полномочий

так浮点数из通用Формат представления следующий:

  • S означает мантисса
  • r означает базу
  • j представляет собой код заказа

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

Если вас интересуют эти условия, вы можете проверить их онлайн, нам нужно только знать浮点数加减运算Это много работы, но если вы собираетесь сделать библиотеку для арифметики с плавающей запятой, вам определенно придется ее освоить.

6. Принцип локальности и уловки (кэширования)

Посмотрите на картинку ниже

(Объяснять,MDRа такжеMARХотя логически принадлежит основной памяти, в电路实现когда,MDRа такжеMARПокинутьCPUотносительно недалеко)

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

const n = 1000;
const a = [1, 2, 3, 4, 5, 6, 7]
for(let i =0; i < n; i++) {
    a[i] = a[i] + 2
}

мы можем узнать, что

  • Данные массива иногда хранятся в памяти непрерывно.
  • Например, если мы хотим извлечь данные, для извлечения данных a[0] из памяти требуется 1000 нс (ns означает наносекунды), тогда для выборки a[0] в a[7] требуется 1000 * 8 = 8000 нс.
  • Если наш процессор обнаружит, что это выборка данных массива, то насколько хорошо было бы для меня хранить все ближайшие блоки данных от a[0] до a[7] в кеше, чтобы нам нужно было получить данные только один раз и потреблять 1000 нс

cahceто есть局部性原理приложение

  • 空间局部性: информация, которая будет использована в ближайшем будущем (指令а также数据), скорее всего, связано с информацией, используемой в настоящее время в存储空间находится рядом
  • 时间局部性: Информация, которая будет использована в ближайшем будущем, скорее всего, сейчас.正在使用的信息

можно увидетьcacheодноразовый приемa[0]прибытьa[9]данные в банке памяти, нужно только1000ns,потому чтоCacheда高速存储器,а такжеcpuСкорость взаимодействияcpuа также主存Взаимодействие намного быстрее.

Затем войдите в последний раздел (пропустите изучение шины), эволюцию устройств ввода-вывода.

7. Эволюция устройств ввода/вывода

Что такое ввод-вывод?

输入/输出(Input /Output ,简称I/O),指的是一切操作、程序或设备与计算机之间发生的数据传输过程。

Например, операции чтения и записи файлов являются типичнымиI/Oработать. Далее, давайте посмотрим на эволюцию устройств ввода-вывода.

В первых компьютерахcpuкак знатьI/O设备Задача выполнена? Например, как узнатьI/O设备Вы закончили чтение данных файла?CPUбудет продолжать запрашиватьI/O设备Это готово. В настоящее время,cpuнаходится в состоянии ожидания. то естьcpuпри работе,I/Oсистема не работает,I/Oсистема работает,cpuне работает.

Тогда посмотрите на второй этап

  • Для решения первого этапаCPUждатьI/O设备,串行способ работы, всеI/O设备пройти черезI/O总线приходи и следуйCPUсделка, как только определеннаяI/O设备Когда задача будет выполнена, она будет中断请求путь, черезI/O总线,РассказыватьCPU,Я готов.

  • Но для高速外设, они выполняют задачи очень быстро, поэтому часто прерываютCPU, Чтобы решить эту проблему, используется прямой путь передачи данных между высокоскоростными периферийными устройствами и основной памятью,DMA总线соединять,CPUПросто организуйте запуск высокоскоростных периферийных устройств, а остальные оставьте в покое, что предотвратит частые прерывания.CPU.

Наконец, посмотрите на третий этап

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

В конце этой статьи я надеюсь, что вам всем понравилось и вы поделитесь своим сердцем💗.