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


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


Хороший ответ! Я думал, что, может быть, некоторые конструкции потока управления подойдут для комбинации. Хорошие параллели с LISP, это очень помогает.

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

0

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

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

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

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

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


1
Чего ждать? «Просто, как C, прежде чем углубляться в Java». Вы потеряли меня в "Простой как C".
— CorsiKa

Мэтт, я не понимаю, что ты делаешь тогда. Книга, которую вы цитировали, рассказывает об обеих этих вещах, независимо от того, называют ли авторы их синтаксис и семантику явно или нет.
— mpdonadio

Фактически, «синтаксис» точно описывает «простейшие» вещи в языках, атомы из которых состоят.
— Ира Бакстер

Синтаксис не полностью отражает действительную программу, отнюдь не так. Например, синтаксически правильная программа может не пройти проверку типа. Программа AC, которая выполняет оператор x = ++x;, недопустима, даже если типичный компилятор примет его.
— Жиль "ТАК - перестань быть злым"

0

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

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

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

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

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


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

Вы знаете, какие еще главы он говорит о комбинациях и абстракциях?
— Боб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.