Это программа переводящая текст инструкций для компьютера с какого либо языка программирования
Язы́к программи́рования — формальная знаковая система, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, задающих внешний вид программы и действия, которые выполнит исполнитель (компьютер) под её управлением.
Со времени создания первых программируемых машин человечество придумало более двух с половиной тысяч языков программирования. [1] Каждый год их число увеличивается. Некоторыми языками умеет пользоваться только небольшое число их собственных разработчиков, другие становятся известны миллионам людей. Профессиональные программисты иногда применяют в своей работе более десятка разнообразных языков программирования.
Создатели языков по-разному толкуют понятие язык программирования. К наиболее распространённым утверждениям, признаваемым большинством разработчиков, относятся следующие: [источник не указан 1249 дней]
- Функция: язык программирования предназначен для написания компьютерных программ, которые применяются для передачи компьютеру инструкций по выполнению того или иного вычислительного процесса и организации управления отдельными устройствами.
- Задача: язык программирования отличается от естественных языков тем, что предназначен для передачи команд и данных от человека к компьютеру, в то время как естественные языки используются для общения людей между собой. Можно обобщить определение «языков программирования» — это способ передачи команд, приказов, чёткого руководства к действию; тогда как человеческие языки служат также для обмена информацией.
- Исполнение: язык программирования может использовать специальные конструкции для определения и манипулирования структурами данных и управления процессом вычислений.
Содержание
Стандартизация языков программирования
Язык программирования может быть представлен в виде набора спецификаций, определяющих его синтаксис и семантику.
Для многих широко распространённых языков программирования созданы международные стандарты. Специальные организации проводят регулярное обновление и публикацию спецификаций и формальных определений соответствующего языка. В рамках таких комитетов продолжается разработка и модернизация языков программирования и решаются вопросы о расширении или поддержке уже существующих и новых языковых конструкций.
Типы данных
Современные цифровые компьютеры обычно являются двоичными и данные хранят в двоичном (бинарном) коде (хотя возможны реализации и в других системах счисления). Эти данные как правило отражают информацию из реального мира (имена, банковские счета, измерения и др.), представляющую высокоуровневые концепции.
Особая система, по которой данные организуются в программе, — это система типов языка программирования; разработка и изучение систем типов известна под названием теория типов. Языки могут быть классифицированы как системы со статической типизацией и языки с динамической типизацией.
Статически-типизированные языки могут быть в дальнейшем подразделены на языки с обязательной декларацией, где каждая переменная и объявление функции имеет обязательное объявление типа, и языки с выводимыми типами. Иногда динамически-типизированные языки называются латентно-типизированными.
Структуры данных
Системы типов в языках высокого уровня позволяют определять сложные, составные типы, так называемые структуры данных. Как правило, структурные типы данных образуются как декартово произведение базовых (атомарных) типов и ранее определённых составных типов.
Основные структуры данных (списки, очереди, хеш-таблицы, двоичные деревья и пары) часто представлены особыми синтаксическими конструкциями в языках высокого уровня. Такие данные структурируются автоматически.
Семантика языков программирования
Существует несколько подходов к определению семантики языков программирования.
Наиболее широко распространены разновидности следующих трёх: операционного, деривационного (аксиоматического) и денотационного (математического).
- При описании семантики в рамках операционного подхода обычно исполнение конструкций языка программирования интерпретируется с помощью некоторой воображаемой (абстрактной) ЭВМ.
- Деривационная семантика описывает последствия выполнения конструкций языка с помощью языка логики и задания пред- и постусловий.
- Денотационная семантика оперирует понятиями, типичными для математики — множества, соответствия, а также суждения, утверждения и др.
Парадигма программирования
Язык программирования строится в соответствии с той или иной базовой моделью вычислений и парадигмой программирования.
В настоящее время также активно развиваются проблемно-ориентированные, декларативные и визуальные языки программирования.
Способы реализации языков
Языки программирования могут быть реализованы как компилируемые и интерпретируемые.
Программа на компилируемом языке при помощи компилятора (особой программы) преобразуется (компилируется) в машинный код (набор инструкций) для данного типа процессора и далее собирается в исполнимый модуль, который может быть запущен на исполнение как отдельная программа. Другими словами, компилятор переводит исходный текст программы с языка программирования высокого уровня в двоичные коды инструкций процессора.
Если программа написана на интерпретируемом языке, то интерпретатор непосредственно выполняет (интерпретирует) исходный текст без предварительного перевода. При этом программа остаётся на исходном языке и не может быть запущена без интерпретатора. Процессор компьютера, в этой связи, можно назвать интерпретатором для машинного кода.
Разделение на компилируемые и интерпретируемые языки является условным. Так, для любого традиционно компилируемого языка, как, например, Паскаль, можно написать интерпретатор. Кроме того, большинство современных «чистых» интерпретаторов не исполняют конструкции языка непосредственно, а компилируют их в некоторое высокоуровневое промежуточное представление (например, с разыменованием переменных и раскрытием макросов).
Для любого интерпретируемого языка можно создать компилятор — например, язык Лисп, изначально интерпретируемый, может компилироваться без каких бы то ни было ограничений. Создаваемый во время исполнения программы код может так же динамически компилироваться во время исполнения.
Как правило, скомпилированные программы выполняются быстрее и не требуют для выполнения дополнительных программ, так как уже переведены на машинный язык. Вместе с тем, при каждом изменении текста программы требуется её перекомпиляция, что замедляет процесс разработки. Кроме того, скомпилированная программа может выполняться только на том же типе компьютеров и, как правило, под той же операционной системой, на которую был рассчитан компилятор. Чтобы создать исполняемый файл для машины другого типа, требуется новая компиляция.
Интерпретируемые языки обладают некоторыми специфическими дополнительными возможностями (см. выше), кроме того, программы на них можно запускать сразу же после изменения, что облегчает разработку. Программа на интерпретируемом языке может быть зачастую запущена на разных типах машин и операционных систем без дополнительных усилий.
Однако интерпретируемые программы выполняются заметно медленнее, чем компилируемые, кроме того, они не могут выполняться без программы-интерпретатора.
Подобный подход в некотором смысле позволяет использовать плюсы как интерпретаторов, так и компиляторов. Следует упомянуть, что есть языки, имеющие и интерпретатор, и компилятор (Форт).
Используемые символы
Современные языки программирования рассчитаны на использование ASCII, то есть доступность всех графических символов ASCII является необходимым и достаточным условием для записи любых конструкций языка. Управляющие символы ASCII используются ограниченно: допускаются только возврат каретки CR, перевод строки LF и горизонтальная табуляция HT (иногда также вертикальная табуляция VT и переход к следующей странице FF).
Ранние языки, возникшие в эпоху 6-битных символов, использовали более ограниченный набор. Например, алфавит Фортрана включает 49 символов (включая пробел): A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - * / () . , $ ' :
Заметным исключением является язык APL, в котором используется очень много специальных символов.
Транслятор - переводчик с языка в другой язык или код
Компилятор - переводчик с языка в машинный код
Интерпретатор выполняет введенные инструкции
Виртуальная машина - среда, эмулирующая вычислительное устройство.
Транслятор - компилятор, интерпретатор или их комбинация для совместной работы.
Компилятор - переводчик программы целиком с одного языка программирования в другой (часто в машинный код).
Интерпретатор - программа покомандного перевода инструкций языка программирования в машинный код и их исполнения.
Виртуальная машина - программный комплекс, эмулирующий вычислительное устройство.
Для понимания понятий поясню, что компьютер понимает только код из циферок называемый машинным.
Транслятор - переводит (переделывает) из одного языка программирования в другой. Потом же для запуска все таки стоит откомпилировать или интерпретировать.
Компилятор - переводит язык программирования в машинный код для последующего запуска программы. Ввиду того что код преобразуется в машинный код еще до запуска программы (время не тратится на преобразование как в интерпретаторе) программа работает значительно быстрее.
Интерпритатор - как и компилятор переводит в машинный код, но по командно и сразу отправляет на управление (взял команду из кода языка программирования, преобразовал в машинные коды, отправил на выполнение, взял следующую команду. и т. д.). Отсюда и выплывает что скорость программы падает.
Виртуальная машина - программный комплекс нужный для запуска программы на разных устройствах и операционных системах. К примеру есть у меня компьютер работающий на виндовсе, у друга тоже компьютер работающий на линуксе, и мой тел. работает на андроиде. И мне нужна программа одинаково работающая на трех этих устройствах. Для этого как нельзя кстати подошла бы виртуальная машина. Программа компилируется не в машинный код, а в байткод, который в свою очередь интерпритируется в машинный виртуальной машиной (почему не в машинной!? да потому что на разных устройствах одно действие выполняется по разному).
Компьютер содержит электронные схемы, с помощью которых соединены клавиатура, экран, модули обработки и памяти.
В схемах присутствуют электрические сигналы.
Сам компьютер ничего, конечно, не понимает.
Его электронная начинка обрабатывает сигналы.
Язык разбили на слова, в соответствии с которыми те или иные сигналы должны поменяться, вызывая предопределённые действия. Слова на буквы. Компьютер умеет сравнивать наличие и отсутствие сигналов. А значит может распознать буквы, а значит и слова.
Но если Вы серьёзно хотите с этим разобраться, то лучше обратитесь к Википедии. Читая одну статью за другой, и задавая себе вопросы -- что теперь не понятно? --Вы быстрее составите для себя правильныю картину. Самостоятельная работа для ума полезнее.
См. "Вычислительные системы" в Википедии.
Компьютер не распознает.
Исходный текст, написанный на каком-то языке, обрабатывается специальной программой - компилятором (разумеется, соответствующим языку) , и превращается в исполняемый файл, который уже понимает компьютер.
Научили, создав программу, которая переводит "слова" языка программирования в машинные коды, которые уже понятны для компьютера.
Как правило, любая элементарная инструкция компьютеру, на самом нижнем уровне, состоит из кода команды и, возможно, кода данных. Например, "прочесть данные из памяти по адресу Х в регистр А", "сложить данные из регистров А и В и поместить сумму в регистр С", "сравнить содержимое регистров А и В", "сдвинуть содержимое регистра А на N разрядов влево" и т. д. То есть даже на таких простых примерах видно, что любая инструкция - это команда (ЧТО сделать) и данные (С ЧЕМ это надо сделать) . И то, и другое есть числа. С данными и так понятно, что это числа, а с командами тоже просто: каждой команде ставится в соответствие определённое число - ведь набор команд всегда ограничен, а значит, их можно просто перенумеровать. Обратите внимание, что некоторым инструкциям не нужны данные. Скажем, команда СБРОС или ОСТАНОВ вполне обойдутся без каких-либо данных. А в однорегистровых процессорах (сейчас таких и не осталось, а вот я начинал с PDP-8, где регистр данных был всего один. ) таких команд было множество, как раз потому, что регистр - один. Поэтому команды инвертирования, сдвига, логических операций и т. п. могли относиться только к этому регистру.
Ну а дальше всё просто: раз каждой команде машинного языка можно поставить в соответствие конкретное число, то точно так же ей можно поставить в соответствие конкретное СЛОВО, которое для человека имеет некоторый смысл. То есть вместо команд 000, 001, 010. можно использовать AND, TAD, ISZ и т. д. (это реальные обозначения команд той самой PDP-8; поскольку памяти в ней было совсем мало, проходилось использовать короткие обозначения команд) . Ну и раз каждой команде соответствавло своё конкретное буквенное обозначение, то не штука было написать программу, которая САМА переводила эти буквенные обозначения в двоичные инструкции. Именно так работает ассемблер - язык программирования самого низкого уровня.
Но на ассемблере писать ОЧЕНЬ СЛОЖНО, потому что а) под каждый конкретный процессор (компьютер) нужен свой ассемблер, и б) ассемблерная программа - это список инструкций 1:1. То есть КАЖДОЕ действие компьютера придётся расписывать по командам ПОЛНОСТЬЮ. Нельзя сказать "прочитать такой-то файл в память", нужно ПОДРОБНО расписать, как распознаётся имя файла, как обратиться к диску, чтобы узнать, где этот файл лежит, как узнать длину файла, как задать адрес начала массива в памяти, как потом запихать все байты файла в ячейки памяти, как на каждом шаге проверять, не закончился ли файл/не переполнился ли массив.. . В общем, кошмар.
Вот поэтому и появились языки программирования высокого уровня (первым это создал К. Цузе ещё в 1941 году) , которые оперируют понятиями, "отвязанными" от конкретных команд машинного уровня и конкретной организации памяти. Поэтому на таком языке уже можно написать "ReadFile (text.doc, ^array)" - и программа-транслятор (не компиллятор! ) САМА переведёт эту инструкцию в ассемблерный код. Потом уже этот кусок ассемблерного кода можно соединить с другими модулями, в частности, стандартными библиотечными модулями (многие типовые операции - работа с клавиатурой и экраном, дисковое чтение/запись, распределение памяти.. . -заранее оттранслированы в машинные коды) . Поэтому следующий этап - это линковка (linking), когда написанный кусок программы связывается с библиотекой и другими кусками программы (если программа сложная) .
А компилятор и интерпретатор - это РАЗНЫЕ ТИПЫ языков высокого уровня. Компилятор (С, Паскаль, Модула, Дельфи) СНАЧАЛА распознаёт текст программы и создаёт промежуточный файл, из которого потом, после линковки, получается исполняемый файл программы. А интерпретатор (Фокал, Бэйсик) распознаёт команды "по ходу дела" и выполняет их одну за другой без того, чтобы предварительно обработать всю программу.
Компилятор (англ. compiler — составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.
1) GCC
2) Free Pascal Compiler
3) Компиляторы C , C ++ и Fortran от Sun Microsystems Inc .
4) Watcom Fortran/C++ Compiler
5) Intel C++/Fortran compiler
6) ICC AVR.
Компилятор обеспечивает преобразование программы с одного языка на другой. Команды исходного языка сильно отличаются по организации и мощности, нежели команды машинного языка. Бывают такие, в которых одна команда исходного языка транслируется в 7-10 машинных команд. Существуют даже такие, в которых в каждой команде может соответствовать более 100 машинных команд (например язык программирования Пролог). В исходных языках довольно часто используется строгая типизация данных, которая осуществляется через их предварительное описание. Программирование на таких языках может опираться не только на кодирование алгоритма, но и на тщательное обдумывание структур данных или классов. Весь процесс трансляции с таких языков программирования обычно называется компиляцией, а исходные языки обычно относятся к языкам высокого уровня.
Интерпретатор (англ. interpreter — истолкователь, устный переводчик) переводит и выполняет программу строка за строкой.В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким. Кроме того, отсутствие выходного машинного кода позволяет не «захламлять» внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50-100 раз медленнее программ, написанных в машинных кодах.
Язык, на котором представлена входная программа, называется исходным языком, а сама программа — исходным кодом. Выходной язык называется целевым языком или объектным кодом.
В общем случае понятие трансляции относится не только к языкам программирования, но и к другим языкам — как формальным компьютерным (вроде языков разметки типа HTML), так и естественным (русскому, английскому и т. п.). [3] [4]
Содержание
Виды трансляторов
Реализации
Цель трансляции — преобразовать текст с одного языка на другой, который понятен адресату текста. В случае программ-трансляторов, адресатом является техническое устройство (процессор) или программа-интерпретатор.
Язык процессоров (машинный код) обычно является низкоуровневым. Существуют платформы, использующие в качестве машинного язык высокого уровня (например, iAPX-432 [5] ), но они являются исключением из правила в силу сложности и дороговизны. Транслятор, который преобразует программы в машинный язык, принимаемый и исполняемый непосредственно процессором, называется компилятором. [6]
Процесс компиляции как правило состоит из нескольких этапов: лексического, синтаксического и семантического анализов, генерации промежуточного кода, оптимизации и генерации результирующего машинного кода. Помимо этого, программа как правило зависит от сервисов, предоставляемых операционной системой и сторонними библиотеками (например, файловый ввод-вывод или графический интерфейс), и машинный код программы необходимо связать с этими сервисами. Связывание со статическими библиотеками выполняется редактором связей или компоновщиком (который может представлять собой отдельную программу или быть частью компилятора), а с операционной системой и динамическими библиотеками связывание выполняется при начале исполнения программы загрузчиком.
Достоинство компилятора: программа компилируется один раз и при каждом выполнении не требуется дополнительных преобразований. Соответственно, не требуется наличие компилятора на целевой машине, для которой компилируется программа. Недостаток: отдельный этап компиляции замедляет написание и отладку и затрудняет исполнение небольших, несложных или разовых программ.
В случае, если исходный язык является языком ассемблера (низкоуровневым языком, близким к машинному языку), то компилятор такого языка называется ассемблером.
Другой метод реализации — когда программа исполняется с помощью интерпретатора вообще без трансляции. Интерпретатор программно моделирует машину, цикл выборки-исполнения которой работает с командами на языках высокого уровня, а не с машинными командами. Такое программное моделирование создаёт виртуальную машину, реализующую язык. Этот подход называется чистой интерпретацией. [6] Чистая интерпретация применяется как правило для языков с простой структурой (например, АПЛ или Лисп). Интерпретаторы командной строки обрабатывают команды в скриптах в UNIX или в пакетных файлах (.bat) в MS-DOS также как правило в режиме чистой интерпретации.
Достоинство чистого интерпретатора: отсутствие промежуточных действий для трансляции упрощает реализацию интерпретатора и делает его удобнее в использовании, в том числе в диалоговом режиме. Недостаток — интерпретатор должен быть в наличии на целевой машине, где должна исполняться программа. Также, как правило, имеется более или менее значительный проигрыш в скорости. А свойство чистого интерпретатора, что ошибки в интерпретируемой программе обнаруживаются только при попытке выполнения команды (или строки) с ошибкой, можно признать как недостатком, так и достоинством.
Существуют компромиссные между компиляцией и чистой интерпретацией варианты реализации языков программирования, когда интерпретатор перед исполнением программы транслирует её на промежуточный язык (например, в байт-код или p-код), более удобный для интерпретации (то есть речь идёт об интерпретаторе со встроенным транслятором). Такой метод называется смешанной реализацией. [6] Примером смешанной реализации языка может служить Perl. Этот подход сочетает как достоинства компилятора и интерпретатора (бо́льшая скорость исполнения и удобство использования), так и недостатки (для трансляции и хранения программы на промежуточном языке требуются дополнительные ресурсы; для исполнения программы на целевой машине должен быть представлен интерпретатор). Также, как и в случае компилятора, смешанная реализация требует, чтобы перед исполнением исходный код не содержал ошибок (лексических, синтаксических и семантических).
По мере увеличения ресурсов компьютеров и расширения гетерогенных сетей (в том числе Интернета), связывающих компьютеры разных типов и архитектур, выделился новый вид интерпретации, при котором исходный (или промежуточный) код компилируется в машинный код непосредственно во время исполнения, «на лету». Уже скомпилированные участки кода кэшируются, чтобы при повторном обращении к ним они сразу получали управление, без перекомпиляции. Этот подход получил название динамической компиляции.
Достоинством динамической компиляции является то, что скорость интерпретации программ становится сравнимой со скоростью исполнения программ в обычных компилируемых языках, при этом сама программа хранится и распространяется в единственном виде, независимом от целевых платформ. Недостатком является бо́льшая сложность реализации и бо́льшие требования к ресурсам, чем в случае простых компиляторов или чистых интерпретаторов.
Смешение понятий трансляции и интерпретации
Трансляция и интерпретация — разные процессы: трансляция занимается переводом программ с одного языка на другой, а интерпретация отвечает за исполнение программ. Однако, поскольку целью трансляции как правило является подготовка программы к интерпретации, то эти процессы обычно рассматриваются вместе. Например, языки программирования часто характеризуются как «компилируемые» или «интерпретируемые», в зависимости от того, преобладает при использовании языка компиляция или интерпретация. Причём практически все языки программирования низкого уровня и третьего поколения, вроде ассемблера, Си или Модулы-2, являются компилируемыми, а более высокоуровневые языки, вроде Python или SQL, — интерпретируемыми.
С другой стороны, существует взаимопроникновение процессов трансляции и интерпретации: интерпретаторы могут быть компилирующими (в том числе с динамической компиляцией), а в трансляторах может требоваться интерпретация для конструкций метапрограммирования (например, для макросов в языке ассемблера, условной компиляции в Си или шаблонов в C++).
Более того, один и тот же язык программирования может и транслироваться, и интерпретироваться, и в обоих случаях должны присутствовать общие этапы анализа и распознавания конструкций и директив исходного языка. Это относится и к программным реализациям, и к аппаратным — так, процессоры семейства x86 перед исполнением инструкций машинного языка выполняют их декодирование, выделяя в опкодах поля операндов (регистров, адресов памяти, непосредственных значений), разрядности и т. п., а в процессорах Pentium с архитектурой NetBurst тот же самый машинный код перед сохранением во внутреннем кэше дополнительно транслируется в последовательность микроопераций.
Примечания
- ↑ 123 ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М .: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X
- ↑ 12Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М .: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0
- ↑ СТ ИСО 2382/7-77 // Вычислительная техника. Терминология. Указ. соч.
- ↑ Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М .: Машиностроение, 1990. — 560 с. — 70 000 (доп,) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания)
- ↑Органик Э. Организация системы Интел 432 = A Programmer’s View of the Intel 432 System / Пер. с англ. — М .: Мир, 1987. — С. 20, 31. — 446 с. — 59 000 экз.
Можно привести ряд других примеров, в которых архитектура разработанных серий вычислительных машин базировалась или сильно зависела от некоторой модели структуры программы. Так, серия GE/Honeywell Multics основывалась на семантической модели выполнения программ, написанных на языке ПЛ/1. В Burroughs (англ.) B5500, B6700 … B7800 прототипом послужила модель программы этапа выполнения, написанной на расширенном языке Алгол. …
Процессор i432, подобно этим ранним архитектурам, также базируется на семантической модели структуры программы. Однако, в отличие от своих предшественников, i432 не основывается на модели некоторого конкретного языка программирования. Вместо этого, основной целью разработчиков было обеспечение непосредственной поддержки на этапе выполнения как для абстрактных данных (то есть программирование с абстрактными типами данных), так и для доменно-ориентированных операционных систем. …
Язык Ада поддерживает объектно-базированное программирование, что и послужило причиной выбора его в качестве основного языка программирования для i432.
Читайте также: