Anatoly Levenchuk (ailev) wrote,
Anatoly Levenchuk
ailev

Святой Грааль computer science -- выразительный, но эффективный язык.

Граалем современного программирования, включая работы по AI, является выразительный и эффективный язык.

Человеческая речь выразительна, потому как за пределами говоримого остается огромный "здравый смысл" (и, замечу, в далеком 1983г. Ленат, Мински, Фейгельбаум и наш знакомый сквиковод Алан Кей) осознали, что эффективное кодирование этого "здравого смысла" является основой той мощи, которая есть в интеллекте (http://www.cyc.com/cyc/company/news/know_it_all говорит об этом так -- By 1983, however, Lenat had become convinced that commonsense AI was possible -- but only if someone were willing to bite the bullet and codify all common knowledge by brute force: sitting down and writing it out, fact by fact by fact. After conferring with MIT's AI maven Marvin Minsky and Apple Computer's high-tech thinker Alan Kay, Lenat estimated the project would take tens of millions of dollars and twenty years to complete).

Далее пути всех этих титанов мысли разошлись. Адмирал Боб Инман уговорил в 1984 году Дугласа Лената заняться ровно этим двадцатилетним прямым кодированием "здравого смысла" (common sense) в рамках проекта www.cyc.com, в чем тот и преуспел. Был придуман специальный язык представления знаний, со встроенным механизмом микротеорий, который эвристически сочетал высокую скорость исполнения с выразительностью описания.

Алан Кей все больше и больше говорил наоборот, об "uncommon sense" -- о том, как прививать школьникам неочевидные для них вещи, в том числе занимаясь вопросом о том, какие неочевидные вещи лежат в основе программирования и развивая Сквик как универсальную языковую среду. Затем у Кея появился шанс (данный ему в лице Иана Пиумарта) поднять выразительность языка без потери скорости выполнения -- и он немедленно пригласил Иана работать к себе.

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

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

Лената-то я давно отслеживаю, а что Алан Кей идет туда же -- это я понял только недавно. И с удивлением обнаружил, что в 1983г. Ленат, Фенгельбаум и Кей были в одной тусовке и решали одни проблемы. Ибо все это время я считал, что они про разное. Оказалось -- это просто разные тропинки к одному и тому же Граалю. И пути Кея и Лената постоянно пересекались (и пересекаются сейчас -- см., например, http://www.ttivanguard.com/ где они оба в board).

И пересечение, которое объединяет Лената, Кея и AOSD -- это extreme late binding. Вот, например, в каком ключе Кей в 1993 году поминает ранние работы Лената:"A look beyond OOP as we know it today can also be done by thinking about late-binding. Prolog's great idea is that it doesn't need binding to values in order to carry out computations [Col **]. The variable is an object and a web of partial results can be built to be filled in when a binding is finally found. Eurisko [Lenat **] constructs its methods--and modifies its basic strategies--as it tries to solve a problem. Instead of a problem looking for methods, the methods look for problems--and Eurisko looks for the methods of the methods. This has been called "opportunistic programming"--I think of it as a drive for more enlightenment, in which problems get resolved as part of the process". (http://www.smalltalk.org/smalltalk/TheEarlyHistoryOfSmalltalk_VI.html).

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

"Великие языки прошлого" и не думали останавливаться в своем развитии. Это относится даже к Prolog (который я почему-то с детства недолюбливаю) -- вон, полюбуйтесь на победы и награды http://www.lpa.co.uk/new_lin.htm (и это только одна из фирм, которая им занимается!). Я не знаю, то ли крутыми языками занимаются крутые люди, и поэтому все у них все то же самое получилось бы и на Фортране, то ли это обычные люди вдруг становятся крутыми, занимаясь крутыми языками. Но корелляция между крутостью и языками для меня несомненна. Поэтому если я опять соберусь тряхнуть стариной и заняться каким-либо софтверным проектом, то делать его буду явно не на Java или C#.

Спасибо gamedeveloper, который сподвиг меня написать этот пост.

UPDATE: вдогонку
замечательное интервью Алан Кея, где он говорит про конец 70-х, когда он (как любящий родитель) хотел "убить Smalltalk": As we learned more and got more ambitious about what we wanted to do, we realized that there are all kinds of things in Smalltalk that don’t scale the way they should—for instance, the reflection stuff that we had in there. It was one of the first languages to really be able to see itself, but now it is known how to do all levels of reflection much better—so we should implement that. (http://acmqueue.com/modules.php?name=Content&pa=showpage&pid=273&page=3
И главное -- чуть дальше, еще более отделяя идею мета- от конкретной языковой реализации: We saw after a couple of years that this could be done much better. The object model we saw after a couple of years could be done much better, etc. So the problem is—I’ve said this about both Smalltalk and Lisp—they tend to eat their young. What I mean is that both Lisp and Smalltalk are really fabulous vehicles, because they have a meta-system. They have so many ways of dealing with problems that the early-binding languages don’t have, that it’s very, very difficult for people who like Lisp or Smalltalk to imagine anything else.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 4 comments