Подтвердить что ты не робот

Статический анализ Coffeescript/Static Typechecking - дорожные блоки

Я думаю, что Coffeescript - это потрясающий язык! Я искал некоторые проекты/проблемы/функции, которые добавляют статический анализ в Coffeescript. Однако после некоторых поисков я обнаружил, что Coffeescript faq и эта страница позволяют предположить, что статический анализ может не быть жизнеспособными.

Мне было интересно, если возникнет фундаментальная проблема при реализации проверки статического анализа/статического типа в Coffeescript, из-за чего чего-то подобного в компиляторе уже нет?

Кроме того, это что-то, что невозможно сделать для нетривиальных проверок, но может работать только для простого анализа? Когда я говорю прямо, я имею в виду проверку тривиальных вещей, таких как: пользователь дважды определил функцию с тем же именем (в классе) или на верхнем уровне (или, возможно, на верхнем уровне в коллекции связанных файлов. Coffee).

Я был бы признателен, если бы кто-нибудь мог указать на некоторые примеры, которые показывают, почему внедрение статического анализа/проверки типов не является прямым или возможным/стоит тратить время?

Большое спасибо!

4b9b3361

Ответ 1

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

Я использую компилятор Google Closure для статического анализа кода, создаваемого CoffeeScript. У этого есть действительно хороший статический анализатор, и я не уверен, есть ли веская причина изобретать колесо здесь. Самый простой способ - просто написать аннотации вручную:

###*
   * @param {number} x
   * @param {number} y
   * @return {number}
###
adder = (x, y) -> x + y

Это немного многословно, но с другой стороны вы заимствуете возможности статического анализа компилятора закрытия, который действительно мощный и способен много проверять. Я на самом деле записываю аннотации типа немного более кратким образом, а затем script переписать файл кофе. Мой код выглядит следующим образом:

#! {number} x {number} y @return {number}
adder = (x, y) -> x + y

Я уверен, вы можете видеть, что переписывающий процесс довольно прост.

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

Еще один вариант по тому же пути (это нарушит совместимость с CoffeeScript, но будет намного круче), чтобы компилятор Coffee скомпилировал что-то вроде этого:

adder = (number x, number y): number -> x + y

в JS, как это:

/***
  * @param {number} x
  * @param {number} y
  * @return {number
  */
var adder = function(x, y) {
  return x + y;
};

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

Действительно, этот парень, казалось, делал именно это. К сожалению, его работа, похоже, находится в неполном состоянии.

Во всех этих случаях мы откладываем сложную работу - статическую проверку типов - на компилятор закрытия. Если вы не хотите этого делать, я бы это понял, но было бы трудно убедить меня, что стоит построить совершенно новый инструмент статического анализа с нуля.:)

ИЗМЕНИТЬ год спустя: я просто использую typescript в эти дни.:)

Ответ 2

Я не эксперт в CoffeeScript, так что это может быть совершенно неправильный ответ, но в основном это сводится к следующему: CoffeeScript - очень выразительный язык, причем большая часть семантики динамически определяется (и, возможно, странным случаем края), Это во многом отличается от таких языков, как Standard ML, которые имеют гораздо более строго определенную семантику. В общем, статический анализ на языках более высокого порядка считается очень сложным. I. статический анализ на реальных программах более высокого порядка (Haskell, ML, особенно javascript из-за таких вещей, как eval) просто сложно, потому что поток управления намного более гибкий. Фактически, решения статического анализа для языков более высокого порядка действительно были исследованы только за последние двадцать лет или около того. (Примечательно, что см. Статью Matt Might на описание стиля обучения CFA.)

В основном, причины таковы:

  • Чтобы сделать анализ, вам нужно иметь дело с проблемой экспрессивной семантики, исходящей из управления потоком, которое вы получаете, хлопая вокруг функций более высокого порядка.
  • Чтобы выполнить типизацию, обычно эти языки имеют гораздо более богатый набор доступных типов. Например, есть очень типичные ситуации, когда вы пытаетесь назначить статический тип переменной в Ruby (как в C, Java, ML и т.д.), Вы получаете ошибку, но поскольку определенные пути вашей программы никогда исполнено, все отлично. Наряду с этим, такие языки, как Ruby others, добавляют множество неявных преобразований типов, которые действительно используются для классного программирования. Значительная работа в этой области, с которой я знакома (динамический анализ статических типов для Ruby), приходит от некоторых людей, с которыми я работаю, но есть и другие примеры.
  • В принципе, язык используется гораздо более динамично, с гораздо более выразительной семантикой, и рассуждение о том, что статически намного сложнее, и склонно быть неточным. Основной фронт приближения к этому (в эти дни) начинает выглядеть гибридным: вы можете статически анализировать часть программы, а также требовать от программиста некоторых тестовых примеров сделать какой-то изысканный анализ.

Я надеюсь, что это несколько ответит на ваши вопросы, опять же, жаль, что я не могу напрямую обратиться к прямым проблемам вашего вопроса, так как это относится к CoffeeScript, но там много работы происходит при анализе таких вещей, как JavaScript прямо сейчас. Отмечу, что некоторые из реальных проблем с Javascript исходят из этой странной семантики, о прототипическом наследовании трудно рассуждать, и особенно eval()! Как правило, программный анализ для этих языков налагает определенные ограничения (например, выкидывая eval полностью!), Чтобы сделать анализ более выполнимым!