Тема: Понятие о языках программирования. Структура современных систем программирования.

Введение.

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

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

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

Гораздо проще написать программу на каком-нибудь языке, более близком к естественному человеческому языку, а работу по переводу этой программы в машин­ные коды поручить компьютеру. Так возникли языки, предназначенные специально для написания программ, — языки программирования.

Уже в последующих ЭВМ первого поколения появился язык мнемокоманд (впоследствии – язык ассемблера) для более понятного человеку преставления машинных команд, а затем, во втором поколении вычислительных машин, возникли и прочно заняли свое место в решении прикладных задач другие, более сложные языки программирования.

Поскольку компьютеры не умеют понимать ничего другого, кроме кодов машинных команд, то возникла необходимость в появлении «переводчиков» с различных языков программирования на язык машинных кодов. Такими переводчиками и стали трансляторы. Кстати, и само слово «транслятор» в переводе с английского означает не что иное, как «переводчик». Наряду с термином «транслятор» часто употребляется еще термин «компилятор». «Транслятор» – понятие более широкое, а «компилятор» – более узкое (любой компилятор является транслятором, но не наоборот).

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

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

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

Все множество языков программирования можно разделить на две группы: языки низкого уровня и языки высокого уровня.

К языкам низкого уровня относятся языки ассемблера (от англ. to assemble — собирать, компоновать). В языке ассемблера используются символьные обозначения команд, которые легко понятны и быстро запоминаются. Вместо последовательности двоичных кодов команд записываются их символьные обозначе­ния, а вместо двоичных адресов данных, используемых при вы­полнении команды, — символьные имена этих данных, выбранные программистом. Иногда язык ассемблера называют мнемокодом или автокодом.

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

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

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

Какие существуют языки программирования

Языки высокого уровня стали появляться уже с середины 50-х годов. Одним из первых языков такого типа стал язык Форт­ран (англ. FORTRAN от FORmula TRANslator — переводчик фор­мул). Так же, как и первые вычислительные машины, этот язык предназначался, в основном, для проведения естественно-научных и математичес­ких расчетов. В усовершенствованном виде этот язык сохранил­ся до настоящего времени. Среди современных языков высокого уровня он является одним из наиболее используемых при про­ведении научных исследований.

НЕ нашли? Не то? Что вы ищете?

После Фортрана в 1957 году появился язык Алгол (англ. ALGOL от ALGOrithmic Language — алгоритмический язык). Этот язык так же, как и Фортран, предназначался для решения науч­но-технических задач. Кроме того, этот язык применялся как средство обучения основам программирования.

В 19591960 гг. был разработан язык Кобол (англ. COBOL от СОттоп Business Oriented Language — общий язык, ориенти­рованный на бизнес). Этот язык предназначался для решения экономических задач, обработки данных для банков, страховых компаний и других учреждений подобного рода.

Почти одновременно с Коболом (1959—1960 гг.) в Массачусетском технологическом институте был создан язык Лисп (англ. LISP от LISt Processing — обработка списков). Этот язык широ­ко используется для обработки символьной информации и при­меняется для создания программного обеспечения, имитирующего деятельность человеческого мозга.

В середине 60-х годов (1966 г.) в Дартмутском колледже (США) был создан язык Бейсик (англ. BASIC от Beginner's All-purpose Symbolic Instruction Code — всецелевой символический код инструкций для начинающих). В основу Бейсика был положен язык Фортран.

В конце 60-х — начале 70-х гг. появился язык Форт (англ. FOURTH* — четвертый). Этот язык стал применяться в задачах управления различными системами после того, как его автор Чарльз Мур написал на нем программу, предназначенную для управления радиотелескопом Аризонской обсерватории.

Появившийся в 1971 году язык Паскаль был назван так в честь великого французского математика XVII века, изобрета­теля первой в мире арифметической машины Блеза Паскаля. Этот язык был создан швейцарским ученым, специалистом в области информатики Никлаусом Виртом как язык для обу­чения методам программирования. С 1983 года язык Паскаль введен в учебные курсы информати­ки средних школ США.

На основе языка Паскаль в конце 70-х гг. был создан язык Ада, названный в честь одаренного математика Ады Лавлейс (Огасты Ады Байрон — дочери поэта Байрона). Именно она в 1843 году смогла объяснить миру возможности Аналитичес­кой машины Чарльза Бэббиджа. Язык Ада был разработан по заказу Министерства обороны США и первоначаль­но предназначался для решения задач управления космически­ми полетами. Этот язык применяется в задачах управления бор­товыми системами космических кораблей, системами обеспечения жизнедеятельности космонавтов в полете, сложными технологи­ческими процессами.

В настоящее время популярным среди программистов явля­ется язык Си (С — буква английского алфавита), созданный в 1972 году Деннисом Ритчи. Первоначально язык Си предназ­начался для написания программ операционной системы UNIX. И операционная система UNIX, и ее прикладные программы на­писаны на языке Си.

Еще один язык был со­здан в начале 70-х гг. группой специалистов Марсельского уни­верситета. Это язык Пролог. Свое название он получил от слов «Программирование на языке ЛОГики». В основе этого языка лежат законы математической логики. Как и язык Лисп, Пролог применяется, в основном, при проведении исследований в области программной имитации деятельности мозга человека. В отличие от описанных выше языков, этот язык не является алгоритмическим. Он относится к так называемым дескриптив­ным (от англ. descriptive — описательный) — описательным языкам. Дескриптивный язык не требует от программиста раз­работки всех этапов выполнения задачи. Вместо этого, в соответст­вии с правилами такого языка, программист должен описать базу данных, соответствующую решаемой задаче, и набор вопросов, на которые нужно получить ответы, используя данные из этой базы.

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

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

Первый объектно-ориентированный язык Simula-67 был со­здан как средство моделирования работы различных приборов и механизмов. Большинство современных языков программиро­вания — объектно-ориентированные. Среди них последние вер­сии языка Turbo Pascal, C++, Ada и др. В настоящее время ши­роко используются системы визуального программирования Visual Basic, Visual C++, Delphi и др. Они позволяют создавать сложные прикладные пакеты, обладающие простым и удобным пользовательским интерфейсом.

Что такое компилятор. Что такое интерпретатор

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

Транслятор это программа, предназначенная для перевода программы, написанной на одном языке программирования, в программу на другом языке программирования. Процесс пере­вода называется трансляцией.

Тексты исходной и результирующей программ находятся в па­мяти компьютера. Примером транслятора является компилятор.

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

Компилятор создает законченный результат — программу в ма­шинных кодах. Затем эта программа выполняется. Откомпили­рованный вариант исходной программы можно сохранить на диске. Для повторного выполнения исходной программы компи­лятор уже не нужен. Достаточно загрузить с диска в память ком­пьютера откомпилированный в предыдущий раз вариант и вы­полнить его.

Существует другой способ сочетания процессов трансляции и выполнения программы. Он называется интерпретацией. Суть процесса интерпретации состоит в следующем. Вначале перево­дится в машинные коды, а затем выполняется первая строка про­граммы. Когда выполнение первой строки окончено, начинается перевод второй строки, которая затем выполняется, и т. д. Управ­ляет процессом интерпретации программа-интерпретатор. Интерпретатор это программа, предназначенная для пост­рочных трансляции и выполнения исходной программы. Такой процесс называется интерпретацией.

В процесс трансляции входит проверка исходной программы на соответствие правилам используемого в ней языка. Если в про­грамме обнаружены ошибки, транслятор выводит сообщение о них на устройство вывода (обычно, на экран дисплея).

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

Иногда один и тот же язык может использовать и компиля­тор, и интерпретатор.

Как правило, программы-компиляторы и интерпретаторы на­зываются так же, как и языки, для перевода с которых они пред­назначены.

Структура современных систем программирования.

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

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

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

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

·  текстовые редакторы, служащие для создания текстов исходных программ;

·  компоновщики, позволяющие объединять несколько объектных модулей, по­рождаемых компилятором, в единое целое;

·  библиотеки прикладных программ, содержащие в себе наиболее часто используемые функции и подпрограммы в виде готовых объектных модулей;

·  загрузчики, обеспечивающие подготовку готовой программы к выполнению;

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

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

·  подать входные данные в виде текста исходной программы на вход компиля­тора;

·  получить от компилятора результаты его работы в виде набора объектных файлов;

·  подать весь набор полученных объектных файлов вместе с необходимыми библиотеками подпрограмм на вход компоновщику;

·  получить от компоновщика единый файл программы (исполняемый файл) и подготовить его к выполнению с помощью загрузчика;

·  поставить программу на выполнение, при необходимости использовать от­ладчик для проверки правильности выполнения программы.

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

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

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

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

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

Структура современной системы программирования

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

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

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

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

В качестве основных тенденций в развитии современных систем программиро­вания следует указать внедрение в них средств разработки на основе так назы­ваемых «языков четвертого поколения» — 4GL (four generation languages), — а также поддержка систем «быстрой разработки программного обеспечения» — RAD (rapid application development).

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

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

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

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

Функции текстовых редакторов в системах программирования

Текстовый редактор в системе программирования — это программа, позволяю­щая создавать, изменять и обрабатывать исходные тексты программ на языках высокого уровня.

Интегрированные среды разработки оказались очень удобным средством. Они стали завоевывать рынок средств разработки программного обеспечения. А с их развитием расширялись и возможности, предоставляемые разработчику в среде текстового редактора. Со временем появились средства пошаговой отладки про­грамм непосредственно по их исходному тексту, объединившие в себе возможно­сти отладчика и редактора исходного текста. Другим примером может служить очень удобное средство, позволяющее графически выделить в исходном тексте программы все лексемы исходного языка по их типам — оно сочетает в себе воз­можности редактора исходных текстов и лексического анализатора компиля­тора.

Компилятор как составная часть системы программирования

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

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

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

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

Компоновщик. Назначение и функции компоновщика

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

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

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

Загрузчики и отладчики. Функции загрузчика

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

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

Загрузчик − специальный модуль, который бы выполняет преобразование отно­сительных адресов в реальные (абсолютные) адреса непосредственно в момент запуска программы на выполнение.

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

Отладчик — это программный модуль, который позволяет выполнить основные задачи, связанные с мониторингом процесса выполнения результирующей при­кладной программы. Этот процесс называется отладкой и включает в себе сле­дующие основные возможности:

·  последовательное пошаговое выполнение результирующей программы на ос­нове шагов по машинным командам или по операторам входного языка;

·  выполнение результирующей программы до достижения ею одной из задан­ных точек останова (адресов останова);

·  выполнение результирующей программы до наступления некоторых заданных условий, связанных с данными и адресами, обрабатываемыми этой программой;

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

Библиотеки подпрограмм как составная часть систем программирования

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

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

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

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

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

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

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

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

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

Тема: Общие сведения о языке программирования Turbo Pascal.

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

В 1992 г. фирма Borland International выпустила два пакета, основанных на языке Паскаль: Borland Pascal 7.0 и Turbo Pascal 7.0. Первый может работать в трех режимах - обычном и защищенном режимах MS DOS и в системе Windows. Для него необходимо порядка 30 Мбайт на жестком диске и около 2 Мбайт оперативной памяти. Турбо Паскаль 7.0 работает только в обычном режиме MS DOS и менее требователен к характеристикам компьютера. Основные компоненты совпадают в обоих продуктах, поэтому для обучения чаще всего используют Турбо Паскаль 7.0.

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

АЛФАВИТ ЯЗЫКА

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

Идентификатор - это имя любого объекта языка. Он может состоять из латинских букв (a...z), цифр (0...9) и знака подчеркивания и не должен начинаться с цифры. Прописные и строчные буквы в идентификаторах и зарезервированных словах считаются идентичными, они различаются лишь в строковых константах. Длина идентификатора не ограничена, но значимыми являются лишь первые 63 символа.

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

К специальным знакам относятся знаки пунктуации (. () [] .. : ;), знаки операций и зарезервированные слова. Знаки операций могут быть как символьные (+,-,*,/ и т. д.), так и буквенными (mod, div, not). Зарезервированные слова являются служебными и не могут быть переопределены пользователем, т. е. их нельзя использовать как имена пользовательских объектов. Неиспользуемые символы - это коды ASCII, которые используются только в комментариях и символьных строках, но не в языке. К ним относятся все русские буквы, а также символы %, &, ! и т. п.

Служебные (зарезервированные) слова:

ABSOLUTE

ASSEMBLER

AND

ARRAY

ASM

ASSEMBLER

BEGIN

CASE

CONST

CONSTRUCTOR

DESTRUCTOR

DIV

DO

DOWNTO

ELSE

EXPORT

END

EXPORT

EXPORTS

EXTERNAL

FAR

FILE

FOR

FORWARD

FUNCTION

GOTO

IF

IMPLEMENTATION

IN

INDEX

INHERITED

INLINE

INTERFACE

LABEL

INTERRUPT

LABEL

LIBRARY

MOD

NAME

NIL

NEAR

NOT

OBJECT

OF

OR

PACKED

PRIVATE

PROCEDURE

PROGRAM

PUBLIC

REPEAT

RECORD

RESIDENT

SET

SHL

SHR

STRING

THEN

TO

TYPE

UNIT

UNTIL

USES

VAR

VIRTUAL

XOR

WITH

WHILE

СТРУКТУРА ПРОГРАММЫ

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

Program... RECORD; {Заголовок программы}

Uses ...; {Подключение модулей}

Label ...; {Раздел объявления меток}

Const ...; {Раздел объявления констант}

Type ...; {Раздел объявления новых типов}

Var ...; {Раздел объявления переменных}

Procedure ...; {Описание своих процедур}

Function ...; {Описание своих функций}

Begin {начало основной программы}

...;

{Операторы}

...;

End.

Обязательной частью является лишь тело программы, которое начинается словом begin, а заканчивается словом end с точкой. Операторы в Паскале разделяются точкой запятой. Заголовок программы является хотя и необязательным, но желательным элементом и состоит из зарезервированного слова program и идентификатора - имени программы, за которым следует точка с запятой. Порядок объявлений и описаний не регламентируется.

ПРИМЕР : Простейшая программа.

program prim_1; {демонстрация структуры программы}

{эта программа не требует никаких объявлений и описаний}

begin

write('Привет! Вот мы и начали.') (* эта строка текста появится на экране *)

end.

КОММЕНТАРИИ

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

Комментарии заключаются либо в фигурные скобки {комментарий 1}, либо в символы (* комментарий 2 *) и могут занимать любое количество строк. Последовательность из трех символов (*) начинает комментарий до конца строки. Текст комментария игнорируется при компиляции, если это не директивы компилятора, которые имеют вид {$ }.

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

ИДЕНТИФИКАТОРЫ

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

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

Приведем несколько примеров идентификаторов:

Writeln

Exit

Real2String

System. MemAvail

Dos. Exec

WinCrt. Windows

ПЕРЕМЕННЫЕ

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

Раздел описания переменных может содержать несколько строк, каждая из которых разделена двоеточием. В левой части такой строки содержится идентификатор переменной (или перечень идентификаторов, разделенных запятыми), а в правой части указан тип данных, которым принадлежит данная переменная (переменные). Каждая строка в разделе описания переменных завершается символом «точкой с запятой». Зарезервированное слово VAR присутствует в тексте программы в единственном экземпляре, число строк в разделе описания переменных, следующих за словом VAR, не ограничивается.

КОНСТАНТЫ

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

Объявляются константы таким образом:

CONST

Number = 93;

Max = 10;

Min = - max;

Message = ‘Ошибка’;

Quan = 2.33E11;

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