как устроен Python?

Тема в разделе "WASM.LANGS", создана пользователем _evil, 28 май 2022.

  1. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    57
    Вобще хотелось бы узнать есть ли такие интерпретаторы которые исполняют прямо по абстрактному синтаксическому дереву (которое получается после парсинга), то есть без преобразования в байт код?
    Или старый PHP единственный в своём роде?
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.861
    Таких очень мало, это не особо оптимальный подход для интерпретаторов. Можешь среди разных LISP'ов и Scheme поискать, ну или https://github.com/HaxeFoundation/hscript посмотри, если нужен один пример, он умеет сериализовывать аст в бинарщину, но это не байткод в классическом понимании вещей.
     
  3. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    826
    Несколько более оптимальный подход - интерпретатор, основанный на замыканиях, ну или closure-based подход. Хорошо описан в SICP и в "Интерпретации Лиспа и Scheme". А ссылки на репы нет смысла давать, если нет понимания, как оно работает в теории. Не поймут.
     
    _evil нравится это.
  4. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    57
    а не можете подсказать как это работает или поделиться ссылкой желательно на русском
     
  5. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    826
    Это фактически компиляция, только не в машинный код или байт-код, а в замыкания в языке программирования, на котором пишется такой интерпретатор.

    В наивном интерпретаторе обход AST будет выполнен каждый раз заново. Например, есть цикл, где 100500 раз вызывается функция c арифметическим выражением. Интерпретатор тогда будет 100500 раз обходить AST этой функции и продираться через это выражение. Вместо этого можно сделать один обход, создавая при этом замыкания, в которых и будут заключены все вычисления, ожидающие только входных данных. Потом останется лишь вызвать замыкание (с параметром - состоянием лексичесого окружения, например) и получить значение интерпретируемого подвырежения. AST здесь больше не нужно. Плюс в том, что в замыканиях (в их локальных переменных) можно естественным образом что-нибудь закешировать, например, местоположение переменных, что лексическом окружении хранятся (чтобы по строковым именам к ним не обращаться каждый раз), и этим ускорить к ним доступ.
     
    _evil нравится это.
  6. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    57
    Пытаюсь переварить про замыкания... как-то не очень понятно...
    То есть AST по частям преобразуют в замыкания ... А замыкания как я полагаю это массивы указателей(или ссылки) на подпрограммы которые получают указатели на аргументы .
    Или что такое замыкания в этом случае? Ведь это не замыкания в языках программирования?
    Было бы интересно на каком либо примере увидеть эти замыкания хотя бы готовые.
     
  7. Microedition

    Microedition Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    826
    Как обычно, рекурсивно обходят и преобразуют. На выходе получается замыкание, представляющее всё вычисление.
    То, о чем вы полагаете, скорее называется шитым кодом.
    Да, я говорю именно про замыкания в языках программирования. То есть процедура плюс переменные, захваченные в контексте определения этой процедуры (ну или в лексической области видимости).
    Так в том же питоне есть замыкания. Например, на javascript такой пример:

    Код (Text):
    1. function incrementor() {
    2.   var i = 0;
    3.   return function() {
    4.   i++;
    5.   return i;
    6.   }
    7. }
    8. var inc = incrementor();
    9. inc();
    10. inc();
    11. console.log(inc());
    - выведет "3". Здесь переменная i определена в функции incrementor, а изменяется во внутренней анонимной функции, причем значение переменной сохраняется между её вызовами.

    Интерпретатор на замыканиях может выглядеть так. Псеводкод на javascript'е:
    Код (Text):
    1. function analyze(ast) {
    2.   switch (ast.nodeType) {
    3.   case NUMBER:  return analyzeNumber(ast);
    4.   case VARIABLE: return analyzeVariable(ast);
    5.   case IF:  return analyzeIf(ast);
    6.   ...
    7.   }
    8. }
    9.  
    10. function analyzeNumber(ast) {
    11.   var number = stringToNumber(ast.text);
    12.   return function(env) {
    13.     return number;
    14.   };
    15. }
    16.  
    17. function analyzeVariable(ast) {
    18.   var location = findLocation(ast);
    19.   return function(env) {
    20.     return getVariableValue(env, location);
    21.   };
    22. }
    23.  
    24. function analyzeIf(ast) {
    25.   var executePred = analyze(ast.predicate);
    26.   var executeThen = analyze(ast.then);
    27.   var executeElse = analyze(ast.else);
    28.   return function(env) {
    29.     var result = executePred(env);
    30.     if (result == true) {
    31.       return executeThen(env);
    32.     } else {
    33.       return executeElse(env);
    34.     }
    35.   };
    36. }
    37.  
    38. var environment = ...;
    39.  
    40. for (;;) {
    41.   var expression = readline('> ');
    42.   var ast = parse(expression);
    43.   var execute = analyze(ast);
    44.   var result = execute(environment);
    45.   print(result);
    46. }
    То есть функция analyze проходит по AST и возвращает замыкание, которое, в свою очередь, возвращает результат вычисления, когда его вызывают. А enviromnent - это состояние интерпретатора, т. е. память, переменные и так далее. Как видите, в анонимных функциях AST больше не используется, а всё, что нужно для работы, сохранено в локальных переменных. Ну а в цикле всё и происходит - прочитали, распарсили, выполнили, вывели результат.

    Вообще, задавая вопросы на форумах, вы никогда не разберетесь, так будет только хаос в голове. Ищите всё самостоятельно в литературе, а ссылки выше я дал.
     
    Последнее редактирование: 1 июн 2022
    _evil нравится это.
  8. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    57
  9. KPG

    KPG Member

    Публикаций:
    0
    Регистрация:
    13 янв 2021
    Сообщения:
    87
    Заметка о языке :Firth сделанного в рамках Lua.
    https://blog.ionoclast.com/2015/05/firth-pre-alpha-1-a-forth-like-language-for-dsl-creation/ :Firth pre-alpha 1– a Forth-like language for DSL creation.

    P.S. Можно использовать отдельно библиотеку LibJit https://ru.wikipedia.org/wiki/LibJIT
    для повышения производительности Форт программ при стековом байт коде VM (может и для МК может сработать при наличии ресурсов в необходимой мере)
    Библиотека нормально собралась и отработала тесты под Linux 32 (правда не последняя её версия)
    В примере библиотеки "скриптовый" Паскаль Dpas с выполнением кода во время загрузки его с исходника.
    На Github есть некоторое количество отдельных языков в привязкe к этой библиотеке.

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

    https://ru.bmstu.wiki/LibJIT
    ...
    Основы программного моделирования ЭВМ.pdf

    Интерпретаторы байт-кодов своими руками
    (из 3-ёх статей)
    --- Сообщение объединено, 23 авг 2022 ---
    Пара познавательных видосиков русскоязычных преподавателей по Форт :)
    1. Системы реального времени (СРВ, RTS). Лекция. Язык Forth (Shared March 10, 2022)
    (Автор только ошибся - в Фортe и стандарте есть локальные переменныe)

    2. Операционные системы - Система Forth 17.12.21
     
  10. who_know777

    who_know777 Member

    Публикаций:
    2
    Регистрация:
    29 мар 2021
    Сообщения:
    98
    Адрес:
            
    Незнаю, может это как-то внесет ясность, исходники питона https://www.python.org/downloads/source/
    Еще есть дирректория include в установленном питоне с заголовочными файлами на си.

    Тоже интересно, только в контексте embedded python. Не совсем понятны некоторые вещи.