Высокоуровневый язык программирования | это… Что такое Высокоуровневый язык программирования?
Высокоуровневый язык программирования — язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта высокоуровневых языков — это абстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных и операции над ними, описания которых на машинном коде (или другом низкоуровневом языке программирования) очень длинны и сложны для понимания.
Так, высокоуровневые языки стремятся не только облегчить решение сложных программных задач, но и упростить портирование программного обеспечения. Использование разнообразных трансляторов и интерпретаторов обеспечивает связь программ, написанных при помощи языков высокого уровня, с различными операционными системами и оборудованием, в то время как их исходный код остаётся, в идеале, неизменным.
Такого рода оторванность высокоуровневых языков от аппаратной реализации компьютера помимо множества плюсов имеет и минусы. В частности, она не позволяет создавать простые и точные инструкции к используемому оборудованию. Программы, написанные на языках высокого уровня, проще для понимания программистом, но менее эффективны, чем их аналоги, создаваемые при помощи низкоуровневых языков. Одним из следствий этого стало добавление поддержки того или иного языка низкого уровня (язык ассемблера) в ряд современных профессиональных высокоуровневых языков программирования.
Примеры: C++, C#, Java, JavaScript, Python, PHP, Ruby, Perl, Паскаль, Delphi, Лисп. Языкам высокого уровня свойственно умение работать с комплексными структурами данных. В большинстве из них интегрирована поддержка строковых типов, объектов, операций файлового ввода-вывода и т. п.
Первым языком программирования высокого уровня считается компьютерный язык Plankalkül, разработанный немецким инженером Конрадом Цузе ещё в период 1942—1946 годах. Однако транслятора для него не существовало до 2000 года. Первым в мире транслятором языка высокого уровня является ПП (Программирующая Программа), он же ПП-1, успешно испытанный в 1954 году. Транслятор ПП-2 (1955 год, 4-й в мире транслятор) уже был оптимизирующим и содержал собственный загрузчик и отладчик, библиотеку стандартных процедур, а транслятор ПП для ЭВМ Стрела-4 уже содержал и компоновщик (linker) из модулей. Однако, широкое применение высокоуровневых языков началось с возникновением Фортрана и созданием компилятора для этого языка (1957).
Переносимость программ
Распространено мнение, что программы на языках высокого уровня можно написать один раз и потом использовать на компьютере любого типа. В действительности же это верно только для тех программ, которые мало взаимодействуют с операционной системой, например, выполняют какие-либо вычисления или обработку данных. Большинство же интерактивных (а тем более мультимедийных) программ обращаются к системным вызовам, которые сильно различаются в зависимости от операционной системы. Например, для отображения графики на экране компьютера программы под Microsoft Windows используют функции Windows API, которые отличаются от используемых в системах, поддерживающих стандарт POSIX. Чаще всего для этих целей в них используется программный интерфейс X-сервера.
К настоящему времени создан целый ряд программных библиотек (например, библиотека Qt или wxWidgets), скрывающих несоответствия системных вызовов различных операционных систем от прикладных программ. Однако такие библиотеки, как правило, не позволяют полностью использовать все возможности конкретных операционных систем.
Новые тенденции
Новой тенденцией является появление языков программирования немного более высокого уровня (ультра-высокоуровневых, не путать с сверхвысокоуровневыми). Такого рода языки характеризуются наличием дополнительных структур и объектов, ориентированных на прикладное использование. Прикладные объекты, в свою очередь, требуют минимальной настройки в виде параметров и моментально готовы к использованию. Использование ультра-высокоуровневых языков программирования снижает временные затраты на разработку программного обеспечения и повышает качество конечного продукта за счет, опять таки, уменьшения объёма исходных кодов.
См. также
- Сверхвысокоуровневый язык программирования
- Низкоуровневый язык программирования
- Метапрограммирование
- Псевдокод (язык описания алгоритмов)
Лучший язык программирования / Хабр
Вопрос, который часто задают начинающие программисты — какой язык программирования изучать? Вопрос звучит разумно. Хочется выбрать самый лучший, чтобы потом не пришлось переучиваться.
Можно ли на него ответить?
Я работаю программистом тридцать лет. За эти годы индустрия несколько раз претерпевала кардинальные изменения. У меня были любимые языки, но ни один из них не стал единственным выбором на долгое время. И дело не в том, что я меняю языки, как перчатки. Меняется сама жизнь.
В конце 90-х я писал на С++ и присматривался к вебу. Писать веб-приложения на C++ было безумием. Тогда не было ни Python, ни Ruby, ни C#, и даже PHP был в зачаточном состоянии. Свои первые программы для веба я написал на Perl. Сейчас проект на Perl назовут глубоко и безоговорочно устаревшим.
Все тридцать лет мне постоянно приходится изучать новые языки программирования. Причиной тому не только любознательность, но и банальная жизненная необходимость. Сегодня востребованы программисты на Python, Go, C#, Java. То, что я знаю язык Ассемблера и Delphi, не помогает мне найти интересную высокооплачиваемую работу. В индустрии ходят слухи о баснословных зарплатах программистов на COBOL. Не знаю. Не уверен. Программисты на Go сейчас гораздо нужнее.
Если постоянно приходится учить новые языки, значит, лучшего языка в принципе не существует. Что же тогда делать начинающему программисту?
Ответ — научиться быстро осваивать новые языки. Чтобы проиллюстрировать эту мысль, расскажу историю из жизни. Обычно изучение нового языка занимает несколько дней, иногда недель, но C# я выучил за двадцать минут.
Я много лет писал на C++, потом неплохо освоил Java и, оказалось, что все основные концепции C# были мне знакомы. Знатокам C# напомню, что речь идёт про 2003 год, когда в языке не было ни LINQ, ни async/await, ни даже обобщённого программирования.
Я открыл MSDN, прочитал несколько страниц, и написал первый код, который сразу ушёл в прод. Конечно, я не знал язык полностью — пара моментов потребовала дополнительного освоения. В частности, новой для меня оказалась концепция делегатов. В C++ и Java есть свои способы, чтобы работать с указателями на функцию, а в C# для этого придумали новое средство языка.
Потребовалось время, чтобы уложить в голове всё, что связано с новинкой, в частности, чтобы понять, чем делегаты отличаются от событий. Но, даже не владея этими аспектами языка, я уже писал рабочий код.
Языки программирования похожи друг на друга. Они образуют целые семейства с общими идеями, а иногда даже и общим синтаксисом. Скажем, C++, Java и C# очень похожи друг на друга не только концептуально, но и синтаксически.
Зная один язык из семейства, вы быстро начнёте писать на родственном языке, даже если у него будет непохожий синтаксис. В этом ключ к быстрому изучению языков.
Освойте несколько языков из кардинально разных семейств, и вам будут знакомы большинство концепций, встречающихся в современных языках программирования.
Семейства языков
Мы ступаем на нетвёрдую почву классификаций. Что бы я ни написал, найдётся читатель, не согласный с предложенными критериями. Я, тем не менее, попробую, и начну с общепризнанных устоявшихся способов разделить языки на группы.
Исторически, самая ранняя классификация касается первых языков программирования высокого уровня — Fortran и LISP. Первый из них был императивным, то есть состоял из императивов. Слово императив в русском языке используют редко, нам привычнее слово команда. Программа на императивном языке программирования — это последовательность команд, которые выполняет компьютер.
Второй — LISP — положил начало функциональным языкам. Вместо команд здесь используют примитивные чистые функции, которые комбинируют в чуть более крупные функции, а те, в свою очередь — в ещё более крупные. В конечном счёте, программа на функциональном языке — это одна большая функция, которую компьютер и вычисляет.
К императивным языкам, помимо Fortran, можно отнести Pascal, C, C++, Java, C#, Python, Go. К функциональным — Haskell, Scala, Erlang, Clojure, Scheme, F#.
В этой классификации есть изъяны. Во-первых, не все согласны с простым определением функциональных языков. Некоторые специалисты считают, что истинно функциональными можно считать только чистые функциональные языки. Из известных это, фактически, только Haskell.
Во-вторых, современные языки поддерживают сразу несколько парадигм. Лямбда-функции, являющиеся основой основ функциональных языков, сейчас можно встретить во многих императивных языках, включая C++.
Несмотря на недостатки классификации, я рекомендую следовать первоначальному плану. Возьмите пару императивных языков и пару функциональных, и напишите на них несколько небольших программ. Будет здорово, если вы выберете языки с разным синтаксисом.
Незнакомый синтаксис заставляет считать новые языки непонятными. Но в действительности, к нему можно привыкнуть всего за несколько дней. Незнакомые концепции могут оказаться гораздо сложнее.
В императивных языках долгое время существовало разделение на код и данные, при этом код управлял данными. Языки такого рода сейчас называют процедурными, к ним, например, относят Fortran, Pascal и C.
В противовес им, в объектно-ориентированных языках программист размещает код и данные вместе, и называет объектом. К таким языкам относят C++, Object Pascal, Java, C#, JavaScript.
Существуют ли объектно-ориентированные функциональные языки? Да, конечно. Обычно разработчики языка совмещают несколько разных парадигм, что, кстати, значительно облегчает нашу задачу, а именно, освоение разных концепций. И если Pascal — императивный и процедурный, то OCaml — функциональный и объекто-ориентированный.
Языки также классифицируют по тому, как они работают с типами данных. Разделяют статически типизированные и динамически типизированные языки, а также языки с сильной и слабой типизацией.
Динамически типизированные языки часто используют для разработки небольших программ — скриптов или сценариев. Они просты в изучении, нетребовательны к квалификации программиста и обычно позволяют писать короткий код. К ним относят JavaScript, Python, PHP, Ruby.
Статически типизированные языки проверяют соответствие типов данных, поэтому программисту приходится описывать объекты, которые он использует. Это касается и переменных, и функций, и даже самих типов. Программы на таких языках обычно больше по размеру, поскольку, в определённом смысле, дублирование помогает справляться с опечатками и другими простыми ошибками. В этой категории мы обнаружим C++, Java, C#, Kotlin, Go.
Ещё один признанный способ классификации — разделение языков на низкоуровневые и высокоуровневые. Языки низкого уровня используют в системном программировании и разработке игр, то есть там, где требуется высокая производительность кода и экономия ресурсов. К ним относят C, C++, Rust и, в какой-то мере, Go.
Языки высокого уровня повышают производительность программиста. Ему не приходится распределять память или вручную обрабатывать строки, он занимается решением бизнес-задач. В категорию высокоуровневых входят Java, C#, Scala, Python, Ruby.
Если языку программирования не хватает скорости, часть программы пишут на низкоуровневом языке и вызывают этот быстрый код из языка высокого уровня. Подобное смешение возможно за счёт техник, которые в целом называют Foreign Function Interface (FFI), или Интерфейс Внешних Функций.
Наконец, языки бывают универсальные и нишевые. Это условное разделение, поскольку нишевые языки практически не похожи друг на друга. Просто надо помнить, что для работы с базами данных придётся учить SQL, для разработки фронтенда — JavaScript, а для проектирования iOS приложений — Swift.
Фундамент
Помимо лингвистических знаний в быстро меняющемся мире важны знания фундаментальные. Те, что не потеряют своей актуальности и через десять лет, и через двадцать.
Очевидная база для программистов — алгоритмы и структуры данных. Она вызывает серьёзные споры, потому что у многих программистов эти знания зачастую не востребованы. Как говорят в интернет-баталиях, чтобы пилить круды, алгоритмы не нужны. И в этом есть доля истины.
Но здесь полезно вспомнить историю. Двадцать лет назад круды пилили не на Python, а на Delphi. Бекенд писали на Perl. За свою карьеру, хотите вы этого или нет, вы несколько раз поменяете стек. И, возможно, единственное, что вам не придётся изучать на новых платформах — это фундамент.
Время от времени вам будут попадаться алгоритмические задачи. Полезно иметь представление об алгоритмах, чтобы писать быстрый код. Тем более, что разбираться с темой придётся только единожды.
Не языками едиными
Кроме языков программирования, нам нужны инструменты и методологии. Где бы вы ни работали, вам наверняка пригодится git. Даже если вы не работаете в команде, заведите аккаунт на GitHub и держите там домашние проекты.
Разберитесь с непрерывной интеграцией и развёртыванием — CI/CD. Настройте автоматическую сборку своих проектов.
Научитесь писать модульные тесты. Сделайте тестирование одним из этапов сборки, чтобы ваш проект собирался только в случае, если проходят все тесты.
Доведите знание английского до уровня B2 — Upper Intermediate. Этого достаточно, чтобы воспринимать английскую речь на слух, общаться с носителями языка и писать письма.
Я учил английский в школе. Мне хватало его, чтобы читать документацию и немного писать. Но сейчас, во времена YouTube, новые знаниях приходят к нам через видео лекции и доклады. Приходится доучивать английский, чтобы не перекрывать себе этот важнейший канал.
Заключение
Что можно сказать про индустрию, проработав в ней тридцать лет? Технологии умирают, и умирают быстро. Больше нет dBASE и Clarion, и даже названия эти современным программистам неведомы. Священная война между Pascal и C, которая шла все восьмидесятые, как-то обыденно закончилась победой C. Но сейчас это никого не волнует — что нам Pascal и C, когда мы пишем на Java?
Мы учимся, зная, что 90% новых знаний устареют уже через три года. Возможно, нам надо освоить ещё два навыка.
Умение забывать. И умение не учить всё подряд, особенно если это всё очень модное и современное. Никто не знает, какой срок отмерен модным технологиям. Будьте избирательны.
15 Список всех языков программирования высокого уровня
Используется несколько языков программирования высокого уровня. Следующие компьютерные языки популярны и имеют широкое применение:
Содержание
Список языков программирования высокого уровня
- BASIC и Visual Basic (VB)
- C и C++
- FORTRAN
- PASCAL и Delphi
- COBOL
- Smalltalk
- Java и JavaScript
- HTML и т. д.
Некоторые другие языки программирования
- ALGOL
- Forth
- RPG
- ADA
- PL/1 (языки программирования/1) 90 009 Snobol
- LISP
BASIC, QBASIC и Visual Basic
BASIC означает универсальные символьные инструкции для начинающих. Это сравнительно простой язык для начинающих. Первоначально BASIC был широко используемым языком для микрокомпьютеров. Он был разработан Дж.Г. Кемени и Томас Курц из Дартмутского колледжа США в 1964.
Используется множество различных версий Бейсика. Большинство микрокомпьютеров используют QBASIC, разработанный компанией Microsoft. BASIC Имеет ряд преимуществ перед другими языками программирования, а именно:
- Простота изучения и использования.
- Он представляет несколько мощных дополнительных функций, недоступных на многих других языках.
- Он предназначен для интерактивного использования, а не в режиме пакетной обработки. Пользователь может исправлять ошибки по мере их возникновения во время выполнения программы.
Язык легко адаптируется ко всем компьютерам. BASIC прост и подходит для непрофессионалов.
Microsoft Visual Basic (VB) — широко используемый пакет для разработки программ. На сегодняшний день это самый успешный инструмент быстрой разработки приложений (RAD) для приложений Microsoft Windows.
VB позволяет программисту не беспокоиться ни о каком коде, генерирующем пользовательский интерфейс; он обрабатывается автоматически компилятором VB, который создает исполняемую программу, способную работать самостоятельно. Используя VB, даже начинающий программист может разработать впечатляющее приложение.
Огромное разнообразие вспомогательных инструментов позволяет программистам VB быстро выполнять такие задачи, как создание интерфейсов к базам данных и расширение функциональных возможностей веб-страницы.
Языки программирования высокого уровняСценарий VB: Это язык сценариев, основанный на VB. Он был создан для написания сценариев (коротких программ), которые можно встраивать в веб-страницы.
C и C++
Деннис Ритчи, программист из AT&T Bell Laboratories в США, разработал язык C в середине 1970-е годы. C позволяет программисту писать код с низкоуровневым доступом к оборудованию, но с высокоуровневой концепцией структурированного программирования. C — популярный язык.
C оказался пригодным для написания программ, которые ранее писались исключительно на языках ассемблера. Операционная система AT&T UNIX была написана на C. Этот язык переносим на микрокомпьютеры. Большинство приложений для ПК и системных программ написаны на C.
Более поздней версией C является C++, который включает в себя объектно-ориентированные функции, но не заставляет программистов придерживаться объектно-ориентированной модели. Таким образом, он обеспечивает гибкость и высокую скорость выполнения. Язык C++ широко используется для профессиональной разработки программ. Софтверный гигант Microsoft Corporation использует C++ для разработки приложений.
FORTRAN
FORTRAN означает перевод формул. Это был первый язык программирования, разработанный IBM в 1957 году. Он много раз модифицировался, и более поздние версии получили названия FORTRAN II и FORTRAN IV, самая популярная версия была разработана в 1966 году.
Последними дополнениями являются FORTRAN 77 и FORTRAN 90. Синтаксис FORTRAN очень жесткий. Он популярен в инженерных и научных расчетах.
Pascal и Delphi
Паскаль популярен на небольших компьютерах. Паскаль был разработан Николасом Виртом для обучения студентов компьютерному программированию. Он принадлежит к семейству ALGOL. Программа на Паскале состоит из вложенных блоков для структурированного программирования.
Как и большинство старых языков программирования, Паскаль был обновлен, чтобы отразить новые подходы к программированию. Объектно-ориентированная версия Pascal обеспечивает основу для Delphi, компилятора, созданного Borland International, который очень похож на Visual Basic.
COBOL
Расшифровывается как Common Business Oriented Language. Это популярный деловой язык для обработки данных. Он был разработан в конце 1960-х годов с целью предоставления общего языка для бизнес-приложений. COBOL не зависит от какой-либо конкретной компьютерной системы, поэтому программа, написанная на этом языке, может быть перенесена на другой компьютер только с незначительными изменениями.
COBRA
Расшифровывается как Common Object Request Broker Architecture, наиболее известная как промежуточное ПО. CORBA определяет, как объекты могут взаимодействовать друг с другом по сети, даже если объекты написаны на разных языках программирования.
Корпорация Майкрософт имеет собственный стандарт, который называется компонентной объектной моделью (COM), который лучше всего работает на платформе Windows.
Smalltalk
Разработан в начале 1970-х годов корпорацией Xerox. Smalltalk считается стопроцентно чистым объектно-ориентированным языком программирования.
Хотя этот язык не часто выбирают для профессиональной разработки программного обеспечения, многие корпорации выбрали Smalltalk для критически важных приложений. Однако Smalltalk сталкивается с жесткой конкуренцией со стороны новейшего объектно-ориентированного языка Java.
Java
Это один из самых мощных и относительно новых языков программирования. Это объектно-ориентированный язык программирования, созданный Sun Microsystems, который произвел революцию в программировании приложений для всемирной паутины (WWW) и корпоративных интрасетей и экстрасетей.
Java похож на C++ и является гораздо более простым, безопасным и независимым от платформы языком программирования. Java также специально разработана для интерактивных сетевых приложений реального времени, работающих в Интернете. Java-приложения, состоящие из небольших прикладных программ, называемых апплетами, могут выполняться на любом компьютере и в любой операционной системе в любом месте сети.
Простота создания апплетов Java и их распространения с сетевых серверов на клиентские ПК и сетевые компьютеры является основной причиной популярности Java. Апплеты могут быть небольшими прикладными программами специального назначения или небольшими модулями более крупных прикладных программ.
Апплеты могут находиться на веб-сайтах в сети, интрасети или экстрасети. Апплеты также не зависят от платформы — они могут работать в системах Windows, OS/2, UNIX и Macintosh без изменений.
Как и VBScript, JavaScript — это язык сценариев, разработанный для использования на веб-страницах. JavaScript не основан на Java. Он был создан Netscape Communications. Это простой, легкий в освоении язык для написания скриптов на веб-страницах, и он широко используется в Интернете.
HTML
Это один из самых важных языков программирования высокого уровня.
Расшифровывается как HyperText Markup Language. Это язык описания страниц, который создает гипертекстовые или гипермедийные документы. HTML вставляет управляющие коды в документ в точках, которые создают ссылки (известные как гиперссылки) на другие части документов или на другие документы в любом месте в Интернете.
HTML встраивает в текст документа ASCII управляющие коды, которые обозначают заголовки, заголовки, графические и мультимедийные компоненты, а также гиперссылки внутри документа. Некоторые программы из лучших программных пакетов автоматически конвертируют документы в форматы HTML.
К ним относятся веб-браузеры, программы обработки текстов и электронных таблиц, менеджеры баз данных и пакеты графических презентаций. Эти и другие специализированные программы-редакторы HTML предоставляют ряд возможностей для проектирования и создания мультимедийных веб-страниц без формального программирования HTML.
w3schools — очень мощная платформа для практики языков программирования высокого уровня.
Некоторые другие языки программирования высокого уровня
АЛГОЛ
Это краткое название алгоритмического языка. Первоначально разработан в 1958, это более опасный язык, чем ФОРТРАН, для научных числовых вычислений.
Forth
Это мощный язык, разработанный только для компьютеров четвертого поколения. Это полезно в домашних компьютерах.
RPG
RPG означает генератор программ отчетов. Это коммерческий язык, специально разработанный для отчетности.
Языки программирования высокого уровняADA
Этот язык был разработан министерством обороны США для приложений реального времени, а также подходит для параллельной обработки.
PL/1 (языки программирования/1)
Этот язык сочетает в себе функции COBOL и FORTRAN и может использоваться как для научных, так и для деловых приложений. Он был представлен в конце 1960-х годов компанией IBM. Его применение ограничено только компьютерами IBM.
Snobol
Он был разработан в 1962 году. Он сильно отличается от языков в том смысле, что его можно использовать для обработки сообщений, шаблонов и строк.
LISP
LISP означает процессор списков. Это язык программирования искусственного интеллекта.
Надеюсь, вы найдете все языки программирования высокого уровня, в противном случае не стесняйтесь комментировать ниже.
Вам также могут понравиться:
- Генерация языков программирования
Языки более высокого и более низкого уровня
Переключить оглавлениеИз Computer Science Wiki
Основы программирования [1]
Содержание
- 1 Язык высокого уровня
- 1.1 Список некоторых популярных языков высокого уровня
- 2 Язык низкого уровня
- 2.1 Список некоторых низкоуровневых языков
- 3 Видео, которое поможет вам понять
- 4 уровня языков программирования
- 5 стандартов
- 6 Каталожные номера
Язык высокого уровня[править]
Язык высокого уровня (HLL) — это язык программирования, такой как C, FORTRAN или Pascal, который позволяет программисту писать программы, более или менее независимые от конкретного типа компьютера. Такие языки считаются высокоуровневыми, потому что они ближе к человеческим языкам и дальше от машинных языков. [2]
В информатике язык программирования высокого уровня — это язык программирования с сильной абстракцией от деталей компьютера. В отличие от языков программирования низкого уровня, он может использовать элементы естественного языка, быть проще в использовании или может автоматизировать (или даже полностью скрывать) важные области вычислительных систем (например, управление памятью), делая процесс разработки программы более простым и понятным, чем при использовании языка более низкого уровня. Объем предоставляемой абстракции определяет, насколько «высокоуровневым» является язык программирования. [3]
Список некоторых популярных языков высокого уровня[править]
- Python
- Ява
- JavaScript
- С++
- С#
- Рубин
- Перл
- PHP
- ГО
- Rust
Язык низкого уровня[править]
Язык низкого уровня — это язык программирования, который практически не абстрагирует концепции программирования и очень близок к написанию настоящих машинных инструкций. Двумя примерами низкоуровневых языков являются ассемблер и машинный код. [4]
Язык программирования низкого уровня — это язык программирования, который практически не абстрагируется от архитектуры набора инструкций компьютера — команды или функции в языке тесно связаны с инструкциями процессора. Как правило, это относится либо к машинному коду, либо к языку ассемблера. Слово «низкий» относится к небольшому или несуществующему уровню абстракции между языком и машинным языком; из-за этого низкоуровневые языки иногда называют «близкими к аппаратному обеспечению». Программы, написанные на языках низкого уровня, как правило, относительно непереносимы. [5]
Список некоторых низкоуровневых языков[править]
- язык ассемблера
- машинный язык
Видео, которое поможет вам понять
Стандарты[править]
- Объясните необходимость языков более высокого уровня.
- Опишите необходимость процесса перевода с языка более высокого уровня на машинный исполняемый код.
Ссылки[править]
- ↑ http://www.flaticon.com/
- ↑ https://www.webopedia.com/TERM/H/high_level_language.html
- ↑ https://en.wikipedia.org/wiki/High-level_programming_language
- ↑ https://www.computerhope.com/jargon/l/lowlangu.htm
- ↑ https://en.wikipedia.org/wiki/Low-level_programming_language
- ↑ https://auth0.com/blog/7-things-you-should-know-about-web-assembly/
Опишите различия между двумя (или более) предметами или ситуациями, ссылаясь на них обоих (всех).