Может ли компьютер писать программы

Обновлено: 04.07.2024

На самом деле компьютеры могут программировать самостоятельно, просто не очень хорошо

Пользователь Quora Тихон Джелвис считает: для того, чтобы машины научились программировать, нужно больше данных, чем есть у учёных на сегодняшний момент, и, на самом деле, это лишь вопрос времени.

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


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

Как объяснить компьютеру, что вам нужно

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


Есть очевидный способ объяснить компьютеру, что ему нужно сделать. Для этого нужно описать проблему на языке какой-нибудь формальной аксиоматической теории. Запрограммировать систему, считывающую вопрос и преобразующую его в текст, понятный машине, относительно просто. Однако далеко не все пользователи компьютера способны перевести задачу на язык математической логики. Поэтому такое решение не годится.

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


Джелвис считает оптимальным следующий способ: пользователь передаёт в систему несколько пар вида (входные данные, выходные данные), а компьютер составляет алгоритм, который из входных данных получает выходные. Когда программа создана, она прогоняется на ещё нескольких парах, и так пока она каждый раз не будет выдавать нужные значения. К сожалению, пока реализовать такую схему невозможно.

В общем случае довольно сложно проверить написанный компьютером код на соответствие заданным условиям

На самом деле, слишком сложно, поясняет пользователь Quora Мариса Кирисаме. Задача разрешимости булевой функции NP-полна. Единственный на данный момент известный науке способ решить такую задачу — перебрать все возможные варианты.

Этот порог можно будет преодолеть — если математикам удастся доказать, что классы задач P и NP равны, однако наука занимается проблемой равенства классов уже много лет, и пока ответа на этот вопрос дать не удалось.

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


Конечно, существуют и разрешимые аксиоматические теории первого порядка — например, арифметика Пресбургера. Но сложность алгоритма, определяющего выводимость формулы в этой теории, экспоненциальная. Если точнее — O(2^(2^N)), где N — длина входных данных.

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

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

Компьютеры не умеют программировать, потому что люди не хотят быть уничтоженными

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


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

Афтар молодец. Аналогию придумал грамотно. Я думал, что программирование на примерах фиг объяснишь - либо видишь код матрицы, либо "видишь блондинку/брюнетку" (как Сайфер).

Напиши программу, которой сможет пользоваться любой дурак, и только дурак захочет ей пользоваться)))

Не моё, но фтему.

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

Эпиграф:
"Ошибки так же неисчерпаемы, как и атом"
Приписывается Карлу Марксу и его подельникам

Аксиома. В любой программе есть ошибки.
Следствие 1. В программе, состоящей из одного оператора, есть ошибки.
Следствие 2. В программе, состоящей из N операторов, есть по крайней мере N ошибок.
Следствие 3. В программе, состоящей из одного оператора, есть по крайней мере N ошибок.
Следствие 4. В любой программе содержится бесконечное число ошибок.
Следствие 5. Чтобы познать бесконечность, нужно быть не философом, а программистом.

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

Теорема обратимости программ и ошибок.
Всегда можно придумать программу, в которой будет не менее N ошибок.
И наоборот, всегда можно придумать ошибку, которая есть не менее, чем в N программах.

Закон пропорциональности.
Чем более программа необходима, тем больше в ней ошибок и наоборот.
Следствие 1. Совершенно ненужная программа ошибок не содержит.
Следствие 2. Ненужную программу невозможно создать ни за какие деньги.

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

Фундаментальный закон Теории ошибок. На ошибках учатся.
Следствие 1. Программист, написавший программу, становится ученым.
Следствие 2. Чем больше программист делает ошибок, тем быстрее он становится ученым.
Следствие 3. По-настоящему ученый программист никогда не пишет правильных программ.
Замечание. На то он и ученый.

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

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

Закон находимости ошибок.
Программист может обнаружить ошибку только в чужой программе или не обнаружить нигде.
Следствие 1. Администратор не может обнаружить ошибку.
Следствие 2. Ошибке не все равно кто ее обнаружит.
Следствие 3. Индивидуальная программистская деятельность невозможна.

