Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Системы программирования как неотъемлемая часть ЭВМ

Содержание:

Введение

Если проследить историю используемых сегодня языков программирования, таких как Си и Паскаль (а равно и менее популярных Бейсик, Фортран или Ада), то окажется, что все они были созданы на рубеже 60-х и 70-х годов. Иными словами, возраст современных языков программирования (за исключением Явы), перевалил за третий десяток, что для компьютерной индустрии является сроком экстремальным. Современные языки программирования старше Интернета, Windows и персонального компьютера минимум на десятилетие. При этом новые языки не переставали регулярно появляться, однако ни один из них не задержался в практике программирования, хотя приносимые ими новые идеи дополняли уже известные языки (как это произошло с объектно-ориентированным программированием).

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

Язык программирования — формальная знаковая система, предназначенная для записи программ. Программа обычно представляет собой некоторый алгоритм в форме, понятной для исполнителя (например, компьютера). Язык программирования определяет набор лексических, синтаксических и семантических правил, используемых при составлении компьютерной программы. Он позволяет программисту точно определить то, на какие события будет реагировать компьютер, как будут храниться и передаваться данные, а также какие именно действия следует выполнять над этими данными при различных обстоятельствах.

С течением времени одни системы развивались, приобретали новые черты и остались востребованы, другие утратили свою актуальность и сегодня представляют в лучшем случае чисто теоретический интерес.

Цель исследования – обзор современных систем программирования.

Задачи исследования:

- рассмотрение истории развития языков программирования;

- анализ структуры современной системы программирования;

- характеристика понятия, назначения и составных элементов систем программирования;

- общая характеристика основных языков программирования;

- обзор современных систем программирования.

Глава 1. Системы программирования как неотъемлемая часть ЭВМ

1.1 История развития языков программирования

Не секрет, что языки программирования обязаны своим появлением необходимостью заставить ЭВМ эффективно работать, поэтому вполне логично начать с краткого экскурса в историю развития высокоуровневых языков программирования.

При классификации языков выделяют следующие типы языков:

  1. Ассемблерные языки — являются символьным представлением машинных языков конкретного компьютера.
  2. Метаязыки — языки, используемые для формального описания других языков.
  3. Императивные языки — это языки, оперирующие командами, изменяющими значение элементов данных, располагают операциями присваивания и циклами. К ним относятся все современные языки программирования.
  4. Декларативные языки — языки, оперирующие инструкциями данным и отношениями между ними. Алгоритм скрывается семантикой языка. Это аппликативные языки, языки логики и объектно-ориентированные языки. Примеры декларативных свойств - сложные множества и инструкции поиска по шаблону.
  5. Процедурные языки — позволяют определять отдельные методы вычисления какой-нибудь проблемы. Включают в себя императивные и функциональные языки.
  6. Аппликативные языки — функции применяются к значениям без побочного эффекта. Это Функциональные языки во всем своем многообразии.
  7. Функциональные языки — оперируют функциями высокого порядка. В них манипуляции совершаются напрямую функциями, а не данными. К категории функциональных языков относятся Lisp, FP, APL, Nial, Krc.
  8. Объектно-ориентированные языки — языки, в которых данные и функции, имеющие доступ к ним рассматриваются как один модуль. Пример: Object Pascal, С++, Java, Objective Caml.
  9. Языки запросов — обеспечивают интерфейс к базам данных.
  10. Языки четвертого поколения (4GL) — высокоуровневые языки, могут использовать естественный английский язык или визуальные конструкции.
  11. Языки логики — языки, оперирующие предикатами и их отношениями p (X,Y)[1].

Известные языки логического программирования: Prolog, KLO, Mandala и Mercury.

Первым общепризнанным языком высокого уровня можно по праву назвать Fortran, версия которого появилась в ноябре 1954 года. Позднее в октябре 1956 года появилась версия Fortran I, а через год Fortran II, еще через год вышел Fortran III, но казавшийся монополизм этого языка был нарушен с появлением более продуманных языков, таких как Cobol (1957), Lisp (1958), Algol'58 (1958), APL (1960). С момента, когда появился первый язык программирования высокого уровня, программисты могли создавать программы длиной до нескольких тысяч строк. Однако когда дело доходило до больших программ, код становился совершенно нечитаемым и трудно управляемым. Избавление от таких неструктурированных программ пришло с появлением языков структурного программирования. И на сегодня это привело к тому, что все современные языки являются структурными.

С ростом производительности ЭВМ от платформно-ориентированных последовательных процедурных языков с одним входом и одним выходом в 1975 пришли к созданию Modula (развитие Pascal) и Scheme (малый собрат языка Lisp).

В 1978 появился стандарт C от Кернигана и Ритчи, появляется и AWK, унаследовавший кое-что от С. Под влиянием популярности Pascal в 1979 появились языки Modula 2 и ADA.

В 1983 появляется ML - прародитель таких языков как O'Caml и Standard ML, небезызвестный С++ задумывается именно в этом году, совершенствуются другие языки (ADA'83, Prolog II)[2] .

