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

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

Как общаться?

Если надо кому-либо объяснить как сделать что-то мы рассказываем последовательность действий. Хороший пример — рецепт какого-нибудь блюда. Допустим тебе надо научить кого-то делать бутерброд с вареньем, тогда инструкция может выглядеть так:
  1. Берешь кусочек хлеба
  2. Намазываешь на него любимое варенье
  3. Вуаля бутерброд с вареньем готов!
Но если тебе надо научить компьютер делать бутерброд с вареньем, то все будет «немного» сложнее.
Компьютер в отличии от человека не имеет накопленного опыта. «А в чем проблема?» спросишь ты. Проблема в том что компьютер не умеет открывать банки с вареньем или например, не знает что не стоит намазывать варенье ногой. В инструкции опущено очень много деталей которые и так понятны человеку, но компьютер это чистый лист и инструкция для него должна быть очень подробной.
Набор инструкций компьютеру называется программой и пишутся эти инструкции на языках программирования.

Инструкции

На самом низком уровне общение с компьютером ограничивается нулями и единицами — двоичная система или машинный код. Человеку практически невозможно читать код состоящий только из 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)
Чем ближе язык к машинному коду тем он более низкоуровневый.

Перевод на машинный язык

Когда мы общаемся мы переводим наши мысли на язык понятный тому кому необходимо донести информацию. Так же и компьютер использует переводчик — компилятор, который превращает код написанный человеком в машинный код.
Существует и другой способ писать программы — с помощью интерпретатора. Представь ты отправился в путешествие, но языка не знаешь и в общении тебе помогает переводчик — интерпретирует сказанные тобой слова на нужный язык.
Языки делятся и по способу исполнения их компьютером:
  • Компилируемые
  • Интерпретируемые
Компилируемый язык, это как подготовка тщательно продуманного выступления. Ты пишешь свой текст заранее, редактируешь его, исправляешь ошибки и только после этого выходишь на сцену, чтобы исполнить своё выступление. Твой текст компилируется в специальную форму, которую зрители могут понять и оценить.
Теперь представь, что ты даёшь выступление на импровизированной сцене. Ты не знаешь заранее, что скажешь, но ты готов к любому повороту событий. Когда ты выходишь на сцену, зрители слушают тебя и сразу же реагируют на твои слова. В этом случае твои слова аналогичны командам в интерпретируемых языках программирования. Ты даёшь команды (код), и интерпретатор (или ты сам, если ты и есть интерпретатор) сразу же их выполняет, без предварительной компиляции.
Таким образом, основное отличие между компилируемыми и интерпретируемыми языками заключается в этапе преобразования и выполнения кода. В компилируемых языках код сначала компилируется в машинный код, а затем выполняется, в то время как в интерпретируемых языках код выполняется непосредственно интерпретатором на ходу.