В 1945 году американские военные обратились к ученым в пенсильванском университете с требованием разработать вычислительную машину, которая будет выполнять сложные расчеты быстро и точно. В результате двое ученных Джон Уильям Моучли и Джон Адам Преспер Эккерт-младший создали первый компьютер (или ЭВМ) под названием ЭНИАК. Кстати, ЭВМ расшифровывается как электронная вычислительная машина.
Эта машина весила 130 тон, содержал 18 тысяч ламп, выполняла 5 тыс. операций в секунду и стоила 3 миллиона долларов.
В СССР первые ламповые компьютеры появились в 1951 году под руководством Сергея Алексеевича Лебедева и назывались МЭСМ (малая электронная счетная машина) и БЭСМ (большая электронная счетная машина).
Эти два компьютера сыграли огромную роль в появлении в нашей стране первых программистов. Также БЭСМ на тот момент являлся самой быстродействующей ЭВМ в мире и выполнял 8 тыс. операций в секунду.
Все ЭВМ делятся на поколения. Так вышеперечисленные машины относятся к компьютерам первого поколения. Архитектура этих машин была основана на лампах. В дальнейшем появлялись компьютеры второго, третьего и четвертого поколения, основной сутью которых был переход от использования ламп к транзисторам и дальнейшим развитием этих транзисторов. Благодаря транзисторам компьютеры стали гораздо меньше, мощней и доступней для большинства людей.
Как и компьютеры сейчас, первые компьютеры понимали только двоичный код (или машинный код), алфавит которого состоял из нулей и единиц. С помощью двоичного кода люди писали для компьютера программы.
Программа – это просто последовательность действий, который должен выполнить компьютер для достижения по поставленной цели. Последовательность действий также называют алгоритмом.
Но каким же образом люди писали программы для первых компьютеров? Это делали помощью устройств похожих на печатные машинки, которые пробивали дырочки на специально вырезанном картоне (они именовались как перфокарты). (уточнить картон вырезанный определенным образом)
Где на определенном участке перфокарты не было дырочки – это означало 0 для компьютера, если была, означало 1.
Помимо перфокарт также использовались перфоленты.
Но писать программы с помощью нулей и единиц было для людей сложно, и особенно сложно было их редактировать или искать ошибки. Чтобы упростить задачу Кэтлин Бут и Дэвид Уилер в 1949 году изобрели специальную машинку для перфокарт под названием Ассемблер. Он также был похож на печатную машинку, но у него была одна ключевая особенность – дело в том, что при работе с двоичным кодом люди часто использовали одни и те же команды, например, знак “+” в двоичном коде пишется таким образом – 00101011. Т.е. если сделать так, чтобы человек писал на специальной машинке для перфокарт знак “+”, а машинка выбивала на перфокарте двоичное представление знака “+” т.е. 00101011, то это существенно облегчало бы жизнь программиста.
По сути данное устройство было переводчиком, которое переводило команды на человеческом языке (+, -, разделить, создать массив данных и т.д.) в машинный код. И программисту надо было знать все эти команды, и как правильно их писать. Все эти правила написания команд и сами команды в последствии назвали – языком ассемблера.
Но у языка Ассеблера есть один минус – так как у большинства компьютеров как в то время, так и сейчас отличаются комплектующие, то для всех них надо писать разные программы. Т.е. вы не можете написать одну программу и запускать ее на разных компьютерах. Еще всё усложняется тем, что и команды и правила написания этих команд тоже отличаются от машины к машине. Получается на одном компьютере у вас один язык ассемблера, на другом другой.
Сейчас все языки программирования подразделяют на языки низкого уровня и высокого. Язык ассемблера, как и сам машинный код относят к языкам низкого уровня, так как чтобы написать программу на этих языках, вам необходимо знать устройство конкретного компьютера, для которого создается программа.
В последствии, люди зная эту проблему, начали разрабатывать языки высокого уровня – где программы могли запускаться на разных компьютерах. Такие языки как С++, JAVA, Python, PHP и многие другие, включая JavaScript являются языками высокого уровня.
Но при неоспоримых преимуществах языков высокого уровня в плане удобства, программы написанные на Ассеблере обычно работают быстрее.
Для каждого языка есть своя программа-переводчик (обычно их называют трансляторами), которые переводят код написанный на языке программирования в машинный код. Трансляторы подразделяются на интерпритаторы, компиляторы и jit-компиляторы.
Начнем с компиляторов. Они сперва переводят код на языке программирования в машинный код, создают файл и сохраняют туда этот код. Запуская на компьютере этот файл (в Виндоус он имеет расширение .exe) вы запускаете программу в машинном коде.
Интерпритаторы, в свою очередь, работают так: читают первую строчку программы, переводят ее в машинный код, и сразу отправляют на выполнение процессором, затем читают вторую строчку, переводят, отправляют на выполнение и т.д.
Программа работающая через интерпретатор запускается гораздо быстрее так как вам не надо ждать пока компилятор переведет весь код в нули и единицы, но программа использующая компилятор работает в разы быстрее, в силу того что компьютер может прочитать весь код сразу, а не ждать строчку за строчкой, пока интерпретатор будет переводить код.
Jit-компиляторы (в переводе just in time, т.е.на лету) зачастую используются в паре с интерпретатором. Т.е. пока интерпретатор выполняет код строчка за строчкой, jit-компилятор анализирует код и самые тяжелые участки кода для процессора заранее компилирует в машинный код. Это повышает скорость программы в среднем на 150%.
Большинство программ-трансляторов для JavaScript являются интерпретаторами, но такие компании как Google и Mozilla для своих трансляторов в браузерах используют git-компиляторы. Думаю, это вопрос времени, когда для JavaScript не останется чистых интерпретаторов, и они все будут работать в паре с jit-компиляторами.
На этом урок заканчивается, до встречи на следующих уроках.