В 1988 уже существовал Modula 3 и Perl 2.0. В 1989: Tcl , ANSI C (C89), Perl 3.0, bash. В 1990: Scheme IEEE, ISO C (C90), SML'90. В 1991: Fortran'90 ISO, Python, Java, Perl 4.0, NetRexx, Tcl/Tk. В 1992 разработан язык принтеров - PostScript level 2, появился фактический стандарт языка Oberon-2. В 1994: Perl 5.0, Common Lisp ANSI. В 1995: ADA'95, Delphi, Java 1. В 1996: PostScript level 3, APL'96, ISO C (C95), Objective Caml. 1997 - довольно богатый на языки год: Object Rexx, Prolog IV, OO Cobol, Modula 2 ISO, SML'97. Также компания Oberon Мicrosystems внесла в Oberon-2 небольшие дополнения и разработав коммерческий компилятор промышленного уровня выпустила его в свет под названием Component Pascal.

В 1998 утвержден стандарт на C++ ANSI/ISO, Java 2 (v1.2), O'Caml.

В 2000 году у появившегося к тому моменту Java 2 (v1.3) появился конкурент - C#. Появилась самая стабильная из существовавших - версия Perl 5.6. Затачивается получивший широкое распространение в Европе функциональный, объектно-ориентированный язык O'Caml 3.

В среде системных программистов визуальный интерфейс получил свой современный вид в основном благодаря противостоянию в 1990 с Microsoft фирм Borland и Watcom, которое как вылилось в появление семейств языков Microsoft Visual Studio, ставшего мощнейшим инструментом в руках Microsoft для пропаганды миграции на платформу Windows, и разрозненного множества систем от Borland, - таких сред как Delphi, Kylix, СBuilder и JBuilder. Кроме того, флагманским продуктом Borland провозглашается все-таки система, основанная на довольно старом языке Object Pascal – Delphi[3]. Последнее время высока популярность WWW-программирования. Языки WWW-программирования обладают рядом свойств, которые позволяют использовать их на платформе, специализированной для работы в качестве сервера. Чаще всего это интерпретаторы (такие как Perl, PHP) позволяющие использовать их на стороне сервера, или языки, поддерживаемые клиентом (браузеры) - HTML, XML, Java, JavaScript, или специальные модули (plug-in), расширяющие клиента - Flash.

1.2 Определение и классификация систем программирования

Система программирования – это комплекс средств, предназначенный для создания и эксплуатации программ на конкретном языке программирования на ЭВМ определенного типа.

Средства для создания программ.

Традиционными средствами разработки программ являются алгоритмические (процедурные) языки программирования. Для создания программы на выбранном языке программирования нужно иметь следующие компоненты:

Текстовый редактор – это редактор, который позволяет набрать текст программы на языке программирования. Для этой цели можно использовать любые текстовые редакторы, но лучше пользоваться специализированным текстовым редактором.

Существуют разные подходы к классификации языков программирования. Все они в той или иной мере упрощают реальную картину и охватывают лишь отдельные характеристики языков. Сложность классификации понятна: 50 лет эволюции языков программирования привели к тому, что взаимопроникновение концепций языков, которые используют различные модели и парадигмы, достигло едва ли не своего апогея. Почти каждый новый язык представляет собой «гремучую смесь» разных концепций и механизмов.

В течение многих лет программное обеспечение строилось на основе операционных и процедурных языков, таких как Фортран, Бейсик, Паскаль, Ада, Си. Сегодня современные версии этих и им подобных языков (Модула, Форт) доминируют при разработке прикладных программных средств. Однако по мере эволюции языков программирования получили широкое распространение и другие, принципиально другие подходы.

Классическое операционное программирование требует от программиста детального описания того, как решить задачу, то есть формулировки алгоритма и его специальные записи. При этом ожидаемые свойства результата обычно не указываются. При процедурном подходе операторы объединяются в группы – процедуры. Структурное программирование не выходит за рамки этого направления, оно лишь дополнительно фиксирует некоторые полезные приемы технологии программирования[4].

Модульное программирование является развитием и совершенствованием процедурного программирования и библиотек специальных программ. Основная черта модульного программирования — стандартизация интерфейса между отдельными программными единицами. Модуль — это отдельная функционально-законченная программная единица, которая структурно оформляется стандартным образом по отношению к компилятору и по отношению к объединению ее с другими аналогичными единицами и загрузке. Как правило, каждый модуль содержит паспорт, в котором указаны все основные его характеристики: язык программирования, объем, входные и выходные переменные, их формат, ограничения на них, точки входа, параметры настройки и т.д. Объем модуля обычно не превышает 1000 команд ЭВМ или операторов языка программирования. В противном случае модуль становится громоздким и трудным к восприятию и использованию.

Модульное программирование — это искусство разбиения задачи на некоторое число различных модулей, умение широко использовать стандартные модули путем их параметрической настройки, автоматизация сборки готовых модулей из библиотек, банков модулей.

Основные концепции модульного программирования:

  • каждый модуль реализует единственную независимую функцию;
  • каждый модуль имеет единственную точку входа и выхода;
  • каждый модуль имеет единственную точку входа и выхода;
  • размер модуля по возможности должен быть минимизирован;
  • каждый модуль может быть разработан и закодирован различными членами бригады программистов и может быть отдельно протестирован;
  • вся система построена из модулей;
  • модуль не должен давать побочных эффектов;
  • каждый модуль не зависит от того, как реализованы другие модули[5].

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

При сопровождении тестируется и отлаживается только тот модуль, который плохо работает. Очевидны преимущества в облегчении написания и тестирования программ, уменьшается стоимость их сопровождения.

