Интересные моменты программирования
Язык Pascal внёс свои определения и
термины в программирование. Поэтому программисты, которые переходили с других
языков программирования на Delphi, не жаловали этот язык. Поэтому Delphi не
такой популярный, как хотелось бы. А те, кто начинал программировать с Delphi
считают этот язык простым и удобным.
В языке
Pascal есть различие между терминами "процедура" и "функция", а фактически это
просто подпрограммы. Просто подпрограмма под названием "функция" изменяет
значение регистра EAX, а процедура не изменяет этот регистр. Если хорошенько
подумать, то и процедура изменяет этот регистр, но это значение обычно "ерунда",
а функция изменяет значение регистра EAX на значение осмысленное. Но нельзя
недооценить вклад языка Pascal в методологию вызовов подпрограмм. Вы иногда
наверное замечали что в некоторых исходниках около объявления подпрограммы
написано одна из данных директив: pascal, cdecl, stdcall. Эти директивы влияют
на метод вызова подпрограммы.
Объясню поподробнее.
1. Директива
pascal определяет "паскальный" вызов подпрограммы (он стоит по умолчанию во всех
процедурах и функциях): а именно параметры пихаются в стек в прямом порядке, но
стек нормализует ВЫЗЫВАЕМЫЙ.
2. Директива cdecl (C declaration)
определяет "сишный" вызов подпрограммы: а именно параметры пихаются в стек в
обратном порядке, но стек нормализует ВЫЗЫВАЮЩИЙ (путаница какая-то, неправда
ли?).
3. Директива stdcall (Standart calling) определяет стандартный
вызов всех продпрограмм всех библиотек WINDOWS: параметры пихаются в стек в
обратном порядке, но стек нормализует ВЫЗЫВАЕМЫЙ. Это есть синтез двух видов
вызовов.
Язык Pascal внёс путаницу в
заголовочные файлы и модули. Буду говорить как все нормальные программисты.
Заголовочный файл это тоже самое, что и модуль в паскале. А модуль в Windows это
любой исполняемый файл формата PE, который может быть загружен в память данного
процесса это *.DLL, *.SYS, *.EXE. Обычно модулем выступает Dll-файл, но ни что
не мешает и exe-файлу быть модулем, но от него толку не будет, только место в
памяти будет занимать т.к. он не экспортирует никаких функций, хотя ничто не
мешает ему содержать таблицу экспорта. Теоретически SYS файл тоже может быть
модулем, но на практике никогда этого не видел, так как это трудно реализовать
(не буду залезать в дебри).