Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Lisp WAS, используемая в AI до конца 1980-х. В 80-х, тем не менее, язык Common LISP был перепродан к деловому миру как "язык AI"; обратная реакция вынудила большинство программистов AI к C++ в течение нескольких лет. В эти дни прототипы обычно пишутся на младшем динамическом языке (Perl, Python, Ruby, и т.д.) и реализации успешного исследования обычно находится в C или C++ (иногда Java).
, Если Вам любопытно на предмет 70-х... хорошо, я не был там. Но я думаю, что Lisp был успешен в исследовании AI по трем причинам (в порядке важности):
я не имею старая книга AI Peter Norvig, но она, как предполагается, хороший способ учиться программировать алгоритмы AI в Lisp.
Правовая оговорка: Я - студент градиента в компьютерной лингвистике. Я знаю подполе обработки естественного языка намного лучше, чем другие поля. Возможно, Lisp используется больше в других подполях.
Одна причина состоит в том, что это позволяет Вам расширять язык с помощью конструкций, специфичных для Вашего домена, делая его, эффективно, предметно-ориентированного языка. Эта техника невероятно мощна, поскольку она позволяет Вам рассуждать о проблема , Вы решаете, а не о перестановке битов.
Мое предположение всегда было то, что, будучи функциональным языком, это не дифференцируется между кодом и данными. Все, включая функциональные определения и вызовы функции можно рассматривать как списки и изменить как любая другая часть данных.
Настолько самоосматривающий, самоизменяющий код мог быть записан легко.
Один возможный ответ - то, что AI является набором очень тяжелых проблем, и Lisp является хорошим языком для решения тяжелых проблем, не просто AI.
относительно того, почему это: макросы, родовые функции и богатый самоанализ допускают краткий код и легкое введение доменных абстракций —, это - язык, который можно сделать более мощным. Для большого количества проблем это является ненужным, и это идет со своими собственными затратами, но для других проблем, что питание необходимо для создания любого прогресса.
Я думаю, что неправильно думать об этом с точки зрения AI только. Вещи как зимние AI и коммерческие эффекты на язык Common LISP недовольны, если Вы спрашиваете, почему он использовался для AI, не, почему он не часто используется теперь...
Так или иначе, я думаю, что это - потому что большая часть кода AI была по существу кодом исследования. Lisp является большим языком для исследовательского программирования, для реализации трудных алгоритмов, для самоизменения и часто изменяемого кода. Другими словами, для кода исследования.
я использую шепелявость сегодня для части моего кода исследования (математика, обработка сигналов), потому что это более гибко и мощно, чем большинство языков при тихой генерации более эффективного кода, чем большинство языков. Я могу обычно получать производительность в факторе +,/-2 говорит скорость C++, но я могу реализовать вещи намного быстрее и иметь дело со сложностью, которая взяла бы меня намного больше времени, чем я имею, если я использовал C++, Java, c#.
Это блуждает вне темы все же. Я думаю, что код AI был, прежде всего, записан в языке Common LISP некоторое время, потому что это - мощный подход к коду исследования. Это все еще; но поскольку алгоритмы 'AI' стали лучше понятый и исследуемый, части их было намного легче преподавать и использовать, таким образом, они обнаружились на flavor-of-the-year языках в курсах старшекурсника. Оттуда, это становится проблемой того, что уже знают люди, какие библиотеки доступны, и что работы хорошо для больших групп.
Я предположил бы, что большой причиной была гибкость списков как структура основных данных.
в то время, способность превратить их в весь вид составных объектов и новые вещи как передачи сообщений и полиморфизм, сделала его предпочтительным языком; не специально для AI, а для большого, сложного, задач. особенно, когда они экспериментировали с понятиями.
Я думаю, что Вы правы: Lisp был удобным инструментом для того, чтобы изрубить вещи. Это вызвано тем, что это не различало очень программу и данные. Это позволило хакерам управлять функциями очень легко, точно так же, как данные.
, Но шепелявость является довольно трудным для людей читать, с ее фигурными скобками и неразличием между данными и программой. Сегодня, я не буду использовать шепелявость ни для какого производственного кода AI (или возможно даже моделирующий), но очень предпочел бы Python для сценариев.
Другой вещью рассмотреть являются существующие библиотеки/инструменты, in/related на язык. Я не имею возможности сравнивать библиотеки шепелявости с библиотеками Python, но я предполагаю, что библиотеки и открытый исходный код имеют большое значение больше теперь, чем прежде.
Этот ответ был вдохновлен следующим сравнением между шепелявостью и Python: http://amitp.blogspot.com/2007/04/lisp-vs-python-syntax.html
Я не забываю слышать, что, будучи функциональным языком, Lisp был очень хорошим выбором для реализации рекурсивных алгоритмов. Способность разыскать дерево и работу Ваш путь назад важна при рассмотрении процессов принятия решений (обход) и конечный результат (вершина).
Это было сказано мне во время курса AI в университете, где мы изучили Lisp.
Lisp используется для AI, потому что он поддерживает реализацию программного обеспечения, которое вычисляет с символами очень хорошо. Символы, символьные выражения и вычисляющий с теми в ядре Lisp.
Типичные области AI для вычислений с символами были: компьютерная алгебра, доказательство теорем, планируя системы, диагноз, переписывают системы, представление знаний и обоснование, логические языки, машинный перевод, экспертные системы, и т.д.
Затем не удивительно, что много известных приложений AI в этих доменах были записаны в Lisp:
Существуют тысячи приложений в этих областях, которые записаны в Lisp. Очень характерный для тех то, что им нужны специальные возможности в области обработки символьной информации. Каждый реализует специальные языки, которые имеют специальные интерпретаторы/компиляторы в этих доменах сверху Lisp. Lisp позволяет создавать представления для символьных данных и программ и может реализовать все виды оборудования для управления этими выражениями (математические формулы, логические формулы, планы...).
(Обратите внимание, что много других языков программирования общего назначения используется в AI, также. Я попытался ответить, почему особенно Lisp используется в AI.)