Концепция модульного программирования реализована в ряде языков, таких как Modula 2, Turbo Pascal 5.0 и выше, C, Python,Perl.

Отличие в реализации процедурного программирования от модульного состоит в том, что модуль не виден программе. В отличие от стандартных языков процедурного программирования, в модульных языках лишние модули просто не прикомпановываются на этапе сборки.

Принципиально иное направление в программировании связано с парадигмами непроцедурного программирования. К ним можно отнести объектно-ориентированное и декларативное программирование.

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

Из языков объектного программирования, популярных среди профессионалов, следует назвать прежде всего C++, для более широкого круга программистов предпочтительны среды типа Delphi и Visual Basic.

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

Декларативные языки подразделяются на два класса: функциональные и логические.

Типичным представителем функциональных языков программирования является Лисп. В основе языка Лисп лежит лямбда-исчисление. Лямбда-исчисление – формализм для представления функций и способов их комбинирования. Вместе со своим эквивалентом –комбинаторной логикой, в которой не используются переменные, – предложено около 1930 г. логиками Черчем, Шейнфинкелем и Карри.

В лямбда-исчислении Черча функция записывается в виде l (x1,x2, … , xn).fn

В Лиспе лямбда-выражение имеет вид:

(LAMBDA(x1,x2, … , xn).fn).

Символ LAMBDA означает, что мы имеем дело с определением функции. Символы xi являются формальными параметрами, они образуют список, называемый лямбда-списком; fn – тело функции, которое может иметь произвольную форму, допускаемую интерпретатором Лиспа. Телом функции может быть константа или композиция из вызовов функций.

Одной из наиболее примечательных является классификация моделей языков, предложенная Дж. Бэкусом в 1977 г. В соответствии с ней выделяются три категории языков:

  1. Простые операционные модели (языки, основанные на конечных автоматах, машине Тьюринга);
  2. Аппликативные модели (языки на основе лямбда-исчисления Чёрча, системы комбинаторов Карри, чистого Лиспа);
  3. Модели фон Неймана (традиционные языки программирования).

Джон Устерхаут предложил принцип классификации языков, в соответствии с которым высокоуровневые языки делятся на языки системного программирования и на скриптовые.

Скриптовый язык (англ. scripting language, также называют язык сценариев) — язык программирования, разработанный для записи «сценариев», последовательностей операций, которые пользователь может выполнять на компьютере. Простые скриптовые языки раньше часто называли языками пакетной обработки (batch languages или job control languages). Сценарии всегда интерпретируются, а не компилируются.

В прикладной программе, сценарий (скрипт) — это программа, которая автоматизирует некоторую задачу, которую без сценария пользователь делал бы вручную, используя интерфейс программы.

Поскольку сценарии интерпретируются из исходного кода динамически при каждом исполнении, они выполняются обычно значительно медленнее готовых программ, оттранслированных в машинный код на этапе компиляции. Также, в плане быстродействия скриптовые языки можно разделить на языки динамического разбора (sh, command.com) и предварительно компилируемые (Perl). Языки динамического разбора считывают инструкции из файла программы минимально требующимися блоками, и исполняют эти блоки, не читая дальнейший код. Предкомпилируемые языки вначале считывают всю программу, компилируют её всю либо в машинный код, либо в какой-то внутренний формат, и лишь затем — исполняют получившийся код.

Вегнер сгруппировал некоторые из наиболее известных языков высокого уровня в четыре поколения в зависимости от того, какие языковые конструкции впервые в них появились:

Первое поколение (1954-1958)

FORTRAN I

Математические формулы

ALGOL-58

Математические формулы

Flowmatic

Математические формулы

IPL V

Математические формулы

Второе поколение (1959-1961)

FORTRAN II

Подпрограммы, раздельная компиляция

ALGOL-60

Блочная структура, типы данных

COBOL

Описание данных, работа с файлами

Lisp

Обработка списков, указатели, сборка мусора

 Третье поколение(1962-1970)

PL/I

FORTRAN+ALGOL+COBOL

ALGOL-68

Более строгий приемник ALGOL-60

Pascal

Более простой приемник ALGOL-60

Simula

Классы, абстрактные данные

 Потерянное поколение (1970-1980)

Языки созданные, но не выжившие. Например, PL/1 , Malboge .

Глава 2. Современные системы программирования

2.1 Языки веб-программирования

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

Средств, которые используются при разработке сайтов на сегодняшний день много. Скрипты сами по себе делятся на две группы: работающие на стороне сервера и работающие на стороне клиента.

Клиентская часть предназначена для взаимодействия с пользователем посредством графического пользовательского интерфейса. Выделяются следующие задачи клиентской части: обработка и представление в текстовом и графическом виде данных, загруженных браузером по запросу, а также контроль ввода входных параметров для различного рода операций.

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

Веб-программирование - это особый случай программирования, который предлагает больше возможностей и функций при разработке сайтов.

Разных видов языков программирования, таких как Си, Паскаль и т.д. оказалось мало для создания веб-страниц, поэтому появились специальные языки и средства, которые имели новые функции, упрощающие работу с типичными данными и элементами. Рассмотрим наиболее важные и распространенные языки и средства, использующиеся на стороне клиента.

