Каковы преимущества составления и обработки документов на компьютере
Обновлено: 21.11.2024
МЕХАНИКА СОЗДАНИЯ ВЫПОЛНЯЕМОЙ КОМПЬЮТЕРНОЙ ПРОГРАММЫ
С помощью языка высокого уровня, такого как Ада, программа может быть написана как обычный текст, хранящийся в файле. Этот текст называется исходным кодом. Файл, содержащий текст, обычно называют текстовым файлом. Текстовые файлы создаются с помощью программы, называемой текстовым редактором. Это такая же программа, как и любая другая, ввод обычно с клавиатуры, а вывод — текстовый файл. Текстовые редакторы позволяют пользователям создавать и редактировать текстовые файлы. Примеров таких программ много, самые сложные из них называются текстовыми процессорами и предназначены для создания документов, а не программ. Текстовые редакторы можно рассматривать как простые программы для обработки текстов. Система Unix, которую мы будем использовать, поддерживает ряд редакторов, мы будем использовать «ved» (визуальный редактор HP-UX).
<Н2>2. ОБЪЕКТНЫЙ МОДУЛЬПосле того, как программа существует в виде текстового файла, следующим этапом является перевод этого текста в машинный код, чтобы программа могла выполняться. Это достигается с помощью программы перевода, называемой компилятором. Для каждого языка программирования высокого уровня существуют разные компиляторы. Таким образом, для компиляции программы на языке Ада нам понадобится компилятор языка Ада. Компьютерные системы часто поставляются с несколькими различными компиляторами. При «вызове» компилятор читает исходный код и проверяет, что программа синтаксически корректна, т. е. подчиняется правилам выбранного языка высокого уровня. Обратите внимание, что все языки программирования имеют особые правила относительно формы различных программных конструкций — мы говорим, что каждый язык имеет свой собственный синтаксис. Если компилятор обнаружит синтаксические ошибки, на экране появится сообщение об ошибке, и в этом случае программист должен повторно вызвать текстовый редактор, исправить программу и попытаться скомпилировать ее снова. Обычно этот процесс продолжается несколько итераций. Если ошибок не обнаружено, компилятор переводит текст в машинный код. Созданный таким образом код называется объектным модулем и сохраняется в файле во вторичном хранилище. Обратите внимание, что поскольку разные модели компьютеров имеют разные машинные коды, компилятор, разработанный для одного компьютера, не будет работать на другом. Для разных машин нужны разные компиляторы. Однако текстовый файл можно легко перенести с одной модели компьютера на другую. Мы говорим, что программа является портативной. Переносимость — важная проблема разработки программного обеспечения и часто упоминаемое преимущество языков высокого уровня.
<Н2>3. ССЫЛКАСледующий этап — «связать» библиотечные подпрограммы, которые потребуются программе. Эти подпрограммы представляют собой фрагменты программного кода, поставляемые с языком, которые могут быть включены в программы. Цель состоит в том, чтобы ускорить процесс программирования, позволяя программистам использовать существующие блоки кода, которые выполняют часто требуемые операции, например, для облегчения ввода с клавиатуры или вывода на экран компьютера. Библиотечные подпрограммы хранятся в файлах так же, как и все остальные данные. Термин «библиотека» используется в том смысле, что программисты могут свободно выбирать подпрограммы способом, аналогичным тому, как книги могут выбираться из традиционных библиотек. Ничто не мешает программистам писать свои собственные библиотечные подпрограммы, на самом деле это часто желательно, но об этом позже
Связывание осуществляется с помощью другой специальной программы, называемой компоновщиком. Это объединяет составные части программы (объектный модуль и библиотечные подпрограммы) и создает один (исполняемый) файл машинного кода, называемый загрузочным модулем, который сохраняется во вторичном хранилище.
Для больших приложений желаемая конечная программа может состоять из нескольких текстовых файлов программы (каждый из которых может быть создан другим программистом) и, следовательно, нескольких объектных модулей. В этом случае компоновщик также может быть использован для включения этих отдельных компиляций в один загрузочный модуль.
<Н2>4. ОБЗОР <ПР>Теперь загрузочный модуль можно запустить (выполнить) с помощью команды операционной системы, как описано ранее. Команда для выполнения программы содержит имя файла, в котором хранится программа. Команда заставляет операционную систему искать требуемый файл во вторичной памяти и (если он найден) копировать его в первичную память, где он затем выполняется под управлением CU. По завершении управление возвращается операционной системе. «Отработанная» копия программы остается в основной памяти до тех пор, пока используемые ячейки не будут перезаписаны выполнением другой программы.
<Н3>4.1. Компилятор ICCМы будем использовать компилятор Ады, называемый компилятором ICC. Это упрощает процесс создания исполняемой программы за счет объединения объектного модуля и связывания этапов. Таким образом, чтобы скомпилировать программу с помощью компилятора ICC, мы просто вводим следующую единственную команду:
$ Имя файла ICC .ada
<Н2>5. ИСПОЛЬЗОВАНИЕ ПЕРЕВОДЧИКОВАльтернативный способ запуска программы, написанной на языке высокого уровня, — использование интерпретатора (вместо компилятора). С помощью интерпретатора исходный код (текст программы) создается точно так же, как описано выше. Затем интерпретатор запускается с текстом программы во вторичной памяти в качестве входных данных. Так же, как и компилятор, интерпретатор читает текст и проверяет, нет ли в программе синтаксических ошибок. Разница в том, что интерпретатор никогда не переводит программу в машинный код. Вместо этого он «интерпретирует» программу шаг за шагом и выполняет задачи программы. С точки зрения пользователя это выглядит так, как будто программа выполняется. Преимущество заключается в том, что интерпретаторы обеспечивают более быстрый и простой способ тестирования небольших программ или фрагментов программ. Недостатком является то, что программы работают гораздо медленнее.
Этот контент был заархивирован и больше не поддерживается Университетом Индианы. Информация здесь может быть неточной, а ссылки могут быть недоступны или ненадежны.
Большинство программ написано на языке высокого уровня, таком как C , Perl или Java . Точно так же, как человеческий язык облегчает людям общение друг с другом, компьютерные языки упрощают работу по указанию компьютеру, что делать. Однако, поскольку компьютер понимает только числа, разговаривать с ним все равно что разговаривать с кем-то, с кем вы не говорите на одном языке. Вам нужен переводчик, чтобы правильно общаться, и это то, что делают интерпретаторы и компиляторы.
Разница между интерпретируемым и компилируемым языком заключается в результате процесса интерпретации или компиляции. Интерпретатор создает результат из программы, а компилятор создает программу, написанную на языке ассемблера. Затем ассемблер архитектуры превращает полученную программу в двоичный код. Язык ассемблера различается для каждого отдельного компьютера в зависимости от его архитектуры. Следовательно, скомпилированные программы могут работать только на компьютерах с той же архитектурой, что и компьютер, на котором они были скомпилированы.
Скомпилированная программа не читается человеком, а написана на машинном языке, зависящем от архитектуры. Создание скомпилированной программы требует нескольких шагов. Сначала программист с помощью средства разработки или даже простого текстового редактора пишет исходный код на выбранном языке программирования. Если программа сложная, ее части могут быть разбросаны по нескольким файлам. Затем программист компилирует программу, сортирует и связывает модули и переводит все это в машинный код, понятный компьютеру.
Поскольку компьютеры разных типов не говорят на машинных языках друг друга, скомпилированная программа будет работать только на той платформе, для которой она была разработана. Например, программа, написанная для HP-UX, обычно не будет работать на компьютере с Mac OS или на компьютере под управлением Solaris. Несмотря на этот недостаток, скомпилированные программы работают быстрее, чем те, которые нужно запускать через интерпретатор. Также часто можно перекомпилировать программу, чтобы она работала на разных платформах. Примеры языков, которые обычно используются для создания скомпилированных программ, включают C, Fortran и COBOL.
С другой стороны, в интерпретируемой программе исходным кодом обычно является программа. Для программ этого типа (часто называемых сценариями) требуется интерпретатор, который анализирует команды в программе и затем выполняет их. Некоторые интерпретаторы, такие как оболочки Unix (sh, csh, ksh и т. д.), читают и сразу же выполняют каждую команду, в то время как другие, такие как Perl, анализируют весь сценарий перед отправкой соответствующих инструкций машинного языка. Преимущество скрипта в том, что он очень портативный. Любой компьютер, на котором установлен соответствующий интерпретатор, может запускать программу более или менее без изменений. Это тоже недостаток, потому что программа вообще не запустится, если интерпретатор недоступен. Как правило, интерпретируемые программы работают медленнее, чем скомпилированные программы, но их легче отлаживать и пересматривать. Другими примерами интерпретируемых языков являются JavaScript и Python.
Скомпилированные программы и интерпретируемые скрипты от промежуточных до специфичных для компьютера — это программы, разработанные для сред выполнения. Таким образом выполняются программы Java и Smalltalk. Создание программ для сред выполнения похоже на написание традиционных скомпилированных программ. Разница в том, что вместо компиляции исходного кода в машинный язык он выводится в виде байтового кода для «виртуальной машины» среды выполнения.Эта виртуальная машина перехватывает инструкции байт-кода и переводит их в команды, специфичные для компьютера. Преимущество этого подхода заключается в том, что среда выполнения быстро компилирует только необходимые фрагменты кода (некоторые части программы могут никогда не выполняться). Это называется своевременной компиляцией. Основным недостатком среды выполнения является то, что плохо спроектированная программа заставит среду выполнения компилировать почти весь код заранее, а затем выполнять избыточные вызовы интерпретатора. Это замедляет загрузку и работу программы.
Каждая программа представляет собой набор инструкций, будь то добавление двух чисел или отправка запроса через Интернет. Компиляторы и интерпретаторы берут удобочитаемый код и преобразуют его в машинный код, читаемый компьютером.
В скомпилированном языке целевая машина напрямую переводит программу. В интерпретируемом языке исходный код не переводится напрямую целевой машиной. Вместо этого другая программа, также известная как интерпретатор, читает и выполняет код.
Хорошо… но что это на самом деле означает?
Представьте, что у вас есть рецепт хумуса, который вы хотите приготовить, но он написан на древнегреческом языке. Есть два способа, которыми вы, не говорящий на древнегреческом языке, можете следовать его указаниям.
Во-первых, если кто-то уже перевел его на английский язык для вас. Вы (и любой другой, кто говорит по-английски) можете прочитать английскую версию рецепта и приготовить хумус. Воспринимайте этот переведенный рецепт как скомпилированную версию.
Второй способ — если у вас есть друг, который знает древнегреческий язык. Когда вы будете готовы приготовить хумус, ваш друг сядет рядом с вами и по ходу будет переводить рецепт на английский язык, строчка за строчкой. В этом случае ваш друг является интерпретатором интерпретированной версии рецепта.
Компилированные языки
Скомпилированные языки преобразуются непосредственно в машинный код, который может выполнять процессор. В результате они, как правило, выполняются быстрее и эффективнее, чем интерпретируемые языки. Они также дают разработчику больший контроль над аппаратными аспектами, такими как управление памятью и использование ЦП.
Скомпилированные языки нуждаются в шаге «сборки» — сначала их нужно скомпилировать вручную. Вам нужно «перестраивать» программу каждый раз, когда вам нужно внести изменения. В нашем примере с хумусом весь перевод пишется до того, как он попадает к вам. Если первоначальный автор решит, что он хочет использовать другой вид оливкового масла, весь рецепт нужно будет снова перевести и отправить вам.
Примерами чисто компилируемых языков являются C, C++, Erlang, Haskell, Rust и Go.
Интерпретируемые языки
Интерпретаторы прогоняют программу построчно и выполняют каждую команду. Здесь, если автор решит, что хочет использовать другой вид оливкового масла, он может вычеркнуть старое и добавить новое. Затем ваш друг-переводчик сможет сообщить вам об этом изменении, как только оно произойдет.
Когда-то интерпретируемые языки работали значительно медленнее, чем компилируемые. Но с развитием компиляции «точно в срок» этот разрыв сокращается.
Примерами распространенных интерпретируемых языков являются PHP, Ruby, Python и JavaScript.
Небольшое предостережение
Большинство языков программирования могут иметь как компилируемые, так и интерпретируемые реализации — сам язык не обязательно компилируется или интерпретируется. Однако для простоты их обычно называют таковыми.
Python, например, может выполняться либо как скомпилированная программа, либо как интерпретируемый язык в интерактивном режиме. С другой стороны, большинство инструментов командной строки, интерфейсов командной строки и оболочек теоретически можно отнести к интерпретируемым языкам.
Преимущества и недостатки
Преимущества компилируемых языков
Программы, скомпилированные в собственный машинный код, как правило, работают быстрее, чем интерпретируемый код. Это связано с тем, что процесс перевода кода во время выполнения увеличивает нагрузку и может привести к замедлению работы программы в целом.
Недостатки компилируемых языков
- Дополнительное время, необходимое для завершения всего шага компиляции перед тестированием.
- Зависимость сгенерированного двоичного кода от платформы
Преимущества интерпретируемых языков
Интерпретируемые языки, как правило, более гибкие и часто предлагают такие функции, как динамическая типизация и меньший размер программы. Кроме того, поскольку интерпретаторы сами выполняют код исходной программы, сам код не зависит от платформы.
Недостатки интерпретируемых языков
Наиболее заметным недостатком является типичная скорость выполнения по сравнению с скомпилированными языками.
Если эта статья была вам полезна, отправьте твит .
Научитесь программировать бесплатно.Учебная программа freeCodeCamp с открытым исходным кодом помогла более чем 40 000 человек получить работу в качестве разработчиков. Начать
freeCodeCamp – это поддерживаемая донорами некоммерческая организация, освобожденная от налогов в соответствии со статьей 501(c)(3) (идентификационный номер федерального налогоплательщика США: 82-0779546)
Наша миссия: помочь людям научиться программировать бесплатно. Мы достигаем этого, создавая тысячи видеороликов, статей и интерактивных уроков по кодированию — все они находятся в свободном доступе. У нас также есть тысячи учебных групп freeCodeCamp по всему миру.
Пожертвования в пользу freeCodeCamp идут на наши образовательные инициативы и помогают оплачивать серверы, услуги и персонал.
Компилятор — это компьютерная программа, преобразующая код, написанный на языке программирования высокого уровня, в машинный код. Это программа, которая переводит удобочитаемый код на язык, понятный компьютерному процессору (двоичные 1 и 0 бит). Компьютер обрабатывает машинный код для выполнения соответствующих задач.
Компилятор должен соответствовать правилам синтаксиса того языка программирования, на котором он написан. Однако компилятор — это всего лишь программа, и он не может исправлять найденные в этой программе ошибки. Итак, если вы допустили ошибку, вам нужно внести изменения в синтаксис вашей программы. В противном случае он не будет скомпилирован.
Что такое переводчик?
Интерпретатор – это компьютерная программа, которая преобразует каждый оператор высокоуровневой программы в машинный код. Сюда входят исходный код, предварительно скомпилированный код и сценарии. И компилятор, и интерпретатор выполняют одну и ту же работу по преобразованию языка программирования более высокого уровня в машинный код. Однако компилятор преобразует код в машинный код (создает исполняемый файл) перед запуском программы. Интерпретаторы преобразуют код в машинный при запуске программы.
КЛЮЧЕВОЕ ОТЛИЧИЕ
- Компилятор преобразует код, написанный на языке программирования высокого уровня, в машинный код сразу перед запуском программы, тогда как интерпретатор преобразует каждый оператор высокоуровневой программы один за другим в машинный код во время выполнения программы.
- Скомпилированный код выполняется быстрее, а интерпретируемый — медленнее.
- Компилятор отображает все ошибки после компиляции, а интерпретатор отображает ошибки каждой строки одну за другой.
- Компилятор основан на модели связывания-загрузки переводов, тогда как интерпретатор основан на методе интерпретации.
- Компилятор принимает всю программу, а интерпретатор — одну строку кода.
Разница между компилятором и интерпретатором
- Создайте программу.
- Compile проанализирует или проанализирует все операторы языка на предмет их правильности. Если неверно, выдает ошибку
- Если ошибки нет, компилятор преобразует исходный код в машинный код.
- Он связывает различные файлы кода в исполняемую программу (известную как exe)
- Запустить программу
- Создать программу
- Без связывания файлов или создания машинного кода
- Исходные операторы, выполняемые построчно ВО ВРЕМЯ выполнения
Роль компилятора
- Компиляторы считывают исходный код, выводят исполняемый код
- Переводит программное обеспечение, написанное на языке более высокого уровня, в инструкции, понятные компьютеру. Он преобразует текст, который пишет программист, в формат, понятный центральному процессору.
- Процесс компиляции относительно сложен. Он тратит много времени на анализ и обработку программы.
- Исполняемый результат представляет собой некую форму двоичного кода, характерного для конкретной машины.
Роль переводчика
- Интерпретатор преобразует исходный код построчно во время выполнения.
- Interpret полностью переводит программу, написанную на языке высокого уровня, на машинный язык.
- Интерпретатор позволяет оценивать и модифицировать программу во время ее выполнения.
- Относительно меньше времени тратится на анализ и обработку программы
- Выполнение программы относительно медленное по сравнению с компилятором
ЯЗЫКИ ВЫСОКОГО УРОВНЯ
Языки высокого уровня, такие как C, C++, JAVA и т. д., очень близки к английскому языку. Это упрощает процесс программирования. Однако перед выполнением его необходимо перевести на машинный язык. Этот процесс перевода выполняется либо компилятором, либо интерпретатором. Также известен как исходный код.
МАШИННЫЙ КОД
Машинные языки очень близки к аппаратному обеспечению. У каждого компьютера есть свой машинный язык. Программы на машинном языке состоят из серий бинарных шаблонов. (Например, 110110) Он представляет собой простые операции, которые должен выполнять компьютер. Программы на машинном языке являются исполняемыми, поэтому их можно запускать напрямую.
КОД ОБЪЕКТА
При компиляции исходного кода машинный код, сгенерированный для разных процессоров, таких как Intel, AMD и ARM, отличается. Чтобы сделать код переносимым, исходный код сначала преобразуется в объектный код. Это промежуточный код (похожий на машинный код), который не поймет ни один процессор. Во время выполнения объектный код преобразуется в машинный код базовой платформы.
Java одновременно компилируется и интерпретируется.
Чтобы использовать относительные преимущества компиляторов, некоторые языки программирования, такие как Java, компилируются и интерпретируются. Сам код Java компилируется в объектный код. Во время выполнения JVM интерпретирует объектный код в машинный код целевого компьютера.
Алекс Аллен
Когда программисты говорят о создании программ, они часто говорят: "Она прекрасно компилируется" или, когда их спрашивают, работает ли программа, "давайте скомпилируем и посмотрим". Это разговорное использование может позже стать источником путаницы для новых программистов. Компиляция — это не совсем то же самое, что создание исполняемого файла! Вместо этого создание исполняемого файла представляет собой многоэтапный процесс, разделенный на две составляющие: компиляцию и компоновку. На самом деле, даже если программа «компилируется нормально», она может не работать из-за ошибок на этапе компоновки. Весь процесс перехода от файлов исходного кода к исполняемому файлу лучше называть сборкой.
Подборка
Под компиляцией понимается обработка файлов исходного кода (.c, .cc или .cpp) и создание «объектного» файла. Этот шаг не создает ничего, что может запустить пользователь. Вместо этого компилятор просто создает инструкции машинного языка, соответствующие скомпилированному файлу исходного кода. Например, если вы скомпилируете (но не свяжете) три отдельных файла, в качестве вывода будут созданы три объектных файла, каждый с именем .o или .obj (расширение зависит от вашего компилятора). Каждый из этих файлов содержит перевод файла вашего исходного кода в файл машинного языка, но вы пока не можете их запустить! Вам нужно превратить их в исполняемые файлы, которые может использовать ваша операционная система. Вот где в дело вступает компоновщик.
Связывание
Связывание означает создание одного исполняемого файла из нескольких объектных файлов. На этом шаге компоновщик обычно жалуется на неопределенные функции (как правило, сам main). Если во время компиляции компилятор не мог найти определение конкретной функции, он просто предполагал, что функция определена в другом файле. Если это не так, то компилятор никак об этом не узнает — он не просматривает содержимое более чем одного файла одновременно. С другой стороны, компоновщик может просмотреть несколько файлов и попытаться найти ссылки на функции, которые не были упомянуты.
Вы можете спросить, зачем нужны отдельные этапы компиляции и компоновки. Во-первых, возможно, так проще реализовать вещи. Компилятор делает свое дело, а компоновщик делает свое дело — разделение функций снижает сложность программы. Еще одно (более очевидное) преимущество заключается в том, что это позволяет создавать большие программы без повторного выполнения шага компиляции каждый раз при изменении файла. Вместо этого, используя так называемую «условную компиляцию», необходимо скомпилировать только те исходные файлы, которые изменились; в остальном объектные файлы являются достаточным входом для компоновщика. Наконец, это упрощает реализацию библиотек предварительно скомпилированного кода: просто создайте объектные файлы и свяжите их так же, как любой другой объектный файл. (Тот факт, что каждый файл компилируется отдельно от информации, содержащейся в других файлах, кстати, называется "моделью раздельной компиляции".)
Чтобы получить все преимущества компиляции условий, вероятно, проще получить программу, которая поможет вам, чем пытаться вспомнить, какие файлы вы изменили с момента последней компиляции. (Конечно, вы можете просто перекомпилировать каждый файл, метка времени которого больше, чем метка времени соответствующего объектного файла.) Если вы работаете с интегрированной средой разработки (IDE), она уже может позаботиться об этом за вас. Если вы используете инструменты командной строки, есть отличная утилита make, которая поставляется с большинством дистрибутивов *nix. Наряду с условной компиляцией у него есть несколько других полезных функций для программирования, таких как возможность различных компиляций вашей программы, например, если у вас есть версия, выдающая подробный вывод для отладки.
Знание разницы между этапом компиляции и этапом компоновки может облегчить поиск ошибок. Ошибки компилятора обычно носят синтаксический характер — пропущенная точка с запятой, лишняя скобка. Ошибки связывания обычно связаны с отсутствием или несколькими определениями.Если вы получаете сообщение об ошибке, что функция или переменная определяется компоновщиком несколько раз, это хороший признак того, что ошибка заключается в том, что два ваших файла с исходным кодом имеют одну и ту же функцию или переменную.
Читайте также: