"Информатика", Семакин И.Г., Залогова Л.А., Русаков С.В., Шестакова Л.В.
Языки программирования позволяют записывать команды для компьютера и задавать ему порядок действий. Сначала программы составляли в машинных кодах, понятных процессору, но неудобных для человека и привязанных к конкретной машине. Затем появились ассемблеры с символическими обозначениями, а позже — языки высокого уровня, на которых алгоритмы можно описывать короче и понятнее. Чтобы компьютер выполнил такую программу, её переводят в машинный код или обрабатывают специальным способом. История языков показывает, как новые задачи и развитие техники меняли программирование.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Машинный язык — набор двоичных кодов команд, которые процессор может исполнять непосредственно. Двоичные коды соответствуют устройству компьютера: процессор распознаёт определённые последовательности нулей и единиц как команды. Поэтому для запуска не требуется перевод в другой язык, но человеку такие записи трудно читать и проверять. Машинный язык нужен компьютеру как конечная форма команд.
Язык ассемблера — язык, в котором машинные команды записывают короткими символическими обозначениями, или мнемониками. Например, вместо числового кода программист может использовать условное обозначение операции сложения. Такую запись проще читать и составлять, чем цепочки двоичных цифр. Однако обозначения соответствуют командам конкретного процессора, поэтому ассемблер помогает писать код, но не избавляет от знания устройства машины.
Язык высокого уровня — язык программирования, команды и конструкции которого предназначены для удобного описания алгоритмов, а не для прямого управления отдельными командами процессора. В нём можно записать вычисление или условие в более привычной форме. Это позволяет сосредоточиться на решении задачи, а не на кодах операций. Чтобы компьютер выполнил такую программу, её нужно обработать специальным средством перевода.
Транслятор — программа, которая переводит исходную программу с одного языка программирования в другую форму, понятную компьютеру, либо организует её выполнение. Он связывает запись, удобную программисту, с машинными командами. В зависимости от способа работы транслятор может заранее подготовить программу или обрабатывать её во время исполнения. Без такого шага процессор не сможет выполнить команды, записанные на языке высокого уровня.
Первые программы записывали в машинных кодах, потому что процессор умел непосредственно исполнять именно такие команды. Программисту приходилось представлять алгоритм как последовательность кодов и учитывать, как команды размещаются в памяти. Это было особенно сложно при длинных программах: ошибка в одном знаке могла изменить действие компьютера. Кроме того, набор машинных команд зависел от модели процессора, поэтому программа для одного компьютера обычно не подходила другому без изменений.
Ассемблер появился как способ сделать запись команд понятнее: вместо двоичного кода стали применять мнемоники и символические обозначения. Специальная программа-ассемблер переводила эти обозначения обратно в машинные команды. Человеку стало легче читать текст программы и находить ошибки, но сами действия оставались низкоуровневыми. Нужно было знать команды процессора, регистры и особенности конкретного компьютера, поэтому переносить программу на другую машину было непросто.
По мере развития вычислительной техники компьютеры стали решать больше задач, а программы — увеличиваться. Для записи вычислений и алгоритмов понадобился язык, в котором одна конструкция могла обозначать более сложное действие, чем отдельная команда процессора. Так появились языки высокого уровня: они помогали писать короче и сосредоточиваться на логике задачи. Их правила меньше зависели от конкретного компьютера, но для каждой системы всё равно требовались подходящие средства перевода.
Ранние языки часто создавали для конкретных потребностей. Fortran, появившийся в 1957 году, предназначался прежде всего для научных и инженерных вычислений; COBOL, разработанный в конце 1950-х годов, — для обработки деловой информации. Algol, созданный около 1960 года, помогал записывать алгоритмы и повлиял на развитие языков программирования. Позже BASIC (1964) сделали доступным для обучения и работы на компьютерах, а Pascal (1970) стал использоваться, в частности, для обучения программированию.
Даже удобный язык высокого уровня не становится понятным процессору сам по себе: процессор исполняет машинные команды. Компилятор заранее переводит исходную программу в машинный код или другой исполняемый вариант, который затем запускают. Интерпретатор, напротив, читает и выполняет команды программы по ходу работы, не создавая заранее полностью готовый машинный файл. Оба подхода позволяют использовать высокоуровневые языки, но отличаются тем, когда и как выполняется перевод.
| Этап или период | Язык или группа языков | Главная особенность | Для каких задач применяли |
|---|---|---|---|
| Машинные языки | Двоичные команды процессора | Исполняются непосредственно, зависят от устройства компьютера | Управление компьютером и выполнение любых задач на уровне машинных команд |
| Ассемблеры | Языки с мнемоническими обозначениями | Команды записываются символами, но соответствуют командам процессора | Системное программирование и задачи, требующие точного управления машиной |
| Первые языки высокого уровня | Fortran, COBOL, Algol (1950–1960-е годы) | Ориентированы на запись вычислений, данных и алгоритмов в более удобной форме | Научные и инженерные расчёты, деловая обработка данных |
| Языки общего и учебного назначения | BASIC (1964), Pascal (1970) и другие | Подходят для широкого круга задач или обучения основам программирования | Обучение, создание программ и решение различных практических задач |
Таблица помогает проследить, как менялись удобство записи и степень зависимости от компьютера. Сопоставляйте не только названия и даты, но и потребности, ради которых создавали язык. Один язык не обязательно полностью заменяет другой: выбор зависит от задачи.
Ответ: машинный язык, ассемблер, язык высокого уровня. Чем дальше язык от устройства процессора, тем удобнее описывать задачу, но тем больше требуется обработки перед исполнением.
Ответ: все пять примеров относятся к языкам высокого уровня; первые три связаны с ранним этапом их развития и специализированными задачами, BASIC и Pascal — с более поздним развитием языков для широкого применения и обучения. Назначение языка объясняет, почему его конструкции были удобны для определённых пользователей.
Ответ: перед запуском исходный текст должен пройти обработку, потому что он не является набором команд процессора. Компиляция заранее готовит программу к исполнению, а интерпретация выполняет её поэтапно во время работы.
Считать ассемблер машинным языком — ошибка: в ассемблере используются символические обозначения, которые затем переводят в машинные команды. Их путают, потому что оба языка близки к процессору. Проверьте себя: если запись содержит мнемоники, а не двоичные коды, это ассемблер.
Нельзя заключать, что любой язык высокого уровня автоматически работает на любом компьютере. Язык может быть менее привязан к устройству, но для запуска всё равно нужны подходящие транслятор или среда выполнения. Чтобы проверить переносимость, выясните, есть ли нужные средства для целевой системы.
Язык программирования и транслятор — не одно и то же: язык задаёт правила записи программы, а транслятор обрабатывает её. Путаница возникает потому, что оба связаны с созданием исполняемого результата. Самопроверка проста: спросите, идёт ли речь о правилах исходного текста или о программе, которая его переводит.
Историю языков не следует представлять как полную замену старых языков новыми. Языки продолжают использовать, если они подходят для определённых задач или нужны существующим программам. Проверяйте себя по назначению: разные области могут одновременно выбирать разные языки.
Для понимания истории языков нужно знать, что такое программа, алгоритм, команда и процессор: эти понятия объясняют, что именно записывает программист и что выполняет компьютер. Изучение языков помогает понять назначение среды программирования и путь от исходного текста до исполняемой программы. Дальше эта тема связывается с трансляторами, компиляцией, интерпретацией и этапами разработки программ. Так становится яснее, почему запись программы и её выполнение — связанные, но разные процессы.
Почему машинный язык трудно использовать для написания больших программ?
Команды записываются двоичными кодами, которые сложно читать и легко перепутать. Кроме того, программисту приходится помнить устройство команд конкретного процессора.
Чем ассемблер отличается от машинного языка?
В машинном языке команды представлены двоичными кодами, а в ассемблере — короткими символьными обозначениями. Ассемблер всё равно близок к устройству процессора, и его программу нужно перевести в машинные команды.
Почему языки программирования высокого уровня называют высокоуровневыми?
Их команды и конструкции больше похожи на привычное описание действий и математических операций, чем на команды процессора. Программисту не нужно записывать каждую операцию в двоичном виде.
Зачем нужен транслятор?
Транслятор обрабатывает программу, записанную на одном языке, и переводит её в форму, которую может выполнить компьютер. Например, он может преобразовать исходный текст на языке высокого уровня в машинный код.
Почему старые языки программирования не исчезают полностью?
Язык может оставаться удобным или необходимым для определённой области, например для работы со старыми программами и системами. Языки не просто сменяют друг друга: они продолжают применяться для разных задач.
2.4. История языков программирования