Компьютерные языки программирования: виды, описание, применение и отзывы. Как компьютер работает с информацией? Какой язык понимает компьютер

1. Как компьютер обрабатывает информацию? 2. Язык, на котором «думает» компьютер – какой он? 3. Как вы думаете: есть ли такая профессия, в которой не используется компьютер? 4. Кто сегодня не может обойтись без компьютера? 5. Как компьютер передает и получает информацию? 6. Какое устройство компьютера обрабатывает информацию?




Программа – это последовательность команд, которую выполняет ПК в процессе обработки информации. Деятельность человека по созданию программ называется – программированием, а люди называются – программистами. Программное обеспечение (ПО) – все многообразие программ, используемых в современном ПК.




Системное ПО Прикладное ПО Инструментальное программирование Является основным ПО, неотъемленной частью ПК. Руководит сложной работой всех элементов компьютерной системы, как на аппаратном уровне, так и на программном Предназначено для выполнения конкретных задач пользователя, не прибегая к программированию (текстовый редактор, графический редактор, электронная таблица и др.) Это средство, предназначенное для создания ПО, т.е. того же системного и прикладного ПО. Его составляют разнообразные языки и среды программирования (Паскаль, С, С++ и др.) Таблица


Резидентные программы – это программы, на протяжении всей работы компьютера находящиеся в его оперативной памяти. Т.к. эти программы на протяжении всего периода включения компьютерной системы следят за ее состоянием (например, операционная система, антивирусная программа). Нерезидентные программы – это программы, которые по окончании своей работы выгружаются полностью или частично из ОЗУ (например, прикладные программы).


1.ПК работает с информацией по алгоритму, который задается программой, а программа в свою очередь написана на языке понятном компьютеру. 2. Для того, чтобы ПК мог работать с информацией необходимо не только аппаратное обеспечение – устройства компьютерной системы, но и программное обеспечение которое наделяет ПК мыслями и интеллектом. 3. ПО делится на: системное, прикладное и инструментальное программирование. 4. ПО систематизируется по длительности нахождения в оперативной памяти компьютера на резидентные программы и нерезидентные программы


Впишите пропущенные слова в предложениях: 1. Компьютер без ………………. – это бесполезный хлам, груда железа. И только ……………….. делают его нашим помощником, другом, советчиком. 2. Программирование – деятельность человека по …………………. программы. 3. Для обработки информации на компьютере необходимо иметь ……………………………………. - устройства компьютерной системы («hardware»), но и …………………………………. («software»), которое наделяет компьютер мыслями и интеллектом. 4. …………………… ПО – предназначено для выполнения конкретных задач пользователя. 5. Наиболее дружественно пользователю ………………….. ПО. программ программы созданию не только аппаратное обеспечение программное обеспечение Прикладное системное



1. Самые первые программы разрабатывались непосредственно на объектно- ориентированном языке и все люди могли заниматься их разработкой, а не только профессиональные программисты. 2. Программа – это последовательность команд, которую выполняет ПК в процессе хранения информации. 3. Все используемые в компьютере программы называются аппаратным обеспечением. 4. Прикладное ПО руководит слаженной работой всех элементов компьютерной системы как на аппаратном уровне, так и на программном уровне. 5. Системные программы – это средства, предназначенные для создания ПО. Найдите и исправьте ошибки в предложениях:


Машинном нетолько 1. Самые первые программы разрабатывались непосредственно на машинном языке и не все люди могли заниматься их разработкой, только профессиональные программисты. обработки 2. Программа – это последовательность команд, которую выполняет ПК в процессе обработки информации. программным обеспечением 3. Все используемые в компьютере программы называются программным обеспечением. Системное ПО 4. Системное ПО руководит слаженной работой всех элементов компьютерной системы как на аппаратном уровне, так и на программном уровне. Инструментальное ПО 5. Инструментальное ПО – это средства, предназначенные для создания ПО. Найдите и исправьте ошибки в предложениях:






1. Организация согласованного выполнения всех процессов в компьютере. 2. Обеспечение хранения информации во внешней памяти и обмен с устройствами ввода-вывода, т.е. ОС отвечает за правильный ввод информации с устройства ввода и ее вывод на монитор, принтер и т.д., а также за правильное распределение информации на дисках внешней памяти. 3.Реакция на ошибки и аварийные ситуации. 4. Осуществление диалога и общения с пользователем.




Этапы загрузки ОС Первую свою команду ПК получает от ПЗУ В ПЗУ находятся программы тестирования компьютера BIOS. Работа BIOS отображается на экране белыми бегущими строками. В этот момент ПК проверяет свои устройства - оперативную память, - жесткий диск - дисководы других дисков, - наличие клавиатуры - других устройств. Если что-то не работает, BIOS докладывает о неисправности, иначе заканчивает свою работу и дает команду загрузить с жесткого диска в оперативную память специальную программу, которая называется Master Boot (загрузчик ОС). Если системные диски отсутствуют в ПК, на экране монитора появляется сообщение Non system disk и загрузка ОС прекращается, ПК остается неработоспособным. Если же все в порядке, загрузчик считывает ОС с диска в оперативную память. После окончания загрузки ОС управления передается командному процессору и на экране появляется графический интерфейс.


1. Выучить основные определения и понятия. 2. Учебник §2.4 - §2.5, устно ответить на вопросы для размышления. 3. Используя новые термины и понятия предыдущего и сегодняшнего урока, составьте кроссворд. Оформите на отдельном листе в нескольких экземплярах. (Можно в электронном варианте)

Ещё вчера информатику считали в Советском Союзе лженаукой. А сегодня правительства некоторых стран жалуются на атаки российских хакеров.

И хоть в России пока что производится мало высокотехнологичных устройств и девайсов, умных программистов хватает и у нас.

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

Начнем рассматривать тему с теории. Первым делом разберёмся с понятием.

Что такое компьютерные языки?

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

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

Но хороший программист должен знать в совершенстве хотя бы несколько базовых из них.

Какие языки программирования самые популярные?

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

Конечно же, языков на самом деле ещё больше, но мы выбрали самые основные, на которых написано более 90% всех компьютерных приложений. Далее рассмотрим подробнее каждый из них.

Процедурный С/С++

Языки С и C++ можно назвать двумя братьями. Есть утверждения о том, что это два абсолютно разных языка программирования, что неверно. С++ является некоторым усовершенствованием предыдущего языка, облегчающим написание программ и сохранившим прежний синтаксис.

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

Говоря о достоинствах и недостатках этого языка, нельзя делать однозначные выводы. Есть его сторонники, а есть и беспощадные критики. Основой для споров является то, что в этом языке программирования нет ничего своего.

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

Независимый и безопасный Java

Этот английский компьютерный язык разработали в компании Sun Microsystems. Благодаря тому, что написанная программа транслируется в особенный байт-код, она способна работать независимо от типа операционной системы или компьютерной архитектуры.

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

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

Если говорить о простоте языка, то стоит отметить исследования, которые показали, что аналогичные операции пишутся в 1,2-2 раза дольше, чем на языке C++. Также в несколько раз больше ресурсов требуется на выполнение команд. Но команда производителя постоянно выпускает множество обновлений, которые сводят к минимуму все недостатки этого языка программирования.

Покоривший Интернет PHP

Вы хотите создать свой сайт или заняться веб-программированием? В этом вам поможет отличный язык PHP, который способен создавать динамические страницы. Он является, пожалуй, самым популярным при создании сайтов и написании веб-приложений.

Благодаря тому, что этот язык программирования создавался разработчиками с открытым кодом, его удалось довести до совершенства, и он набрал бешеную популярность. PHP легко взаимодействует с самыми разными базами данных - от MySQL до Access.

Самые популярные сайты Интернета, такие как Facebook или Wikipedia, написаны именно на этом языке.

Писать на нём достаточно просто. Существует даже статистика, что более 60% программистов мира, которые работают на коде PHP, достаточно ограниченно знают (на базовом уровне) английский язык. Компьютерная грамотность в этом случае ограничивается лишь знанием необходимых функций и процедур.

Нельзя обойти стороной и критику языка. Несмотря на то что в рейтингах самых популярных языков 2015 года PHP занял 6-е место, в его адрес нередко высказывается недовольство.

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

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

Актуальность знания и понимания языков программирования

Тема умения "разговаривать" с компьютером в последнее десятилетие набирает все больше оборотов.

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

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

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

Изучить языки можно онлайн

Так что придётся изучить иностранный язык хотя бы на базовом уровне, пока русский компьютерный язык не придумали.

Но не переживайте, мир не стоит на месте. Сегодня можно обучаться, не выходя из дома. Главное - иметь компьютер и Интернет. Есть множество сайтов, которые проводят компьютерное обучение языкам. Самые популярные из них - это Codecademy, Code School и Udacity.

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

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

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

Какие языки используются для создания обычных прикладных программ (т.е. программ, написанных непосредственно для пользователей)? Их бесчисленное множество, самые популярные из них – C++ и Delphi. Они предоставляют наибольшее количество возможностей для разработки программ на все случаи жизни. Именно их используют профессиональные программисты.

Однако и С++, и Delphi были созданы на основе более простых языков. Для C++ это язык C (называют «Си»). Предшественник Delphi – это Pascal. Многие их учат ещё в школе на уроках информатики. Язык Pascal был создан именно для обучения программированию, так как является очень простым и понятным. Сейчас он используется практически во всех школах, колледжах, университетах и институтах.

После освоения Pascal изучение Delphi проходит, что называется «на ура». Такая последовательность освоения языков, т.е. сначала именно Pascal, а потом Delphi или C, C++, является весьма желательной. На вопрос «Какой язык программирования лучше» можно ответить, что для обучения начинающим лучше всего подойдет Паскаль (Pascal).

Для разработки мультфильмов и анимации была создана специальная программа – Adobe (Macromedia) Flash. Также Flash используют при разработке сайтов и для создания компьютерных игр. Язык, применяемый во Flash, – ActionScript. Он получил огромную популярность в наши дни, так как используется во всех современных интернет-проектах.

HTML является сокращением от англ. HyperText Markup Language и переводится как «язык разметки гипертекста». С его помощью создается большинство веб-страниц. Знание HTML значительно упрощает работу со своим блогом или сайтом, но не является при этом обязательным.

Более совершенные и функциональные (но более сложные) языки, чем HTML, – это PHP, Ajax, SQL.

Для разработки игр и программ на телефоны используются, в основном, два языка – Java и C++. Про C++ мы уже говорили, а Java является языком программирования, созданным на основе C++.

Для создания 3D игр и фильмов используют язык Python. Он даёт огромнейший спектр возможностей для управления 3D графикой.

Язык Фортран был разработан для сложных математических вычислений, создан в 1954-1957 годах. Слово Fortran произошло от первых букв: FORmula TRANslator, то есть, переводчик формул. Он выполняет математические, инженерные и различные научные задачи и применяется в очень мощных компьютерах.

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

P.S. Статья закончилась, но можно еще прочитать.

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

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

«Зачем они нужны?» — спросите вы. Все очень просто. Языки программирования содержат в себе команды, отдаваемые компьютеру, чтобы он выполнял те или иные функции. Видите ли, у вычислительных машин тоже есть свой особый язык, или по-другому код, на котором с ними приходится общаться. Чтобы попросить компьютер что-либо сделать, ему надо написать соответствующую команду, после чего он ее обработает и выдаст результат. Вот так вот все одновременно просто и сложно.

Один из самых базовых языков называется С++, свою историю он ведет еще с 80-х годов. На заре создания компьютеров каждый разработчик создавал свою собственную операционную систему и язык программирования под нее. С ростом различных компаний и их разработок стало ясно, что пора ввести какие-то единые стандарты, т.к. все больше стало возникать проблем совместимости оборудования и программного обеспечения. Так первой общей операционной системой стала Unix, и к ней первый язык программирования C++.

С тех пор прошло много времени, новые языки появлялись и исчезали (совсем не все широко использовались), и другим популярным языком стал Java, имеющий некие общие черты с C++, но по сути являющийся совершенно иным. Язык Ява (или Джава) сегодня особенно используется в разработке самых различных веб-приложений, начиная от простых функций сайтов, заканчивая сложными веб-интерфейсами. Несмотря на то, что в последние годы появилось огромное количество пособий о том, как научиться программировать, все-таки специалисты рекомендуют заканчивать профильные ВУЗы. Или хотя бы посетить специализированные курсы.

Но «пожилые» языки программирования все чаще и чаще критикуются за сложность и громоздкость. Опыт последнего десятилетия и бум новых устройств показал, что команды для компьютеров могут быть гораздо проще и короче. Поэтому процесс развития новых языков не стоит на месте. В последние несколько лет появились такие языки программирования как Скратч (Scratch) и Питон (Python), на которых учатся «кодить» даже дети. Например, Скратч в зарубежных школах начинают изучать с начальных классов. А Питон позволяет ученикам средней школы самостоятельно создавать различные новые функции для известной игры Майн Крафт. Простота новых языков и увлекательный формат подачи привлекают все больше и больше школьников к такой сложной науке как программирование.

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

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

Часть 4)

У человека появилась потребность записывать свои знания в более строгом виде, там всякие математические формулы, технологии, и самое сложное – инструкции для управления разными машинами, в т.ч. вычислительными. Поэтому возникли разные способы формальной записи человеческих знаний и оперирования такими записанными знаниями. Со временем эти способы записи и оперирования знаниями старались перенести на разные устройства для обработки без участия человека, вплоть до попыток воспроизвести интеллект человека. Дальше мы рассмотрим языки (модели) программирования, две их главные разновидности – процедурную и предикатную, как они работают на компьютерах и чего им не хватает для создания искусственного интеллекта.

Процедурная модель

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

Пример такого алгоритма – переход дороги:

  • 1. пока не дошли до дороги: вперёд 1 шаг
      (а точнее:
    • 1а. дошли до дороги? да – переход на шаг 2, нет – переход на шаг 1б
    • 1б. пройти вперёд по тропинке на 1 шаг
    • 1в. переход на шаг 1а)
  • 2. пока есть машины ждать 1 секунду
  • 3. перейти дорогу

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

У этой модели были несколько усовершенствований, такие как структурное программирование и объёктно-ориентированная модель (ООП). Для того чтобы программа представляла собой не кашу из данных и переходов, куски кода и данных были разбиты на иерархию, и доступ напрямую в любое место делать нельзя, только по правилам этой иерархии. Например, к процедуре обращаются только через одну входную точку, передавая ей пачку выходных и выходных данных, но внутри процедуры ничего нельзя трогать, и сама процедура ничего снаружи себя не трогает. Похожее делает и ООП – каждый предмет имеет при себе куски кода и данных, которые обслуживают этот объект, и интерфейс – процедуры, через которые можно взаимодействовать с объектом, а напрямую в код и данные объекта лазить нельзя. Усовершенствования очень полезные, но сами по себе они никак не решают проблему всяких неожиданностей.

Предикатная модель

Предикатная модель более близка к человеческой форме записи и обработки знаний. С её помощью изначально записывали математические формулы и логические построения. Суть её в том, что имеется набор правил, которые никак не связаны между собой порядком исполнения. Но! У каждого правила есть условие активации, состояние (например, состояние вычислительной среды), при котором это правило может выполняться, и выполнение этого правила меняет состояние. Какой-то внешний исполнитель проверяет все правила из набора и применяет правило, которое подходит к текущему состоянию. Для изменённого состояния вновь ищется подходящее правило и так далее. Конечно, внутри самого правила может встречаться и последовательная запись инструкций выполнения, но это уже для удобства и не принципиально. Могут быть и сигнальные состояния, т.е. состояния, которые не встречаются во внешней среде, а которые вырабатываются самими правилами как промежуточные, для активации других правил, когда мы хотим сложное правило разбить на набор простых.

Например, для перехода дороги, набор правил был бы таким (формат – входное условие: действие):

  • - (у дороги, машины есть) : ждать 1 секунду
  • - (не у дороги) : вперёд 1 шаг
  • - (у дороги, машин нет) : перейти дорогу

Исполнитель при этом сам развернёт набор правил в нужную последовательность действий, в зависимости от ситуации, например:

  • - (у дороги: нет, машин нет: неизвестно) : вперёд 1 шаг
  • - (у дороги: нет, машин нет: неизвестно) : вперёд 1 шаг
  • - (у дороги: да, машин нет: нет) : ждать 1 секунду
  • - (у дороги: да, машин нет: нет) : ждать 1 секунду
  • - (у дороги: да, машин нет: да) : перейти дорогу

