Языки программирования
Язык программирования по смыслу ничем не отличается от обычного языка общения: английский, русский, китайский и т. д. Назначение обычного языка — передавать информацию от одного человека другому. Программисту же необходимо передать информацию компьютеру.
Как общаться?
Если надо кому-либо объяснить как сделать что-то мы рассказываем последовательность действий. Хороший пример — рецепт какого-нибудь блюда. Допустим тебе надо научить кого-то делать бутерброд с вареньем, тогда инструкция может выглядеть так:
- Берешь кусочек хлеба
- Намазываешь на него любимое варенье
- Вуаля бутерброд с вареньем готов!
Но если тебе надо научить компьютер делать бутерброд с вареньем, то все будет «немного» сложнее.
Компьютер в отличии от человека не имеет накопленного опыта. «А в чем проблема?» спросишь ты. Проблема в том что компьютер не умеет открывать банки с вареньем или например, не знает что не стоит намазывать варенье ногой. В инструкции опущено очень много деталей которые и так понятны человеку, но компьютер это чистый лист и инструкция для него должна быть очень подробной.
Набор инструкций компьютеру называется программой и пишутся эти инструкции на языках программирования.
Инструкции
На самом низком уровне общение с компьютером ограничивается нулями и единицами — двоичная система или машинный код. Человеку практически невозможно читать код состоящий только из
0
и 1
, а писать такой код конечно можно попробовать, но тогда придется заниматься постоянным переводом в двоичный код. Например буква «A» в двоичной системе выглядит как 01000001
. С таким успехом код, даже небольшой программы, будет занимать сотни строк.Для более удобного общения с компьютером был придуман язык Assembly. Вот так выглядит код программы которая пишет «Hello world!»
section .text
global _start
_start:
mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80section .data
msg db "Hello world!", 0xa
len equ $ -msg
Местами даже можно прочитать и понять отдельные слова, но все-таки это довольно близко к машинному коду и писать большие программы будет сложно.
«Под капотом» у Assembly все те же нули и единицы. Получается как бы язык Assembly поверх бинарного языка. В программировании такое называется уровнем абстракции языка.
Существует разделение языков программирования по уровню абстракции:
- Высокоуровневые (Java, Python, Ruby, C# и т. д.)
- Среднеуровневые (С, С++, RUST)
- Низкоуровневые (Forth, CIL, Assembly)
Чем ближе язык к машинному коду тем он более низкоуровневый.
Перевод на машинный язык
Когда мы общаемся мы переводим наши мысли на язык понятный тому кому необходимо донести информацию. Так же и компьютер использует переводчик — компилятор, который превращает код написанный человеком в машинный код.
Существует и другой способ писать программы — с помощью интерпретатора. Представь ты отправился в путешествие, но языка не знаешь и в общении тебе помогает переводчик — интерпретирует сказанные тобой слова на нужный язык.
Языки делятся и по способу исполнения их компьютером:
- Компилируемые
- Интерпретируемые
Компилируемый язык, это как подготовка тщательно продуманного выступления. Ты пишешь свой текст заранее, редактируешь его, исправляешь ошибки и только после этого выходишь на сцену, чтобы исполнить своё выступление. Твой текст компилируется в специальную форму, которую зрители могут понять и оценить.
Теперь представь, что ты даёшь выступление на импровизированной сцене. Ты не знаешь заранее, что скажешь, но ты готов к любому повороту событий. Когда ты выходишь на сцену, зрители слушают тебя и сразу же реагируют на твои слова. В этом случае твои слова аналогичны командам в интерпретируемых языках программирования. Ты даёшь команды (код), и интерпретатор (или ты сам, если ты и есть интерпретатор) сразу же их выполняет, без предварительной компиляции.
Таким образом, основное отличие между компилируемыми и интерпретируемыми языками заключается в этапе преобразования и выполнения кода. В компилируемых языках код сначала компилируется в машинный код, а затем выполняется, в то время как в интерпретируемых языках код выполняется непосредственно интерпретатором на ходу.