В чем преимущество используемой в java системы трансляции выполнения программ
Java – один из самых распространенных и надежных языков для разработки приложений и ПО. У него есть широкий набор различных инструментов, которые могут значительно облегчить этот процесс. Почему специалисты выбирают Java, расскажет эксперт в области разработки и архитектуры ПО учебного центра Luxoft Training Михаил Соколов.
Java – объектно-ориентированный язык программирования. На нем пишут серверный софт, программы для персональных компьютеров и мобильные приложения для разных целей и задач. Рассмотрим 7 причин, почему сейчас для изучения стоит выбрать Java.
№ 1 — Сильное Java-community
По данным Java, этот язык объединяет 5 млн студентов и 12 млн разработчиков по всему миру – от авторов библиотек до целых компаний. Здесь даже начинающий специалист сможет легко найти готовые куски кода для решения своих задач или ответы на любые вопросы.
Сообщество организованно и активно участвует в жизни языка, развивает его, а также разрабатывает множество библиотек и инструментов, в том числе для серверной разработки. Благодаря community экосистема Java продолжает расти и легко адаптируется под современные требования.
№ 2 — Многообразие инструментов
Java содержит большое количество библиотек для решения типовых задач, API, сред разработки и фреймворков для создания программ и приложений разной степени сложности. Возможности этого языка постоянно обновляются.
Многообразие инструментов Java для серверной разработки позволяет писать программы быстрее, с меньшим количеством потенциальных ошибок и проблем, а значит сократить время вывода решений на рынок. И эта особенность языка делает его привлекательным для корпоративных приложений.
№ 3 — Java virtual machine
Java – это не только язык программирования, но и среда исполнения кода (runtime). Позволяет писать достаточно производительное ПО. Многие языки программирования используют Java runtime в качестве среды исполнения. Например, Groovy, Clojure, Scala, Kotlin, а также существуют версии Python, JRuby, работающие на JVM. Создатели этих языков выбрали Java virtual machine из-за ее производительности, кроссплатформенности, а также возможности использовать многообразие библиотек и инструментов Java.
№ 4 — Кроссплатформенность Java
Java – кроссплатформенный язык. Недаром одним из главных слоганов этого языка до сих пор является – Write once, run anywhere.Он позволяет разработчику создать переносимый код, то есть написать программу один раз и исполнять ее в нескольких операционных системах (Windows, Linux и MacOS) без изменения. Достичь этой гибкости языку позволяет JVM.
№ 5— Обратная совместимость
Стремление Java к обратной совместимости, с одной стороны, тормозит его рост и развитие, а с другой является неоспоримым преимуществом, особенно для корпоративных приложений. Эта характеристика дает ощущение стабильности и уверенности в том, что с каждой новой версией языка приложение будет работать.
№ 6 — Многочисленные способы для изучения Java
Сегодня есть много доступных инструментов для изучения этого языка. На рынке представлено огромное количество соответствующего материала: книги, статьи, семинары, подкасты, конференции, курсы.
Но часто бывает, что специалисту просто не хватает времени или понимания, чтобы сделать первый шаг в определенной области. Получить базу по конкретной теме или вектор для движения можно на специализированных курсах и тренингах. Это будет полезно не только профессионалам, желающим изучить возможности новой версии, API или библиотеки. Для начинающих разработчиков, которые еще только входят в профессию, хотят быть востребованными на рынке и построить успешную карьеру, такой способ получения знаний будет более предпочтительным.
№ 7 — Возможность быть востребованным на рынке
Роль автоматизации в бизнесе растет. При этом наблюдается дефицит кадров на рынке труда. Согласно отчету CompTIA, в декабре 2020 года объем нанимаемых IT-специалистов в США вырос на 391 тысячу человек, при этом наибольшая доля новых предложений – 62 900 – приходится на разработчиков программного обеспечения и приложений.
Рейтинг сообщества программистов TIOBE говорит, что Java в июле 2021 года занимает второе место, уступая лишь языку C. Напомню, этот индекс широко используется, чтобы проверить, актуальны ли ваши навыки программирования, или помочь вам принять стратегическое решение. какой язык программирования вам следует принять при создании новой программной системы.
В России для разработчиков на Java, например, на одном только Headhunter опубликовано почти 12 тысяч вакансий. Поэтому в разработку можно идти и в нашей стране. Там вас будет ждать много интересных и сложных задач. А знание такого востребованного языка, как Java, будет полезным для старта карьеры в IT. Но не забывайте, что современный разработчик должен знать не только языки программирования и популярные фреймворки, но и хорошо ориентироваться в архитектуре ПО, а также быть коммуникабельным и обладать рядом soft skills, поскольку разработка – это командная работа.
Рассмотрение истории создания и развития языка Java было бы неполным без описания особенностей, характерных для Java. Основным фактором, обусловившим изобретение Java, стала потребность в обеспечении переносимости и безопасности, но свою роль в формировании окончательной версии языка сыграли и другие факторы. Группа разработчиков обобщила основные понятия Java и составила следующий перечень его особенностей:
- простота;
- безопасность;
- переносимость;
- объектная ориентированность;
- надежность;
- многопоточность;
- архитектурная нейтральность;
- интерпретируемость;
- высокая производительность;
- распределенность;
- динамичность.
Мы уже рассмотрели такие особенности, как безопасность и переносимость. А теперь поясним значение остальных элементов этого списка.
Простота
Язык Java был задуман как простой в изучении и эффективный в употреблении профессиональными программистами. Овладеть языком Java тем, у кого имеется некоторый опыт программирования, не составит особого труда. Если же вы уже знакомы с основными принципами объектно-ориентированного программирования, то изучить Java вам будет еще проще. А от тех, кто имеет опыт программирования на C++, переход к java вообще потребует минимум усилий. Язык Java наследует синтаксис C/C++ и многие объектно-ориентированные свойства C++, поэтому для большинства программистов изучение Java не составит больших трудностей.
Объектная ориентированность
Хотя предшественники языка Java и оказали влияние на его архитектуру и синтаксис, при его проектировании не ставилась задача совместимости по исходному коду с каким-нибудь другим языком. Это позволило группе разработчиков создавать Java, по существу, с чистого листа. Одним из следствий этого явился четкий, практичный, прагматичный подход к объектам. Помимо того, что язык Java позаимствовал свойства многих удачных объектно-программных сред, разработанных на протяжении нескольких последних десятилетий, в нем удалось достичь золотой середины между строгим соблюдением принципа “все элементы программы являются объектами” и более прагматичного принципа “прочь с дороги”. Объектная модель Java проста и легко расширяема. В то же время такие элементарные типы данных, как целочисленные, сохраняются в виде высокопроизводительных компонентов, не являющихся объектами.
Надежность
Многоплатформенная среда веб предъявляет к программам повышенные требования, поскольку они должны надежно выполняться в разнотипных системах. Поэтому способность создавать надежные программы была одним из главных приоритетов при pa3pa6oTKeJava. Для обеспечения надежности Bjava накладывается ряд ограничений в нескольких наиболее важных областях, что вынуждает программистов выявлять ошибки на ранних этапах разработки программы. В то же время Java избавляет от необходимости беспокоиться по поводу многих наиболее часто встречающихся ошибок программирования. А поскольку Java — строго типизированный язык, то проверка кода выполняется во время компиляции. Но проверка кода делается и во время выполнения. В результате многие трудно обнаруживаемые программные ошибки, которые часто приводят к возникновению с трудом воспроизводимых ситуаций во время выполнения, попросту невозможны в программе Hajava. Предсказуемость кода в разных ситуациях — одна из основных особенностей Java.
Чтобы понять, каким образом достигается надежность программ на Java, рассмотрим две основные причины программных сбоев: ошибки управления памятью и неправильная обработка исключений (т.е. ошибки при выполнении). В традиционных средах создания программ управление памятью — сложная и трудоемкая задача. Например, в среде C/C++ программист должен вручную резервировать и освобождать всю динамически распределяемую память. Иногда это ведет к возникновению трудностей, поскольку программисты забывают освободить ранее зарезервированную память или, что еще хуже, пытаются освободить область памяти, все еще используемую другой частью кода. Java полностью исключает такие ситуации, автоматически управляя резервированием и освобождением памяти. (Освобождение оперативной памяти полностью выполняется автоматически, поскольку Java предоставляет средства сборки неиспользуемых объектов в “мусор”.) В традиционных средах условия для исключений часто возникают в таких ситуациях, как деление на нуль или отсутствие искомого файла, а управление ими должно осуществляться с помощью громоздких и трудных для понимания конструкций. Java облегчает выполнение этой задачи, предлагая объектно-ориентированный механизм обработки исключений. В грамотно написанной программе Hajava все ошибки при выполнении могут (и должны) обрабатываться самой программой.
Многопоточность
Язык Java был разработан в ответ на потребность создавать интерактивные сетевые программы. Для этой цели в Java поддерживается написание многопоточных программ, способных одновременно выполнять многие действия. Исполняющая система Java содержит изящное, но вместе с тем сложное решение задачи синхронизации многих процессов, которое позволяет строить устойчиво работающие интерактивные системы. Простой подход к организации многопоточной обработки, реализованный в java, позволяет программистам сосредоточивать основное внимание на конкретном поведении программы, а не на создании многозадачной подсистемы.
Архитектурная нейтральность
Основной задачей, которую ставили перед собой разработчики Java, было обеспечение долговечности и переносимости кода. Одной из главных трудностей, стоявших перед разработчиками, когда они создавали Java, было отсутствие всяких гарантий, что код, написанный сегодня, будет успешно выполняться завтра — даже на одном и том же компьютере. Операционные системы и процессоры постоянно совершенствуются, и любые изменения в основных системных ресурсах могут стать причиной неработоспособности программ. Пытаясь каким-то образом изменить это положение, разработчики приняли ряд жестких решений в самом языке и виртуальной машине Java. Они поставили перед собой следующую цель:
“написано однажды, выполняется везде, в любое время и всегда”. И эта цель была в значительной степени достигнута.
Интерпретируемость и высокая производительность
Как упоминалось ранее, выполняя компиляцию программ в промежуточное представление, называемое байт-кодом, Java позволяет создавать межплатформенные программы. Такой код может выполняться в любой системе, на которой реализована виртуальная машина JVM. С первых же попыток разработать межплатформенные решения удалось достичь поставленной цели, хотя и за счет снижения производительности. Как пояснялось ранее, байт-код Java был тщательно разработан таким образом, чтобы его можно было с высокой эффективностью преобразовывать непосредственно в машинозависимый код на конкретной платформе с помощью динамического компилятора. Исполняющие системы Java, обеспечивающие такую возможность, сохраняют все преимущества кода, не зависящего от конкретной платформы.
Распределенность
Язык Java предназначен для распределенной среды Интернета, поскольку он поддерживает семейство сетевых протоколов TCP/IP. По существу, обращение к ресурсу по унифицированному указателю информационного ресурса (URL) мало чем отличается от обращения к файлу. В Java поддерживается также удаленный вызов методов (RMI — Remote Method Invocation). Такая возможность позволяет вызывать методы из программ через сеть.
Динамичность
Программы на Java содержат значительный объем данных динамического типа, используемых для проверки полномочий и разрешения доступа к объектам во время выполнения. Это позволяет безопасно и рационально выполнять динамическое связывание кода. Данное обстоятельство исключительно важно для устойчивости среды Java, где небольшие фрагменты байт-кода могут динамически обновляться в действующей системе.
На появление первой версии Java в 1996 году откликнулись не только специализирующиеся на вычислительной технике газеты и журналы, но даже такие солидные издания, как The New York Times, The Washington Post и Business Week. Java — единственный язык программирования, удостоившийся десятиминутного репортажа на Национальном общественном радио в США. Для разработки и сопровождения программных продуктов только на этом языке программирования был учрежден венчурный фонд в 100 млн. долларов. Это было удивительное время. Тем временам и последующей истории развития языка Java посвящена эта статья.
Программная платформа Java
В первом издании этой книги о Java было сказано следующее: "Как язык программирования, Java перевыполнил рекламные обещания. Определенно Java — хороший язык программирования. Несомненно, это один из лучших языков, доступных серьезным программистам. Потенциально Java имел все предпосылки, чтобы стать великим языком программирования, но теперь время для этого уже, вероятно, упущено. Как только появляется новый язык программирования, сразу же возникает неприятная проблема его совместимости с созданным раньше программным обеспечением".
По поводу этого абзаца наш редактор долго спорил с одним из руководителей компании Sun Microsystems. Но и сейчас, по прошествии длительного времени, такая оценка кажется нам правильной. Действительно, Java обладает целым рядом преимуществ, о которых мы поговорим чуть позже. Но более поздние дополнения далеко не так изящны, как исходный вариант этого языка программирования, и виной тому пресловутые требования совместимости.
Java никогда не был только языком. Хорошие языки — не редкость, а появление некоторых из них вызвало в свое время настоящую сенсацию в области вычислительной техники. В отличие от них, Java — это программная платформа , включающая в себя мощную библиотеку, большой объем кода, пригодного для повторного использования, а также среду для выполнения программ, которая обеспечивает безопасность, независимость от операционной системы и автоматическую "сборку мусора".
Программистам нужны языки с четкими синтаксическими правилами и понятной семантикой (т.е. определенно не C++). Такому требованию, помимо Java, отвечают десятки языков. Некоторые из них даже обеспечивают переносимость и "сборку мусора", но их библиотеки оставляют желать много лучшего. В итоге программисты вынуждены самостоятельно реализовывать графические операции, доступ к сети и базе данных и другие часто встречающиеся процедуры. Java объединяет в себе прекрасный язык, высококачественную среду выполнения программ и обширную библиотеку. В результате многие программисты остановили свой выбор именно на Java.
Характерные особенности и достоинства Java
Создатели Java написали руководство, в котором объяснялись цели и достоинства нового языка. В этом документе приведено одиннадцать характерных особенностей Java. Этот язык:
- простой;
- объектно-ориентированный;
- распределенный;
- надежный;
- безопасный;
- не зависящий от архитектуры компьютера;
- переносимый;
- интерпретируемый;
- высокопроизводительный;
- многопоточный;
- динамичный.
В данном разделе блога мы:
- приведем цитаты из руководства по Java, раскрывающие особенности этого языка программирования;
- поделимся с читателями соображениями по поводу отдельных характеристик языка Java, основываясь на собственном опыте работы с его текущей версией.
НА ЗАМЕТКУ! Руководство по Java
Простота
"Мы хотели создать систему; которая позволяла бы легко писать программы, не требовала дополнительного обучения и учитывала сложившуюся практику и стандарты программирования. Мы считали C++ не совсем подходящим для этих целей, но чтобы сделать систему более доступной, язык Java был разработан как можно более похожим на C++. А исключили мы лишь редко используемые; малопонятные и невразумительные средства C++, которые, по нашему мнению, приносят больше вреда, чем пользы".
Если вы привыкли к визуальной среде программирования (например, Visual Basic), язык Java может показаться вам сложным. Его синтаксис некоторые считают странным, хотя понять его не составляет большого труда. Но важнее другое: пользуясь Java, приходится больше программировать. Начинающие программисты нередко предпочитают язык Visual Basic, поскольку его визуальная среда программирования позволяет почти автоматически создавать инфраструктуру приложения. Чтобы достичь того же результата средствами Java, придется вручную написать довольно большой объем кода. Существуют, однако, интегрированные среды разработки (ИСР) от независимых производителей, которые позволяют программировать в стиле перетаскивания.
"Другой аспект простоты — краткость. Одна из целей языка Java — обеспечить разработку независимых программ, способных выполняться на машинах с ограниченным объемом ресурсов. Размер основного интерпретатора и средств поддержки классов составляет около 40 Кбайт; стандартные библиотеки и средства поддержки потоков, в том числе автономное микроядро, занимают еще 175 Кбайт".
На то время это было впечатляющим достижением. Разумеется, с тех пор библиотеки разрослись до гигантских размеров. Но теперь существует отдельная платформа Java Micro Edition с компактными библиотеками, более подходящая для встроенных устройств.
Объектно-ориентированный характер
"По существу, объектно-ориентированное проектирование — это методика программирования, в центре внимания которой находятся данные (т.е. объекты) и интерфейсы этих объектов. Проводя аналогию со столярным делом, можно сказать, что "объектно-ориентированный" мастер сосредоточен в первую очередь на стуле, который он изготавливает, и лишь во вторую очередь его интересуют необходимые для этого инструменты; в то же время "не объектно-ориентированный" столяр думает в первую очередь о своих инструментах. Объектно-ориентированные средства Java и C++ по существу совпадают".
За прошедшие тридцать лет объектно-ориентированный подход уже доказал свое право на жизнь, и без него невозможно представить себе современный язык программирования. Действительно, особенности Java, связанные с объектами, сравнимы с языком C++. Основное отличие между ними заключается в механизме множественного наследования, который в языке Java заменен более простым понятием интерфейсов, а также в модели метаклассов Java.
Поддержка распределенных вычислений в сети
"Язык Java предоставляет разработчику обширную библиотеку программ для передачи данных по протоколу TCP/IP, HTTP и FTP. Приложения на Java способны открывать объекты и получать к ним доступ по сети с такой же легкостью, как и в локальной файловой системе, используя URL для адресации".
Язык Java предоставляет эффективные и удобные средства для работы в сети. Всякий, когда-либо пытавшийся писать программы на других языках для работы в Интернете, будет приятно удивлен тем, насколько просто на Java решаются самые трудные задачи, например установление сокетных соединений. (Работа в сети будет подробно обсуждаться во втором томе данной книги.) Связь между распределенными объектами в Java обеспечивается механизмом вызова удаленных методов (эта тема также рассматривается во втором томе).
Надежность
"Язык Java предназначен для написания программ, которые должны надежно работать в любых условиях. Основное внимание в этом языке уделяется раннему обнаружению возможных ошибок, контролю в процессе выполнения программы, а также устранению ситуаций, которые могут вызвать ошибки. Единственное существенное отличие языка Java от C++ кроется в модели указателей, принятой в Java, которая исключает возможность записи в произвольно выбранную область памяти и повреждения данных".
И эта характеристика языка очень полезна. Компилятор Java выявляет такие ошибки, которые в других языках обнаруживаются только на этапе выполнения программы. Кроме того, программисты, потратившие многие часы на поиски ошибки, вызвавшей нарушения данных в памяти из-за неверного указателя, будут обрадованы тем, что в работе с Java подобные осложнения не могут даже в принципе возникнуть.
Если вам приходилось раньше программировать на Visual Basic или другом языке, где указатели явным образом не применяются, то у вас может возникнуть недоумение, почему этот вопрос настолько важен. Программирующим на С нужны указатели для доступа к символьным строкам, массивам, объектам и даже файлам.
При программировании на Visual Basic ничего подобного не требуется, и разработчик может не беспокоиться о распределении памяти для хранения объектов. С другой стороны, многие структуры данных в языке, не имеющем указателей, реализовать очень трудно. В Java выбрана золотая середина. Для простых конструкций, вроде символьных строк и массивов, указатели не нужны. Но в то же время указателями можно в полной мере воспользоваться там, где без них нельзя обойтись, например, при составлении связных списков. Программирующий на Java полностью защищен, поскольку он никогда не обратится к неправильному указателю, не допустит ошибок выделения памяти, и ему не придется искать причины утечек памяти.
Безопасность
"Язык Java предназначен для использования в сетевой или распределенной среде. По этой причине большое внимание было уделено безопасности. Java позволяет создавать системы, защищенные от вирусов и несанкционированного доступа".
В первом издании мы предостерегали: "Никогда не говорите никогда", и оказались правы. Вскоре после выхода первой версии Java Development Kit группа экспертов по вопросам безопасности из Принстонского университета обнаружила первые ошибки в системе защиты Java 1.0. Компания Sun Microsystems развернула исследования в области безопасности программ на Java. В частности, она обнародовала спецификацию и код виртуальной машины и библиотек, ответственных за защиту. Это ускорило выявление и устранение ошибок. Так или иначе, создатели Java сильно затруднили задачу обхода ее механизмов безопасности. Обнаруженные с тех пор ошибки носили лишь технический характер и были совсем не многочисленны.
Ниже перечислены некоторые виды нарушения защиты, которые с самого начала предотвращает система безопасности Java.
- Намеренное переполнение стека выполняемой программы — один из распространенных способов нарушения защиты, используемых вирусами и "червями".
- Повреждение данных на участках памяти, находящихся за пределами пространства, выделенного процессу.
- Несанкционированное чтение файлов и их модификация.
Со временем в Java был добавлен ряд новых средств защиты. Так, в версии Java 1.1 появилось понятие классов с цифровой подписью (подробнее об этом — во втором томе). Пользуясь таким классом, вы получаете сведения об его авторе. Если вы доверяете автору класса, то можете предоставить этому классу все необходимые полномочия на своей машине.
НА ЗАМЕТКУ!
Независимость от архитектуры компьютера
"Компилятор генерирует объектный файл,, формат которого не зависит от архитектуры компьютера. Скомпилированная программа может выполняться на любых процессорах, а для ее работы требуется лишь исполняющая система Java. Код, генерируемый компилятором Java, называется байт-кодом. Он разработан таким образом, чтобы его можно было легко интерпретировать на любой машине или оперативно преобразовать в собственный машинный код".
Эта идея не нова. Более тридцати лет назад она была предложена Никлаусом Виртом (Niclaus Wirth) для языка Pascal. Эта же технология была реализована в системе UCSD Pascal.
Следует отметить и ряд других преимуществ виртуальной машины по сравнению с непосредственным выполнением программы. Она существенно повышает безопасность, поскольку в процессе работы можно оценить последствия выполнения каждой конкретной команды. Некоторые программы способны даже генерировать байт-код по ходу выполнения, динамически расширяя свои функциональные возможности.
Переносимость
"В отличие от С и C++, ни один из аспектов спецификации Java не зависит от реализации. Разрядность примитивных типов данных и арифметические операции над ними строго определены".
Например, тип int в Java всегда означает 32-разрядное целое число. А в С и C++ тип int может означать как 16-, так и 32-разрядное целое число. Единственное ограничение состоит в том, что разрядность типа int не может быть меньше разрядности типа short int и больше разрядности типа long int. Фиксированная разрядность числовых типов данных позволяет избежать многих неприятностей, связанных с выполнением программ на разных компьютерах. Двоичные данные хранятся и передаются в неизменном формате, что также позволяет избежать недоразумений, связанных с разным порядком следования байтов на различных платформах. Строки сохраняются в стандартном формате Unicode.
"Библиотеки, являющиеся частью системы, предоставляют переносимые интерфейсы. Например, в Java предусмотрен абстрактный класс Window и его реализации для операционных систем Unix, Windows и Macintosh".
Всякий, когда-либо пытавшийся написать программу, которая одинаково хорошо работала бы под управлением операционных систем Windows, Macintosh и десятка разновидностей ОС Unix, знает, что это очень трудная задача. Разработчики версии Java 1.0 предприняли героическую попытку решить эту задачу, предоставив простой набор инструментальных средств, приспосабливающий обычные элементы пользовательского интерфейса к различным платформам. К сожалению, библиотека, на которую было затрачено немало труда, не позволила достичь приемлемых результатов в разных системах. (В реализациях графических программ на разных платформах нередко проявлялись характерные ошибки.) Но это было лишь началом. Во многих приложениях машинная независимость оказалась намного важнее изысканности графического пользовательского интерфейса. Именно эти приложения выиграли от появления версии Java 1.0. А ныне инструментальный набор для создания графического пользовательского интерфейса (ГПИ) полностью переработан и больше не зависит от интерфейсных средств, используемых на конкретном компьютере. Теперь он выглядит вполне согласованным и, по нашему мнению, намного более привлекательным для пользователя, чем в прежних версиях.
Интепретируемость
"Интерпретатор Java может выполнять байт-код непосредственно на любой машине, на которую перенесен интерпретатор. А поскольку процесс компоновки носит в большей степени пошаговый и относительно простой характер, то процесс разработки программ может быть заметно ускорен, став более творческим ".
Пошаговая компоновка имеет свои преимущества, но ее выгоды для процесса разработки, очевидно, переоцениваются. Первоначально инструментальные средства разработки на Java были довольно медленными. А ныне байт-код транслируется в машинный код динамическим компилятором.
Производительность
"Обычно интерпретируемый байт-код имеет достаточную производительность, но бывают ситуации, когда требуется еще более высокая производительность. Байт-код можно транслировать во время выполнения программы в машинный код для того процессора, на котором выполняется данное приложение".
На ранней стадии развития Java многие пользователи были не согласны с утверждением, что производительности "более чем достаточно". Но теперь динамические компиляторы (называемые иначе JIT-компиляторами) настолько усовершенствованы, что могут конкурировать с традиционными компиляторами, а в некоторых случаях они даже дают выигрыш в производительности, поскольку имеют больше доступной информации. Так, например, динамический компилятор может отслеживать код, который выполняется чаще, и оптимизировать по быстродействию только эту часть кода. Динамическому компилятору известно, какие именно классы были загружены. Он может сначала применить встраивание, когда определенная функция вообще не переопределяется на основании загруженной коллекции классов, а затем отменить, если потребуется, такую оптимизацию.
Многопоточность
"К преимуществам многопоточности относится более высокая интерактивная реакция и поведение программ в реальном масштабе времени".
Если вы когда-либо пытались организовать многопоточную обработку на каком-нибудь из языков программирования, то будете приятно удивлены тем, насколько это легко сделать на Java. В потоках, организуемых на Java, могут быть использованы преимущества многопроцессорных систем, если операционная система допускает такую возможность. К сожалению, реализации потоков в большинстве систем сильно отличаются друг от друга, а разработчики Java не предпринимают должных усилий, чтобы достичь независимости от платформы и в этом вопросе. Только код для вызо- ва потоков остается одинаковым для всех машин, а ответственность за их поддержку возлагается на операционную систему или библиотеку потоков. Несмотря на это, именно простота организации многопоточной обработки делает язык Java таким привлекательным для разработю! серверного программного обеспечения.
Динамичность
"Во многих отношениях язык Java является более динамичным, чем языки С и C++. Он был разработан таким образом, чтобы легко адаптироваться к постоянно изменяющейся среде. В библиотеки можно свободно включать новые методы и объекты, ни коим образом не затрагивая приложения, пользующиеся библиотеками. В Java совсем не трудно получить информацию о ходе выполнения программы".
Это очень важно в тех случаях, когда требуется добавить код в уже выполняющуюся программу. Ярким тому примером служит код, загружаемый из Интернета для выполнения браузером. В версии Java 1.0 получить информацию о работающей программе было непросто, но в последних версиях Java программирующий получает полное представление как о структуре, так и о поведении объектов. Это весьма ценно для систем, которые должны анализировать объекты в ходе выполнения программы. К таким системам относятся средства построения графического пользовательского интерфейса, интеллектуальные отладчики, подключаемые компоненты и объектные базы данных.
Хотите улучшить этот вопрос? Обновите вопрос, чтобы он фокусировался только на одной проблеме, отредактировав этот пост .
Закрыт 3 года назад .
Меня спросили об этом на интервью, и я не уверен, что дал лучший ответ, который мог дать. Я упоминал, что вы можете выполнять параллельный поиск и что нулевые значения обрабатывались каким-то способом, который я не мог вспомнить. Теперь я понимаю, что думал о Optionals. Что мне здесь не хватает? Они утверждают, что это лучший или более сжатый код, но я не уверен, что согласен.
Учитывая, насколько кратко на него был дан ответ, кажется, что это был не слишком широкий вопрос.
Если они задают этот вопрос на собеседовании, а они явно задают этот вопрос, какой цели может служить его разбивка, кроме как затруднить поиск ответа? Я имею в виду, что ты ищешь? Я мог бы разбить вопрос и получить ответы на все подвопросы, но затем создать родительский вопрос со ссылками на все подвопросы . хотя это кажется довольно глупым. Пока мы занимаемся этим, приведите, пожалуйста, мне пример менее широкого вопроса. Я не знаю, как задать только часть этого вопроса и все же получить содержательный ответ. Я мог бы задать точно такой же вопрос по-другому. Например, я мог бы спросить «Какую цель служат потоки?» или "Когда я буду использовать поток вместо цикла for?" или "Зачем беспокоиться о потоках, а не о циклах?" Но это все тот же вопрос.
. или это считается слишком широким, потому что кто-то дал действительно длинный многоточечный ответ? Откровенно говоря, любой знающий мог сделать это практически с любым вопросом. Если, например, вы являетесь одним из авторов JVM, вы, вероятно, могли бы говорить о циклах for весь день, в то время как большинство из нас не могли.
Как отмечено ниже, был дан адекватный ответ, который доказывает, что он существует и что его достаточно легко дать.
Это imho основано на мнении. Лично я предпочитаю потоки, потому что они делают код более читабельным. Это позволяет писать то, что вы хотите, а не как . Более того, делать удивительные вещи с однострочниками - это круто.
Кроме того, все, что я здесь ищу, - это подходящий ответ на интервью. Это единственное «мнение», которое имеет значение.
С точки зрения образования, этот вопрос спас меня от некоторой деградации и на следующем собеседовании, @slim действительно справился с этим, но в промышленном отношении он также говорит о том, как языки программирования Microsoft построили свою карьеру на копировании языка Java, и, наконец, Java отомстила, разорвав вне лямбда-выражения и потоков от оппонентов, давайте посмотрим, что java собирается делать со структурами и союзами в будущем :)
Обратите внимание, что потоки используют лишь часть возможностей функционального программирования: - /
Интересно, что вопрос интервью спрашивает о преимуществах, не спрашивая о недостатках, поскольку есть и то, и другое.
Потоки - это более декларативный стиль . Или более выразительный стиль. Может показаться, что лучше заявить о своем намерении в коде, чем описывать, как это делается:
. совершенно ясно говорит, что вы фильтруете совпадающие элементы из списка, тогда как:
Говорит «делаю петлю». Цель цикла глубже закопана в логике.
Потоки часто более краткие . Тот же пример показывает это. Тессер не всегда лучше, но если вы можете быть лаконичным и выразительным одновременно, тем лучше.
Потоки очень похожи на функции . В Java 8 представлены лямбда-выражения и функциональные интерфейсы, что открывает целый набор мощных методов. Потоки предоставляют наиболее удобный и естественный способ применения функций к последовательностям объектов.
Потоки способствуют меньшей изменчивости . Это как бы связано с аспектом функционального программирования - программы, которые вы пишете с использованием потоков, обычно относятся к тем программам, в которых вы не изменяете объекты.
Потоки способствуют ослаблению связи . Вашему коду обработки потока не обязательно знать источник потока или его возможный метод завершения.
Потоки могут лаконично выражать довольно сложное поведение . Например:
На первый взгляд может показаться, что он фильтрует весь поток, а затем возвращает первый элемент. Но на самом деле findFirst() управляет всей операцией, поэтому она эффективно останавливается после нахождения одного элемента.
Потоки предоставляют возможности для повышения эффективности в будущем . Некоторые люди провели тестирование и обнаружили, что однопоточные потоки из in-memory List s или массивов могут быть медленнее, чем эквивалентный цикл. Это правдоподобно, потому что в игре больше объектов и накладных расходов.
Но потоки масштабные. Помимо встроенной поддержки Java для параллельных потоковых операций, существует несколько библиотек для распределенного сокращения карты с использованием Streams в качестве API, потому что модель подходит.
Недостатки?
Производительность : for цикл через массив чрезвычайно легок с точки зрения использования кучи и ЦП. Если приоритетом является чистая скорость и бережливость памяти, использование потока хуже.
Знакомство . В мире полно опытных процедурных программистов, владеющих разными языками, для которых циклы знакомы, а потоки - в новинку. В некоторых средах вы захотите написать код, знакомый таким людям.
Когнитивные накладные расходы . Из-за его декларативного характера и повышенной абстракции от того, что происходит внутри, вам может потребоваться построить новую мысленную модель того, как код соотносится с выполнением. На самом деле вам нужно делать это только тогда, когда что-то идет не так, или если вам нужно глубоко проанализировать производительность или малозаметные ошибки. Когда он «просто работает», он просто работает.
Отладчики улучшаются, но даже сейчас, когда вы проходите через потоковый код в отладчике, это может быть труднее, чем эквивалентный цикл, потому что простой цикл очень близок к переменным и местоположениям кода, с которыми работает традиционный отладчик.
Я думаю, было бы справедливо отметить, что потоковые вещи становятся все более распространенными и теперь появляются во многих часто используемых языках, которые не особенно ориентированы на FP.
Учитывая перечисленные здесь плюсы и минусы, я думаю, что потоки НЕ стоят того ни для чего, кроме очень простых применений (небольшая логика if / then / else, не много вложенных вызовов или лямбда-выражений и т. Д.), В некритических частях производительности
@HenrikKjusAlstad Это совершенно не тот вывод, который я намеревался сообщить. Потоки зрелые, мощные, выразительные и полностью подходят для промышленного кода.
О, я не имел в виду, что не буду использовать его в продакшене. Но я бы предпочел использовать старомодные циклы / ifs и т. Д., А не потоки, особенно если результирующий поток будет выглядеть сложным. Я уверен, что есть варианты использования, в которых поток превосходит петли, и если это ясно, но чаще всего, я думаю, что это "привязано", а иногда даже наоборот. Таким образом, я бы добавил вес аргументам о когнитивных накладных расходах в пользу того, чтобы придерживаться старых способов.
@lijepdam - но у вас все еще есть код, который говорит: «Я повторяю этот список (см. внутри цикла, чтобы узнать, почему)», когда «итерация по списку» не является основной целью кода.
Помимо синтаксического удовольствия, Streams предназначены для работы с потенциально бесконечно большими наборами данных, тогда как массивы, коллекции и почти каждый класс Java SE, который реализует Iterable, полностью находятся в памяти.
Недостатком Stream является то, что фильтры, сопоставления и т. Д. Не могут генерировать проверенные исключения. Это делает Stream плохим выбором, скажем, для промежуточных операций ввода-вывода.
Но если элементы для обработки сохраняются в БД, как вы используете потоки? У младшего разработчика может возникнуть соблазн прочитать их все в Коллекции, просто чтобы использовать Streams. И это было бы катастрофой.
@LluisMartinez хорошая клиентская библиотека БД вернет что-то вроде Stream
@xxfelixxx Потоки не игнорируют исключения молча. Попробуйте запустить это: Arrays.asList("test", null).stream().forEach(s -> System.out.println(s.length()));
Вы неправильно поняли: параллельные операции используют Stream s, а не Optional s.
Вы можете определить методы, работающие с потоками: принимать их как параметры, возвращать их и т. Д. Вы не можете определить метод, который принимает цикл как параметр. Это позволяет выполнять сложную потоковую операцию один раз и использовать ее много раз. Обратите внимание, что у Java здесь есть недостаток: ваши методы должны вызываться, а someMethod(stream) не собственные потоки stream.someMethod() , поэтому их смешивание усложняет чтение: попробуйте увидеть порядок операций в
Даже если вам нужны только последовательные операции и вы не хотите их повторно использовать, чтобы можно было использовать потоки или циклы, простые операции с потоками могут соответствовать довольно сложным изменениям в циклах.
Объясните 1. Разве Необязательный интерфейс не является средством, с помощью которого нули обрабатываются в цепочках? Что касается 3, это имеет смысл, потому что с короткозамкнутыми фильтрами метод будет вызываться только для определенных случаев. Эффективное. Имеет смысл сказать, что их использование снижает потребность в написании дополнительного кода, который необходимо будет протестировать и т. Д. После обзора я не уверен, что вы имеете в виду под последовательным регистром в 2.
1. Optional является альтернативой null , но не имеет ничего общего с параллельными операциями. Если в вашем вопросе «Теперь я понимаю, что я думал о Optionals» речь идет только об null обработке?
В этом году язык программирования Java отметил свой 25-летний юбилей. Немалый срок, однако, сдавать позиции он точно не собирается. Дело в том, что Java – не просто язык, это универсальная программная платформа, ставшая настоящим прорывом в мире вычислительной техники.
Первую версию Java выпустила в 1995 году компания Sun Microsystems. Язык был назван в честь сорта кофе с одноимённого острова. Этот факт отражен на официальном логотипе.
Изначально язык был создан для программирования бытовых электронных устройств, но очень скоро стало ясно, что его возможности гораздо шире. Язык взяли на вооружение разработчики серверного ПО и клиентских приложений. Так Java начал покорение мира. Очень скоро он вытеснил с рынка очень распространённый в начале 90-х C++.
С 2010 года все права на Java перешли к корпорации Oracle, поглотившей Sun Microsystems. А сам язык вышел на пик своей популярности. И, надо сказать, вполне заслуженно.
Java – универсальный объектно-ориентированный язык со строгой типизацией. В нём реализован принцип WORA (от английского: write once, run anywhere). Это позволяет запускать приложения везде, где есть среда исполнения JRE (от английского: Java Runtime Environment). Механизм работы программ следующий. Исходный материал транслируется в байт-код, который обрабатывается виртуальной машиной Java (JVM). При этом не имеет значения, какая операционная система установлена на устройстве.
Благодаря кроссплатформенности язык получил широкое распространение, регулярно занимает ведущие позиции в Топ-5 авторитетных международных рейтингов.
PYPL (PopularitY of Programming Language) – специализированный рейтинг, основанный на данных Google SE. Взглянем на его первую пятёрку. Java – на почётном втором месте.
Stack Overflow (раздел технологий) – расширенный рейтинг, основан на количестве вопросов, касающихся языков программирования и скриптов. Java – в первой пятёрке.
В международных рейтингах IEEE Spectrum и TIOBE (также как в PYPL) Java занимает вторые места в ТОП-5 (за 2019/2020 год). Это однозначно свидетельствует о лидирующих позициях языка в мировой IT-индустрии.
Java был протестирован программистами в самых разных сферах: от карманных компьютеров до интерактивного телевидения. Сейчас он наиболее востребован в таких направлениях, как
- веб-разработка (масштабные бизнес-проекты);
- программы для ПК (десктопный софт);
- компьютерные игры (например, Minecraft);
- приложения для мобильных устройств (ОС Android);
- научные исследования и разработки;
- промышленный программинг.
Изначально перед создателями Java стояла задача сделать синтаксис более простым и понятным в сравнении с С/С++. В итоге так и получилось. Сходство между этими языками есть, но освоить Java и кодировать на нём гораздо легче.
У Java масса достоинств, благодаря которым многие разработчики выбирают именно его.
Простота – первое техническое достоинство Java. У него чёткие синтаксические правила и понятная семантика. Рациональность и краткость очень полезны для обработки кода машинами с ограниченным объёмом ресурсов. Для встроенных устройств создана специальная платформа Java Micro Edition.
Объектно-ориентированный подход. За 3 десятилетия он доказал свою эффективность. Суть состоит в том, что в центре внимания находятся данные (объекты), интерфейсы и алгоритмы вторичны. Другими словами, мы отталкиваемся от результата при выборе инструментов, способов их применения.
Безопасность. Важнейший критерий, учитывая применение языка в сетевых / распределенных средах. Разработчики проделали большую работу по защите платформы Java. И она продолжается. Обойти или взломать механизмы защиты крайне сложно. Пример: использование классов, имеющих цифровую подпись. Полные права предоставляются только при полном доверии автору класса.
Производительность. Изначально она вызывала вопросы. Новые версии динамических компиляторов Java не уступают традиционным из других платформ. Мощный прирост скорости обработки даёт оптимизация тех фрагментов кода, которая исполняется чаще. При необходимости те или иные приёмы оптимизации включаются или отменяются JIT-компилятором.
Надёжность – одно из важнейших преимуществ. Программы на Java стабильно работают в любых условиях. Компилятор способен выявить ошибки ещё до выполнения кода, то есть на ранних стадиях. Контроль выполнения позволяет предотвратить сбои в памяти (например, из-за неточного указателя). Сами указатели можно применять не везде, а только там, где это необходимо (скажем, в работе со связными списками).
Независимость от аппаратной части и ОС. Важно лишь наличие исполняющей среды и JVM. А компьютерная архитектура в целом значения не имеет. Байт-код легко интерпретируется на любой машине. Подход доказал свою состоятельность во многом благодаря динамической компиляции. Кроссплатформенностью отличается также интерфейс, реализованный в системных библиотеках.
Динамичность и адаптируемость. Эта особенность позволяет Java не теряться в постоянно изменяющейся среде. При необходимости можно добавить в библиотеки новые объекты, методы. При этом трогать приложения, использующие данные библиотеки не нужно. Отследить информацию о структуре объектов, их поведении, о ходе выполнения программы очень легко.
Не надо забывать, что Java – это трио, состоящее из языка программирования, мощного универсального обработчика и внушительной библиотеки. Все эти наработки доступны программистам. Им не нужно разрабатывать с нуля многие необходимые процедуры (доступ к сети, базам данных и т.п). Это тоже весомый аргумент в пользу Java.
Учитывая вышеизложенное, можно смело утверждать: Java – хороший язык программирования. Отличным его делает востребованность специалистов и высокая зарплата. По числу вакансий в России он уступает, разве что, Javascript. Ведущая рекрутинговая компания России HeadHunter предлагает более 5000 вариантов занятости. Это не считая фриланса.
Важно и то, что зарплата специалиста составляет от 90000 рублей при полной занятости. Это очень достойный уровень. Вообще, программисты Java зарабатывают выше многих коллег, работающих с другими языками. Опытный Java-разработчик вполне может рассчитывать на доход 130-150 тысяч в месяц.
Java достаточно прост в изучении, снисходителен к новичкам. Для начала надо изучить базовую часть. Затем уже осваиваются требуемые навыки по выбранному направлению. Специалистом начального уровня реально стать за 6-12 месяцев. Практика и знание английского языка будут способствовать скорейшему достижению успеха. Доступный и быстрый старт – ещё одно неоспоримое достоинство.
Сегодня Java представляет собой мощную, универсальную платформу для создания прикладного программного обеспечения:
- серверной логики;
- распределённых систем;
- веб-приложений;
- десктопных программ;
- мобильных приложений.
В арсенале Java имеются солидные библиотеки, наработки, готовые решения. По совокупности таких свойств, как безопасность, надёжность и динамичность, Java несомненно лидирует. Производительность платформы с момента выхода первой версии заметно возросла.
В обозримом будущем востребованность Java и его экосистемы вопросов не вызывает. Наоборот, спрос на специалистов по языку растёт. А вместе с ним предлагаются всё более выгодные условия. Есть возможность устроиться на работу как в России, так и за рубежом.
Конечно, недостатки у Java тоже есть. Например, платное коммерческое использование. Но на фоне столь внушительных достоинств минусы выглядят лишь придирками. А плюсы делают язык незаменимым и перспективным.
Ещё больше о Java можно узнать на нашем шестимесячном курсе «Профессия: Разработчик» 👉 Узнать подробности!
Читайте также: