примитивы языка программирования - PullRequest
1 голос
/ 27 марта 2010

К чему относятся понятия, управляющие потоком, типом данных, оператором, выражением и операцией? Синтаксис или семантика?

Какова связь между потоком управления, типом данных, оператором, выражением, операцией, функцией, ...? Как программа строится из уровня этих примитивов за уровнем?

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

Спасибо и всего наилучшего!

Ответы [ 3 ]

2 голосов
/ 27 марта 2010

Они принадлежат обоим мирам:

  • Синтаксис опишет, какие операторы являются примитивными типами (int, float) и являются ключевыми словами (return, for, while ). Таким образом, синтаксис решает, какие «слова» вы можете использовать в языке программирования. Под словом «я» подразумевается каждый возможный токен: = - это токен, void - это токен, varName12345 - это токен, который считается идентификатором, 12.4 - это токен, рассматриваемый как float и так далее. .

  • Семантика опишет, как эти токены могут быть объединены вместе в вашем языке.

Например, у вас будет семантика while:

WHILE ::= 'while' '(' CONDITION ')' '{' STATEMENTS '}'
CONDITION ::= CONDITION '&&' CONDITION | CONDITION '||' CONDITION | ...
STATEMENTS ::= STATEMENT ';' STATEMENTS | empty_rule

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

Тогда есть третий аспект семантики, а именно «что означает эта конструкция?». Вы можете видеть это как соответствие между, например, циклом for и тем, как он должен быть переведен на язык нижнего уровня, который необходимо выполнить.

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

Например, ваша грамматика может разрешить делать varName = 12.4, но средство проверки типов будет использовать объявление varName, чтобы понять, можете ли вы присвоить ему число с плавающей запятой. (конечно же, речь идет о статической проверке типов)

2 голосов
/ 27 марта 2010

Все эти языковые элементы имеют как синтаксис (как он написан), так и семантику (как способ написания соответствует тому, что на самом деле означает) Поток управления определяет, какие операторы выполняются и когда, выражения дают значение и могут состоять из функций и других элементов языка (хотя детали зависят от языка программирования). Операция обычно представляет собой последовательность операторов. Значение «функции» варьируется от языка к языку; в некоторых языках любая операция, которая может быть вызвана по имени, является функцией. В других языках функция - это операция, которая выдает результат (в отличие от процедуры, которая не сообщает о результате). Некоторые языки также требуют, чтобы функции не мутировали, в то время как процедуры могут мутировать, хотя это зависит от языка к языку. Типы данных инкапсулируют как данные, так и операции / процедуры / функции, которые могут работать с этими данными.

1 голос
/ 27 марта 2010

Эти понятия принадлежат обоим.

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

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

...