В SICP авторы утверждают ( раздел 1.1 ), что существует три основных «механизма» языков программирования:
примитивные выражения , представляющие простейшие сущности, с которыми связан язык
средство комбинирования , с помощью которого составные элементы строятся из более простых
средство абстракции , с помощью которого составные элементы могут быть названы и управляться как единицы
Как я могу проанализировать основной язык программирования (например, Java) с точки зрения этих элементов или механизмов?
Ответы:
Различие между примитивными выражениями, средствами комбинирования и средствами абстракции является полезным при моделировании языков программирования. Обратите внимание, что это не является внутренним свойством языка: вы не можете указать на какое-либо определение языка и сказать «эта функция однозначно является примитивным выражением, эта функция однозначно является средством комбинации». Различие является свойством модели, и сложные модели могут противостоять классификации.
Учебным примером этих трех понятий является лямбда-исчисление , которое имеет ровно одно из каждого:
Когда вы переходите на языки с большим количеством функций, моделирование может стать более неоднозначным. Вообще говоря, примитивное выражение - это то, что вы не можете или не будете разбивать на примитивные компоненты. Но это похоже на атом : оно примитивно, пока наука не пойдет дальше. Например, существует вариант лямбда-исчисления, в котором переменные используют числа, а не имена ( индексы де Брейна ), что особенно удобно при моделировании лямбда-терминов для компьютерных доказательств; и в компьютерных доказательствах целые числа разбиты на составные части . Так что в этих моделях переменные не являются примитивными выражениями.
В (типичной модели) Java примитивные выражения в основном являются константами и переменными. Средства комбинаций включают в себя многочисленные операторы; более точно, «аддитивное выражение» - это средство комбинации с двумя слотами (левая сторона и правая сторона) или с тремя слотами (две стороны плюс оператор), если вы включаете и A
+
B, и A-
B под этим именем (в этом случае операторы+
и-
будут примитивными конструкциями сами по себе). Другие средства комбинирования включают в себя последовательности инструкций I;
J , циклические конструкцииwhile (…) {…}
, и так далее. Затем у вас есть конструкции, такие как объявления переменных, определения функций, определения классов и т. Д., Которые являются средствами комбинации (они объединяют имена и типы параметров, тела, инициализаторы и т. Д.) И средствами абстракции (поскольку они определяют имена для повторного использования). На самом деле весьма распространено, что средства абстракции также являются средствами объединения: они объединяют имя с его определением.источник
Грубый удар:
Выражения только это; что составляет выражение в Java. Я не знаю, будет ли это включать заявления или нет.
Комбинации могут включать составные выражения, (переменные?) Операторы, методы, механизм классов и пакеты. Модули тоже, как только они на языке.
В Java самым простым средством абстракции является класс: ничто не может существовать вне класса. Возможно, существуют «слои» абстракции: статический метод, возможно, проще, чем метод экземпляра, потому что он не требует экземпляра.
Дженерики предлагают дополнительный уровень абстракции (и разочарования).
источник
Вот моя основная классификация. Я пытаюсь нарисовать параллель с LISP.
Примитивные выражения
Параллель в LISP : атомы, числа и списки.
Средства комбинирования (способы построения составных структур данных)
Параллельно в LISP : минусы, списки, списки
Средства абстракции
+
,-
,*
,/
, ...)Параллельно в LISP : функции, похожие на синтаксис
let
,define
источник
Язык программирования обычно определяется его синтаксисом и семантикой . Оба из них будут определены в стандартах для языка.
Синтаксис описывает, как написать правильную программу, а семантика определяет, что означает эта действительная программа.
В ваших случаях синтаксис скажет вам, каковы ваши примитивы, как вы их комбинируете и как вы их абстрагируете. Семантика скажет вам, что означают комбинации и абстракции.
Например, синтаксис скажет вам, как написать правильный
for
цикл. Семантика скажет вам, что делает цикл for.Если вы действительно хотите начать анализировать язык программирования, возьмите копию стандарта и посмотрите, что там. Я бы действительно начал с простого языка, такого как C, прежде чем углубляться в Java. Я также прочитал бы остальную часть книги. Изучение того, почему языки программирования работают так, как они делают, сделало меня лучшим программистом, хотя я не использую компиляторы.
источник
x = ++x;
, недопустима, даже если типичный компилятор примет его.Я не знаю, правильно ли это, но то, как я понимаю разделение, таково:
примитивные выражения , это могут быть такие вещи, как >>, +, *, /, int, логическое значение, переменные, методы и т. д.
средства комбинации, это может быть спорным, либо его вещи , как + и concact, или его говорить о более сложных идей , как наследование против композиции и способы , чтобы сделать это. Инъекция, новый оператор, расширение и т. Д.
средства абстракции, это будет синтаксис, используемый для именования переменных и методов, а также средства создания интерфейсов, классов, статических классов, методов перегрузки и т. д.
Однако, возможно, вам нужно дать нам больше информации из книги, чтобы мы точно знали, что там подразумевается.
источник
means of combination
том, что сложно понять, что именно там находится. Хороший ответ, хотя.