Компиляторы языка программирования сначала переводят в блок или непосредственно в машинный код?

Попробуйте использовать класс Actions, чтобы сначала сосредоточиться на элементе, прежде чем использовать sendkeys(), как показано ниже:

Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.name("userId")));
actions.click();
actions.sendKeys("sysadmin");
actions.build().perform();
44
задан 10 May 2009 в 13:45
поделиться

10 ответов

gcc actually produces assembler and assembles it using the as assembler. Not all compilers do this - the MS compilers produce object code directly, though you can make them generate assembler output. Translating assembler to object code is a pretty simple process, at least compared with compilation.

Some compilers produce other high-level language code as their output - for example, cfront, the first C++ compiler produced C as its output which was then compiled by a C compiler.

Note that neither direct compilation or assembly actually produce an executable. That is done by the linker, which takes the various object code files produced by compilation/assembly, resolves all the names they contain and produces the final executable binary.

46
ответ дан 26 November 2019 в 22:04
поделиться

Согласно глава 2 из Введение в программное обеспечение обратного проектирования (Майка Перри и Наско Оскова), и gcc, и cl.exe (задняя сторона конечный компилятор для MSVC ++) имеют переключатель -S , который можно использовать для вывода сборки, создаваемой каждым компилятором.

Вы также можете запустить gcc в подробном режиме ( gcc -v ) чтобы получить список команд, которые он выполняет, чтобы увидеть, что он делает за кулисами.

6
ответ дан 26 November 2019 в 22:04
поделиться

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

Что касается gcc, он может компилироваться для самых разных целей. Я не знаю, компилируется ли сначала для x86 в сборку, но я дал вам некоторое представление о компиляторах - и вы тоже об этом просили.

6
ответ дан 26 November 2019 в 22:04
поделиться

Visual C ++ имеет переключатель для вывода ассемблерного кода, поэтому я думаю, что он генерирует ассемблерный код перед выводом машинного кода.

1
ответ дан 26 November 2019 в 22:04
поделиться

GCC компилируется на ассемблер. Некоторые другие компиляторы этого не делают. Например, LLVM-GCC компилируется в LLVM-сборку или LLVM-байт-код, который затем компилируется в машинный код. Почти все компиляторы имеют какое-то внутреннее представление, LLVM-GCC использует LLVM, а IIRC, GCC использует нечто, называемое GIMPLE.

5
ответ дан 26 November 2019 в 22:04
поделиться

You'd probably be interested to listen to this pod cast: Internals of GCC

1
ответ дан 26 November 2019 в 22:04
поделиться

In most multi-pass compilers assembly language is generated during the code generation steps. This allows you to write the lexer, syntax and semantic phases once and then generate executable code using a single assembler back end. this is used a lot in cross compilers such a C compilers that generates for a range of different cpu's.

Just about every compiler has some form of this wheter its an implicit or explicity step.

1
ответ дан 26 November 2019 в 22:04
поделиться

Компиляторы Java компилируются в байт-код Java (двоичный формат), а затем запускают его с помощью виртуальной машины (jvm).

Хотя это может показаться медленным, но может быть быстрее, потому что JVM можно использовать более поздние инструкции ЦП и новые оптимизации. Компилятор C ++ этого не сделает - вы должны настроить набор инструкций во время компиляции.

0
ответ дан 26 November 2019 в 22:04
поделиться

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

  • Standard ML of New Jersey , который работает в интерактивном режиме и компилирует каждое выражение «на лету».

  • Компилятор tinycc , который разработан, чтобы быть достаточно быстрым для компиляции, загрузить и запустить сценарий C менее чем за 100 миллисекунд и, следовательно, не хочет накладных расходов на вызов ассемблера и компоновщика.

Что общего у этих случаев, так это желание «мгновенного» ответа. Ассемблеры и компоновщики работают достаточно быстро, но недостаточно для интерактивного ответа. Тем не менее.

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

(Сноска: в начале 1990-х мы с Мэри Фернандес написали New Jersey Machine Code Toolkit , для которого онлайн-код генерирует Библиотеки C, которые авторы компиляторов могут использовать для обхода стандартного ассемблера и компоновщика. Мэри использовала их, чтобы примерно удвоить скорость своего оптимизирующего компоновщика при генерации a.out . Если вы не записываете на диск, ускорение будет даже больше ...)

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

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

15
ответ дан 26 November 2019 в 22:04
поделиться

Есть много фаз компиляции. Абстрактно, есть передняя часть, которая читает исходный код, разбивает его на лексемы и, наконец, на дерево разбора.

Задняя часть отвечает сначала за генерацию последовательного кода, подобного трем адресным кодам, например:

code:

x = y + z + w

into:

reg1 = y + z
x = reg1 + w

Then optimizing it, транслируя его на ассемблере и, в конце концов, на машинном языке. Все шаги аккуратно разбиты на слои, чтобы при необходимости можно было заменить один из них

.
1
ответ дан 26 November 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: