Это правда, что конкретный язык программирования может облегчить анализ.
Если вы хотите легко анализировать языки, выберите чисто функциональный
один.
Но на практике никто не программирует на чисто функциональных языках.
(Ребята из Haskell собираются прыгать вверх и вниз, когда они видят
это, если серьезно, Haskell используется крайне редко).
Что делает анализируемым язык программирования, так это инфраструктура
предназначен для поддержки анализа . ASIS Ады выше, отличный пример.
Не путайте тот факт, что ASIS был написан для Ады или является
написано в аде; важно то, что кто-то серьезно хотел
проанализировать Ада и приложил усилия, чтобы построить анализ Ада
техника.
Я считаю, что правильным решением является построение инфраструктуры общего анализа.
и амортизировать его на многих языках. В то время как
мы на этом, мы должны построить общую инфраструктуру преобразования,
тоже, потому что, как только у вас есть анализ, вы захотите использовать
это, чтобы произвести изменение. (Визиты к врачу не заканчиваются диагнозом;
они заканчиваются лечением). И я поставил на это свою карьеру.
Результатом является двигатель, который я считаю идеальным для анализа,
рефакторинг, реинжиниринг и т.д .:
наш инструментарий разработки программного обеспечения DMS.
Он имеет общий синтаксический анализ, построение дерева, красивую печать,
манипулирование деревом, перезапись от источника к источнику, атрибут
оценка грамматики, контроль и анализ потока данных.
У этого есть производственные качественные интерфейсы для многих широко используемых диалектов
C и C ++, для Java, C #, COBOL и PHP, и даже
для Verilog и VHDL (также много других языков,
но не совсем на этом уровне).
Чтобы дать вам некоторое представление о его полезности, он был использован
преобразовать код JOVIAL для бомбардировщика B-2 в C ...
без нас когда-либо видел исходный код.
См http://www.semdesigns.com/Products/Services/NorthropGrummanB2.html
Теперь, если предположить, что у человека есть инфраструктура анализа, на каком языке
Возможности помощи?
Статические типы помогают, ограничивая набор возможных значений, которые может принимать переменная,
но только путем добавления ограниченного предиката с одним аргументом, например, «X является целым числом».
Я думаю , что помогает больше - это утверждения в коде, потому что они фиксируют
предикаты с более чем одним аргументом, которые устанавливают отношения между переменными состояния, которые часто не могут быть найдены путем проверки
код (например, информация о проблеме или домене, например, «X> Y + 3».)
Инфраструктура анализа (и, честно говоря, программисты, которые читают код)
в идеале может воспользоваться такими дополнительными фактами, чтобы обеспечить более
эффективный анализ.
Такие утверждения обычно кодируются специальными ключевыми словами, такими как «assert»,
«pre (условие» и «post (условие»), которые вдохновлены веской причиной
из теоремы, доказывающей литературу.
Но даже если у вас нет утверждений на вашем языке, они
в любом случае его легко закодировать: просто напишите оператор if с условием, содержащим отказ в утверждении, и тело делает что-то, что вызывает идиому
невозможность или нарушает семантику языка (например, разыскивать явно нулевой указатель),
такие как "if (x> 0) fail ();"
Так что на самом деле нужны не утверждения на языке, , а программисты
кто готов их написать . Увы, этого, к сожалению, не хватает.