Чем плоха такая запись уже понятно – нужен более сложный/мощный исполнитель (вычислительный девайс, понятливый человек), который бы по изменившейся ситуации сам отыскивал нужное действие. Да и у каждого правила набор условий может оказаться очень и очень развесистым, что потребует ещё большей памяти и скорости. (Здесь конечно есть возможность сворачивания набора состояний в одно более крупное состояние, по аналогии со структурным программированием, когда есть правила-переразбивки, которые по более низкоуровневым состояниям вырабатывают одно высокоуровневое состояние и наоборот. Правила же более высокого уровня работают уже с высокоуровневыми состояниями. Причём правила-переразбивки для полноты картины должны периодически вызываться для обновления метасостояний. Но у этого способа есть свои недостатки для построения интеллекта, потому, что такое укрупнение уменьшает преимущества предикатной записи. И это отдельная тема, об этом позже.)

Например, для извилистой тропинки, можно добавить правило, которое активируется при обнаружении поворота на тропинке и выравнивает наше направление на ведущее к дороге:

  • - (не у дороги, поворот на тропинке есть) : развернуться в сторону, ведущую к дороге

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

    Зато и преимущества у такой записи весомые. В случае открытия новых неожиданностей, в процедурной записи нам бы пришлось перелопатить весь алгоритм и поправить все места, где эта неожиданность может встретиться. В предикатной записи (внимание!) в идеале достаточно добавить новое правило, которое бы меняло неожиданное состояние в одно из уже знакомых состояний. (Конечно, здесь не всё так просто, но об этом дальше.) Такую запись ещё можно назвать ситуативной, что будет точно отражать её суть – действие по ситуации, а не по жёсткому алгоритму. Некоторые задачи, которые трудно программировать в процедурном виде, в предикатном виде формулируются потрясающе просто, перекладывая всю тяжесть подбора цепочек правил на исполнителя.

    Так, например, происходит вывод математических формул и теорем. Есть куча аксиом и промежуточных теорем, каждая со своими условиями применимости. Исполнитель собирает из них различные цепочки в надежде получить (или опровергнуть) нужный результат. Такие системы даже делали в варианте на компьютере, и даже получали интересные результаты. Но ничего радикально нового такая система не вывела. Почему? См. ниже и в следующих частях.

    Точно также происходит вывод на правилах в экспертной системе (например, постановка медицинского диагноза по симптомам) или выполнение программы в предикатных программах, например, в языке Пролог. Причём, изначально экспертная система может знать не всё состояние системы, а уточнять его по мере активации новых правил, например, если начальная жалоба была темпера температуру, а не на раны, то системе не нужен будет характер повреждения раны, но зато потом она уточнит симптомы температуры, например есть ли сыпь или потеря аппетита.

    В природе тоже есть такая форма кодирования (но она естественно отступает от жёсткого формализма), и она обеспечивает мощное и устойчивое кодирование и обработку информации, но исполнитель здесь - уже природные законы. Так, например, кодируются и реплицируются молекулы ДНК, они "катаются" по молекулярным цепочкам, сами встраиваются в нужное для себя место (в ненужное они не смогут прицепиться - параметры молекулярных связей не те), исправляют ошибки, пропущенные или наоборот продублированные куски. Похожее есть и в работе всего организма, взаимодействии особей, построении интеллекта.

    Хороший пример был про шахматы у Пенроуза. Ситуация на доске была такая, что одна из сторон минимальными действиями могла поддерживать равновесие сил и выйти на ничью. Компьютерные же программы, которые действовали перебором вариантов, начинали ломать это равновесие, добиваясь ближнего во времени преимущества, которое на дальних шагах оборачивалось полным разгромом. (Но вывод из этого Пенроуз сделал неправильный – якобы человеческий мозг может до конца проверять «вечные» варианты в конечное время за счёт «дёргания» неизвестных физических процессов.)

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

    Для случая с переходом дороги, это, например, была бы встреча с развилкой на тропинке. Программа должна найти правильный путь среди всех развилок. Для обычных дорог есть простой и однозначный алгоритм, здесь программа не будет блуждать вечно и съедать огромные ресурсы. Для вывода математических теорем и похожих случаев «карта дорог» будет меняться в зависимости от того, куда мы пойдём, с каждым нашим шагом вперёд мы будем видеть новый кусочек карты вокруг, близко от себя, но не сможем посмотреть вдаль или в сторону параллельной дорожки. И только пройдя по какому-то из путей вперёд, мы сможем увидеть, что там такое. А чтобы увидеть, что будет на параллельной дорожке, мы должны вернуться обратно к развилке и пойти по этой самой дорожке. Всю же карту сразу иметь нельзя - её размер больше чем бесконечен, и это касается многих кусков карты помельче! (см. )

    Возможное решение – несколько цепочек надо выстраивать параллельно, ведь какая-то из них может привести к успеху раньше других. И вместо того, чтобы вести до конца (а может даже и вечно!) единственную безуспешную цепочку, а после неё взяться за другую, лучше вести несколько цепочек параллельно. Но и здесь нас подстерегает проблема – взрыв вариантов цепочек может запросто сожрёт вычислительные ресурсы. Современные системы вывода используют разные эвристики (хитрости) чтобы справиться с такими ситуациями. Но применение эвристик имеет свою особенность – какой-то из вариантов мы можем вообще пропустить и не исследовать, поэтому такой вывод теряет формальную строгость. Хорошо это или плохо? С одной стороны мы теряем некоторые варианты и формальную строгость, с другой стороны программа становится работоспособна без залипания навечно.

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

    Есть, конечно, такая штука, называемая нечёткие правила и вывод на них. Что она делает – вместо обычных булевых значений 0/1 использует весь диапазон от 0 до 1, и вычисление проходит не булевыми, а вещественными операциями, и результат соответственно – вещественное число, близость которого к нулю или к единице определяет близость к ложности или истине вычисляемого выражения. Это уже ближе к тому, что надо для интеллекта, но далеко не всё. Потому что на выходе получается только одно результирующее значение. Нечёткие правила хорошо обрабатывают нечёткость входных параметров, но не нечёткость/неопределённость ситуации в целом. Потому что для неопределённой ситуации будет не один результирующий вариант, а много. И при выводе с неопределённостями система должна будет не раз пройти через взрыв вариантов из-за неопределённости, и отсечение неперспективных вариантов. (Нечёткие правила – не моя тема, но насколько я знаю, они этого не делают.) Причём не просто запускать альтернативные цепочки и смотреть, какая из них быстрее приведёт к результату, а позволять их взаимодействие, в результате которых могут как родиться новые цепочки, так и исчезнуть старые, но это уже забегая вперёд, будет в следующих частях.

    Как видим, ситуативная/предикатная модель – очень мощная штука, и заманчиво использовать её для построения искусственного интеллекта – знай себе, выписывай правила и добавляй их в копилку правил, а уж компьютер сам составит правильные логические цепочки. Японцы так и хотели сделать, даже компьютер пятого поколения на Пролог-процессорах сконструировали. И, как вы уже догадались, эта идея потерпела крах. Причины те же: взрыв вариантов, потребность обрабатывать неопределённости, нечёткости и похожие ситуации. Да ещё и всё это помноженное на то, что сам человек оперирует гигантским объёмом таких правил, в которых (помните?) весьма развесистые условия активации, да и вытащить их из головы, формализовать, задача весьма непростая. Ведь то, что человек выписывает в качестве формального правила – далеко не то, что у него творится в голове, да и необязательно правильно он это выписывает. Тут нужна отдельная система, которая бы занималась добычей знаний в правильном виде, во всём их гигантском объёме и развесистости условий активации.

    Современные программные модели

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

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

    Похожее изобретение – это сервисы и компонентные модели. В отличие от объекта в ООП, компоненты и сервисы живут не внутри программы, а внутри операционки. У них есть свой интерфейс, через который (и только через который) с ними могут взаимодействовать другие программы, может быть у них и свой цикл обработки событий.

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

    Итог

    Теперь нам понятно как программируют компьютеры, и чего в этом программировании не хватает, для того, чтобы обрести интеллект. Предикатная/ситуативная модель – мощная штука, и если ей удастся преодолеть проблемы, связанные со взрывом вариантов, обработкой неопределённостей и нечёткостей, то это будет хорошая база для создания интеллекта. Правда при этом она уйдёт от чёткости формализма и получит в дополнение кучу «особенностей» естественного интеллекта, но это уже другой разговор.