Новый язык программирования Mash

На протяТСнии Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π»Π΅Ρ‚ я ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» свои силы Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ своСго языка программирования. МнС Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π° ΠΌΠΎΠΉ взгляд максимально простой, ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ язык.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ ΠΎΡΠ²Π΅Ρ‚ΠΈΡ‚ΡŒ основныС этапы своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ для Π½Π°Ρ‡Π°Π»Π° ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ созданный ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ языка ΠΈ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сСйчас Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ.

Π—Π°Ρ€Π°Π½Π΅Π΅ скаТу, Ρ‡Ρ‚ΠΎ писал вСсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° Free Pascal, Ρ‚.ΠΊ. ΠΏΡ€ΠΎΠ³ΠΈ Π½Π° Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ число ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ, Π΄Π° ΠΈ сам компилятор Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΈ (ΡΠΎΠ±ΠΈΡ€Π°ΡŽ всС ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с O2 Ρ„Π»Π°Π³ΠΎΠΌ).

Π‘Ρ€Π΅Π΄Π° выполнСния языка

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ стоит Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ для выполнСния Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΌΠΎΡ‘ΠΌ языкС. РСшил я Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΡΡ‚Π΅ΠΊΠΎΠ²ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ всСго. Ни ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΊΠ°ΠΊ ΠΌΠ½Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π° русском я Π½Π΅ нашСл, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ послС ознакомлСния с англоязычным ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠΌ я засСл Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ написаниС своСго вСлосипСда. Π”Π°Π»Π΅Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ свои Β«ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ²Ρ‹Π΅Β» ΠΈΠ΄Π΅ΠΈ ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² этом Π΄Π΅Π»Π΅.

РСализация стСка

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π²ΠΎ Π³Π»Π°Π²Π΅ Π’Πœ Π»Π΅ΠΆΠΈΡ‚ стСк. Π’ ΠΌΠΎΠ΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ. По сути это простой массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ пСрСмСнная для хранСния индСкса Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка.
ΠŸΡ€ΠΈ Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, создаСтся массив Π½Π° 256 элСмСнтов. Если Π² стСк закидываСтся большСС число ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‚ΠΎ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ увСличиваСтся Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ 256 элСмСнтов. БоотвСтствСнно, ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ элСмСнтов ΠΈΠ· стСка β€” Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ рСгулируСтся.

Π’ Π’Πœ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСсколько стСков:

  1. Основной стСк.
  2. Π‘Ρ‚Π΅ΠΊ для хранСния Ρ‚ΠΎΡ‡Π΅ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°.
  3. Π‘Ρ‚Π΅ΠΊ сборщика мусора.
  4. Π‘Ρ‚Π΅ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° try/catch/finally Π±Π»ΠΎΠΊΠΎΠ².

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

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

Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора

Π’ ΠΌΠΎΠ΅ΠΉ Π’Πœ ΠΎΠ½ полуавтоматичСский. Π’.Π΅. Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сам Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ сборщик мусора. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΠ½ Π½Π΅ ΠΏΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ счСтчику ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠ°ΠΊ Π² Ρ‚Π΅Ρ… ΠΆΠ΅ Python, Perl, Ruby, Lua ΠΈ Ρ‚.Π΄. Он Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‡Π΅Ρ€Π΅Π· систСму ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ΠΎΠ². Π’.Π΅. ΠΊΠΎΠ³Π΄Π° подразумСваСтся, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ присваиваСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ добавляСтся Π² стСк сборщика мусора. Π’ дальнСйшСм сборщик быстро пробСгаСтся ΠΏΠΎ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΌΡƒ списку ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° try/catch/finally Π±Π»ΠΎΠΊΠΎΠ²

Как ΠΈ Π² любом соврСмСнном языкС, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ β€” ваТная Π΅Π³ΠΎ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ. Π―Π΄Ρ€ΠΎ Π’Πœ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΠΎ Π² try..catch Π±Π»ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ исполнСнию ΠΊΠΎΠ΄Π°, послС ΠΏΠΎΠΈΠΌΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, помСстив Π² стСк Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π½Π΅ΠΌ. Π’ ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ try/catch/finally Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°, указывая Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π½Π° catch (ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ) ΠΈ Π½Π° finally/end (ΠΊΠΎΠ½Π΅Ρ† Π±Π»ΠΎΠΊΠ°).

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ

Она поддСрТиваСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π’Πœ. Π­Ρ‚ΠΎ просто ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ для использования. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· систСмы ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… Π² нСсколько Ρ€Π°Π· быстрСС соотвСтствСнно.

Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для Π’Πœ

Π‘Π΅Π· этого Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ. Π’Πœ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках. МоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π½Π° Mash ΠΈ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π½Π° Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… языках, Π·Π°Ρ‚Π΅ΠΌ связав ΠΈΡ… Π² ΠΎΠ΄Π½ΠΎ Ρ†Π΅Π»ΠΎΠ΅.

Вранслятор с высокоуровнСвого языка Mash Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ для Π’Πœ

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык

Для быстрого написания транслятора со слоТного языка Π² ΠΊΠΎΠ΄ для Π’Πœ я сначала Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ассСмблСроподобноС ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ΅ Π·Ρ€Π΅Π»ΠΈΡ‰Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ здСсь Π½Π΅Ρ‚Ρƒ особого смысла. Π‘ΠΊΠ°ΠΆΡƒ лишь Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π° этом ΡƒΡ€ΠΎΠ²Π½Π΅ транслятор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ констант, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, вычисляСт ΠΈΡ… статичСскиС адрСса ΠΈ адрСса Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Ρ…ΠΎΠ΄Π°.

АрхитСктура транслятора

Π’Ρ‹Π±Ρ€Π°Π» я Π½Π΅ ΡΠ°ΠΌΡƒΡŽ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Вранслятор Π½Π΅ строит Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΎΠ±Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ трансляторам. Он смотрит Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ конструкции. Π’.Π΅. Ссли Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΡ‹ΠΉ кусок ΠΊΠΎΠ΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ Β«while <условиС>:Β», Ρ‚ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ это конструкция while Ρ†ΠΈΠΊΠ»Π° ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‘ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ while Ρ†ΠΈΠΊΠ»Π°. Π§Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ слоТного switch-case.

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

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠ΄Π°

Π’ΡƒΡ‚ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ (ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ, Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ€ΡƒΠΊΠΈ Π΄ΠΎΠΉΠ΄ΡƒΡ‚). Пока Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚ΡΠ΅ΠΊΠ°Ρ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄, константы ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ ΠΎΡ‚ сборки. Π’Π°ΠΊΠΆΠ΅ нСсколько констант с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠΉ. Π’ΠΎΡ‚ ΠΈ всС.

Π―Π·Ρ‹ΠΊ Mash

Основная концСпция языка

Основной ΠΈΠ΄Π΅Π΅ΠΉ Π±Ρ‹Π»ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ максимально Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ простой язык. Π‘Ρ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ со своСй Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° справляСтся Π½Π° ΡƒΡ€Π°.

Π‘Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ВсС конструкции Π² языкС ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ : ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ end.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ proc ΠΈ func соотвСтствСнно. Π’ скобках ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. ВсС ΠΊΠ°ΠΊ Ρƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языков.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ return ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ break позволяСт Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹/Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ссли ΠΎΠ½ стоит Π²Π½Π΅ Ρ†ΠΈΠΊΠ»ΠΎΠ²).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

...

func summ(a, b):
  return a + b
end

proc main():
  println(summ(inputln(), inputln()))
end

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ конструкции

  • Π¦ΠΈΠΊΠ»Ρ‹: for..end, while..end, until..end
  • Условия: if..[else..]end, switch..[case..end..][else..]end
  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹: proc <имя>():… end, func <имя>():… end
  • Label & goto: <имя>:, jump <имя>
  • Enum пСрСчислСния ΠΈ константныС массивы.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

Вранслятор ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ автоматичСски, Π»ΠΈΠ±ΠΎ Ссли Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ var ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°:

a ?= 10
b ?= a + 20

var a = 10, b = a + 20

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

ООП

