Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Синтаксический сахар — это вообще, по определению, синтаксическая конструкция, которая заменяет собой другую синтаксическую конструкцию того же самого языка программирования.
Если вы говорите о языках программирования, то всё началось с великих и ужасных Fortran и Lisp… Если вы говорите о языках машинных инструкций… То с этого ничего не началось, это было где-то посрединке.
Вы понятия не имеете, что такое машина Тьюринга, в которой просто по определению нет регистров.
Языки, в которых не использовался стек (тот же Fortran) появились гораздо раньше.
pop и push — это инструкции процессора, и это не синтаксических сахар, это изменение семантики ассемблера, который теперь умеет генерировать новый код
Бредите вы, потому что вы говорите, в тексте: «Всё началось».
Если вы говорите о языках программирования, не ассемблерах, которые не считались языками, а назывались автокодами, то их история началась с Fortran и Lisp. Ассемблеры — это нечто посрединке всего этого праздника программирования.
В котором прямо написано: вспомним машину Тьюринга, там регистры.
И пишете: mov a, FA[1]; mov b, FA[2]; mov ..., FA[X].
И при чём тут ссылка на стековые языки?
Но как теперь это соотносится с тем, что вся история ЯП — это синтаксический сахар?
А что такое регистровый язык?
Когда появился первый ассемблер точно я не знаю, но вот Fortran и Ассемблеры долго считались конкурирующими подходами к программированию, пока транслятор фотран не уделал какой-то вручную написанный код по скорости выполнения программы.
Главное свойство регистра не то, что оно используется для хранения и обработки (перфокарта, или там магнитная лента, тоже могут использоваться), а то, что у него есть номер (или идентификатор), по которому к нему можно получить доступ
mov RETHERE, FA[0]; RETHERE:
f: ...; jmp FA[0];
;;; локальные переменные
H1$A: .WORD 0
H1$B: .WORD 0
;;; табличка вызова
H1$CALL1: .WORD 2,H1$A,H1$B
;;; место для адреса возврата и для таблички параметров
H1$PARAM: .WORD 0
H1$RET: .WORD 0
;;; сама функция H1:
H1:
MOV R5,H1$PARAM ;;; сохранили блок вызова
MOV R6,H1$RET ;;; сохранили адрес возврата
.... ;;; что-то делаем
;;; собираемся вызвать функцию
MOV #H1$CALL1 ,R5
MOV #H1$CALL1$RET,R6
JMP F
H1$RET:
MOV H1$PARAM,R5
.... ;;; делаем что-то еще
JMP @H1$RET ;;; возвращаемся из функции H1
;;; блок описывать не будем, предположим, что компилятор его соптимизировал
F:
ADD @4(R5),@2(R5) ;;; двойная адресация (обращение к ячейке, адрес которой лежит в (R5+4))
JMP (R6) ;;; прыжок по адресу, лежащему в R6.
— чистый полиморфизм (полиморфизм по сигнатуре)
— параметрический полиморфизм (полиморфизм по имени метода)
— переопределение (абстрагирование, абстрактные классы)
— перегрузка (неполное замещение метода предка методом потомка)
Ассемблер так же привязан к архитектуре машины (поскольку его команды повторяют команды процессора), но шаг в пропасть был уже сделан и языки начинали всё больше и больше обрастать кристаллами сахара.
Так появляются целочисленные типы данных без возможности указать являются ли они отрицательным или нет (byte, unsigned integer, unsigned long integer и т.д.)
тип boolean с двумя значениями true и false (за которыми, в прочем, стояли те же единичка и нолик)
Массив данных кардинально отличался от стека возможностью свободного доступа не только к последнему засунутому элементу, а вообще к любому по номеру
Но, ведь, ячейки не обязательно бывают заполненными? Так потребовалось обозначение пустой ячейки и возникает тип null
И не дай Ричи тебе записать в массив типа int элемент вида long!
Дабы справиться со строками переменной длины, придумали помечать null-маркером конец строки.
ничто не мешало добавить в середину строки null и поиметь с этого кучу лулзов
Ссылка представляет из себя ярлычок (link) на какую-то переменную, под которую выделен блочок памяти.
Но не тут то было: передача переменных по ссылке дало уникальную возможность конструировать из простых типов данных целые конструкции — структуры данных!
1. в них есть формальный язык описания структур данных (*.h файлы в C)
Возможность создавать свои собственные типы данных возбуждает в программистах страстное желание внутри этого типа данных иметь функции для работы с ним.
инкапсуляция, которую определяют как свойство объекта объединять в себе данные и методы работы с этими данными. Философы вообще любят рекурсивные определения.
Но класс-ориентированное программирование оказалось более удобным для описания API и фреймворков [...], по этому стало более распространённым.
База по языкам программирования: Синтаксический сахар или история развития языков