Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования для UnixΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 77

Автор Π Π΅ΠΉΠΌΠΎΠ½Π΄ Π­Ρ€ΠΈΠΊ Π‘Ρ‚ΠΈΠ²Π΅Π½

8.3.2. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΈ встраиваниС языков

Один ΠΈΠ· Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ Π²Π°ΠΆΠ½Ρ‹Ρ… вопросов Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈ-язык ΠΏΡƒΡ‚Π΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ встраивания ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ языка сцСнариСв. НСрСдко Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ являСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ ΠΊ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌΡƒ ΠΌΠΈΠ½ΠΈ-языку, Π½ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π½Π΅Π΅ Π²Π΅Ρ€Π½Ρ‹ΠΌ ΠΊ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌΡƒ.

Иногда ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ язык ΠΏΡƒΡ‚Π΅ΠΌ простого кодирования слуТСбных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ язык, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°Π»Π΅Π΅ Π² цСлях освСщСния Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΡ‹ называСтся "Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ" (host) языком. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанныС Π½Π° Ρ‚Π°ΠΊΠΎΠΌ ΠΌΠΈΠ½ΠΈ-языкС, ΡΠ²Π»ΡΡŽΡ‚ΡΡ просто сцСнариями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ ΡΠ»ΡƒΠΆΠ΅Π±Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ структуры ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ срСдства Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ языка ΠΊΠ°ΠΊ каркас. КаТдоС срСдство, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ΡΡ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ языкС, избавляСт ΠΎΡ‚ нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ собствСнноС Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ срСдство.

Π”Π°Π½Π½Ρ‹ΠΉ способ являСтся ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ для написания ΠΌΠΈΠ½ΠΈ-языка. Lisp-программисты старой ΡˆΠΊΠΎΠ»Ρ‹ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ самого Π°Π²Ρ‚ΠΎΡ€Π°) ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈ интСнсивно Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚. Он Π»Π΅ΠΆΠΈΡ‚ Π² основС конструкции Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Emacs ΠΈ открываСтся Π·Π°Π½ΠΎΠ²ΠΎ Π² языках сцСнариСв Π½ΠΎΠ²ΠΎΠΉ ΡˆΠΊΠΎΠ»Ρ‹, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Tel, Python ΠΈ Perl. Однако Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ свои нСдостатки.

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ язык ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСспособным ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ интСрфСйс ΠΊ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΊΠΎΠ΄Π°. Или Π΅Π³ΠΎ онтология Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½ΠΎΠΉ для Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° вычислСний. Или измСрСния ΠΏΠΎΠΊΠ°ΠΆΡƒΡ‚ слишком Π½ΠΈΠ·ΠΊΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°. Π’ Ρ‚Π°ΠΊΠΈΡ… ситуациях ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ являСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π‘ (ΠΈΠ»ΠΈ Π‘++) ΠΈ интСграция Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π² создаваСмый ΠΌΠΈΠ½ΠΈ-язык.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ языка сцСнариСв с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π‘-ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ внСдрСния языка сцСнариСв Π² Π‘-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ зависит ΠΎΡ‚ сущСствования ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для этих Ρ†Π΅Π»Π΅ΠΉ языка сцСнариСв. Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ язык сцСнариСв ΠΌΠΎΠΆΠ½ΠΎ, заставив Π΅Π³ΠΎ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π‘-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π‘ стали Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ, ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΌ языкС. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ язык сцСнария Π² Π‘-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ экзСмпляру ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΊΠ°ΠΊ значСния Π² Π‘.

ОбС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ зависят ΠΎΡ‚ способности ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ½Ρ‚ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠΎΠ² Π‘ ΠΈ ΠΎΠ½Ρ‚ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ языка сцСнариСв. НСкоторыС языки сцСнариСв, Π² цСлях ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ‚Π°ΠΊΠΎΠΉ возмоТности Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ снизу Π²Π²Π΅Ρ€Ρ…. Одним ΠΈΠ· Π½ΠΈΡ… являСтся Tel, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рассматриваСтся Π² Π³Π»Π°Π²Π΅ 14, Π΄Ρ€ΡƒΠ³ΠΈΠΌ β€” Guile, Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚ с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ Lisp-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Scheme. Guile поставляСтся Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для внСдрСния Π² Π‘-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (хотя Π΄ΠΎ сих ΠΏΠΎΡ€ довольно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ) Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ язык Perl. ΠžΡ‡Π΅Π½ΡŒ просто Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Python ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ Π΅Π³ΠΎ; Π‘-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² ΠΌΠΈΡ€Π΅ Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ особСнно интСнсивно. Π―Π·Ρ‹ΠΊ Java ΠΈΠΌΠ΅Π΅Ρ‚ интСрфСйс для Π²Ρ‹Π·ΠΎΠ²Π° "собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²" Π² Π‘, хотя практичСскиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ этого бСспСрспСктивны, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ вСрсий ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Unix (shell) Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для внСдрСния ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Korn (ksh93 ΠΈ Π±ΠΎΠ»Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠ΅ вСрсии) являСтся Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ.

БущСствуСт мноТСство ΠΏΡ€ΠΈΡ‡ΠΈΠ½ Π½Π΅ Π½Π°Π΄ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ создаваСмый ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈ-язык Π½Π°Π΄ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ языком сцСнариСв. Одна ΠΈΠ· вСсомых ΠΏΡ€ΠΈΡ‡ΠΈΠ½ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² нСобходимости Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнный, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ грамматичСский Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ошибок. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС слСдуСт Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ уасс ΠΈ lex.

8.3.3. НаписаниС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

