О чем думает компьютер

Обновлено: 02.07.2024

Главная программа - функции malloc:
Прошу обеспечить выделение 257 килобайт Conventional Memory.

Функция malloc - операционной системе:
Прошу выделить 257 килобайт Conventional Memory в связи с производственной необходимостью.

Операционная система - главной программе:
Выделить 257 килобайт Conventional Memory не представляется возможным в связи с отсутствием таковых. Есть 3 мега Extended. Берете?

Главная программа - обработчику исключений:
С памятью облом. Что делать будем?

Обработчик исключений - процедуре оптимизации:
Необходимо добиться экономии памяти за счет более рационального использования системных ресурсов.

Контроллер прерываний - обработчику прерываний:
Тут это. юзер кнопку нажал.

Главная программа - обработчику прерываний:
Не дергайся! Подержит и отпустит.

Процедура оптимизации - обработчику исключений:
Готово!

Главная программа - обработчику исключений:
Ну что там?

Обработчик исключений - главной программе:
Еще хуже стало. Может, на диск посвопимся

Главная программа - жесткому диску:
Прошу принять на хранение swap-файл в размере 257 килобайт.

Жесткий диск - главной программе:
Ваша просьба не может быть удовлетворена за недостатком места.

Главная программа - операционной системе:
Что еще за глюк? Было же место!

Жесткий диск - главной программе:
Ничего не глюк. Вы еще прошлый swap-файл на 4 мега не забрали. А я, между прочим, не резиновый. И даже не stacker'ный.

Контроллер прерываний - обработчику прерываний:
Тут это. юзер опять кнопку давит.

Обработчик прерываний - PC speaker'у:
Ну скажи ему что-нибудь, пусть отвяжется!

PC speaker - юзеру:
Биип!

Главная программа - операционной системе:
Ну может можно чего-нибудь перераспределить?

Операционная система - главной программе:
Другим задачам тоже память нужна. Вам что, General Protection Error схлопотать охота?

Главная программа - хакерской функции:
Ну-ка выясни, кто там отожрал всю память, и выкини их к XTшной матери!

Контроллер прерываний - обработчику прерываний:
Тут юзер Ctrl-Alt-Del жмет!

Главная программа - обработчику прерываний:
Да отруби ты этому зануде клавиатуру! Мы тут делом заняты.

Хакерская функция - главной программе:
Опаньки!

Главная программа - операционной системе:
Ну что там? Сколько памяти свободно?

Операционная система - главной программе:
320 Conventional и. ой, куда это Extended Memory Manager делся?

Главная программа - хакерской функции:
Ты что начистила, сволочь?

Хакерская функция - главной программе:
А чо я, чо я? Мне сказали - выкинуть, я и выкидываю!

Функция malloc - операционной системе:
Прошу выделить 257 килобайт Conventional Memory в связи с производственной необходимостью.

Операционная система - главной программе:
Не могу. У меня в Extended Memory важные данные лежали. И вообще, я с вами скоро повешусь!

Олюшка13

ВАРИАНТ 221. Дан массив из N элементов вещественного типа .Осуществить сдвиг вправо на 2 элемента части последовательности расположенной между между м … аксимальным и минимальным элементами последовательности.2.Дано целое Х и вектор А, состоящий из N элементов(0ВАРИАНТ 231. Дан одномерный целочисленный массив А состоящий из N элементов. N заданное натуральное число. Найти произведение элементов массива А, которые являются числами Фиббоначи и принадлежат сегменту [10,1000].2. Дан вещественный массив Х из N элементов(0ВАРИАНТ 241.Дан вектор с большим количеством нулевых элементов. Заменить в нем каждую группу из подряд идущих нулей на 2 элемента: первый из них 0, а второй – количество нулей в данной группе(т.е. 00010500000 заменить на 03101505).2.Даны две последовательности по 30 элементов в каждой. Найти наименьшее среди тех чисел последовательности которые не входят в другую. Считать что такое число есть.

ВАРИАНТ 19 1.Дан массив из N элементов целого типа(0<=M[i]<=40000). Упорядочить масив по убыванию до минимального элемента и по возрастанию посл … е минимального. 2.Дан вектор Q состоящий из N целых чисел (0 ВАРИАНТ 20 1. Дан массив из N элементов вешественного типа . Удалить из него все максимальные элементы. 2. Дан вектор Х, состоящий из L целых чисел (0 ВАРИАНТ 21 1. Дан массив из N элементов вещественного типа .Определить образуют ли элементы расположенные между максимальным и минимальным возрастающую последовательность. 2. Дан вектор Х, состоящий из L целых чисел (0

ВАРИАНТ 1 1. Дан вектор Х из М целых чисел( 0 2. Дан одномерный целочисленный массив А состоящий из N элементов. N заданное натуральное число. Найти к … оличество элементов, превосходящих сумму элементов и являющихся простыми числами. ВАРИАНТ2 1. Дан массив М, состоящий из К целых чисел (0 2. Дан одномерный целочисленный массив А состоящий из N различных элементов. N заданное натуральное число. Найти среднее арифметическое значение элементов , расположенных между наибольшим и наименьшим элементами, включая эти элементы. ВАРИАНТ 3 1. Дан вектор К состоящий из М целых чисел (0 2. Дан одномерный целочисленный массив А состоящий из N элементов. N заданное натуральное число. Если элементы массива А образуют строго монотонную последовательность, то все положительные элементы массива ,заменить единицей ,иначе оставить массив без изменения.

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

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

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

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

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

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

Успешно пройдя курс, учащийся сможет принять участие в финале Олимпиаде «Высшая проба», Московской предпрофессиональной олимпиаде школьников и успешно сдать предпрофессиональный экзамен по направлениям НИУ ВШЭ. Кроме этого, каждый учащийся, прошедший обучение на выбранном курсе, сможет принять участие в проектно-исследовательской деятельности и подготовить свой проект на научно-практических мероприятиях городского и всероссийского уровня (Научно-практическая конференция «Инженеры будущего» и Конкурс исследовательских и проектных работ школьников «Высший пилотаж» НИУ ВШЭ).

Контингент обучающихся – только школьники 10 -11 классов, обучающиеся в инженерных классах в школах, имеющих статус участника или кандидата в проекте «Инженерный класс в московской школе» Департамента образования города Москвы

Обучение для данного контингента обучающихся – бесплатное

Место проведения занятий – город Москва, улица Таллинская, д.34, МИЭМ НИУ ВШЭ, метро Строгино (последний вагон из центра, пешком 5 минут от метро)

Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal

[Tags|penrose, science]

Как думают компьютеры. Языки программирования.
(о чём молчит Пенроуз, часть 4)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Читайте также: