Языки программирования

Двоичная запись информации крайне неудобна для человека, поэтому довольно быстро от двоичной записи перешли к восьмеричной записи, а затем к шестнадцатеричной.

О шестнадцатеричной системе счисления разговор отдельный, а пока рассмотрим пример шестнадцатеричной записи машинной команды сложения, который был приведен при изучении основ компьютерного «языка» и «мышления». Итак, для того, чтобы подать компьютеру команду сложения целых чисел, ему необходимо записать следующее:

 00000001000011010000111000001010

Думается, что далеко не каждый человек сможет быстро записать эту череду нулей и единиц без ошибок, и уж тем более – запомнить ее. А вот такая запись этой же команды смотрится уже значительно проще:

010D0E0A

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

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

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

Шестнадцатеричная или восьмеричная запись команд стала первым языком программирования, требующим перевода на машинный язык. Такие языки были названы языками программирования первого поколения, 1GL (1 Generation Language).

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

Договорились обозначать команды сокращенной записью действий, которых они требуют от машины, а ячейки памяти какими-нибудь именами. Например, команду сложения целых чисел, которая в двоичной записи выглядит так: 00000001000011010000111000001010, а в шестнадцатеричной — 010D0E0A, теперь обозначают ADD – от английского глагола «прибавить». Тогда предыдущий пример для целых чисел А и В можно записать в таком виде:

ADD А, В, С.

Эта запись уже вполне приемлема для человека, и даже имеющий отдаленное представление о программировании индивидуум, может догадаться, чего в данном случае требуется от компьютера. Ну а то, что компьютер эту запись прочитать не может, уже не столь важно – в любом случае ему необходим переводчик, с которым он может общаться значительно быстрее, чем человек, пытающийся преобразовать команды в двоичную систему исчисления. Программа, переводящая символьную запись в двоичный код, была названа ассемблером, а язык – языком ассемблера. Языки ассемблера составили второе поколение языков программирования – 2GL.

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

С = А + В

Это был революционный прорыв. Теперь программисту не надо было думать о том, какие машинные команды будут выполняться в его программе. Он может вообще не знать систему команд компьютера. Более того, он может даже не знать тип компьютера, для которого пишет программу. Такими языками (языками третьего поколения, 3GL)  мы пользуемся до сих пор. Первым языком третьего поколения был язык вычисления формул FORTRAN, потом появился Algol и множество других, среди которых ныне здравствующие – Pascal, C, C++, Java, C#.

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

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

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

Самым ярким примером языка четвертого поколения стал язык SQL (Structured Query Language), на котором происходит обращение к базам данных. На этом языке мы можем, например, записать команду, гласящую: «Выбери из базы данных сведения обо всех Ивановых, родившихся в марте 1983 года и не получивших высшее образование». Компилятор сам сгенерирует необходимые для выполнения этой команды действия и запишет их на машинном языке.

Попытки создать языки пятого поколения, основанные на голосовом вводе обычных для человека указаний типа: «Реши-ка мне дифференциальное уравнение», оказались неудачными и незаметно были сняты с повестки дня. Неожиданные новшества в создании новых языков прекратились. Теперь языки программирования развиваются постепенно, без заметных скачков и революционных переворотов.

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

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

Кроме того, языки бывают низкоуровневые и высокоуровневые, компилируемые и интерпретируемые.



Rambler's Top100