Для Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΌΠΈΠ½ΠΈ-языков основной вопрос состоит Π² Ρ‚ΠΎΠΌ, слСдуСт Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ XML Π² качСствС основного синтаксиса ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Π’ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π²Π΅Ρ€Π΅Π½ для слоТно структурированных Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΌΠΈΠ½ΠΈ-языков, ΠΎΠ΄Π½Π°ΠΊΠΎ здСсь Ρ‚Π°ΠΊΠΆΠ΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ прСдостСрСТСния, ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π² Π³Π»Π°Π²Π΅ 5, ΠΎ конструкции Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… β€” XML ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ излишним. Если XML Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, слСдуСт ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ наимСньшСй нСоТиданности, поддСрТивая описанныС Unix-соглашСния для Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… (простой синтаксис Π½Π° основС лСксСм, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π‘-соглашСний ΠΎΠ± использовании ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ косой Ρ‡Π΅Ρ€Ρ‚Ρ‹ ΠΈ Ρ‚.Π΄.).

Если ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ трСбуСтся, Ρ‚ΠΎ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ уасс ΠΈ lex (ΠΈΠ»ΠΈ ΠΈΡ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ эквивалСнт Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌ языкС), вСроятно, Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ°ΠΌΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ… случаСв, ΠΊΠΎΠ³Π΄Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ языка Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ проста, Ρ‡Ρ‚ΠΎ Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСкурсивного нисходящСго синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° прСдставляСт собой Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ. Π”Π°ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° уасс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ устранСниС ошибок, Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³/асс-спСцифи-ΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ развития синтаксиса языка Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅. Π’ Π³Π»Π°Π²Π΅ 9 Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΡ‚ уасс ΠΈ lex инструмСнты, доступныС Π² языках Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π”Π°ΠΆΠ΅ Π² случаС принятия Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ собствСнного синтаксиса рСкомСндуСтся Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ Π²Ρ‹Π³ΠΎΠ΄Ρƒ ΠΎΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… срСдств. Если Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ макросрСдства, слСдуСт ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° срСдствами Ρ‚4(1) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. Однако, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ прСдостСрСТСния, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

8.3.4. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ макросов

БрСдства ΠΌΠ°ΠΊΡ€ΠΎΡ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π±Ρ‹Π»ΠΈ излюблСнной Ρ‚Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² языков Π² Ρ€Π°Π½Π½Π΅ΠΉ Unix. Π―Π·Ρ‹ΠΊ Π‘, нСсомнСнно, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅ срСдство. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΠΎΠ»Π΅Π΅ слоТных ΠΌΠΈΠ½ΠΈ-языках ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ назначСния, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ pic(1). ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Ρ‚4 прСдоставляСт ΠΎΠ±Ρ‰Π΅Π΅ срСдство для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ°ΠΊΡ€ΠΎ-Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‰ΠΈΡ… прСпроцСссоров.

ΠœΠ°ΠΊΡ€ΠΎΡ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ просто ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ мноТСство изящных ΠΈ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… тСхничСских ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ². На Ρ€Π°Π½Π½ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π» влияниС ΠΎΠΏΡ‹Ρ‚ ассСмблСра, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ макросрСдства часто Π±Ρ‹Π»ΠΈ СдинствСнным ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ, доступным для ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠΌ ΠΌΠ°ΠΊΡ€ΠΎΡ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ свСдСний ΠΎ синтаксисС, Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΌ Π² основС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ языка, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ синтаксиса. К соТалСнию, Π΄Π°Π½Π½Ρ‹ΠΌ прСимущСством ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ Π·Π»ΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‚, создавая Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ, нСпрСдсказуСмый ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΌ источником тяТСло опрСдСляСмых ошибок.

Для языка Π‘ классичСским ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ являСтся макрос, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ.

#define max(x, Ρƒ)Β Ρ… > Ρƒ ? Ρ… : Ρƒ

Π”Π°Π½Π½Ρ‹ΠΉ макрос создаСт ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄Π²Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Одна ΠΈΠ· Π½ΠΈΡ… Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ нСпрСдсказуСмыС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Π² случаС Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌ Π² сСбя ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ мСньшСго ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, Ρ‡Π΅ΠΌ > ΠΈΠ»ΠΈ ?:. Рассмотрим Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ max (Π° = Π¬, ++с). Если программист Π·Π°Π±Ρ‹Π», Ρ‡Ρ‚ΠΎ ΡˆΠ°Ρ… являСтся макросом, Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ присваиваниС Π° = b ΠΈ прСинкрСмСнтная опСрация с с Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ значСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ max Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Однако это Π½Π΅ Ρ‚Π°ΠΊ. ВмСсто этого прСпроцСссор ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π° = b > ++с ? Π° = b : ++с, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° компилятора Π‘ Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π° = (b > ++с ? Π° = b : ++с). Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ присвоСн Π°.

ПодобноС Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ взаимодСйствиС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ, кодируя ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макроса Π±ΠΎΠ»Π΅Π΅ бСзопасно.

#define max(x, Ρƒ)Β ((Ρ…) > (Ρƒ) ? (Ρ…) : (Ρƒ))

Π‘ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎ ΠΊΠ°ΠΊ ((Π° = Π¬) > (++с) ? (Π° = Π¬) : (++с) ), Ρ‡Ρ‚ΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΎΠ΄Π½Π°ΠΊΠΎ слСдуСт Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ пСрСмСнная с ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° Π΄Π²Π°ΠΆΠ΄Ρ‹. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅Π½Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° макросу Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ макросами ΠΈ выраТСниями с ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠœΠ°ΠΊΡ€ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Π‘ ΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎ создан лСгковСсным ΠΈ простым. Π‘ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Π΅ макропроцСссоры способны Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.