JavaScript - самый известный инструмент веб-программирования. Этот язык очень простой и удобный, который позволяет легко управлять содержимым веб-страниц. Следует заметить, что JavaScript не требуют никаких дополнительных программ и плагинов, что является явным преимуществом. У JavaScript есть три главных особенности: полностью совместим с HTML/CSS; простой и несложный; имеется возможность подключения ко всем распространенным браузерам.

Для написания программ, направленных на работу в интернете, был создан специальный язык - Java. Он уникален, так как способен работать как на стороне клиента, так и на стороне сервера. Существенным отличием между JavaScript и Java заключается в следующем: программа, которая основана на Java не встраивается в html-код. Она способна функционировать под управлением специальной виртуальной машины Java.

Для создания анимаций была создана известная всем технология под названием Flash. Она была разработана фирмой Macromedia и очень быстро получила распространение. На сегодняшний день Adobe Flash — мультимедийная платформа, предоставляющая пользователю широкий спектр возможностей. Основным преимуществам данной технологии является его межплатформенность, то есть этот формат может использоваться на любой аппаратно-программной платформе.

К серверным средствам и языкам программирования можно отнести следующие: SSI, Perl, PHP, ASP.NET и многие другие.

Server Side Include (SSI) — это небольшой набор директив, который позволяет добавлять контент во множество страниц. Преимуществом данной технологии является то, что это происходит незаметно для пользователя, а также она работает только под управлением веб-сервера и представляет собой набор команд вставляемых в HTML-файл.

Язык веб-программирования, который является одним из старых и который был создан специально для серверного программирования — это Perl. Изначально он был создан для написания сетевых программ. Следует заметить, что он появился еще до массового появления интернета и сейчас намного уступает в своих функционалах и возможностях популярным и современным языкам.

PHP - специальный язык программирования, который был создания для написания веб-проложений (сценариев). Отличительной чертой PHP является предоставление web-разработчикам возможности быстрого создания динамически генерируемых web-страниц. Это язык хорошо подходит для начинающих, так как он позволяет писать программы с различными базами данных, с графикой, что подчеркивает его простоту и универсальность.

MySQL - самая популярная и распространенная СУБД при разработке сайтов. Она очень проста в использовании, но не предназначена для работы с большим объемом информации. Несмотря на это, есть возможность применения, как в небольших, так и крупных интернет сайтах.

Итак, процесс создания веб-приложений, веб-сайтов называется веб-разработка. Данный процесс включает в себя веб-дизайн, веб-программирование, а также настройку веб-сервера. Но кто же занимается этим? Профессионал в области веб-программирования - веб-программист. Деятельность данного специалиста тесно связана с «всемирной паутиной», с ресурсами, которые будут жить и развиваться в сети. На нем лежит большая ответственность за создание и дальнейшее нормальное функционирование сайтов.

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

2.2 Функционально-императивные языки программирования

Язык программирования El был разработан под сильным влиянием своего прототипа – языка Erlang, но отличается от него (и многих других языков) рядом существенных характеристик. К числу наиболее важных свойств языка El, существенно влияющих на выбор подхода к его реализации, можно отнести следующее.

Все пользовательские функции – чистые, т.е. не могут создавать побочного эффекта и являются детерминированными (естественно только в тех случаях, когда из них не вызываются встроенные или библиотечные функции, которые могут не быть детерминированными или обладать побочным эффектом). Это обеспечивается отсутствием глобальных переменных, указателей, передачей аргументов в функции и возвратом их результатов только по значению.

Нет операций явного захвата/освобождения памяти. В сочетании с тем, что все переменные, доступные в любой функции, локальны, это приводит к отсутствию процесса «сбора мусора».

Состояние памяти в момент возврата из функции отличается от ее состояния в момент входа в функцию только значением выработанного ею результата, которое присваивается локальной переменной вызывающей функции. Платой за это, естественно, являются некоторые затраты времени на захват памяти для переменных в момент входа в функцию или блок и на возврат памяти в кучу при выходе из функции, но эти затраты распределены по всему времени выполнения функций программы и не могут вызывать эффекта «stop the world».

Мутабельность (возможность переприсванивания значений переменным) вариативна по выбору программиста. Используемые функцией переменные по умолчанию, как это принято в функциональных языках, иммутабельны (для явного указания, что переменная не является переприсваиваемой ее нужно объявлять с ключевым словом def), однако их можно превращать в мутабельные, просто объявляя с использованием ключевого слова var. Объявления переменных делаются либо для указания мутабельности, либо для указания типа данных и могут находиться только в начале блока – совокупности операторов, охваченных фигурными скобками и выполняемых строго последовательно в порядке их записи.

Типизация обрабатываемых данных также вариативна. Прежде всего – имеются примитивные и составные типы данных. К примитивным относятся численные (целые и вещественные) данные ограниченной точности – int, long, float и double. Составными называются числа произвольной точности (bigint и bigfloat), строки (string), списки (list), кортежи (tuple), векторы (vector), бинарники (binary), функции (function) и модули (module). Векторы (массивы однотипных элементов неизменяемого размера) могут быть как прямоугольными, так и ступенчатыми.

С каждым из составных типов связан определенный перечень встроенных методов, необходимых для эффективного использования данных. Типы используемых переменных можно не объявлять.

В этом случае переменные могут получать только значения составных типов, причем фактический тип переменной формируется динамически при вычислении выражений. В то же время существует возможность объявлять типы переменных статически путем указания имени нужного типа (int, double, list, tuple, …) после ключевых слов var или def. Это позволит транслятору создавать эффективный код обработки данных примитивных типов, что может быть особенно важно для обработки векторов, содержащих элементы таких типов.

Для составных высокоуровневых типов данных (строки, списки, кортежи, бинарники, векторы, функции, модули) реализованы разнообразные операции их обработки и наборы встроенных функций. Для списков реализован доступ как с головы, так и с хвоста, аналогично расширены средства генерации списков (list comprehension).

Все операции, которые могут быть выполнены над отдельными элементами данных (сложение, умножение, и т. д.), применимы и к массивам таких элементов (векторам) в целом.

Использование таких высокоуровневых операций для векторов в целом позволяет программисту сосредоточиться на существе алгоритма обработки данных и не отвлекаться на мелкие детали, такие как необходимость объявления индексных переменных для циклов обработки элементов массива, установки их начальных значений, контроля границ изменения индексов и т.д.

Достижению этой же цели служат разнообразные способы записи индексных выражений для векторов, близкие к математическим обозначениям и позволяющие организовывать неявную циклическую обработку нужных подмассивов любого вектора. В индексных выражениях можно использовать мнемонические обозначения нижней и верхней границ вектора, диапазоны и шаг изменения индексов. Например, следующий оператор умножает все элементы i-й строки матрицы на коэффициент k: matrix[ i ] [ _ .. ^ ] *= k;

Обозначение «..» в индексном выражении фактически организует неявный цикл перебора всех элементов вектора, находящихся в указанном диапазоне.

Индексные ссылки – еще один способ упрощения записи алгоритмов обработки векторов в целом по сравнению с чисто императивным стилем программирования. Если в одном операторе записаны несколько одинаковых индексных выражений, например:

arr[2 * i + 1] = alpha[2 * i + 1] – beta[2 * i + 1]; то все, кроме первого, могут быть заменены ссылкой на него: arr[2 * i + 1] = alpha[#] – beta[#].

Наряду с уменьшением текстуальной сложности записи операторов, обрабатывающих векторы, индексные ссылки, так же, как и индексные выражения, предоставляют программисту возможность организовывать неявную циклическую обработку.

В тексте одного модуля может присутствовать сколько угодно вариантов одноименных функций с одинаковыми перечнями аргументов.

Компилятор строит результирующий код только для каждой первой (по тексту) из перегруженных таким образом функций. Наличие всех остальных может рассматриваться, например, как реализация версионного контроля или как средство упрощения отладки модулей путем перемещения исследуемой версии функции в начало цепочки перегруженных версий.

Любая функция с конкретным набором формальных аргументов может содержать произвольное количество различных тел – так называемых охраняемых блоков. Охраняемый блок – это последовательность операторов в фигурных скобках, перед которым по определенным правилам записано логическое выражение (последний блок в цепочке может не иметь охранного выражения). При вызове такой функции для фактического выполнения выбирается первый блок по тексту, для которого охранное выражение имеет истинное значение при данном наборе значений фактических аргументов.

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

Модули могут включать в себя произвольное количество функций. Доступность функций для других модулей регулируется ключевыми словами public и private. Модули могут просто импортироваться, либо могут использоваться для создания одного или нескольких экземпляров, различающихся значениями константных полей и становящихся значениями переменных, через которые осуществляется доступ к их функциям.

Простой импорт модуля на самом деле тоже приводит к неявному созданию его экземпляра.

Таким образом, в языке реализована возможность создавать и использовать объекты, но нет ни интерфейсов, ни наследования.

В языке имеется единственная управляющая конструкция by, позволяющая определять разветвления вычислений на две и большее количество ветвей (аналоги условных операторов и переключателей) и циклы. Имеются две разные формы этого оператора, отличающиеся способами формирования проверяемого условие и сопоставления его с образцами. Первая форма предполагает вычисление (впоследствии возможно перевычисление) одного значения, которое далее последовательно сопоставляется с несколькими образцами и, при совпадении, приводит к выполнению соответствующей ветки. Пример оператора ветвления в первой форме, вычисляющий очередное значение Сиракузской последовательности по значению очередного члена x: by x % 2 {of 0 : x \= 2; of 1 : x = 3 * x + 1;}

Во второй форме в каждой ветке вычисляется свое логическое значение, при истинности которого выполняются соответствующая последовательность операторов. Общее выражение может использоваться для начальной установки. Те же самые вычисления для

Сиракузской последовательности могут быть записаны так:

by { when x % 2 == 0 : x \= 2; else x = 3 * x + 1; }

Последний оператор легко может быть преобразован в цикл, вычисляющий все члены Сиракузской последовательности:

by { when x == 1 : break; when x % 2 == 0 : x \= 2; again; else x = 3 * x + 1; again; }

Здесь: ‒ обе ветки, модифицирующие значения x, дополнены оператором again, осуществляющим возврат на начало выполнения оператора by; ‒ добавлена ветка с условием x == 1, обеспечивающая выход из цикла.

Кроме операторов break и again можно использовать оператор next, приводящий к выполнению следующей по тексту ветки без обработки условия ее выполнения. В форме break <label>; и again <label>; эти операторы могут быть использоваться для выхода или возврата на начало охватывающего оператора by, имеющего метку <label>. Отметим, что явное задание циклических вычислений в императивном стиле может использоваться вместо более дорогостоящих рекурсивных вызовов в функциональном стиле, которые, впрочем, тоже доступны.

Ожидается, что тестирование и отладка программ на языке El будут проще, чем в чисто императивных языках. Как обычно для языков функциональной парадигмы, это обусловлено тем, что в языке El нет ни глобальных переменных, ни указателей, нет побочного эффекта у функций (за исключением некоторых встроенных методов и ряда функций стандартных модулей, осуществляющих ввод-вывод), все функции чистые. Любое значение любой переменной формируется только внутри данной функции. Если функция полностью отлажена, то на ее работоспособность ничто извне повлиять не может. За это, конечно, тоже есть плата – необходимость копирования значений при передаче любых аргументов в функции и при возврате результатов.

По своей нацеленности на эффективную обработку разнообразных, в том числе примитивных типов данных, язык El следует отнести к группе преимущественно компилируемых языков, хотя в последующем для него предполагается создание и интерпретатора.

Существование многих различных платформ (Linux, Windows, MacOS, …) приводит либо к необходимости реализации нескольких различных компиляторов для каждой из них, либо к решению создавать кроссплатформенный компилятор. Второй путь, очевидно, более предпочтителен, поэтому в качестве решения рассматривается двухэтапная компиляция: на первом этапе выполняется трансляция программы с языка El в платформно-независимое промежуточное представление, которое на втором этапе преобразуется в объектный код для целевой платформы с использованием специально предназначенного для этого средства.

В качестве такого инструмента из двух основных известных средств GCC и LLVM выбрана инфраструктура проектирования компиляторов LLVM. Эта инфраструктура реализует регистровую виртуальную машину и имеет собственный входной язык, называемый языком ассемблера. Разрабатываемый для языка El компилятор будет транслировать программы на язык ассемблера LLVM.

2.3 Языки программирования высокого уровня

Языки программирования высокого уровня используют в аппаратно-независимых системах программирования.

Языки программирования высокого уровня подразделяют на:

- процедурно-ориентированные;

- проблемно-ориентированные;

- объектно-ориентированные.

Каждый из описанных ниже языков программирования применяется для решения определенного круга задач.

К первому классу языков, который используется для записи процедур или алгоритмов обработки информации относят:

а) язык Фортран (Fortran). Является одним из первых языков программирования высокого уровня. К его основным достоинствам относится наличие огромного числа математических библиотек, поддержка работы с целыми, вещественными и комплексными числами высокой точности, встроенных средств обработки массивов.

