Языки программирования – 3
Писать на ассемблере, команды которого легко читает компьютер, можно. Писать в оперативную память можно если знать что по какому адресу лежит. Но уж очень неудобно.
Но ведь компьютер и ассемблерные команды не читает. Он из сразу преобразует в внутренний код – цифру и обрабатывает уже его. Так почему не заставить его преобразовывать более сложные для компьютера зато более привычные для человека слова?
Я не буду описывать всевозможные Пл-и, Алголы и Фортраны больших машин. Подозреваю, что там было примерно также как и тут. Тут только про то, что было на персональных компьютерах.
Первое, что придумали тут – Бейсик (basic). Упоминаю его в основном потому, что тот DOS-овский basic не имеет никакого отношения к тому, что тут находится на вкладке VB:
https://msdn.microsoft.com
Этот DOS-овский Бейсик был ИНТЕРПРЕТАТОРом, т.е написанное в нем не менялось на удобный для компьютера текст команд а сразу анализировалось и выполнялось. Справедливости ради надо сказать что программа разбирающаяся в ассемблерных кодах и выполняющая их тоже интерпретатор, но в те времена с достаточным основанием считалось что разбор более сложного текста в момент выполнения очень медленное и потому плохое решение.
А вот здесь:
http://akostina76.ucoz.ru/blog/2016-06-18-3071
… описана работа интерпретатора Интернетовской программы. Причём этот интерпретатор давно стал нормой также как и многие другие. Принципиально увеличилось быстродействие машин потому разбор текста в момент выполнения перестал занимать хоть какое-то заметное время.
Но в начале 90-х было иначе и основным инструментом стал язык Си. Язык позволил заменить цифры и коды на легко читаемые и запоминаемые слова.
Здесь всё тот же мышачий пример:
http://www.codenet.ru/progr/other/mouse.php
… который почти весь состоит из ассемблерных вставок и единственное что делает – даёт возможность писать ShowMouseCursor() навсегда забыв и про 33-е прерывание и про то, какая его функция что делает. Что делает эта функция понятно из названия.
К языку Си прилагается КОМПИЛЯТОР, т.е то, что преобразует текст на Си во всё тот же ассемблер, который легко и быстро читается компьютером.
В нечто примерно такое это преобразовывалось:
http://asmworld.ru/uchebnyj-kurs/003-turbo-debugger/
… т.е можно было увидеть какой ассемблерный текст написал компилятор, анализируя написанное на Си.
Конструкций любого языка немного. Это обычно описание функции, условный оператор, цикл, выбор варианта.
Для наглядности на примере Visual Basic:
Описание функции, которая получает параметры – аргументы, что-то делает и возвращается к тому месту, откуда её вызвали:
Function myFunction(ByVal j As Integer) As Double
myFunction = 3.87 * j
Exit Function
End Function
Условный оператор:
If count = 0 Then
Message = “count = 0”
Else
Message = “count НЕ РАВНО 0”
End If
Если условие выполнено, то выполняется то, что написано после if/ Если не выполнено то то, что после else
Циклы бывают разные но это всегда выполнение одного и того де действия пока действует некое условия. While цикл:
While index <= 10
Index = index +1
End While
К переменной index будет прибавляться единица пока значение не станет 11. Тогда выполнение прекратиться.
Выбор варианта:
Dim number As Integer = 8
Select Case number
Case 1 To 5
Debug.WriteLine("Between 1 and 5, inclusive")
Case 6, 7, 8
Debug.WriteLine("Between 6 and 8, inclusive")
Case 9 To 10
Debug.WriteLine("Equal to 9 or 10")
Case Else
Debug.WriteLine("Not between 1 and 10, inclusive")
End Select
Текст сообщения зависит от анализируемого значения Number. Поскольку в примере Number = 8, будет написано : Between 6 and 8, inclusive
Примерно такие тексты компилятору надо перевести в ассемблерные коды и он это делает считывая написанное строку за строкой.
Надо ещё отметить, что никаких «строк» в компьютере не существует. Это такая же «оптическая иллюзия» как и буква в текстовом режиме, которая набор точек.
Информация текстовых файлов это одна длинная сплошная строка. А там, где перевод строки находится невидимый символ с кондом 13. Текстовый редактор видит этот символ и начинает писать буквы с новой строки.
Компилятору ничего читать с экрана не нужно но ему нужно точно знать, где закончилась очередная команда.
В VB (Visual basic) команды отделяются переводом строки, т.е тем самым 13-м символом, а в Си всех вариантов символом “;”.
Вот, например:
while ( speed < 60 )
{
speed = speed+10;
count++;
}
… При этом реальный текст, который будет читать компилятор выглядит так:
“while ( speed < 60 ) { speed = speed+10; count++; }”
Следующая проблема, которая возникла – количество параметров функции. Всё постепенно усложняется, требую всё больше данных для передачи информации. Вначале не хватило бита, потребовалось придумывать байт. Потом 8 стандартных регистров были тем, с помощью чего с трудом можно передать изображение одного символа на экране. Т.е один символ передать можно, но больше уже ничего нельзя, предел достигнут.
Функции языков, позволяющие передавать любое количество параметров решили эту проблему. Но потом опять всё стало хоть и возможно, но очень неудобно.
Пусть, например, нужна функция которая в графическом режиме экрана будет рисовать окно такое как в Windows/ Передать надо 1) координаты левого верхнего угла (2 шт) 2) ширину, высоту (2шт) 3) цвет фона 4) толщину рамки 5) кнопка “закрыть” (есть нет) 6) кнопка «свернуть» (есть/нет).
Уже набралось 8 штук, реально надо намного больше. А это означает, что опять чтобы что-то написать надо считать. Только на этот раз смещение не в байтах а в запятых. Пусть надо отсчитать 9 запятых и после 9-й поменять значение параметра «Истина» на «Ложь» чтобы не выводить крестик, позволяющий закрыть окно. Это опять неудобно. С этом тоже справились, но про это дальше.
|