Ещё один способ использования python в браузере (и не только)

Предыстория

Весной 2020 года я впервые попробовал себя в разработке сайтов бэкенд я писал на питоне, а на фронте пришлось использовать js, и он вызвал у меня отторжение(тут надо уточнить, что я не считаю js ужасным языком, просто он мне не понравился). Не долго думая я начал писать транслятор с питона в явускрипт(а если бы погуглил то нашел бы это и это). об этом трансляторе и пойдет речь.

Отличия от других трансляторов

В процессе разработки я читал о явескрипт и не много о других языках (ruby, lua, php) и заметил что в них много общего, например наличие условных конструкций, функций, переменных и тд. И тогда я подумал почему бы не добавить возможность трансляции не только в js, но и в другие языки.

Языки добавляются с помощью функций обработчиков, например обработчик математичиских операций для js выгладит так:

def bin_op(left, right, op):
    return f"({left}{op}{right})"

а для lisp он будет выглядеть так:

def bin_op(left, right, op):
    return f"({op} {left} {right})"

А так же также отличительной чертой является возможность добавления макросов например целочисленное деление в js:

signs = {"//": lambda l, r: f"Math.floor({l}/{r})"}

Кому это нужно

Одним из вариантов использования проекта является написание скриптов в играх, так как питон довольно тяжелый для встроенного языка то можно использовать трансляцию в lua.

Так же можно использовать его как линтер для python с исправлением ошибок в именах функций.

Ну и для поддержки проектов с языками вызывающими у вас отторжение(как у меня js или pascal) ну или просто устаревшие языки.

Важно

В некоторых местах статьи можно подумать, что считаю некоторые языки какими-то не такими. Я рассматриваю языки как две части: его синтаксис(тут python для меня почти идеал) и как платформу.

Все говорят, что язык это инструмент и нужно уметь пользоваться разными, то есть молотком отвертку не заменишь. Так вот молоток и отвертка - это платформы, а их ручка это синтаксис.

Лучше всего это видно на примере java. Java(jvm) - это распространённая, быстрая платформа, а синтаксис и языки для нее разные: Kotlin, Java, Clojure и многие другие.

Что поддерживается

На момент написания статьи добавлен только один язык js, так же я пробовал транслировать в go, но только на уровне hello world и делал код робота катающегося по линии на ардуино(c++).

А так же пока не сделана документация.

Поддерживаются блоки if...elif...else, while, for(C подобный и for each), возможность писать с аннотациями типов. Так же поддерживаются макросы. В общем пока можно писать программы уровня олимпиадного программирования.

Планы на будущее

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

И еще хотелось бы web интерфейс как на этой картинке:

P.S.

Это вторая попытка написания статьи.

Поддержите проект звездочкой на гитхаб

Присоединяйтесь к телеграм каналу

Комментарии 26

    +5
    Конечно у вас JS вызвал отторжение, у меня бы ваш Рутхон тоже вызвал отторжение, если бы я
    в нем не разобрался для начала, начиная с изучения названия языка.
      0
      Проблема трансляции из абстрактного синтаксического дерева (или еще банальнее регекспами) в том, что транслируется только синтаксис, но не платформа языка. В grumpy на GO попытались стандартную библиотеку хотя бы тоже транслировать, но проект сильно сдал после того, как в google на него забили.

      Для своих поделок под век выбрал imba, но у нее тоже подводных камней хватает, пришлось отключить сжатие когда и читать сгенерированный js после трансляции для дебага
        0

        Есть возможность описать библиотеку. Например, я использовал библиотеку json с помощью аналогичной библиотеки в js

          +2

          хех, grumpy вспомнили
          я как раз один из контрибуторов, пытаюсь добавить поддержку 3 питона

          0

          Если уж JS так бесит, попробуйте CoffeeScript, он чем-то похож на Python (хотя на самом деле больше на Ruby, но все же).

            0

            CofeeScript классный, но всё же питон мне ближе.

            +9
            Как можно написать хороший транслятор в JS, не изучив JS глубоко и всесторонне? А если JS уже глубоко и всесторонее изучен, зачем транслятор?
              +1
              А если JS уже глубоко и всесторонее изучен, зачем транслятор?

              Чтобы не писать один код дважды для исполнения в двух разных средах.
                0

                Например? Какой код может пригодиться и в браузере, и в микроконтроллере с python внутри?

                  +1

                  Это разные сферы. А вот в браузере и в десктопном приложении уже может понадобиться один и тот же код.

                    0
                    Если бы я писал код для микроконтроллера с python внутри, я бы охотно повесил на сайте его интерактивную демку.
                +2

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

                  0
                  Вот вам конкретный пример: библиотека iText 7 пишется на Java и автоматически транслируется на C#, чтобы ею пользоваться могли и под JVM, и под CLR. Очевидно, что в автосгенерированном коде на C# много кусков, от которых программисты на C# кисло морщатся.
                  По-вашему, было бы практичнее писать iText 7 на двух языках параллельно и независимо? Удвоить затраты на разработку, сопровождение, поиск багов?
                  +1
                  Вот пайтон отличается от многих языков отсутствием обозначения конца строки и многих других «лишних» символов и конструкций языка, поэтому читать текст автора без запятых и других знаков очень сложно, хотя вполне понятно почему так. Мне вот интересно, а как бы выглядел текст, если любимым языком автора был не пайтон, а какой-нибудь условный Java, там точки были бы вместо пробелов или может все же стоит перечитывать текст перед публикацией?
                    0

                    А если бы автор писал на whitespace, то и статьи бы не было. /sarcasm

                    0
                    Оффтоп: почему на картинке alert() а не console.log()? Он, вроде, ближе по смыслу
                      +2
                      гугл транслейт же
                        0

                        Это настраивается.

                        0
                        Есть ещё вот такой вариант: github.com/iodide-project/pyodide
                          +4

                          Программу на python с помощью замены синтаксиса можно преобразовать в js только в том случае, если она уже написана на js, только с табами и двоеточия и :D
                          Любой python-специфичный оборот, или просто импорт любого модуля — что с ним будете делать?

                            0

                            Конечно же когда вы пишите для браузера вы пишете на js, но с более приятным синтаксисом python.

                              0
                              КМК проще сразу писать на js. Или в мире javascript нет IDE с поддержкой синтаксиса, и там всё делают в блокноте?
                                0

                                Имеется ввиду, что вы должны понимать возможности и ограничения js, как платформы. Например, в оригинальном питоне вы не можете сложить строку с числом, а в js можете. Поэтому вы можете сделать так.


                                print('a'+1)
                                  +1
                                  Думаю, за такие обороты в приличной компании должны бить граблями по пальцам. Даже если это js :)
                            +1

                            пост — это "Цветы для Элджернона" на программистском языке?

                              0
                              Посоветуйте, как во всем разбираться?

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое