Как работают операторы? - PullRequest
4 голосов
/ 31 августа 2009

Я хочу знать, как операторы работают внутри компьютера?

И Есть много операторов, которые компьютер использует для выполнения многих задач, например, "+" используется для добавления двух чисел, а также для объединения двух строк в Java. Итак, как он различает задачи такого типа?

Ответы [ 7 ]

3 голосов
/ 31 августа 2009

На самом деле вы спрашиваете: «как работают компиляторы?» - операторы - это один из типов токенов, которые компилятор должен анализировать, и они принципиально не отличаются от других типов токенов, таких как методы - на самом деле в языках, которые позволяют вам определять свои собственные операторы, определение обычно выглядит как определение метода.

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

1 голос
/ 31 августа 2009

Компилятор знает тип данных операндов. Если он увидит выражение типа 2+3, он определит, что оба операнда (то есть 2 и 3 ) являются целыми числами, поэтому компилятор генерировать исполняемый код, который выполняет сложение целых чисел. Если выражение равно "Hey, " + "Bob!", компилятор видит, что операнды являются строками, и если язык поддерживает добавление строк (например, в Java), он сгенерирует код, который выполняет конкатенацию строк.

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

0 голосов
/ 31 августа 2009

Строка, содержащая операторы типа "a + b * (c-d)", является выражением. Компилятор анализирует выражение и создает промежуточную структуру, называемую абстрактной синтаксической строкой:

          +
         / \
        a   *
           / \
          b   +
             / \
            c   d

С помощью синтаксического дерева вычисляется выражение. Типы листьев (a, b, c, d) определяют, какая операция необходима. Эта информация используется для оценки выражения (для интерпретатора) или для создания машинного кода:

get c  ; get variable c in a register
add d  ; add variable d
mul b  ; multiply with variable b
add a  ; add variable a
store restult ; store the restult

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

0 голосов
/ 31 августа 2009

Различает задачи на основе (получите это), какой оператор вы используете. Когда код анализируется, анализатор / компилятор находит операторы и решает, что делать с окружающими его вещами. Если + используется как для сложения, так и для конкатенации, это будет зависеть от предоставленных ему аргументов. Язык решает, что делать, когда это микс, например, если «4» + 5 равно «45» или 9.

Кроме того, операторы имеют приоритет. То есть некоторые операторы оцениваются раньше, чем другие. Вроде как порядок операций, которые вы изучаете в математике. Например, операторы + и - обычно имеют более низкий приоритет, чем операторы * и / (умножение и деление) (то есть операции умножения будут выполняться перед операциями сложения). Вот почему 4 * 5 + 2 будет равно 22 вместо 28. Вы можете найти здесь таблицу приоритетов операторов . Это для языка C, но оно должно быть аналогичным для большинства других языков.

Существует также ассоциативность операторов. Это (в основном) порядок, в котором оцениваются операторы одного типа. Большинство из тех, к которым вы привыкли, останутся ассоциативными. Например:

4 * 5 * 6 * 7

это осталось ассоциативным, что означает это:

((4 * 5) * 6) * 7

если в строке есть два или более операторов одного и того же приоритета (как в примере), то они будут оцениваться слева направо. То есть сначала 4 * 5, затем 20 * 6, затем 120 * 7. Примером правого ассоциативного оператора является оператор экспоненты:

 4 ^ 5 ^ 6 ^ 7

Это становится

 4 ^ (5 ^ (6 ^ 7))

Они оцениваются справа налево. Если бы оператор экспоненты оставался ассоциативным, это дало бы неправильный ответ.

Думайте об ассоциативности как "с какой стороны заключены скобки". они слева для левой ассоциации, а справа - для правой.

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

0 голосов
/ 31 августа 2009

Операторы очень похожи на функции с параметрами. Или в современных объектно-ориентированных языках, таких как методы объекта с параметром. Это прекрасно видно, например, если вы посмотрите на методы перегрузки методов в C ++. Таким образом, числовой оператор + - это своего рода псевдокод - что-то вроде этого:

function integer.+(b: integer) {
   return ADD self, b;
}

Остальное - синтаксический сахар.

Был ли у вас когда-нибудь калькулятор HP с постфиксной нотацией? Думайте об этом в этих терминах. Таким образом, компилятор переведет a + b в (+ a b) или объект, ориентированный на a. + (B).

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

Затем он преобразует код во внутреннее представление и в машинный код.

0 голосов
/ 31 августа 2009

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

По определению, правильно написанный синтаксический код никогда не будет неоднозначным.

Когда компилятор говорит «синтаксическая ошибка», он говорит вам, что код неоднозначен.

0 голосов
/ 31 августа 2009

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

...