Автор работы: Пользователь скрыл имя, 20 Декабря 2013 в 15:24, реферат
Процесс работы компьютера заключается в выполнении программы, то есть набора вполне определённых команд во вполне определённом порядке. Машинный вид команды, состоящий из нулей и единиц, указывает, какое именно действие должен выполнить центральный процессор. Чтобы задать компьютеру последовательность действий, которые он должен выполнить, нужно задать последовательность двоичных кодов соответствующих команд.
Внешне-языковые средства. Применяются в случаях, если простых средств вроде шаблонов недостаточно. Язык генератора составляется так, чтобы автоматически или с минимальными усилиями со стороны программиста реализовывать правила парадигмы или необходимые специальные функции. Фактически, это – более высокоуровневый язык программирования, а генератор – не что иное, как транслятор. Генераторы пишутся, как правило, для создания специализированных программ, в которых очень значительная часть стереотипна, либо для реализации сложных парадигм.[6]
Основные парадигмы и подходы к решению задач в современных языках программирования представлены в таблице 2.
Таблица 2 – Парадигмы и подходы языков программирования [2]
Язык программирования |
Парадигмы программирования |
Основные подходы программирования |
Java |
императивная структурная |
объектно-ориентированный |
C |
императивная |
процедурный |
C++ |
мультипарадигмальный метапрограммирование |
процедурный объектно-ориентированный |
PHP |
мультипарадигмальный |
процедурный объектно-ориентированный |
C# |
мультипарадигмальный императивная |
процедурный объектно-ориентированный |
Python |
императивная декларативная структурная |
процедурный функциональный объектно-ориентированный |
Visual Basic |
императивная структурная |
процедурный объектно-ориентированный |
Objective C |
мультипарадигмальный |
процедурный объектно-ориентированный |
Perl |
мультипарадигмальный декларативная |
функциональный объектно-ориентированный |
Delphi |
императивная структурная |
процедурный объектно-ориентированный |
Современные языки программирования не ограничиваются какой-то одной парадигмой, а используют их несколько или даже являются мультипарадигмальными. Это обусловлено стремлением разработчиков расширить области применения языка, сделать его языком общего назначения, а не ориентированным на решение узкого круга задач.
Использование почти всеми языками объектно-ориентированного подхода наряду с «классическим» процедурным, обусловлено возрастающей сложностью современных задач. Создание больших распределенных систем просто не мыслимо без создания структурной модели, а работа с объектами, в любых их проявлениях, значительно облегчает разработку и отладку таких систем.
Поскольку текст, записанный на языке программирования, непонятен компьютеру, то требуется перевести его на машинный код. Такой перевод программы с языка программирования на язык машинных кодов называется трансляцией, а выполняется она специальными программами – трансляторами.
Транслятор – обслуживающая программа, преобразующая исходную программу, предоставленную на входном языке программирования, в рабочую программу, представленную на объектном языке.
В настоящее время трансляторы разделяются на две основные группы: компиляторы и интерпретаторы.
Компилятор – это обслуживающая программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера). Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7–10 машинных команд. Однако есть и такие языки, в которых каждой команде может соответствовать 100 и более машинных команд. Кроме того, в исходных языках достаточно часто используется строгая типизация данных, осуществляемая через их предварительное описание. Программирование может опираться не на кодирование алгоритма, а на тщательное обдумывание структур данных или классов. Процесс трансляции с таких языков обычно называется компиляцией, а исходные языки обычно относятся к языкам программирования высокого уровня (или высокоуровневым языкам).[7]
Интерпретатор – программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. Интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее.
Простой интерпретатор – анализирует и тут же выполняет (собственно интерпретация) программу покомандно (или построчно), по мере поступления исходного кода на вход интерпретатора. Достоинством такого подхода является мгновенная реакция. Недостаток – такой интерпретатор обнаруживает ошибки в тексте программы только при попытке выполнения команды (или строки) с ошибкой.
Интерпретатор компилирующего типа – это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина). Достоинством таких систем является бо́льшее быстродействие выполнения программ (за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации этого анализа в интерпретаторе). Недостатки – большее требование к ресурсам и требование на корректность исходного кода.[7]
Достоинства интерпретаторов:
– Бо́льшая переносимость интерпретируемых программ – программа будет работать на любой платформе, на которой есть соответствующий интерпретатор.
– Как правило, более совершенные и наглядные средства диагностики ошибок в исходных кодах.
– Упрощение отладки исходных кодов программ. Интерпретатор позволяет начать обработку данных после написания даже одной команды.
– Меньшие размеры кода по сравнению с машинным кодом, полученным после обычных компиляторов.
Недостатки интерпретаторов:
– Интерпретируемая программа не может выполняться отдельно без программы–интерпретатора. Сам интерпретатор при этом может быть не очень компактным.
– Интерпретируемая программа выполняется
медленнее, поскольку промежуточный
анализ исходного кода и планирование
его выполнения требуют дополнительного
времени в сравнении с
– Практически отсутствует
Виды трансляторов современных языков программирования представлены в таблице 3.
Таблица 3 – Трансляторы современных языков программирования [2]
Язык программирования |
Транслятор |
Java |
компиляция в байт-код |
C |
компилятор |
C++ |
компилятор |
PHP |
компиляция в байт-код |
C# |
компиляция в MSIL-код интерпретатор |
Python |
компиляция в байт-код |
Visual Basic |
компиляция в MSIL-код интерпретатор, компилятор |
Objective C |
компилятор |
Perl |
компиляция в байт-код |
Delphi |
компилятор |
Современные языки программирования используют в равной степени компиляцию и интерпретацию.
Широкое использование компиляторов обусловлено большой скоростью работы программ, а также возможность использовать полностью все возможности конкретных платформ и создание «машинно-зависимых» участков кода и программ.
Использование интерпретации, напротив, позволяет оградить программиста от особенностей конкретных платформ, что наиболее востребовано в связи с развитием Интернет–технологий.
Среди интерпретируемых языков используются в основном интерпретаторы компилирующего типа, что обусловлено значительным увеличением скорости работы программ в сравнении с простыми интерпретаторами. При разработке больших и сложных приложений такое увеличение скорости может быть очень существенным.
Тип – относительно устойчивая и независимая совокупность элементов, которую можно выделить во всём рассматриваемом множестве.
Математически тип может быть определён двумя способами:
Тип данных – фундаментальное понятие теории программирования. Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и выполнения операций. Любые данные, которыми оперируют программы, относятся к определённым типам.
Типы данных различаются уже на нижних уровнях системы. Так, например, даже в Ассемблере х86 различаются типы «целое число» и «вещественное число». Это объясняется тем, что для чисел рассматриваемых типов отводятся различные объёмы памяти, используются различные регистры микропроцессора, а для операций с ними применяются различные команды Ассемблера и различные ядра микропроцессора.
В языках программирования типы данных не всегда строго соответствуют подобным математическим типам. Например, тип “целое число” большинства языков программирования не соответствует принятому в математике типу “целое число”, так как в математике указанный тип не имеет ограничений ни сверху, ни снизу, а в языках программирования эти ограничения есть. Как правило, в языках и системах имеется множество целых типов, отличающихся допустимым диапазоном значений (определяемым объёмом занимаемой памяти).[1]
Наиболее часто используемые типы данных:
Простые:
Составные (сложные):
Как уже отмечалось ранее, любой тип данных в языках программирования определяет не только множество собственных значений, но и набор операций, способы хранения и присваивания значений. Типы переменных и параметров должны совпадать с присваиваемыми им значениями или вызываемыми для них функциями. Для обеспечения совместимости типов переменных и их значений в языках программирования существует контроль типов (типизация) – это процесс проверки и накладывания ограничений на использование типов.
Существует два вида контроля типов:
Определение соответствия типов тоже является важным моментом, для этого используется следующие два подхода:
На сегодняшний день не существует единого мнения о том, какой вид типизации лучше. Рассмотрим основные достоинства и недостатки каждого вида контроля типа.[1]
Поскольку переменная связывается с типом в момент присваивания и в ходе выполнения программы может менять свой тип, контролировать на этапе проектирования соответствие такой переменной вызываемым для нее функциям и методам невозможно. Поэтому транслятор встраивает в программу операции связанные с динамической проверкой типа. Отсюда вытекают явные недостатки динамической типизации: