Ответы пользователя по тегу Трансляторы
  • Как написать свой компилятор?

    @rPman
    В тупом виде - каждый оператор и инструкция языка в коде компилятора описаны набором машинных команд (точнее там что то в виде функции, генерирующей набор команд в соответствии со входными параметрами).

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

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

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

    Иногда добавляют еще несколько стадий, например один язык может генерироваться не сразу в объектный код а в исходные коды другого языка, который уже существующим компилятором генерирует итоговый.

    Или наоборот, вместо генерации машинного кода, используется коды выдуманной виртуальной машины, которая будет запускаться (транслироваться в реальном времени в машинный код) на разных архитектурах одинаково (например jvm и clr).

    И в догонку, в мире уже столько наворотили языков что разрабатывать и поддерживать под каждый оптимальный компилятор становится сложно, что в мире придумали llvm - набор правил, стандартов, библиотек и утилит, включая байткод виртуальной машины и трансляторы на все архитектуры... к примеру opencl использует llvm как основу
    Ответ написан
    1 комментарий
  • VM vs native, какие плюсы и минусы?

    @rPman
    Если рассматривать конкретно llvm то эта инфраструктура может дать оптимизацию на основе выполнения, т.е. собирая статистику работы кода на лету может оптимизировать циклы на столько что итоговая скорость выполнения может стать выше аналогичного кода, скомпилированного нативно (например у меня так llvm код соптимизировал 'почти' не используемые блоки).

    Да, для компиляторов c++ есть анализаторы, собрающие данные путем прогона алгоритма на специально собранных версиях, но маловато кто этим занимается, уж точно 99.99999% проектов что есть этим не заморачиваются (да и сложно это)

    p.s. с другими виртуальными машинами такие тесты сложно провести, а то что я слышал jvm или clr работают медленней нативного, ощутимо
    Ответ написан
  • Как скомпилировать программу через командную строку используя только возможности виндоус?

    @rPman
    Возможностей windows для этого будет мало. В штатной поставке идет наверное только .net компилятор (это c# или js.net/vb.net где то с win8), т.е. с помощью .net можно сгенерировать текст программы и скомпилировать ее командной строке или кодом, получишь exe но для .net виртуальной машины.
    ------------------------
    Для создания своего языка программирования и интерпретатора есть свои инструменты, и много, для питона например lexer, но вот чтобы сразу и компилятор в нативный код получился, уже сложнее, все в основном не заморачиваются бинарным кодом и переводят в си язык с стараясь следовать posix тогда получившаяся программа будет кросплатформенной (или относительно легко таковой сделать) а уже получившийся код компилируют в бинарник.

    Но если речь в принципе о задаче и не важно как она будет решена, наиболее эффективный способ использовать llvm. И хотя тут так же будет не нативный код а байткод для виртуальной машины llvm, это все равно будет лучше, так как благодаря современным технологиям, виртуальная машина многие места программ оптимизирует в процессе выполнения и они могут работать даже быстрее нативного бинарника (сам в шоке, стремовый парсер json у меня на llvm работает чуть ли не в 2 раза быстрее gcc, который быстрее в 2 раза майкрософтовского)
    p.s. ой тяжко тебе будет с windows, не невозможно а просто сложно, речь о создании и настройки окружения для получения результата... даже кросскомпиляция из linux в windows может оказаться проще, поэтому сразу смотри в сторону cygwin или даже wsl подсистемы
    Ответ написан
  • Где найти компилятор Microsoft Visual Studio 2010?

    @rPman
    попробуй веб инсталлер, маловероятно что он заработает но вдруг.

    еще можешь попробовать скачать 2012 версию

    p.s. если что, на рутрекере их лежит несколько, начиная с portable версии
    Ответ написан
    Комментировать
  • Чем движок отличается от виртуальной машины?

    @rPman
    По всякому.

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

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

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

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

    Компиляция в другой язык программирования, который имеет компилятор под нужную вам архитектуру, т.е. ваш код преобразуется в промежуточный (truescript например компилируется в javascript а тот исполняется в браузере или на nodejs).

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