К недостаткам можно отнести отсутствие средств отладки и анализа поведения программы, сложность понимания исходного кода. По сути, на данный момент Фортран является узкоспециализированным языком, применяемым для научных и инженерных вычислений.

б) язык Бейсик (Basic). Был разработан в 1964 г. в качестве языка для обучения программированию.

Основными достоинствами этого языка являются, простой синтаксис, который позволяет в кратчайшие сроки освоить этот язык программирования, простота реализации графического интерфейса, возможность использования WinAPI функций, что значительно расширяет возможности языка.

Одним из основных недостатков языка является то, что он поддерживает только операционные системы семейства Windows, DOS и Mac OS X, что значительно сужает сферы его применения. Также к недостаткам можно отнести низкую скорость работы и отсутствие механизма наследования реализации объектов.

в) язык Си (С) был создан в 1969-1973 годах в качестве языка системного программирования и первоначально предназначался для написания ОС UNIX. В 1980-е гг. язык С был дополнен инструментами объектно-ориентированного программирования и на основе него был создан язык C++.

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

К недостаткам языка можно отнести отсутствие четкой стандартизации. В ходе исторического развития языка его элементы зачастую заимствовались из других языков, вне зависимости от наличия других элементов. Это привело к наличию дублирующих и иногда противоречащих друг другу элементов. Данные аспекты привели к тому, что язык стал чрезвычайно сложным для восприятия.

г) язык Паскаль (Pascal). Был создан математиком Н. Виртом специально для обучения программированию. Однако со временем стал широко применяться для разработки программных средств в профессиональном программировании.

Самая первая версия была создана в 1968 году профессором кафедры вычислительной техники Швейцарского федерального института технологии Никласом Виртом. Основной целью, при создании нового языка, является его простота, с сохранением всех достоинств уже имеющихся языков высокого уровня программирования.

Популярность созданного языка стала столь высокой, что уже к 1980 году насчитывалось более восьми десятков его трансляторов. В начале 80-х годов язык программирования Паскаль еще более усилил свои позиции после создания трансляторов Turbo-Pascal для персональных компьютеров. С этого момента язык смело вышел за рамки узкого использования программистами-профессионалами. Он начал использоваться как рабочий инструмент пользователей и как средство обучения языков программирования.

Одним из главных достоинств языка Паскаль является четкая структуризация, удобная среда разработки и отладки, позволяющая пользователю обнаружить логические и синтаксические ошибки в программе. Также к достоинствам можно отнести высокую скорость компиляции программ, возможность использования вставок языка Ассемблер.

В отличие от языка С (С++) в при использовании Паскаль сведены к минимуму возможные синтаксические неоднозначности, синтаксис языка является интуитивно понятным и доступным, поскольку, как уже было отмечено выше, язык изначально разрабатывался для обучения студентов программированию.

Несмотря на долгую историю, Паскаль является динамично развивающимся языком программирования высокого уровня. Современные версии компилятора ликвидировали большинство перечисленных выше недостатков.

Рассмотрим особенности языков другого класса. Основным достоинством проблемно-ориентированных языков программирования является минимизация трудозатрат программиста при решении задач принадлежащих некоторому четко выделяемому классу. К проблемно-ориентированным относят следующие языки программирования:

а) язык Лисп. Считается вторым после Фортрана старейшим высокоуровневым языком программирования. Данный язык наиболее часто применяется при разработке экспертных систем и систем аналитических вычислений. Существуют современные версии этого языка, которые активно применяются при разработке новейших web-технологий. Также модификации данного языка используются в качестве встроенных языков программирования в САПР. Примером может послужить AutoLISP - язык для разработки надстроек в продуктах компании AutoDesk.

б) язык Пролог. Используется для реализации систем искусственного интеллекта, а также и интеллектуальных систем баз данных.

Написание программ на языке Пролог существенно отличается от использования других языков программирования. Программа на Прологе не является реализацией некоторого алгоритма, а представляет собой запись на языке формальной логики. Таким образом, данный язык относится к описательным языкам программирования.

Таким образом, сферой применения данного языка является решение логических задач. Для создания вычислительных, графически задач, реализации пользовательского интерфейса данный язык не предназначен.

Большинство объектно-ориентированных языков являются версиями процедурно-ориентированных и проблемно-ориентированных.

В настоящий момент наиболее активно используются и развиваются следующие среды программирования:

а) Delphi (Lazarus некоммерческая - версия для ОС семейства Linux) - основана на Object Pascal;

б) C++, С# (~ C);

в) Visual Basic (~ Basic);

г) Visual Fortran (~ Fortran);

д) Prolog++ (~ Prolog).

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

Одним из важных факторов для выполнения поставленной задачи может отказаться и верный выбор языка программирования. Для реализации поставленной задачи можно использовать различные языки высокого уровня, наиболее распространенными из которых являются С++ и Паскаль.

Язык Паскаль является статически типизированным, компилируемым, поддерживает низкоуровневую работу с памятью. Именно поэтому его можно рекомендовать в качестве языка программирования для изучения работы подпрограмм, процедур и функций. Простота реализации графического интерфейса позволяет наглядно продемонстрировать процесс создания пользовательского меню.

Проанализировав все выше изложенное, нами был сделан аргументированный выбор языка программирования высокого уровня Паскаль для дальнейшего изучения предмета исследования.

Заключение

Созданные в разное время, с разными целями, по разные стороны Атлантического океана языки в процессе своего практического использования обрастали разными полезными конструкциями, и в конечном итоге пришли к почти полному тождеству - удивительное сходство между собой. Современные языки программирования похожи друг на друга: каждый из них содержит конструкции (операторы, типы данных и другие), имеющие аналоги в других языках программирования. В то же время идентичность языков далеко не полная. Каждый из них содержит конструкции, присущие только ему (даже похожих конструкций в других языках не наблюдается). Схема пересечения семантики языков программирования представлена в Приложении Б.

Как видно из приведенной схемы, существует общая для всех современных языков семантическая зона, в которую входят конструкции, принадлежащие всем (или большинству) языков программирования. Таким образом, семантику каждого языка программирования можно условно поделить на "область пересечения" (общие для всех языков конструкции) и "область объединения" (специфические для данного языка конструкции).

Сегодня имеется немало систем программирования, выпускаемых различными фирмами и ориентированных на различные модели ПК и операционные системы. Наиболее популярны следующие визуальные среды быстрого проектирования:

1) Microsoft Visual Basic;

2) Turbo Pascal

3) C++ Builder

4) Symantec Café.

Из универсальных языков программирования сегодня наиболее популярны следующие:

Бейсик (Basic) – для освоения требует начальной подготовки (общеобразовательные школы)

Паскаль (Pascal) – требует специальной подготовки (школы с углубленным изучением предмета и общетехнические вузы)

Си++ (C++), Ява (Java) – требуют профессиональной подготовки (специализированные средние и высшие учебные заведения)

Именно эти системы и языки программирования в дальнейшем будут определять развитие информатики.

Последние годы в области языков программирования наблюдается некоторый застой. Новые языки не появляются, старые не модернизируются. Безусловно, это затишье перед бурей. Стремительное развитие компьютерной индустрии не может не поставить перед создателями "средств производства" программ (компиляторов) новые задачи. Компиляторы должны стать более "адекватны" эпохе визуального программирования и Интернета. Унификация языков программирования и создание общепринятой семантической базы - необходимое условие продолжения прогресса в этой области программного обеспечения, и, в конечном итоге, всей компьютерной индустрии в целом.

Список использованной литературы и источников

  1. Баранов А.Н., Крейдлин Е.Г. Информационная безопасность // ВЯ, № 2. 2015. с.84-99.
  2. Григорьев Ю.А., Ревунков Г.И. Банки данных: Учеб. для вузов. М: Изд-во МГТУ им. Н.Э. Баумана, 2017.
  3. Дейт, К. Руководство по реляционной СУБД [Текст] / К. Дейт. 2016. – М. – 519 с. –ISBN – 5-3216-3254-4.
  4. Инструментарий ARIS. Методы. Версия 4.1 М.: Весть-Мета Технология, 2015.
  5. Куправа, Т.А. Создание и программирование баз данных средствами СУБД dBase III Plus, FoxBASE Plus, Clipper [Текст] / Т.А. Куправа. – М. : Мир, 2015. – 468 с. – ISBN 6-0934-22981-3.
  6. Мартин, Г. SQL: Справочное руководство [Текст] / Г. Мартин. – М. : Лори, 2017. – 316 с. – ISBN 7-0932-023411-9.
  7. Монахов, В. Язык программирования Java [Текст] / В. Моняхов. – СПб. : БХВ-Петербург, 2017. - 640 с. - ISBN 978-5-9775-0216-0.
  8. Моргун, А. Н. Справочник по Turbo Pascal для студентов [Текст] / А. Н. Моргун. – М. : Вильямс, 2015. – 608 с. ISBN 5-8459-1028-5.
  9. Орлов С.А. Технологии разработки программного обеспечения: Учебник для вузов. ‑3-е издание. СПб.: Питер, 2016.
  10. Сафронов, И. Visual Basic в задачах и примерах [Текст] / И. Сафронов. – СПб. : БХВ-Петербург, 2015. - 400 с. - ISBN 5-94157-495-9.
  11. Фаронов, В. В. Turbo Pascal. Наиболее полное руководство [Текст] / В. В. Фарофонтов. – СПб. : Питер, 2017. – 763 с. - ISBN 5-89251-054-9.
  12. Фрост Р., Дей Дж., Ван К., Базы данных. Проектирование и разработка. М.: NT Пресс, 2016.
  13. Хорстманн, К. С., Корнелл, Г. Java 2. Библиотека профессионала [Текст] / К. С. Хорстман, Г. Корнелл. – М. : Вильямс, 2015. - 898 с. - ISBN 978-5-8459-0970-1.
  14. Шафрин Ю.А. Информационные технологии в 2ч. Ч.1: Основы информатики и информационных технологий / Шафрин Ю.А. – М.: БИНОМ. Лаборатория знаний, 2016. – 316 с.
  15. Шилдт, Г. Полный справочник по С++ [Текст] / Г. Шилдт. - М. : Вильямс, 2014. – 800 с. - ISBN 5-8459-0563-X.

отечественных и экономистов, несмотря на это данная тема продолжает быть особенно актуальной в наше время, так как кредитные на данном этапе человеческого развития достигли распространения и развития. На  сегодня использование кредита для экономически предприятий выступает в качестве единственного

Приложение А

Текстовый редактор

Исходная программа

Компилятор

Объектная программа

Редактор связей

Библиотеки

Исполняемый файл

Редактор ресурсов

Исходный код

Компилятор ресурсов

Ресурсы интерфейса

Загрузчик

Выполнение программы

Рисунок А.1 - Структура современной системы программирования

Приложение Б

Рисунок - Схема пересечения семантики языков программирования

Приложение В

Листинг программы на С++ Создание двумерного массива, находится минимальное и максимальное число в массиве и выводится на экран

#include<iostream.h>
#include<stdlib.h>
void main()
{
const N=4;
const M=5;
int min,max,i,j,m[N][M];
int* p=&m[0][0];
for(i=0;i < N*M;i++) *p++=100-rand() % 201;
for(min=max=*(--p),i=0;i < N*M;i++,p--) { if(*p > max) max=*p; if(*p < min) min=*p; }
for(++p,i=0;i < N;i++,cout << endl)
for(j=0;j < M;j++) cout << *p++ << '\t';
cout << "min=" << min << ", max=" << max << endl;
}
Это было на Borland
если на Visual C++, то

#include<iostream>
#include<stdlib.h>
using namespace std;
void main()
{
const int N=4;
const int M=5;
int min,max,i,j,m[N][M];
int* p=&m[0][0];
for(i=0;i < N*M;i++) *p++=100-rand() % 201;
for(min=max=*(--p),i=0;i < N*M;i++,p--) { if(*p > max) max=*p; if(*p < min) min=*p; }
for(++p,i=0;i < N;i++,cout << endl)
for(j=0;j < M;j++) cout << *p++ << '\t';
cout << "min=" << min << ", max=" << max << endl;
}

  1. Шилдт, Г. Полный справочник по С++ [Текст] / Г. Шилдт. - М. : Вильямс, 2016. – С. 84.

  2. Монахов, В. Язык программирования Java и среда NetBeans [Текст] / В. Моняхов. – СПб. : БХВ-Петербург, 2016. – С. 134.

  3. Куправа, Т.А. Создание и программирование баз данных средствами СУБД dBase III Plus, FoxBASE Plus, Clipper [Текст] / Т.А. Куправа. – М. : Мир, 2016. – С. 216.

  4. Фаронов, В. В. Turbo Pascal. Наиболее полное руководство [Текст] / В. В. Фарофонтов. – СПб. : Питер, 2017. – С. 144.

  5. Корчегин, А.В. Системы управления базами данных [Текст] / А.В. Кочергин, В.Д. Кривов. – М. : Издательство московского университета. 2016. – С. 98.