Ну Π²ΠΎΡ‚ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ ΠΌΡ‹ ΠΊ самой вкусной Ρ‚Π΅ΠΌΠ΅. Π’ языкС Mash ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ всС ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. Π’.Π΅. классы, наслСдования, ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (Π² Ρ‚.Ρ‡. динамичСский), динамичСскиС автоматичСскиС рСфлСксия ΠΈ интроспСкция (полная).

Π‘Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… слов, Π»ΡƒΡ‡ΡˆΠ΅ просто ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ класс ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Π½ΠΈΠΌ:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

proc main():
  x ?= new MyClass(10, 20)
  println(x->Summ())
  x->Free()
end

Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: 30.

НаслСдованиС ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

class MyNewClass(MyClass):
  func Summ
end

func MyNewClass::Summ():
  return ($a + $b) * 2
end

proc main():
  x ?= new MyNewClass(10, 20)
  println(x->Summ())
  x->Free()
end

Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: 60.

Π§Ρ‚ΠΎ Π½Π° счСт динамичСского ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°? Π”Π° это ΠΆΠ΅ рСфлСксия!:

uses <bf>
uses <crt>

class MyClass:
  var a, b
  proc Create, Free
  func Summ
end

proc MyClass::Create(a, b):
  $a = new(a)
  $b = new(b)
end

proc MyClass::Free():
  Free($a, $b)
  $rem()
end

func MyClass::Summ():
  return $a + $b
end

class MyNewClass(MyClass):
  func Summ
end

func MyNewClass::Summ():
  return ($a + $b) * 2
end

proc main():
  x ?= new MyClass(10, 20)
  x->Summ ?= MyNewClass::Summ
  println(x->Summ())
  x->Free()
end

Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: 60.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠ΄Π΅Π»ΠΈΠΌ ΠΌΠΈΠ½ΡƒΡ‚ΠΊΡƒ интроспСкции для простых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ классов:

uses <bf>
uses <crt>

class MyClass:
  var a, b
end

proc main():
  x ?= new MyClass
  println(BoolToStr(x->type == MyClass))
  x->rem()
  println(BoolToStr(typeof(3.14) == typeReal))
end

Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: true, true.

Об ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… присваивания ΠΈ явных указатСлях

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ?= слуТит для присвоСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ указатСля Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² памяти.
ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ = измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² памяти ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ явных указатСлях. Π”ΠΎΠ±Π°Π²ΠΈΠ» я ΠΈΡ… Π² язык Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ.
@<пСрСмСнная> β€” Π²Π·ΡΡ‚ΡŒ явный ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ.
?<пСрСмСнная> β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ.
@= β€” ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎ явному ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π½Π° Π½Π΅Ρ‘.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

uses <bf>
uses <crt>

proc main():
  var a = 10, b
  b ?= @a
  PrintLn(b)
  b ?= ?b
  PrintLn(b)
  b++
  PrintLn(a)
  InputLn()
end

Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ число, 10, 11.

Try..[catch..][finally..]end

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

uses <bf>
uses <crt>

proc main():
  println("Start")
  try:
    println("Trying to do something...")
    a ?= 10 / 0
  catch:
    println(getError())
  finally:
    println("Finally")
  end
  println("End")
  inputln()
end

ΠŸΠ»Π°Π½Ρ‹ Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅

ВсС ΠΏΡ€ΠΈΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡΡŒ Π΄Π° ΠΏΡ€ΠΈΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡΡŒ ΠΊ GraalVM & Truffle. Π£ ΠΌΠΎΠ΅ΠΉ срСды выполнСния отсутствуСт JIT компилятор, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² ΠΏΠ»Π°Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½ ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΡŽ Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ ΠΏΠΈΡ‚ΠΎΠ½Ρƒ. НадСюсь, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ окаТСтся ΠΏΠΎΠ΄ силу Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ JIT ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π½Π° Π±Π°Π·Π΅ GraalVM ΠΈΠ»ΠΈ LLVM.

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒΡΡ с Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ сами.

Π‘Π°ΠΉΡ‚
Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π½Π° GitHub

Бпасибо, Ρ‡Ρ‚ΠΎ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°, Ссли Π²Ρ‹ это сдСлали.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com