Языки программирования
Развитие программирования связано со слиянием двух ветвей - теоретического и практического программирования - и появлением языков программирования высокого уровня. Идея языка программирования высокого уровня заключается в том, что мы отвлекаемся от конкретного машинного языка конкретного типа компьютеров и конструируем такие правила записи программ, которые, с одной стороны, будут достаточны и удобны для описания алгоритмов решения задач, а с другой стороны, толкуются совершенно однозначно и могут быть преобразованы в программы в машинных кодах. Тогда задача программиста заключается в том, чтобы подготовить правильный текст на языке программирования, а остальное возьмет на себя транслятор, который прочтет этот текст, проверит его на соответствие правилам языка и сформирует программу на машинном языке. Естественно, транслятор должен быть свой для каждого типа компьютера.
Языки программирования с описанными выше свойствами называются машинно-независимыми. Отметим, что при повсеместном переходе на языки программирования программой стал называться текст на языке программирования, а оттранслированная программа на машинном языке стала называться машинным кодом или просто кодом.
Забегая вперед, следует сказать, что никто не составляет текст программы целиком вплоть до малейших деталей. В мире уже составлено огромное количество программ, и очень многие из них имеют тождественные фрагменты, выполняющие одинаковые подзадачи. Наиболее типичные и употребительные фрагменты уже написаны, отлажены и вставлены в трансляторы в форме так называемых стандартных процедур и функций. Из них составлены библиотеки, которыми программист может пользоваться (и обычно пользуется). Поэтому при трансляции программы, составленной программистом, не получается нормального кода: в нем нет тех стандартных функций, которые хранятся в библиотеках. Чтобы отличить такой промежуточный продукт от работоспособной программы, он помещается в файл с расширением .obj (object), в то время как окончательный код получает расширение .exe (execute). Соответственно компиляцией называется преобразование текста программы в obj-файл, в то время как образование exe-файла путем сборки кода из нескольких фрагментов называется редактированием связей (линковкой на жаргоне программистов, от английского Link).
Первыми языками программирования высокого уровня были COBOL, FORTRAN, затем ALGOL, BASIC, PL/1. Был накоплен определенный опыт в том, как эти языки должны быть устроены. Стало также ясно, что не может быть одного самого лучшего языка, и что при программировании различных задач удобнее использовать разные языки. В настоящее время языки программирования делятся на специализированные и универсальные. Специализированные используются для решения узкого класса задач. На универсальном языке можно запрограммировать любую задачу (вопрос об эффективности программирования и эффективности программы здесь не ставится). Универсальные условно делятся на простые и сложные. Простые имеют ограниченный набор средств и за счет этого проще в изучении и дают экономичный код (т.е. откомпилированная программа занимает меньше места в памяти и быстрее выполняется). Сложные имеют большее разнообразие синтаксических конструкций и зачастую сильно упрощают программирование, но сложны в изучении и дают менее экономичный код. Наиболее употребительными простыми языками являются PASCAL , C (более сложная версия - C++) и BASIC. В нашем курсе мы будем изучать программирование на основе языка PASCAL. Более сложные языки программирования - ADA, MODULA-2, DELPHI.
Другое деление языков - деление на императивные и декларативные. Императивные позволяют формулировать алгоритм в форме схемы отдельных операций (согласно приведенному выше определению алгоритма). Декларативные языки позволяют формулировать сразу цель программы, а алгоритм ее решения строится автоматически. Естественно, такие языки пригодны не для всех, а только для определенного класса задач, для которых формализован процесс составления алгоритма в классическом смысле. В качестве примера декларативных языков можно привести языки PROLOG и PLANNER.
Язык программирования Паскаль придуман швейцарским ученым Николасом Виртом в 1970г. Паскаль вначале предназначался для учебных целей, однако оказался настолько удачным, что широко распространился среди профессиональных программистов. Его достоинствами являются простота, естественность, хорошая усваиваемость при обучении и эффективность при реализации программ. При этом неоднократно делались попытки улучшить Паскаль за счет полезных нововведений. В результате для Паскаля, как и для других языков программирования, стала актуальной проблема приведения языка к единому стандарту, иначе терялось главное достоинство языка высокого уровня - универсальность и переносимость. Этот стандарт был создан в 1983г (стандарт ISO 7185 - 83). В этом стандарте зафиксированы те конструкции и термины Паскаля, которые должны присутствовать в каждой реализации и не могут быть изменены.
Наиболее важным понятием любого языка программирования является понятие переменной. Переменная - это как бы ячейка камеры хранения, где данные ждут того момента, когда они могут понадобиться. Переменная хранит значение, положенное в ячейку последним. При исполнении программы на компьютере переменной соответствует выделенный ей фрагмент оперативной памяти. Поскольку ясно, что память переменной должна быть выделена до вычисления значения, а значения могут быть разных размеров, объем памяти должен быть достаточным для хранения тех значений переменной, которые ей могут быть присвоены. Возможно одно из двух: либо всем переменным отводится память по максимуму, либо каждая переменная отводится под значения только определенного типа. Первый путь неэкономичен и в большинстве языков (в том числе в Паскале) принято второе предположение: каждой переменной присваивается определенный тип, который однозначно определяет объем памяти, отводимой переменной. Понятие типа переменной в Паскале - второе важнейшее понятие этого языка.
Изложим схему профессионального программирования на языке высокого уровня. Оно состоит из нескольких этапов. Сначала нужно хорошо сформулировать задачу и придумать алгоритм решения задачи. Затем нужно реализовать алгоритм в форме текста программы на языке высокого уровня. После этого следует откомпилировать программу с помощью какого-либо компилятора с этого языка и выявить синтаксические ошибки в тексте программы (которые наверняка там будут). Исправленный текст следует откомпилировать заново. Подобная процедура может повториться несколько раз. Программу, в которой нет синтаксических ошибок, необходимо отладить. Отладкой называется процесс проверки правильности работы программы, то есть соответствия программы поставленной задаче. Поиск логических ошибок в программе очень трудоемок. Наиболее общий способ отладки заключается в проверке функционирования программы для возможно большего числа вариантов разнообразных входных наборов данных. В большинстве случаев даже в программе, которая верно работает для широкого набора входных значений, обнаруживаются ошибки.
В традиционной схеме отладки программы все этапы выполняются отдельно с помощью различных инструментов (прикладных программ): один инструмент (текстовой редактор) служит для ввода текста программы, другой инструмент (компилятор) компилирует текст, третий инструмент (редактор связей) собирает программу, затем на заранее подобранных исходных данных с известными результатами программа проверяется. При наличии ошибок весь цикл повторяется сначала, и так до тех пор, пока программа не окажется без изъянов. Для того, чтобы облегчить труд программистов, были созданы такие программные комплексы, которые позволяли решать эти задачи, оставаясь внутри этих программных комплексов. Подобные комплексы принято называть средой программирования.
В среду Турбо-Паскаль входит редактор текстов, пользуясь которым удобно набирать и модифицировать программы на языке Турбо-Паскаль (несколько расширенная версия базового языка Паскаль). Одним нажатием клавиши текст программы можно откомпилировать и найти в нем синтаксические ошибки, причем эти ошибки будут выделены в тексте программы особым цветом. Нажатием другой клавиши можно собрать программу с помощью редактора связей. Третья клавиша запускает программу. Причем Турбо-Паскаль дает возможность выполнять программу с остановкой после каждой выполненной команды, после чего есть возможность проверить значения переменных, участвующих в текущей операции, и результат операции.
Языки программирования с описанными выше свойствами называются машинно-независимыми. Отметим, что при повсеместном переходе на языки программирования программой стал называться текст на языке программирования, а оттранслированная программа на машинном языке стала называться машинным кодом или просто кодом.
Забегая вперед, следует сказать, что никто не составляет текст программы целиком вплоть до малейших деталей. В мире уже составлено огромное количество программ, и очень многие из них имеют тождественные фрагменты, выполняющие одинаковые подзадачи. Наиболее типичные и употребительные фрагменты уже написаны, отлажены и вставлены в трансляторы в форме так называемых стандартных процедур и функций. Из них составлены библиотеки, которыми программист может пользоваться (и обычно пользуется). Поэтому при трансляции программы, составленной программистом, не получается нормального кода: в нем нет тех стандартных функций, которые хранятся в библиотеках. Чтобы отличить такой промежуточный продукт от работоспособной программы, он помещается в файл с расширением .obj (object), в то время как окончательный код получает расширение .exe (execute). Соответственно компиляцией называется преобразование текста программы в obj-файл, в то время как образование exe-файла путем сборки кода из нескольких фрагментов называется редактированием связей (линковкой на жаргоне программистов, от английского Link).
Первыми языками программирования высокого уровня были COBOL, FORTRAN, затем ALGOL, BASIC, PL/1. Был накоплен определенный опыт в том, как эти языки должны быть устроены. Стало также ясно, что не может быть одного самого лучшего языка, и что при программировании различных задач удобнее использовать разные языки. В настоящее время языки программирования делятся на специализированные и универсальные. Специализированные используются для решения узкого класса задач. На универсальном языке можно запрограммировать любую задачу (вопрос об эффективности программирования и эффективности программы здесь не ставится). Универсальные условно делятся на простые и сложные. Простые имеют ограниченный набор средств и за счет этого проще в изучении и дают экономичный код (т.е. откомпилированная программа занимает меньше места в памяти и быстрее выполняется). Сложные имеют большее разнообразие синтаксических конструкций и зачастую сильно упрощают программирование, но сложны в изучении и дают менее экономичный код. Наиболее употребительными простыми языками являются PASCAL , C (более сложная версия - C++) и BASIC. В нашем курсе мы будем изучать программирование на основе языка PASCAL. Более сложные языки программирования - ADA, MODULA-2, DELPHI.
Другое деление языков - деление на императивные и декларативные. Императивные позволяют формулировать алгоритм в форме схемы отдельных операций (согласно приведенному выше определению алгоритма). Декларативные языки позволяют формулировать сразу цель программы, а алгоритм ее решения строится автоматически. Естественно, такие языки пригодны не для всех, а только для определенного класса задач, для которых формализован процесс составления алгоритма в классическом смысле. В качестве примера декларативных языков можно привести языки PROLOG и PLANNER.
Язык программирования Паскаль придуман швейцарским ученым Николасом Виртом в 1970г. Паскаль вначале предназначался для учебных целей, однако оказался настолько удачным, что широко распространился среди профессиональных программистов. Его достоинствами являются простота, естественность, хорошая усваиваемость при обучении и эффективность при реализации программ. При этом неоднократно делались попытки улучшить Паскаль за счет полезных нововведений. В результате для Паскаля, как и для других языков программирования, стала актуальной проблема приведения языка к единому стандарту, иначе терялось главное достоинство языка высокого уровня - универсальность и переносимость. Этот стандарт был создан в 1983г (стандарт ISO 7185 - 83). В этом стандарте зафиксированы те конструкции и термины Паскаля, которые должны присутствовать в каждой реализации и не могут быть изменены.
Наиболее важным понятием любого языка программирования является понятие переменной. Переменная - это как бы ячейка камеры хранения, где данные ждут того момента, когда они могут понадобиться. Переменная хранит значение, положенное в ячейку последним. При исполнении программы на компьютере переменной соответствует выделенный ей фрагмент оперативной памяти. Поскольку ясно, что память переменной должна быть выделена до вычисления значения, а значения могут быть разных размеров, объем памяти должен быть достаточным для хранения тех значений переменной, которые ей могут быть присвоены. Возможно одно из двух: либо всем переменным отводится память по максимуму, либо каждая переменная отводится под значения только определенного типа. Первый путь неэкономичен и в большинстве языков (в том числе в Паскале) принято второе предположение: каждой переменной присваивается определенный тип, который однозначно определяет объем памяти, отводимой переменной. Понятие типа переменной в Паскале - второе важнейшее понятие этого языка.
Изложим схему профессионального программирования на языке высокого уровня. Оно состоит из нескольких этапов. Сначала нужно хорошо сформулировать задачу и придумать алгоритм решения задачи. Затем нужно реализовать алгоритм в форме текста программы на языке высокого уровня. После этого следует откомпилировать программу с помощью какого-либо компилятора с этого языка и выявить синтаксические ошибки в тексте программы (которые наверняка там будут). Исправленный текст следует откомпилировать заново. Подобная процедура может повториться несколько раз. Программу, в которой нет синтаксических ошибок, необходимо отладить. Отладкой называется процесс проверки правильности работы программы, то есть соответствия программы поставленной задаче. Поиск логических ошибок в программе очень трудоемок. Наиболее общий способ отладки заключается в проверке функционирования программы для возможно большего числа вариантов разнообразных входных наборов данных. В большинстве случаев даже в программе, которая верно работает для широкого набора входных значений, обнаруживаются ошибки.
В традиционной схеме отладки программы все этапы выполняются отдельно с помощью различных инструментов (прикладных программ): один инструмент (текстовой редактор) служит для ввода текста программы, другой инструмент (компилятор) компилирует текст, третий инструмент (редактор связей) собирает программу, затем на заранее подобранных исходных данных с известными результатами программа проверяется. При наличии ошибок весь цикл повторяется сначала, и так до тех пор, пока программа не окажется без изъянов. Для того, чтобы облегчить труд программистов, были созданы такие программные комплексы, которые позволяли решать эти задачи, оставаясь внутри этих программных комплексов. Подобные комплексы принято называть средой программирования.
В среду Турбо-Паскаль входит редактор текстов, пользуясь которым удобно набирать и модифицировать программы на языке Турбо-Паскаль (несколько расширенная версия базового языка Паскаль). Одним нажатием клавиши текст программы можно откомпилировать и найти в нем синтаксические ошибки, причем эти ошибки будут выделены в тексте программы особым цветом. Нажатием другой клавиши можно собрать программу с помощью редактора связей. Третья клавиша запускает программу. Причем Турбо-Паскаль дает возможность выполнять программу с остановкой после каждой выполненной команды, после чего есть возможность проверить значения переменных, участвующих в текущей операции, и результат операции.
Алексей Иванов
Опубликовано 29-08-2023
121