Закон общественной полезности программиста.
Каждый человек на Земле должен быть программистом.

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

Памятка программисту.
1) Не следует делить очевидные ошибки на постоянные и исчезающие, а следует делить их на обнаруженные ранее, обнаруженные ранее и забытые, и на новые, которые обычно являются хорошо забытыми старыми.
2) Объектное программирование - надежное средство для написания необнаруживаемых ошибок.

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

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

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

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

как работает процессор и языки программирования

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

Все описанное ниже как всегда упрощено для лучшего понимания.

Процессор и оперативная память

процессор управляет всеми устройствами и процессами в компьютере

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

Процессор знает много команд и у каждой из них есть свой числовой код, например:


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


Понимаете прикол? Это значит, что вам нужно писать код для каждой архитектуры процессора. Жуть.

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

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

как работает процессор и оперативная память

Ассемблер

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

Для того, чтобы заставить процессор выполнить какую-то программу, например решить уравнение 2 + 2 * 2, нам нужно написать цепочку простых числовых команд.

процессор выполняет цепочка команд из числовых кодов команд

Согласитесь, что писать такой код очень сложно и легко запутаться. И это мы всего лишь написали код для решения простого уравнения. А теперь представьте, как написать ВКонтактик или Инстаграм.

Для упрощения жизни люди придумали инструмент Ассемблер и язык программирования на ассемблере.

Теперь все числовые коды команд процессора заменили на буквенные аббревиатуры, которые стало легче запоминать и читать.

Помните примеры кодов команд, которые были указаны выше? Теперь они выглядят так:

Также к названию команд были добавлены операнды (один или более), которые дают дополнительную информацию для выполнения команды.

пример кода на языке assembler

Что-то слишком много непонятного кода для такой пустяковой задачи, не правда ли?

Языки программирования высшего уровня

Помните в самом начале я писал, что каждый производитель процессоров делает свою архитектуру? И что у каждой архитектуры свои числовые коды команд?

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

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

Компилируемые языки

Первыми появились компилируемые языки программирования. К ним относится С, С++, Java и другие.

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

процессор не понимает код высшего порядка напрямую

Но процессор не поймет этой команды. Как мы помним, он знает и понимает только маленькие числовые команды. Поэтому компилятор языка C преобразует команду в ассемблированный код, а затем в машинный код, понятный процессору.

как работает компилятор

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

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

компилятор языка C собрал исполняемый файл

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

Интерпретируемые языки

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

Вот тут в ход идут интерпретируемые языки программирования такие как: Python, PHP, Perl, Pascal и другие.

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

как работает интерпретатор

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

Подытожим

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

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


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

Компьютерное программирование

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

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

Выбор языка


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

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

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

В общем плане выбор языка программирования зависит от типа программы или сценария, который вы хотите создать. Например, Visual Basic является популярным из-за его относительной легкости. Основы программирования можно изучить с помощью Pascal.

Выбор редактора и среды программирования


Редактор - это любая программа, которая позволяет вам писать компьютерный код. Они варьируются от простого (как любой базовый текстовый редактор) до продвинутого программного обеспечения, такого как Adobe Dreamweaver, Eclipse, JDeveloper, SharpDevelop или Microsoft Visual Studio. К счастью, любая программа может быть написана в текстовом редакторе, что означает, что вы можете начать бесплатно. По мере того, как вам становится понятнее язык программирования, рекомендуется использовать более продвинутый редактор, поскольку он может сделать кодирование и тестирование кода более эффективным.

Для пользователей Windows я предлагаю редактор Notepad ++, потому что он бесплатный и поддерживает подсветку синтаксиса. Если вы на Mac, вы можете использовать их бесплатный редактор называющийся TextEdit. Кроме того, следует иметь в виду, что в средах разработки есть встроенные редакторы.

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

  1. Качаем и устанавливаем компилятор или среду разработки.
  2. Находим информации в сети или в книгах по изучению языка.
  3. Создаем первую программу.
  4. Запускаем её на своем компьютере.


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