Анализируя язык программирования

10

В SICP авторы утверждают ( раздел 1.1 ), что существует три основных «механизма» языков программирования:

  • примитивные выражения , представляющие простейшие сущности, с которыми связан язык

  • средство комбинирования , с помощью которого составные элементы строятся из более простых

  • средство абстракции , с помощью которого составные элементы могут быть названы и управляться как единицы

Как я могу проанализировать основной язык программирования (например, Java) с точки зрения этих элементов или механизмов?


источник
Вы смотрели в расширенной форме Бэкуса-Наура, EBNF или форме Бэкуса-Наура, BNF раньше? Это может сломать грамматику, похожую на эти три понятия, хотя я не совсем уверен, каковы ваши намерения, поэтому я не знаю, поможет это или нет.
Джетти
@ Джетти - да, у меня есть, и нет, это не то, что меня интересует. Я действительно хочу проанализировать семантику (вопрос: действительно ли это слово, которое я ищу?) Языков программирования, а не их письменные формы (т.е. синтаксис).

Ответы:

1

Различие между примитивными выражениями, средствами комбинирования и средствами абстракции является полезным при моделировании языков программирования. Обратите внимание, что это не является внутренним свойством языка: вы не можете указать на какое-либо определение языка и сказать «эта функция однозначно является примитивным выражением, эта функция однозначно является средством комбинации». Различие является свойством модели, и сложные модели могут противостоять классификации.

Учебным примером этих трех понятий является лямбда-исчисление , которое имеет ровно одно из каждого:

  • Переменные x , y ,… являются единственными примитивными выражениями.
  • Применение функции MN является единственным средством комбинации.
  • Лямбда-абстракция λx.M является единственным средством абстракции.

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

В (типичной модели) Java примитивные выражения в основном являются константами и переменными. Средства комбинаций включают в себя многочисленные операторы; более точно, «аддитивное выражение» - это средство комбинации с двумя слотами (левая сторона и правая сторона) или с тремя слотами (две стороны плюс оператор), если вы включаете и A + B, и A - B под этим именем (в этом случае операторы +и -будут примитивными конструкциями сами по себе). Другие средства комбинирования включают в себя последовательности инструкций I ; J , циклические конструкцииwhile (…) {…}, и так далее. Затем у вас есть конструкции, такие как объявления переменных, определения функций, определения классов и т. Д., Которые являются средствами комбинации (они объединяют имена и типы параметров, тела, инициализаторы и т. Д.) И средствами абстракции (поскольку они определяют имена для повторного использования). На самом деле весьма распространено, что средства абстракции также являются средствами объединения: они объединяют имя с его определением.

Жиль "ТАК - перестань быть злым"
источник
Хороший ответ; Вы столкнулись с проблемами, с которыми я боролся - неоднозначное различие между примитивами, комбинациями и т. д.
Что вы подразумеваете под «переменной» точно? Разве их нельзя назвать средством абстракции, потому что у них есть имя?
morbidCode
@morbidCode Понятие переменной является сложным, и слово имеет другое, но связанное значение в лямбда-исчислении и в Java. Переменную можно считать «абстракцией», поскольку она ссылается на неопределенное значение. Тем не менее, это не средство абстракции: оно не создает ссылку, это просто способ использовать существующую абстракцию. Лямбда-абстракция создает способ использования блока кода в качестве объекта, которым можно манипулировать.
Жиль "ТАК - перестань быть злым"
4

Грубый удар:

Выражения только это; что составляет выражение в Java. Я не знаю, будет ли это включать заявления или нет.

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

В Java самым простым средством абстракции является класс: ничто не может существовать вне класса. Возможно, существуют «слои» абстракции: статический метод, возможно, проще, чем метод экземпляра, потому что он не требует экземпляра.

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

Дэйв Ньютон
источник
@MattFenwick Выражение может состоять из одного примитива, комбинации примитивов и других сущностей образуют составное выражение (все еще выражение, но не выражение).
Дэйв Ньютон
@ MattFenwick Я не, я не говорю, что выражение является примитивом, я говорю, что выражение может состоять только из одного примитива. Строка не может быть примитивом только потому, что язык предоставляет синтаксический сахар для нее, если только вы не хотите различить непосредственную строку и ссылку, которую она создает. Я бы сказал + есть, потому что на него никак нельзя повлиять.
Дэйв Ньютон
Относительно вас в стороне: есть ли проблема с реализацией обобщений в Java?
Стивен Эверс
2

Вот моя основная классификация. Я пытаюсь нарисовать параллель с LISP.

Примитивные выражения

  • Все примитивные значения, вещи, которые вы можете представить, используя литералы (числа, логические значения, ...)

Параллель в LISP : атомы, числа и списки.

Средства комбинирования (способы построения составных структур данных)

  • Массивы
  • Объекты / структуры.

Параллельно в LISP : минусы, списки, списки

Средства абстракции

  • Синтаксис всего потока управления (если, пока для)
  • Все операторы BUILTIN ( +, -, *, /, ...)
  • Все функции (в эту категорию мы включаем классы и методы)

Параллельно в LISP : функции, похожие на синтаксис let,define

hugomg
источник
Хороший ответ! Я думал, что, может быть, некоторые конструкции потока управления подойдут для комбинации. Хорошие параллели с LISP, это очень помогает.
Не совсем. Массивы и объекты воспроизводятся на другом уровне, они являются частью представления данных, а не самого языка. Инициализаторы массива являются частью языка и средством объединения. Операторы и конструкции потока управления не являются средствами абстракции, потому что они ничего не «хранят» для повторного использования. Средства абстракции обычно дают имя сущности для последующего повторного использования под этим именем.
Жиль "ТАК - перестань быть злым"
0

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

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

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

Например, синтаксис скажет вам, как написать правильный forцикл. Семантика скажет вам, что делает цикл for.

Если вы действительно хотите начать анализировать язык программирования, возьмите копию стандарта и посмотрите, что там. Я бы действительно начал с простого языка, такого как C, прежде чем углубляться в Java. Я также прочитал бы остальную часть книги. Изучение того, почему языки программирования работают так, как они делают, сделало меня лучшим программистом, хотя я не использую компиляторы.

mpdonadio
источник
1
Чего ждать? «Просто, как C, прежде чем углубляться в Java». Вы потеряли меня в "Простой как C".
CorsiKa
Мэтт, я не понимаю, что ты делаешь тогда. Книга, которую вы цитировали, рассказывает об обеих этих вещах, независимо от того, называют ли авторы их синтаксис и семантику явно или нет.
mpdonadio
Фактически, «синтаксис» точно описывает «простейшие» вещи в языках, атомы из которых состоят.
Ира Бакстер
Синтаксис не полностью отражает действительную программу, отнюдь не так. Например, синтаксически правильная программа может не пройти проверку типа. Программа AC, которая выполняет оператор x = ++x;, недопустима, даже если типичный компилятор примет его.
Жиль "ТАК - перестань быть злым"
0

Я не знаю, правильно ли это, но то, как я понимаю разделение, таково:

примитивные выражения , это могут быть такие вещи, как >>, +, *, /, int, логическое значение, переменные, методы и т. д.

средства комбинации, это может быть спорным, либо его вещи , как + и concact, или его говорить о более сложных идей , как наследование против композиции и способы , чтобы сделать это. Инъекция, новый оператор, расширение и т. Д.

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

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

боб
источник
Книга бесплатная онлайн; ссылка дана в ОП. Я чувствовал то же самое о means of combinationтом, что сложно понять, что именно там находится. Хороший ответ, хотя.
Вы знаете, какие еще главы он говорит о комбинациях и абстракциях?
Боб