Файл: Обзор языков программирования высокого уровня (Операторы перехода).pdf
Добавлен: 04.04.2023
Просмотров: 64
Скачиваний: 1
СОДЕРЖАНИЕ
ГЛАВА 1. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ РАЗВИТИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
1.1. Исторические этапы развития языков программирования
1.2. Классификация языков программирования
ГЛАВА 2. СОВРЕМЕННОЕ СОСТОЯНИЕ И ПЕРСПЕКТИВЫ РАЗВИТИЯ СОВРЕМЕННЫХ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
2.1. Возможности современных языков программирования
ГЛАВА 3. ОСНОВНЫЕ ОПЕРАТОРЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
2.2. Потенциальное направление развития языков программирования на сближение с моделями естественного языка
Если проследить всю историю развития парадигм программирования, то можно заметить постепенное увеличение описательных возможностей языков, позволяющих не просто задавать последовательность выполнения команд для ЭВМ, но моделировать таким образом реальность. Языки машинных команд в этом смысле являются отправной точкой, поскольку они не содержат никакой семантики, кроме устройства ЭВМ, для которой они предназначены. Язык ассемблера, по сути, является более удобным способом написания машинных команд. Однако это удобство заключается в добавлении некоторой семантики на уровне операций, использовании осмысленных имен вместо кодов. На следующем этапе – этапе процедурного и модульного программирования – семантика заключается в представлениях алгоритмической декомпозиции и структурного анализа. То есть, мир представляется в виде набора операций, процессов, действий, которые преобразуют некоторые входные информационные потоки в выходные. В явном виде моделирование мира с данной точки зрения представлено в методологии SADT [4, c.103]. Однако после появления ООП от этого подхода отказались в связи с преимуществами последнего [1, c.283].
Концепция ООП заключается в использовании объектной декомпозиции, т.е. представления действительности как набора независимых объектов, у каждого из которых имеются известные общедоступные каналы для взаимодействия и некоторая внутренняя скрытая «начинка». Данные объекты обмениваются друг с другом сообщениями через открытые каналы, в результате чего изменяют свое внутреннее состояние. При этом предполагается, что большинство объектов имеют некоторое существенное сходство, благодаря которому их можно объединить в иерархическую систему классификации, так что свойства этих классов в полной мере описывают каждый конкретный объект [1, c.292].
Данная модель в концептуальном смысле имеет претензию на соответствие структуре естественного языка и способу человеческого мышления. Классы в данном случае соответствуют понятиям языка, а объекты конкретным проявлениям этих понятий в реальном мире. Например, Буч приводит методику объектно- ориентированного анализа, при которой понятия, взятые непосредственно из словаря пользователя, преобразуются в классы и объекты (микропроцесс анализа и проектирования [1, c.307-337]).
Учитывая данное историческое направление развития языков программирования, дальнейшие пути совершенствования средств разработки программного обеспечения следует искать в создании еще более эффективных средств моделирования. Для поиска таких инструментов нам следует обратиться к уже существующим способам описания действительности. Наиболее широко используемый и доказавший на протяжении веков свою эффективность способ описания действительности – это словесное описание. Наша речь – это мощнейший интеллектуальный инструмент, который не только способен описывать любые объекты и явления реального мира, но и тесно связан с внутренними когнитивными процессами. Поэтому, изучая свойства и особенности речи, можно обнаружить такие закономерности, которые будут в равной степени описывать как сам мир, так и способ его восприятия нами.
Попытки понимания сущности языка были предприняты двумя знаменитыми мыслителями, родоначальником школы аналитической философии, австрийским философом Людвигом Витгенштейном, и всемирно известным психологом, основателем психолингвистической школы Львом Семеновичем Выготским. Каждый из этих мыслителей, в силу специфики своего подхода, рассматривали язык с разных точек зрения. Витгенштейна, как философа, в большей степени интересовали вопросы соотношения языка с действительностью, с реальным его применением в социокультурной практике. Выготский, в свою очередь, как 27 психолог, интересовался внутренними механизмами языка, генезиса его происхождения, связи его с мыслительными процессами. Поэтому особенно интересным представляется сопоставление выводов, к которым пришли эти исследователи, двигаясь с двух разных сторон – снаружи и изнутри – к языку. Интересным представляется тот факт, что оба подхода, Витгенштейна и Выготского, не просто не противоречат друг другу, но и коррелируют в своих основополагающих принципах. Наиболее существенной в данном контексте идеей, встречающейся в обеих работах, мы считаем анти-детерминистическую установку в понимании языка. Оба мыслителя обсуждают эту тему, и каждый из них приводит собственные, специфичные аргументы в поддержку этой концепции.
С позиции Витгенштейна [8] язык нельзя свести к формальной логике, с четкими и однозначными правилами вывода, поскольку язык является продуктом «языковых игр». Значение каждого понятия, каждой языковой конструкции образуется спонтанно в ходе человеческой деятельности, и поэтому он имеет нечеткий характер. Так, например, рассматривая понятие «игра», философ обнаруживает, что невозможно выделить какие- либо общие признаки, характерные для всех игр. То, что верно для настольных игр, где присутствуют правила и соревновательный момент, оказывается неприменимо к детским играм в песочнице. Существует множество видов деятельности называемых играми, между которыми имеются «семейные сходства», однако полное определение понятия «игра» едва ли возможно. «Безусловно, можно начертить несколько таких прямоугольников с четкими контурами, которые соответствовали бы одному нечеткому. Но если в оригинале нет резких границ при переходе одного цвета в другой, то разве не становится невыполнимой задача передать расплывчатое изображение четким?» [8]. То есть, пытаться описать содержание понятий формальным образом подобно попытке описать расплывчатую область четким прямоугольником. Можно сделать это с разной степенью полноты или адекватности, но в любом случае, конечный результат будет неверным.
Своеобразный подход к этой проблеме у Выготского [2, c.169]. Он рассматривает слово не в контексте его фактического существования, но в рамках процесса его формирования. С этой точки зрения психолог представляет слово как результат обобщения, сложной интеллектуальной операции по выявлению (пользуясь терминологией Витгенштейна) «семейных сходств» у объектов реального мира.
При этом, если одно и то же «название» дается разным предметам, то это воспринимается как таковое, то есть просто как факт того, что все эти предметы называются одинаково. То есть, понятие в сознании детей представляется как множество из всех тех объектов реального мира, которые были им обозначены. Так происходит потому, что в раннем возрасте дети еще оказываются не способны провести ту интеллектуальную операцию обобщения, выявления общих черт, которая и образует значение слова. При такой трактовке слова формализация языка возможна только в той степени, в какой возможна формализация самого процесса обобщения. Слово выражает то общее, ту «схожесть» объектов действительности, которую люди заметили в ходе познавательной деятельности. Поэтому, чтобы четко определить значение слова, необходимо четко определить сущность ощущения «схожести», описать все критерии, которые его определяют. Очевидно, что хотя и возможно выделить некоторые объективные показатели, все же они только отчасти характеризуют обозначенное явление. Существенную часть здесь занимает именно субъективное восприятие мира человеком.
Таким образом, мы приходим к выводу, что перспективным направлением развития инструментов моделирования реальности является уход от строгих четких формальных описаний к нечетким и неоднозначным. Однако при этом язык должен остаться достаточно детерминированным, чтобы он мог быть преобразован в последовательность машинных команд. Решение данного противоречия мы видим в разделении средств моделирования и средств вычисления. Любую компьютерную программу можно представить в виде сплошной последовательности команд, следовательно, все надстройки, которые до сих пор вводились в языки программирования, являются лишь средством упрощения восприятия кода программистом.
Представление кода необязательно должно быть полностью формальным и детерминированным, его основным критерием является его эвристичность, простота, наглядность. Так, например, можно использовать одновременно несколько представлений, среди которых будут сугубо формальные, служащие для написания конкретных алгоритмов, и ряд нечетких, неформальных моделей, служащих для обзора и ориентации в рамках системы. Вероятно, что модели второго типа могут быть даже вынесены в качестве отдельного языка или программного инструмента, тогда как непосредственно в самом языке программирования останутся только базовые конструкции, служащие для непосредственного написания алгоритмов для вычислительных машин. Вся остальная часть, связанная с разбиением кода на модули, объекты, процедуры и т.д. может быть переложена на эти языки моделирования, которые на основе установленных связей и взаимодействий будут формировать конечную структуру программной системы, объединяя разрозненные куски кода в единое целое.
Таким образом, мы считаем, что продолжая логику движения языков программирования в сторону языков описания действительности, есть смысл двигаться в сторону соответствия естественным языкам.
ГЛАВА 3. ОСНОВНЫЕ ОПЕРАТОРЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
3.1 Операторы присваивания
Дальнейшее рассмотрение операторов языков программирования высокого уровня будем вести на примере языка Паскаль. Данный выбор обусловлен простотой языка и строгим синтаксисом.
В языке Паскаль оператор присваивания обозначается двумя символами «:=», между которыми не ставится пробел. В левой части данного оператора должна стоять переменная, а в правой части – выражение, значение которого будет присвоено переменной.
Очень часто в Паскале можно увидеть конструкцию вида p:=p+1. Данная запись не содержит ошибки. Внутри компьютера данный оператор выполняется следующим образом: сначала берется исходное значение переменной, к которому прибавляется единица. После этих действий результат вычислений помещается в переменную p. Таким образом в языке Паскаль реализуется инкремент переменной.
Очень важно следить, чтобы все переменные, которые участвуют в правой части оператора присваивания, были определены к моменту его исполнения. В качестве правых частей для вычисления численных переменных операторы присваивания используют арифметические выражения, состоящие из переменных, констант, знаков операций, скобок и вызовов функций. В общем случае правила построения выражений аналогичны математической записи. Бинарные операции, применимые к целочисленным данным приведены в таблице 1 [19].
Для примера реализации операции присваивания рассмотрим задачу вычисления гипотенузы треугольника по двум известным катетам. Согласно теореме Пифагора, гипотенуза будет рассчитываться по формуле:
(1)
Таблица 1 – Бинарные арифметические операции над типом integer
Операция |
Обозначение |
Пример |
Сложение |
+ |
p + 2 |
Вычитание |
- |
p– 2 |
Умножение |
* |
p * 2 |
Деление нацело |
div |
p div 2 |
Остаток от деления |
mod |
p mod 2 |
Исходный код программы:
Program Op_prisv;
var
a,b,c:real;
begin
a:=3;
b:=4;
c:=sqrt(a*a+b*b);
end.
В данной программе использованы только операторы присваивания. При этом в двух случаях переменным просто присваивается начальное значение – это катеты треугольника. А в третьем случае происходит вычисление выражения, определяющего корень из суммы квадратов катетов.
В результате выполнения данного кода программа вычислит значение гипотенузы треугольника со сторонамиa, b, и занесет это значение в переменную c.
3.2 Операторы ввода-вывода
Ввод и вывод необходимы для связи программы с внешним миром – таким образом можно получать входные данные от пользователя и выводить полученные результаты на экран. Очевидно, программа без вывода не имеет смысла. В предыдущем примере было рассмотрено вычисление гипотенузы прямоугольного треугольника, однако, без использования оператора вывода нельзя узнать результат, полученный при исполнении программы.
В языке Паскаль операторы ввода-вывода правильнее называть процедурами. Они служат для обмена данными между программой и внешними устройствами. Так, например, можно ввести данные с клавиатуры, из файла, вывести данные на экран или в файл.
Для ввода с клавиатуры в языке Паскаль существует два оператора: Readи Readln. Для вывода на экран – Writeи Writeln. Дополнение «ln» произошло от английского слова «line» - строка, линия. Операторы, заканчивающиеся на «ln» в результате своих действий переводят курсор на новую строку. Так, например, при работе оператора Write курсор останется на следующей позиции после последнего выведенного символа. А в случае оператора Read очередные данные будут считываться из той же строки, где стоит курсор.
Традиционная запись данных операторов содержит параметры, однако, их может и не быть. В таком случае оператор Writeln будет реализовывать просто переход на новую строку, а оператор Readlnбудет ждать ввода любой клавиши.
Кроме стандартного вывода данных в языке Паскаль предусмотрен и форматированный вывод, который существует для того, чтобы сделать отображение на экране более понятным. Форматированный вывод содержит количество позиций, которые при выводе необходимо отвести под значение переменной [5].
В качестве примера использования операторов ввода-вывода модифицируем задачу определения гипотенузы прямоугольного треугольника следующим образом: