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


10

У програмі SICP автори заявляють ( розділ 1.1 ), що існують три основні "механізми" мов програмування:

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

  • засоби комбінування , за допомогою яких складені елементи будуються з більш простих

  • засоби абстракції , за допомогою яких складові елементи можуть бути названі та маніпульовані як одиниці

Як я можу проаналізувати мову основного програмування (наприклад, Java) щодо цих елементів чи механізмів?


Ви раніше заглядали в розширену форму "Backus-Naur", EBNF або Backus-Naur Form, BNF ? Це може розбити граматику, подібну до цих трьох понять, хоча я не дуже впевнений, які ваші наміри, тому я не знаю, допоможе це чи ні.
Jetti

@Jetti - так, я маю, і ні, це не те, що мене цікавить. Я дійсно прагну проаналізувати семантику (питання: це власне слово, яке я шукаю?) Мов програмування, а не їх письмові форми (тобто синтаксис).

Відповіді:


1

Відмінність примітивних виразів, засобів комбінації та засобів абстракції є корисним при моделюванні мов програмування. Зауважте, що це не властива мова: ви не можете вказати на якесь визначення мови та сказати, що "ця функція однозначно є примітивним виразом; ця особливість однозначно є засобом комбінації". Відмінність є властивістю моделі, і складні моделі можуть протистояти класифікації.

Приклад підручника з цих трьох понять - це лямбда-числення , яке має саме одне з кожного:

  • Змінні x , y ,… - єдині примітивні вирази.
  • Функціональне застосування MN - це єдиний засіб комбінації.
  • Абстракція лямбда λx.M - один із засобів абстракції.

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

У (типовій моделі) 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

Насправді "синтаксис" описує саме "найпростіші" речі в мовах, атоми з яких складаються.
Іра Бакстер

Синтаксис не повністю відображає, що є дійсною програмою, далеко не це. Наприклад, синтаксично правильна програма може не перевірити тип. Програма змінного струму, яка виконує оператор x = ++x;, недійсна, навіть якщо типовий компілятор прийняв би її.
Жил 'ТАК - перестань бути злим'

0

Я не знаю, чи це правильно, але я розумію поділ наступним чином:

примітивні вирази. Це такі речі, як >>, +, *, /, int, boolean, змінні, методи тощо.

засоби комбінування. Це може бути дискусійним, чи то про речі, як + і concact, чи то, що говорить про більш просунуті ідеї, такі як спадкування проти складу та методи, як це зробити. Інжектор, новий оператор, розширення і т.д.

засоби абстракції. Це був би синтаксис, який використовується для назви змінних та методів, а також засоби створення інтерфейсів, класів, статичних класів, методів перевантаження тощо.

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


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

Чи знаєте ви, в яких інших розділах він розповідає про комбінації та абстракції?
Боб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.