Skip to main content

Java

trigger

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

Языки высокого уровня

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

Основным рабочим инструментом у этих языков вместо регистров стали переменные. Переменная - это область памяти, которой присвоены имя и правила перевода её из человекопонятного вида в машинный и обратно. Эти правила называются типом переменной.

Хотя название переменным можно давать любое, принято давать им осмысленные названия. Например, переменная, в которой мы бы хранили число тех или иных событий, правильно называть её count или cnt. Однако в школьном курсе программирования допустимо

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

Как при составлении логических схем процессора мы не учитывали физическую реализацию, так и при работе с алгоритмическими языками нам не важно, какими именно логическими схемами и системой команд будет это достигнуто. Мы составляем только алгоритм, т.е. последовательность абстрактных действий.

Задачу с хранением типов более-менее понятно, как решить. Мы просто вместе с адресом будем хранить её название и дальше, встретив название в тексте, просто подставим адрес и с помощью информации о типе легко переведём значение из удобного нам формата записи, в удобный машине.

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

Самым эффективным способом хранения переменных является стек. Да, есть и другие способы хранения, но их в рамках данного курса мы рассматривать не будем.

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

Однако у стека есть одно серьёзное ограничение: все данные добавляются в него последовательно и также последовательно извлекаются. Поэтому если мы сохранили 5 переменных, а хотим удалить или прочитать значение третьей, то нам необходимо удалить из стека сначала пятую, а потом четвёртую, и только после этого нам станет доступна нужная нам переменная.

trigger

Хотя такой подход может показаться неудобным, но он очень полезен при написании функций. К тому же стек хорошо оптимизируется и может даже храниться в кэш-памяти процессора, а это даёт огромный прирост скорости вычислений.

На алгоритмическом уровне прогресс не остановился. Стало понятно, что переменные и алгоритмы можно группировать та кже, как раньше группировались команды. Такие объединения стали называть объектами, а сам подход объектно-ориентированным. Подробнее будет написано здесь.

Виртуальная машина

Java относительно молодой язык и при его проектировании был использован объектно-ориентированны подход. Однако в нём есть алгоритмическая часть, которая работает с так называемыми базовыми типами, они точно также создаются на стеке.

Это сделано из-за того, что при переходе на каждый новый уровень абстракции, нам нужно писать меньше кода, но зато наше решение менее эффективное.

Многие задачи не требуют объектно-ориентированного подхода и решаются с помощью обычных алгоритмов и переменных. Именно для этих целей в java они сохранены.

Правда, у Java есть вторая особенность. Она не компилирует алгоритмы в машинные коды для процессора. Создатели этого языка пошли дальше и решили, что между процессором, получающим команды и компилятором, формирующем его можно добавить ещё один уровень.

Этот уровень называется "виртуальная машина". Программа, запущенная на ней, посылает коды не настоящему процессору, а виртуальному, который работает, как часть программы (такие коды в Java называются байт-коды), а уже сама программа, когда нужно, отправляет свои команды настоящему процессору.

Java и Эльбрус

Компания Унипро в Новосибрске разрабатывает свою виртуальную машину java под архитектуру Эльбрус. Подробнее можно прочитать здесь.

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

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

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