Путешествие по слоям абстракции

Компьютер

имя существительное

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

Откуда берутся языки?

Как возникает такой язык, как Ruby или Javascript? С чего это начинается? Как он выполняет то, что мы хотим от него? Языки высокого уровня, с которыми мы привыкли работать, на самом деле далеки от внутренней работы компьютера, на котором вы пишете код. Начиная от очень (обманчиво) базового машинного кода до множества языков высокого уровня на выбор, есть несколько больших шагов и уровней абстракции, которые ведут нас от языков низшего уровня к языку высокого уровня, подобному Ruby.

Машинный код и двоичный код

Нижний уровень наших уровней абстракции - это машинный код. Машинный код обычно путают с двоичным, но это не одно и то же. Технически двоичный файл - это абстракция логического значения «различных магнитных состояний на жестком диске». Это представление машинного кода, но не самого машинного кода. Первые программисты использовали перфокарты или магнитную ленту для визуализации этого кода. На самом деле машинный код - это просто набор инструкций, которые могут выполняться центральным процессором (ЦП) компьютера. Машины понимают только логику включения-выключения или истинно-ложную логику этой двоичной системы. Используя комбинацию этой логической логики и системы счисления с основанием 2, комбинация нулей и единиц может представлять любое число, а оттуда и многое другое. Для программистов эти 0 и 1 - самый низкий уровень программирования, о котором нам нужно беспокоиться. В машинном коде каждая инструкция выполняет очень конкретную задачу. Понятно, что весь этот двоичный код очень трудно читать. Например, простая фраза «привет, мир» в двоичном формате выглядит так:

01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100

и могли быть введены с помощью коммутатора или чего-то вроде этого:

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

Каков следующий уровень абстракции?

Языки ассемблера

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

Языки ассемблера очень похожи на машинный код и имеют с ними отношения 1: 1. Разница в том, что в языках ассемблера для представления машинного кода используется комбинация английских символов и чисел. Они считаются низкоуровневыми языками программирования, которые очень мало абстрагируются от машинного кода. Таким образом, языки ассемблера имеют те же команды и приложения, что и машинный код, но позволяют программисту использовать слова в дополнение к числам, и в результате они более удобочитаемы. Каждый машинный код и связанный с ним язык уникальны для конкретного процессора. Следовательно, языки ассемблера не являются взаимозаменяемыми для разных процессоров.

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

Один из способов, которым языки ассемблера легче читать и писать, чем чистый машинный код, - это возможность по-разному представлять биты и байты машинного кода. Например, общей чертой языков ассемблера является представление двоичного кода в шестнадцатеричной системе (или с основанием 16), в отличие от двоичной (с основанием 2). Чтобы понять, почему это немного облегчает чтение, давайте сравним две системы.

Повторное использование нашего предыдущего примера hello world

01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100

отображается в шестнадцатеричном виде как:

48656C6C6F20576F726C64

Можно себе представить, насколько большими программами можно было бы управлять в этой системе. Фактически, языки ассемблера все еще используются сегодня, когда программист хочет получить прямой доступ к компьютерному оборудованию. А из-за однозначной связи с машинным кодом его рендеринг выполняется намного быстрее. Однако эта система по-прежнему не дает среднему читателю много информации о том, что происходит. Написание на ассемблере по-прежнему очень трудоемко. Итак, что же нам делать дальше?

Введите языки высокого уровня.

Языки высокого уровня

Начиная с 1950-х годов начали развиваться языки высокого уровня. Эти новые типы языков были даже дальше удалены из машинного кода с очень высокой степенью абстракции, но были более удобочитаемыми. Одним из первых из этих языков высокого уровня был ФОРТРАН. FORTRAN (от слова «перевод формулы») получил широкое распространение и до сих пор используется для интенсивных числовых и научных расчетов. Первоначальный выпуск FORTRAN содержал 32 различных оператора, некоторые из которых, как операторы if, были бы узнаваемы сегодня любым программистом. Первоначально FORTRAN все еще вводился в компьютер с помощью перфокарты, в которой разные столбцы представляли разные утверждения. Наше простое приложение Hello World теперь выглядит более привлекательно. Этот конкретный пример взят из FORTRAN 66, четвертой версии FORTRAN.

C     FORTRAN IV WAS ONE OF THE FIRST PROGRAMMING
C     LANGUAGES TO SUPPORT SOURCE COMMENTS
      WRITE (6,7)
    7 FORMAT(13H HELLO, WORLD)
      STOP
      END

Между 1969 и 1973 годами был разработан язык C. Он был разработан для операционной системы Unix и остается популярным по сей день. C оказал большое влияние на развитие современных языков. Давайте посмотрим на Hello World на C.

#include <stdio.h>
int main()
{
   // printf() displays the string inside quotation
   printf("Hello, World!");
   return 0;
}

Итак, где же тут рубин?

Ruby как язык был разработан в середине 1990-х Юкихиро Мацумото (или Мац) и разрабатывался для программистов. Матц хотел создать язык, на котором программистам было бы интересно писать. Но на чем написан Ruby?

Ruby написан на C. Фактически, многие современные языки написаны на C. Будучи написанными на C, оба языка имеют общие черты, хотя различия между ними все еще велики. Ruby считается языком программирования общего назначения, что означает, что он может писать программное обеспечение для множества различных приложений. Наконец, давайте посмотрим, как выглядит наш Hello World, отрисованный в Ruby.

puts "Hello World"

И так…

Источники