Скомпилированный динамический язык

Facebook делает это, когда Вы пишете на стенах людей, но только изменяет размеры вертикально.

Горизонтальный изменяют размеры, кажется мне, путаницей, из-за перехода на новую строку, длинные линии, и так далее, но вертикальный изменяют размеры, кажется, довольно безопасен и хорош.

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

Некоторый код JavaScript, чтобы сделать это, с помощью Прототип (потому что это - то, что я знаком с):



    
        
        
    

    
        

        
    

пз: Очевидно, этот код JavaScript очень наивен и не хорошо протестированный, и Вы, вероятно, не хотите использовать его на текстовых полях с романами в них, но Вы в общих чертах понимаете.

7
задан SheetJS 24 September 2013 в 20:00
поделиться

7 ответов

Может быть, есть причина, по которой Лисп таков? Лисп был разработан для программирования других языков и вычислений с символическими представлениями кода и данных . Границы между кодом и данными больше нет. Это влияет на дизайн И реализацию языка программирования.

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

Lisp знает свои данные во время выполнения - вы можете запрашивать все для его тип или класс. Классы сами по себе являются объектами, как и функции. Таким образом, эти элементы языка программирования и программы также являются первоклассными объектами, ими можно манипулировать как таковые. Динамический язык не имеет ничего общего с «динамической типизацией».

«Динамический язык» означает, что элементы языка программирования (например, через мета-классы и протокол метаобъектов) и программа ( его классы, функции, методы, слоты, наследование, ...) можно просматривать во время выполнения и изменять во время выполнения.

Вероятно, чем больше этих функций вы добавите в язык, тем больше он будет похож на Lisp. Поскольку Lisp в значительной степени является локальным максимумом простого динамического программируемого языка программирования. Если вам нужны некоторые из этих функций, то вы можете подумать, от каких функций другого языка программы вы должны отказаться или готовы отказаться. Например, для простого языка «код как данные» вся синтаксическая модель C может оказаться непрактичной.

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

10
ответ дан 6 December 2019 в 19:38
поделиться

C # всегда допускал самомодифицирующийся код.

  • C # 1 позволял вам создавать и компилировать код на лету.
  • C # 3 добавил «деревья выражений», которые предлагали ограниченный способ динамической генерации кода с использованием объектной модели и абстрактных синтаксических деревьев.
  • C # 4 основывается на этом, включая поддержку «Dynamic Language Runtime». Это, вероятно, максимально приближает вас к возможностям LISP на платформе .NET на скомпилированном языке.
2
ответ дан 6 December 2019 в 19:38
поделиться

Возможно, вы захотите рассмотреть возможность использования C ++ с LLVM для (в основном) переносимой генерации кода. Вы даже можете использовать clang , чтобы работать в деревьях синтаксического анализа C (обратите внимание, что clang в настоящее время не полностью поддерживает C ++, но написан на самом C ++)

Например, вы можете написать само- ядро модификации в C ++ для взаимодействия с clang и LLVM, а остальная часть программы на C. Сохраните дерево синтаксического анализа для основной программы вместе с кодом самомодификации, а затем манипулируйте им с помощью clang во время выполнения. Clang позволит вам напрямую манипулировать деревом AST любым способом, а затем скомпилировать его до машинного кода.

Имейте в виду, что манипулирование вашим AST на скомпилированном языке всегда будет означать включение компилятора (или интерпретатора) в ваш программа. LLVM - простой вариант для этого.

1
ответ дан 6 December 2019 в 19:38
поделиться

«Динамический язык» - это широкий термин, охватывающий самые разные концепции. Динамическая типизация поддерживается C # 4.0, который является компилируемым языком. Objective-C также поддерживает некоторые функции динамических языков. Однако ни один из них даже не близок к Лиспу с точки зрения поддержки самомодифицирующегося кода.

Для поддержки такой степени динамизма и самомодифицируемого кода у вас должен быть полнофункциональный компилятор, который можно вызывать во время выполнения; это в значительной степени то, чем на самом деле является интерпретатор.

0
ответ дан 6 December 2019 в 19:38
поделиться

JavaScirpt + V8 (компилятор JavaScript для Chrome)

JavaScript

  • динамический
  • самомодифицирующийся (самооценка) (ну, вроде как, в зависимости от ваше определение)
  • имеет синтаксис C-подобный (опять же, в некотором роде, это лучшее, что вы можете получить для динамического)

И теперь вы можете скомпилировать его с помощью V8: http://code.google. com / p / v8 /

0
ответ дан 6 December 2019 в 19:38
поделиться

Я не хочу зависеть от виртуальной машины, это то, что я имел в виду под "compiled" :)

Если это все, что вы ищете, я бы порекомендовал Python или Ruby. Оба они могут работать на своих собственных виртуальных машинах, а также в JVM и .Net CLR. Таким образом, вы можете выбрать любую среду выполнения, которую хотите. Из этих двух у Ruby, кажется, больше возможностей для метапрограммирования, но у Python, похоже, есть более зрелые реализации на других платформах.

0
ответ дан 6 December 2019 в 19:38
поделиться

Попробуйте groovy. Это динамический язык на основе Java-JVM, который компилируется во время выполнения. Он должен иметь возможность выполнять свой собственный код.

http://groovy.codehaus.org/

В противном случае у вас всегда есть Perl, PHP и т.д ... но это не так, как вы предлагаете, C / C ++ / D- подобные языки.

0
ответ дан 6 December 2019 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: