Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Борьба со сложностью - минимизация языка

Понятно, что полноценный компилятор полноценного языка (gcc, ghc, javac) за человекомесяц не собрать. Значит, чтобы уложиться, надо убирать функции - "облегчать" как язык, так и компилятор.

Минимальный компилятор минимального языка можно написать за пару дней (см. пример в SICP и мой недокомпилятор), что дает надежду попытаться за месяц сделать что-то достойное.

Минимальный функциональный язык, сгодящийся для моих нужд, по моим расчетам, должен быть чистым и энергичным языком с выводом типов и содержать следуюшее:
  • определение функции
  • определение переменной
  • if (в энергичных языках if не может быть функцией, т.к. имеет ленивую семантику)
  • вложенные скоупы
  • вызов функции (без инфиксной нотации)
  • FFI (Foreign Functions Interface, термин из Haskell) для импорта функций и методов из C++
Типы должны выводиться, явные декларации типов переменных можно из языка вообще убрать, в decidable системах типов без них можно обойтись. "Источниками" типов для алгоритма вывода путем унификации являются внешние функции - типы принимаемых и возвращаемого значения указываются в их FFI-декларациях. Без User Defined Types тоже можно обойтись - мне сгодится сочетание примитивных типов и типов, в которые примитивные типы можно сконвертировать с помощью FFI-функций. Рекурсия тоже не нужна - достаточно примитивной рекурсии, инкапсулированной в библиотечные ФВП.

Однако, этот язык трудно будет компилировать - для эффективности нужны циклы и присваивания. Поэтому я разбил язык на уровни- данный язык (HN+2) компилируется в HN+1, он - в HN0, а HN0 - в С++.
Tags: compiler design, hn0
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments