Обязательная теория. Часть 3. Уровень абстракции.

Уровень абстракции в программировании

Уровень абстракции в программировании.

В предыдущей статье, касающейся обязательных для любого программиста теоретических основ программирования, мы ввели в наш лексикон понятие УРОВЕНЬ АБСТРАКЦИИ. Это сделано для стандартизации, мобильности наших знаний.

Основная наша задача — научиться программировать на любом языке. Понимая основы кодирования и обладая навыками профессионального программирования на одном-двух языках, вы изучите любой другой язык программирования за кратчайшее время: одного-двух дней будет достаточно.

Уровень абстракции современных языков программирования растёт. Для этого есть объективные причины:

  • Упрощение программного кода и как следствие — сокращение времени написания программ.
  • Сокрытие реализации кода в целях дальнейшего формирования интеллектуального рынка, правового регулирования вопросов авторства.
  • Стремление стандартизации и глобализации кода (в идеале — создание одного-единственного языка программирования на все случаи жизни).

Уровень абстракции — общее понимание.

Вспоминаем следующие моменты:

  • Программирование — это совокупность кода и данных.
  • Цель программирования — наладить взаимоотношение ЧЕЛОВЕК-МАШИНА.
  • Машина понимает только цифры (если уж совсем точно — единицы и нули, если ещё точнее — наличие заряженной либо разряженной частицы).
  • Человек понимает только образы, которые реализуются через речь, в нашем случае — через язык программирования.

Обозначаем уровень абстракции:

  1. Машинный код в двоичной (шестнадцатеричной и т.п.) системе счисления — «голые» цифры. Самый низкий уровень абстракции.
  2. Ассемблер — цифры отображаются в виде кода (call, je, cmp, mov и т.д.) и данных (_txt db ‘my_text’,0 и т.п.).
  3. Процедурный язык программирования — код и данные группируются в процедуры (функции), имеющие понятные смысловые названия (напр: CopyString).
  4. Объектно-ориентированный язык программирования. Работаем с понятием Класса. Класс — фактически сложная структура, состоящая из совокупностти ряда функций, данных и классов (например: CString). Классы группируются и используются по предназначению (MFC — создание десктопных Windows приложений, DirectX — создание игр).
  5. Фрэймворки (Framework) — программная платформа, готовый, работающий каркас, используя возможности которого программист «лепит» свою конкретную программу (.NET Framework — фактически виртуальная машина, то есть отдельная операционная система, среда). Работа в рамках Framework на сегодняшнее время — это фактически работа с набором классов, но отличие от объектно-ориентированного программирования есть — это возможность писать код на нескольких языках программирования. Фреймворки — это глобализация в среде программирования.

Чем выше уровень абстракции, тем проще и быстрее писать код, но тем более ограничены наши возможности конкретной узкопрофильной задачей. Выйти из рамок профиля можно, но это существенно усложняет код. При всех неоспоримых плюсах — простоте кода, скорости его написания, контроль над ошибками, связанными с выделением памяти и т.п. мы имеем существенный минус, присущий любой системе с высокой степенью глобальности — это уничтожение оригинальных идей, реализаций и технологий. Правила что и как программировать нам диктует производитель Фреймворка. Задумайтесь над этим.

С прикладной точки зрения, можно отметить, что чем выше уровень абстракции, тем больше объём машинного кода (програмный код как раз-таки очень маленький) и тем медленнее он выполняется на компьютере. Однако, с ростом производительности машин этот недостаток не столь актуален.

Уровень абстракции в историческом разрезе программирования.

1. Первые программы для первых компьютеров писались машинным кодом в виде цифр. Объём кода рос, необходимо было повысить уровень абстракции.

2. Следующий шаг к увеличению степени абстракции — язык ассемблера. Как мы уже знаем, программирование в MS-DOS представляло собой выполнение определённых процессорных команд (jmp, call, mov и т.п.) и вызов определённых системных функций, так называемых «прерываний» (int 21h). Прерывания в основном реализовывали взаимодействие человека с машиной (выводили на консоль текст, производили чтение и запись данных и т.п.).

Определённые куски кода объединялись в функции с использованием макросов. В какой-то момент сформировались и отработались наиболее часто используемые функции (сложение двух десятичных чисел, объединение строк, сравнение строк и т.п.). Кроме этого, возникла идея «встроить» отдельные макросы, повышающие читаемость и наглядность кода (.if … .else … .endif и др.) в сам компилятор языка программирования, то есть увеличить уровень абстракции.

3. Появился процедурный язык программирования Си с набором стандартных и полезных функций. На языке Си были написаны операционные системы Windows, включая Windows 98 (под таким названием в дальнейшем мы будем иметь ввиду операционные системы Windows 1 — Windows ME, не смотря на различную битность — 16 и 32 разных операционок, суть в данном случае не меняется).

Многие называют Windows 98 оболочкой DOS, но это не так. Windows 98 имела свои системные функции (Win API, а затем — Win32 API). Функции были заключены в так называемые библиотеки (файлы с расширением .dll). Определённые библиотеки были обязательными и устанавливались вместе с операционкой, другие могли устанавливаться различными сторонними программами.

Со временем количество .dll файлов, а естественно и функций, увеличилось в огромном размере (более 250 библиотек, в каждой насчитывалось иногда более 100 функций). Ряд функций Microsoft раскрывала перед программистами (документированные функции), ряд — нет (недокументированные функции). Недокументированные функции вычисляли хакеры, исходя из анализа дизасемблированого кода. Документированные функции описывались через общедоступную базу в MSDN (Microsoft Developer Network).

Основой программирования Windows приложений (вплоть до времён Windows 8, включая Windows 98, ME, XP, Vista, 7) являлась работа с так называемыми Win32 API функциями.

Однако, к следующему уровню абстракции — объектно ориентированному программированию, цифровое сообщество пришло не из-за стремления упростить и ускорить написание движков для новых операционок.

4. Язык С++ получил бурное развитие в связи с чрезвычайной прибыльностью компьютерных игр именно во времена Windows 98. Он очень подходил и подходит именно для этих целей (С++ до сих пор является основным языком, на котором пишутся как игровые движки, так и сами игры на основе этих движков).

Со временем С++ занял нишу языка, на котором пишутся современные операционные системы Windows.

Десктопные программы для Windows (на основе окон) по-прежнему писались с использованием Win32 API, правда Microsoft создал библиотеку классов MFC, но это была всего лишь оболочка, работающая на основе Win32 API.

Игры писались с использованием классов и функций DirectX и OpenGl на C++ и всё вроде было бы хорошо, но с приходом Windows 8, Microsoft решила увеличить уровень абстракции

5. .NET Framework (Dot Net) — фактически виртуальная машина, встроенная в операционную систему Windows 8 — 10.

Идея была следующая:

  • Код пишется на любом языке программирования, удобном для программиста (C#, Visual Basic .NET, JScript .NET, C++/CLI, F# ,J#, IronPython, Python .NET и др).
  • Из первоначального языка код преобразуется в специфический «высокоуровневый ассемблер» (CIL — Common Intermediate Language) — фактически язык процедурного типа, понятный виртуальной машине.
  • Виртуальная машина .Net (общеязыковая  исполняющая среда — common language runtime — CLR) понимает только язык CIL, который преобразует в режиме Run Time (то есть преобразует и одновременно выполняет) в машинный код.
  • Задача Dot Net (.NET Framework) наладить быстрое и эффективное взаимодействие с операционной системой.

По задумке Dot Net можно установить на любую операционку (как от Microsoft, так и Unix подобную). Таким образом, идея в том, чтобы создать такую среду, для которой можно писать код на любом языке, работающий на любой операционке.

Это, конечно глобализация с явно выраженной конечной коммерческой целью — последующий переход на одну операционную систему с поддержкой .NET Framework во всём мире (угадайте, какую;). Это наше субъективное мнение, так как реальных своих целей цифровые гиганты пока не озвучивали…

Процедурное программирование с использованием WIN32 API.

Работа с Win32 API популярна со времён Windows 98 и не теряет актуальности до настоящего времени. Программирование с использованием Win32 API основано на вызове предоставленных операционной системой Windows стандартных функций (процедур).

Win32 API критиковали в том числе и за то, что программирование в рамках стандартных функций ограничивает возможности программиста перечнем и функциональностью этих функций. Ряд процедур «засекречивались» компанией Microsoft, но не на долго. Совершенствование отладчиков привело к практической невозможности скрыть код и Мелко-мягкие капитулировали.

В настоящее время, программирование с использованием Win32 API считается  практически низкоуровневым, так сказать «хакерским».

Родной язык Win32 API — язык Си (сам по себе являющийся процедурным языком). Однако, смею Вас заверить, что 32 битный ассемблер — ничуть не сложнее. Из наиболее распространённых, самыми обоснованными, логическими и простыми ассемблерами для написания проектов WIN32 API, по нашему мнению, являются MASM32 и FASM.

Добавить комментарий