Розвиток динамічної мови


11

Я створив кілька рукописних компіляторів для дуже простих мов, але тепер я хочу спробувати свої сили у розробці динамічної мови, подібної до спрощеного Python або Ruby. Однак мені було легко обернути голову навколо того, як працюють компілятори. Примітивні компілятори просто перекладають. Але я не можу цього зробити, якщо мова динамічна. Мені потрібно написати перекладача або ВМ, який слідкує за інформацією під час виконання та накладає на мене набагато більше роботи.

Коротше кажучи, чи є якісь ресурси, які я повинен перевірити, враховуючи, що я знаю, як працюють компілятори, але хочу перейти до створення інтерпретатора? Є кілька віртуальних машин для динамічних мов, але я не маю жодних проблем із прокручуванням власних. Це все лише для мого особистого досвіду.

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

Я не хочу широких чи абстрактних ресурсів, які стосуються роботи компіляторів чи віртуальних машин. У мене є багато підручників з цього питання. Всі ресурси, які я знайшов в Інтернеті, або припускають, що у вас є 0 досвіду, і, таким чином, почніть з лексичного чи синтаксичного аналізу, або вони є надзвичайно абстрактними. У мене працює робочий компілятор, але зараз я хочу перетворити це на інтерпретатора і додати динамічні функції до мови.

Я не зміг знайти ресурси для цього процесу, можливо, це занадто обмежений обсяг або ресурси на "зворотній частині" перекладача, не будучи занадто теоретичним, тому я розмістив тут.


1
Такі тонни ресурсів є. Зауважте, що лінія між компілятором та інтерпретатором є більш розмитою, ніж ви вважаєте, що це є; компілятор C # 4.0 підтримує динамічне програмування, як і ряд інших компіляторів.
Роберт Харві

@RobertHarvey Так, я прошу ресурсів зробити власний час роботи / перекладача / віртуальної машини. Інтерпретатор .Net занадто складний для мене, щоб базувати моє!
Остін Генлі


1
І ознайомтесь із цим питанням ТАК є кілька коментарів із посиланнями на інші запитання, які є досить цікавими ...
yannis

Відповіді:


4

Спочатку дізнайтеся про впровадження перекладачів. Я рекомендую PLAI (Мови програмування: застосування та інтерпретація) . Він потрапляє до м'яса інтерпретації швидко, не зупиняючись на синтаксисі.

Для вашої мови ви зможете повторно використовувати передню частину (аналізатор, здебільшого) компілятора та бібліотеку виконання (GC, структури даних, примітивні операції тощо).

Звичайно, ви також можете реалізувати динамічну мову за допомогою компілятора, який створює код, який маніпулює (деякими) тими ж структурами даних, які ви використовували б в інтерпретаторі. Наприклад, в інтерпретаторі ви можете реалізувати глобальні змінні у вигляді хеш-таблиці з індексом рядка. У компіляторі ви збирали б глобальні посилання змінних у код, який здійснює пошук, використовуючи ту саму таблицю. На відміну від цього, ви можете скласти лексичні змінні для більш ефективного подання ("нативного" аргументу та посилань на закриття структури).


5

Якщо ви хочете вивчити основи впровадження інтерпретатора для динамічної мови, я не можу уявити собі кращого місця для початку, ніж витоки першої динамічної інтерпретованої мови програмування: Lisp.

У своєму первісному документі 1960 року Джон Маккарті визначив 5 примітивних функцій, необхідних Лісу. Звичайно, Маккарті лише задумав свою роботу про Лісп як академічну вправу; це аспірант, який заплутався evalу зборах і створив першого перекладача Ліспа. Пол Грехем виділяє сім примітивів : quo, atom, eq, cons, car, cdr та cond.

Річ у тому, що ви можете реально реалізувати Lisp будь-якою мовою; Як тільки ви реалізуєте eval, налаштувати REPL легко, і у вас є інтерактивний перекладач. Люди нудьгували чи цікаво впроваджувати Lisps на C, Java, Ruby, Python та багатьох інших мовах. І не завжди цілеспрямовано; важливо пам’ятати про десяте правило Грінспуна :

Будь-яка достатньо складна програма C або Fortran містить спеціальну, неофіційну, неофіційну, повільну реалізацію половини звичайного Lisp.

Я не кажу, що ваша кінцева мета повинна бути реалізацією Lisp; але гомоконічність має свої переваги при навчанні впроваджувати динамічну мову; навіщо займатися питаннями синтаксису, коли ви можете вивчити мову, якою ідіоматичний синтаксис є тотожним AST мови, яка використовує лексери / парсери?

У всякому разі ... просто пропозиція. Але це є поважною причиною, що більшість чудових мов програмування з моменту C мають хоча б трохи природи Lisp.


1
Я хотів би прийняти дві відповіді. Дякую, я думаю, що я дійсно застосую перекладача Lisp. Легко розібратися, має тону документації та існуючий код, і він повинен дати мені фундамент для роботи. На жаль, я взяв бакалаврат, який використовував схему, і це змусило мене витягнути волосся;)
Остін Генлі,

1
Зараз я спокусився скласти свою мову на своєму діалекті Лісп!
Остін Генлі


0

Я помістив це (~ 600 рядків C #) у загальнодоступне надбання, яке підтримує цитати / список / застосувати / eval / тест / тощо, і дозволяє легко налаштувати синтаксис, схожий на Lisp та / або семантичні вбудовані:

https://repl.it/CdjV/3

Наприклад:

        var factorial = (Lambda)language.
            Evaluate
            (@"
                ( => ( n ) (
                        ? ( != n 0 )
                        ( * n ( this ( - n 1 ) ) )
                        1
                    )
                )
            ");

        var sw = new System.Diagnostics.Stopwatch();
        var n = 12;
        var r = 0;
        int k;
        sw.Start();
        for (k = 0; k < 10000; k++)
        {
            r = (int)factorial.Invoke(null, n);
        }
        sw.Stop();
        Console.WriteLine("{0}! = {1}", n, r);
        Console.WriteLine();
        Console.WriteLine("in {0} ms (for {1} times)", sw.ElapsedMilliseconds, k.ToString("0,0"));

'HTH,


0

Якщо припустити, що ви знаєте трохи схеми (наприклад, прочитали SICP ) або Lisp, я рекомендую книгу Queinnec's Lisp In Small Pieces . Він пояснює кілька варіантів інтерпретаторів та компіляторів, подібних до Lisp (включаючи байт-код або C).

Також прочитайте Прагматику мови програмування Скотта , останню книгу Драконів , довідник GC , Типи Пірса та мови програмування .

Я шукаю інформацію про те, як перейти від компілятора до перекладача.

Тоді часткове оцінювання (& прогнози Футамури) та стиль проходження продовження можуть бути актуальними.

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