Могут ли существовать «независимые от языка компиляторы»? - PullRequest
0 голосов
/ 19 января 2019

Следующий (странный) код является частью действительной программы Scala:

/*
  simple-lang s0.3.35
*/
block main()
For a = 0 to 50 {
  display("Hello World at "+a+" ")
}
// end of simple-lang-like program

Несмотря на то, что этот кодовый блок является частью исходного кода программы Scala, он отличается только от 3 символов программа на другом языке .

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

LLVM является своего рода не зависящим от языка компилятором, но он «обрабатывает» исходные файлы другого языка, компилируя их на промежуточный язык.

Могут ли существовать компиляторы, которые не обрабатывают файлы до промежуточного состояния?


Я хотел бы задать больше вопросов, но они носят умозрительный характер.Например, «Будем ли мы скоро иметь такие компиляторы» и «Является ли Scala первым шагом к такому компилятору».

Это моя первая программа Scala, так что терпите меня.Единственная цель этой программы - показать, что код, который выглядит странно для Scala, все еще может быть проанализирован без ошибок.

object HelloWorld {

  class Block {
    def main() {}
  }

  val block = new Block()

  class ForClass() {
    var a: Range = 0 to 0;
  }

  val For = new ForClass()

  implicit def removeBody(int: Int) = (body: Unit) => int

  class A() {
    override def toString(): String = "<a>"
  };
  val a = new A()

  var toPrint: Option[String] = None

  def display(s: String) {
    toPrint = Some(s)
  }

  def main(args: Array[String]) {

    /*
      simple-lang s0.3.35
    */
    block main()
    For a = 0 to 50 {
      display("Hello World at " + a + " ")
    }
    // end of simple-lang-like program
    println(For.a)
    println(toPrint.getOrElse())
  }
}

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Нет, вы не можете написать компилятор для нескольких языков.Например, что должна делать эта программа?

foo = print "Hello, World!"

В Haskell она компилируется, но ничего не делает, тогда как в Python 2 она печатает выходные данные.Компилятор не может знать, какой язык выбрать, так как он действителен на обоих языках.

Однако вы можете написать программу, которая делает одно и то же на нескольких языках.Это называется полиглот .Вот наша приведенная выше программа, модифицированная как полиглот на Haskell и Python 2:

main = print "Hello, World!"

Что касается написания кода, который выглядит «странно», как код в вашем примере в Scala, он называется внутренним DSL и на самом деле не редкость.

0 голосов
/ 19 января 2019

Могут ли существовать компиляторы, которые не обрабатывают файлы до промежуточного состояния?

Да, такой компилятор может существовать.Компилятор преобразует читаемый человеком текст в машиночитаемые инструкции, и не требуется, чтобы он проходил через промежуточную форму.Однако десятилетия исследований компиляторов показали, что наличие промежуточной формы облегчает компиляцию и создает лучший код.

Могут ли существовать «независимые от языка компиляторы»?

Нет, этоне может быть сделано так же, как «не зависящий от языка переводчик» не может существовать для человеческих языков.

Первая проблема состоит в том, что разные языки имеют разный синтаксис , поэтому вы не знаете, как слова и символы можно соединить, чтобы сделать правильные утверждения.

Втораяпроблема в том, что разные языки имеют различную семантику , поэтому вы не знаете, что означают слова и символы.Например, есть оператор for в Scala и оператор for в C, но на самом деле они сильно отличаются.

И в случае, если вы захотите изобрести новый язык, совместимый сНа всех других языках здесь XKCD предупреждение о стандартах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...