LINUX.ORG.RU

Abstract syntax tree

 ,


0

4

Копался во внутренностях гема rubocop (статический анализатор) и открыл для себя такой интересный гем как astrolabe который рубокоп юзает для синтаксического разбора ruby кода.
Он переводит код ruby в абстрактное синтаксическое дерево.
Например такой код на руби

puts 'test'
arr = %w(1 2 3)
он переводит вот в такое AST
(begin
  (send nil :puts
    (str "test"))
  (lvasgn :arr
    (array
      (str "1")
      (str "2")
      (str "3"))))
=)

А вот такой
module Test3
end

class Test1
end

class Test2 < Test1
  include Test3

  def qwer
    puts 'test'
    arr = %w(1 2 3)
  end

  private

    def qwer2(test, test1:, test2:)
      @arr = (1..10).map(&:to_f)
    end

    def qwer3(**)
    end
end
Вот в такое
  (begin
  (module
    (const nil :Test3) nil)
  (class
    (const nil :Test1) nil nil)
  (class
    (const nil :Test2)
    (const nil :Test1)
    (begin
      (send nil :include
        (const nil :Test3))
      (def :qwer
        (args)
        (begin
          (send nil :puts
            (str "test"))
          (lvasgn :arr
            (array
              (str "1")
              (str "2")
              (str "3")))))
      (send nil :private)
      (def :qwer2
        (args
          (arg :test)
          (kwarg :test1)
          (kwarg :test2))
        (ivasgn :@arr
          (send
            (begin
              (irange
                (int 1)
                (int 10))) :map
            (block-pass
              (sym :to_f)))))
      (def :qwer3
        (args
          (kwrestarg)) nil)))),
абстрактное синтаксическое дерево =)

Вопросы:
1) Какого хрена в моем уютном руби делает лисп?
2) Лисп так хорошо подходит для использования в качестве абстрактного синтаксического дерева?
3) Лиспофанатики кричащие о том что лисп это основа основ и нет ЯП кроме лиспа не так уж и далеки от правды?
4) Если лисп умер почему я встречаю его в самых неожиданных местах?
5) Как мне это развидеть? Мир уже никогда не будет прежним?

★★★★★

в talks

1) Любой язык можно таким образом превратить в лисп.
2) Да.
3) Да.
4) Он не умер.
5) Никак. Да.

mix_mix ★★★★★
()

Не парься. Просто аст удобно представлять в виде скобкоты. Никакой лисповой семантики там нет.

anonymous
()

1) Это не лисп, это представление дерева в S-expr. Можно было с тем же успехом его как XML представлять. 2) S-expr неплохо подходит для отображения AST. Лиспа никакого тут нет, и S-expr используется только для отображения, а не «в качестве». 3) Так же далеки, как и раньше. 4) Потому, что ты не отличаешь лисп от S-expr, очевидно же. 5) Успокойся, истеричка, лисп мертв.

nonimous
()

Ты где тут лишп углядел? Это всего лишь s-выражения - синтаксис для записи сильно накренившихся вправо двоичных деревьев. Так уж вышло, что АСТ из-под парсера всегда как раз кренятся вправо, вот ленивые люди и используют тупые s-выражения там, где лучше подошел бы божественный json.

anonymous
()

Лисп так хорошо подходит для использования в качестве абстрактного синтаксического дерева?

AST хорошо представляется в Lisp-подобной нотации. Не более.

Если лисп умер почему я встречаю его в самых неожиданных местах?

Это не Lisp.

tailgunner ★★★★★
()
Ответ на: комментарий от TDrive

Лисп не является интерпретатором S-expr?

И? Есть адекватные люди, следовательно anonimous не больной шизофазик?

anonymous
()

В лиспе вместо синтаксиса - AST, а символы в руби сперли из лиспа. Вот и вся загадка.

Virtuos86 ★★★★★
()
Ответ на: комментарий от TDrive

S-выражения - не язык программирования, чтобы его интерпретировать. Лисп его разбирает.

sevenredlines
()

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

2. Дерево подходит для использования в качестве дерева, да.

3. Использование AST'а просто дает больше степеней свободы.

4. Потому что он не умер, «Lisp doesn't look any deader than usual to me.» - David Thornley, reply to a question older than most languages

5. Как однажды сказал pjb на #lisp - «lisp is either your first or your last programming language».

loz ★★★★★
()

1) такой же мертвый как и уютный руби
2) подходит для того, что мертво
3) как основа всего мертвого
4) потому что руби тоже умер
5) не писать на руби

umren ★★★★★
()

И кстати, чтоб шизофреникам совсем плохо стало:

1.c:

int abc(int a, int b)
{
  return a*a + b*b;
}

Теперь говорим:

gcc -c -fdump-rtl-all 1.c

И получаем кучку файлов примерно такого содержания:

;; Function abc (abc)

(note 1 0 3 NOTE_INSN_DELETED)

(note 3 1 22 2 [bb 2] NOTE_INSN_BASIC_BLOCK)

(insn/f 22 3 23 2 (set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0 S4 A8])
        (reg/f:SI 6 bp)) 1.c:3 43 {*pushsi2}
     (nil))

(insn/f 23 22 24 2 (set (reg/f:SI 6 bp)
        (reg/f:SI 7 sp)) 1.c:3 64 {*movsi_internal}
     (nil))

(note 24 23 2 2 NOTE_INSN_PROLOGUE_END)

(note 2 24 5 2 NOTE_INSN_FUNCTION_BEG)

(insn 5 2 21 2 (set (reg:SI 0 ax [63])
        (mem/c/i:SI (plus:SI (reg/f:SI 6 bp)
                (const_int 8 [0x8])) [0 a+0 S4 A32])) 1.c:4 64 {*movsi_internal}
     (nil))

(insn 21 5 6 2 (set (reg:SI 1 dx [orig:59 D.1232 ] [59])
        (reg:SI 0 ax [63])) 1.c:4 64 {*movsi_internal}
     (nil))

(insn 6 21 7 2 (parallel [
            (set (reg:SI 1 dx [orig:59 D.1232 ] [59])
                (mult:SI (reg:SI 1 dx [orig:59 D.1232 ] [59])
                    (mem/c/i:SI (plus:SI (reg/f:SI 6 bp)
                            (const_int 8 [0x8])) [0 a+0 S4 A32])))
            (clobber (reg:CC 17 flags))

  ...

anonymous
()
Ответ на: комментарий от anonymous

Это к слову не AST, а одно из промежуточных представлений бинарного кода, и тут от S-expr никакого проку нет, он по смыслу плоский как ассемблер. Скобочки тут остались с 80х, спасибо аутисту rms, и LLVM IR в этом же контексте гораздо читаемее.

nonimous
()
Ответ на: комментарий от TDrive

Тебя действительно интересует мнение этого дурачка?

Да просто поржать :) Я знал что он про своб ноду тут писать будет, или пхп :)

abc
()
Ответ на: комментарий от nonimous

Эквивалент в LLVM этому уровню - не IR, а Selection DAG. И там тоже скобочки.

anonymous
()

Никакого, да, да, нет, никак, да.

t184256 ★★★★★
()
Ответ на: комментарий от hlebushek

Эти деревья не двоичные.

Почему это не двоичные? Голова и хвост.

И что значит накренившиеся вправо?

Вложенность хвостов намного больше, чем голов. Т.е.

(a . (b . (c . (d . ()))))

будет записано как

(a b c d)

Для наивного представления AST удобно. Но лучше так не делать.

anonymous
()

Абстрактное синтаксическое дерево же, из любого языка такое можно сделать. Чем, кстати, и занимается компилятор на этапе парсинга. Есть ещё специальные сервисы для визульного построения этого дерева, используя вот этот «Lisp»-оподобный код.

kalterfive ★★
()

так это давно известно что лисперы настолько суровы что пишут без синтаксиса сразу в AST

хотя небольшой синтаксис в виде reader macros у них все же есть

bismi
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.