Поиск документации Pharo для методов компиляции и оценки и т. Д. В классе компилятора

У меня очень простой вопрос. Я новичок в smalltalk (я пытаюсь баловаться этим каждые 5 лет или около того), и у меня работает Pharo 6.1. Как мне найти официальную документацию по стандартной библиотеке? Специально для класса компилятора? Такие вещи, как методы компиляции и оценки? Я не понимаю, как выполнять поиск с помощью браузера справки, а комментарии метода в классе компилятора довольно краткие и загадочные. Я также не вижу очевидной ссылки на документацию API стандартной библиотеки по адресу: http://pharo.org/documentation. Книги «Pharo by Example» и «Deep into Pharo», похоже, также не охватывают этот класс. Я полагаю, что этот класс, вероятно, похож на Squeak и другие smalltalks, поэтому ссылка на их документацию для класса компилятора также может быть полезна.

Спасибо!


person Greg Buchholz    schedule 02.03.2018    source источник
comment
Странно, что новичок захочет узнать, как работает компилятор, но вопрос будет более уместным, если вы спросите его в списке разработчиков Pharo (forum.world.st/Pharo-Smalltalk-Developers-f1294837.html - это веб-интерфейс к нему)   -  person John Pfersich    schedule 02.03.2018
comment
Новичок в Smalltalk, а не в программировании. Есть разница между тем, как работает компилятор, и тем, как его использовать. FWIW, меня интересует оценка строк. Может я ищу не в том классе? Я пытаюсь найти моральный эквивалент eval, который можно найти в других языках (en.wikipedia. org / wiki / Eval # Smalltalk). Я полагаю, есть небольшая вероятность того, что нет общедоступной общей документации по Smalltalk API, поскольку все это платно по стандарту ANSI? docs.python.org/3/library/index.html ruby-doc.org/stdlib-2.5.0   -  person Greg Buchholz    schedule 02.03.2018


Ответы (3)


Есть несколько классов, которые сотрудничают в составлении метода (или выражения), и, учитывая ваш интерес к предмету, я испытываю соблазн еще больше стимулировать вас в их изучении и понимании.

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

Сканер анализирует поток символов исходного кода и создает поток токенов. Затем эти токены анализируются парсером, который преобразует их в узлы AST (абстрактного синтаксического дерева). Затем компилятор посещает узлы AST для их семантического анализа. Здесь классифицируются все узлы переменных: аргументы метода, временные библиотеки методов, общие, аргументы блоков, временные структуры блоков и т. Д. Именно во время этого анализа все переменные связываются в соответствующей области. На этом этапе AST больше не является «абстрактным», поскольку он был аннотирован с информацией о привязке. Наконец, узлы повторно посещаются, чтобы сгенерировать буквальный фрейм и байт-коды скомпилированного метода.

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

Object compile: 'm ^3'

чтобы усвоить процесс.

После некоторого шага и повторения вы дойдете до первого интересного фрагмента кода, которым является метод OpalCompiler >> #compile. Если убрать блоки обработки ошибок, эти методы говорят сами за себя:

compile
  | cm |
  ast := self parse.
  self doSemanticAnalysis. 
  self callPlugins.  
  cm := ast generate: self compilationContext compiledMethodTrailer 
  ^cm

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

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

person Leandro Caniglia    schedule 02.03.2018
comment
Спасибо за развернутый и подробный ответ. Приношу свои извинения за непонятность в моем первоначальном вопросе. Я ищу документацию, описывающую использование методов класса компиляции, чтобы я мог научиться создавать и соответствующим образом использовать такие вещи, как аргумент aContext (для настройки лексической среды) метода #evaluate: in: (среди прочего ). Документация, аналогичная по духу той, что вы найдете для других языков программирования: docs.racket-lang.org /guide/eval.html Спасибо! - person Greg Buchholz; 02.03.2018

Вот несколько простых фактов:

  1. Оценка в Smalltalk доступна везде: в рабочих областях, в стенограмме, в браузерах, инспекторах, отладчике и т. Д. В принципе, если вам разрешено редактировать текст, скорее всего, вам также будет разрешено его оценивать.
  2. Есть 4 оценочные команды

    • Do it (evaluates without showing the answer)
    • Распечатать (вычисляет и печатает ответ рядом с выражением)
    • Осмотрите его (оценивает и открывает инспектор по результату)
    • Выполните отладку (открывает отладчик, чтобы вы могли шаг за шагом оценить свое выражение).
  3. Ваше выражение может содержать любой литерал (числа, массивы, строки, символы и т. Д.)

    17 "valid expression"
    
  4. Ваше выражение может содержать любое сообщение.

    3 + 4.
    'Hello world' size.
    1 bitShift: 28
    
  5. Ваше выражение может использовать любую глобальную переменную

    Object new.
    Smalltalk compiler
    
  6. Ваше выражение может ссылаться на self, super, true, nil, false.

    SharedRandom globalGenerator next < 0.2 ifTrue: [nil] ifFalse: [self]
    
  7. Ваше выражение может использовать любые переменные, объявленные в контексте панели, на которой вы пишете. Например:

    • If you are writing in a class browser, self will be bound to the current class
    • Если вы пишете в инспекторе, self привязан к проверяемому объекту. Вы также можете использовать в выражении его переменные экземпляра.
    • Если вы находитесь в отладчике, ваше выражение может ссылаться на self, переменные экземпляра, аргументы сообщений, временные библиотеки и т. Д.

введите здесь описание изображения

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

введите здесь описание изображения

person Leandro Caniglia    schedule 02.03.2018

Насколько я могу судить, для стандартной библиотеки Pharo нет документации по API, как в случае с другими языками программирования. Похоже, это подтверждается в списке рассылки пользователя Pharo: http://forum.world.st/Essential-Documentation-td4916861.html

... имеется черновая версия стандарта ANSI: http://wiki.squeak.org/squeak/uploads/172/standard_v1_9-indexed.pdf

... но, похоже, это не касается класса компилятора.

person Greg Buchholz    schedule 02.03.2018