Какой язык, по вашему мнению, позволяет среднему программисту выводить функции с наименьшим количеством труднодоступных ошибок? Это, конечно, очень широкий вопрос, и меня интересуют очень широкие и общие ответы и мудрости.
Лично я нахожу, что я трачу очень мало времени на поиск странных ошибок в программах на Java и C #, в то время как код C ++ имеет свой отдельный набор повторяющихся ошибок, а Python / аналогичный имеет свой собственный набор общих и глупых ошибок, которые будут обнаружены компилятором. на других языках.
Также мне трудно рассматривать функциональные языки в этом отношении, потому что я никогда не видел большую и сложную программу, написанную в полностью функциональном коде. Ваш вклад, пожалуйста.
Редактировать: Полностью произвольное разъяснение трудно обнаруживаемой ошибки: Воспроизведение занимает более 15 минут или более 1 часа, чтобы найти причину и устранить ее.
Простите, если это дубликат, но я не нашел ничего по этой конкретной теме.
источник
Ответы:
Чем мощнее система типов языка, тем больше ошибок будет обнаружено во время компиляции.
На следующем рисунке сравниваются некоторые из известных языков программирования с точки зрения мощности, простоты и безопасности систем их типов. [ Источник ]
* Факторинг в способности использовать небезопасные конструкции.
источник
(let ((itbe '())) ... )
...На мой взгляд, Haskell помогает вам избежать некоторых распространенных источников ошибок:
null
не является частью определения типа значения: этим вы избегаете ошибки в миллиард долларовисточник
null
, естьundefined
, который является членом каждого типа.)Традиционно самым трудным для поиска ошибок являются условия гонки в многопоточных приложениях, поскольку они
Следовательно, вам нужны языки, которые управляют парализмом для вас как можно более и ненавязчиво. Это еще не мейнстрим. Java делает что-то, но оставит вас с трудной частью.
Насколько я понимаю, вам нужен функциональный язык, так как «отсутствие побочных эффектов» - это то, что в первую очередь устраняет два пункта. Я видел, что работа по прозрачному превращению Haskell в эффективный многопоточный язык продолжается, и я считаю, что Fortress изначально разрабатывался как эффективный параллельный язык.
Редактировать: в Java
Executors
обрабатывают еще больше сложных деталей. Вам нужно сделать так, чтобы отдельные задачи соответствовалиCallable
интерфейсу.источник
Ада разработана таким образом, чтобы как можно больше ловилось во время компиляции, а не во время выполнения. Это означает, что для компиляции программы в Ada часто требуется примерно в 10 раз больше времени, чем в Java, но в случае компиляции вы можете быть гораздо более уверены, что целые классы ошибок не проявятся, когда программа запустить.
источник
Сначала определение: трудно обнаруживаемая ошибка, насколько я понимаю, - это ошибка, которую можно воспроизвести, но ее причину трудно найти.
Вероятно, наиболее важным аспектом является то, что я бы назвал узостью , т. Е. Насколько далеко может уйти ошибка, насколько велика область действия, на которую потенциально может повлиять ошибка. В таких языках, как C, ошибка, например, отрицательный индекс массива или неинициализированный указатель, может повлиять буквально на все всюду во всей программе, поэтому в худшем случае вам придется проверять все везде, чтобы найти источник вашей проблемы.
Хорошие языки в этом отношении поддерживают модификаторы доступа и применяют их таким образом, чтобы их было трудно или невозможно обойти. Хорошие языки поощряют вас ограничивать область действия ваших переменных, вместо того, чтобы слишком легко иметь глобальные переменные (например, «все, что не объявлено явно, является глобальной переменной с типом и значением по умолчанию»).
Вторым важным аспектом является параллелизм . Расовые условия, как правило, трудно воспроизвести и, следовательно, трудно найти. Хорошие языки предлагают простые в использовании механизмы синхронизации, а их стандартные библиотеки являются поточно-ориентированными при необходимости.
Это уже завершает мой список; другие вещи, такие как строгая типизация, помогают обнаруживать ошибки во время компиляции, но эти ошибки, вероятно, не составит труда найти позже.
Учитывая все это, я бы сказал, что Java и C #, а также многие другие языки в мире JVM и .net подходят для того, чтобы избежать трудно обнаруживаемых ошибок.
источник
Поскольку Excel является наиболее широко используемым DSL, я пойду с Excel. (исключая VBA конечно)
Это отвечает всем требованиям:
источник
123
илиABC
) или функции (=SUM(A2:A5)
). Затем Excel оценивает все переменные, выясняя, в каком порядке разрешать зависимости и т. Д. Это, конечно, не только данные.Это сложный вопрос, потому что большинство ошибок не по вине самого языка, а по вине разработчиков, допускающих ошибки в использовании языка.
Я считаю, что есть несколько аспектов языковых возможностей, которые влияют на вероятность ошибок:
Интерактивность - динамические языки с REPL поощряют взаимодействие / экспериментирование с запущенными программами и гораздо меньшие циклы кода / тестирования. Если вы считаете, что итерация - это хороший способ найти простые и понятные решения и обнаружить / устранить ошибки, тогда предпочтительнее использовать интерактивные языки.
Выразительность - если код короче и имеет меньшую стандартную / случайную сложность, тогда легче увидеть ошибки / логические ошибки.
Безопасность типов - чем больше проверки времени компиляции, тем больше ошибок будет обнаружено компилятором, поэтому в целом безопасность типов - это хорошая вещь. Однако в них обычно нетрудно найти ошибки - даже в полностью динамическом языке неправильный тип в структуре данных обычно вызывает очень очевидную ошибку времени выполнения, и TDD почти всегда выявляет ошибки такого рода.
Неизменность - многие серьезные ошибки происходят из-за сложных взаимодействий изменяемого состояния. Языки, которые подчеркивают неизменность (Haskell, Clojure, Erlang), имеют огромное преимущество, избегая изменчивости
Функциональное программирование - функциональные подходы к написанию кода, как правило, более «доказуемо корректны», чем объектно-ориентированный код со сложными последовательностями эффектов / взаимодействий. Мой опыт показывает, что FP помогает избежать хитрых ошибок - я считаю, что где-то есть научные исследования, которые я не могу найти в настоящее время, которые подтверждают это.
Поддержка параллелизма - проблемы с параллелизмом особенно трудно обнаружить и отладить, поэтому это так важно. Все, что требует ручной блокировки, в конечном итоге обречено на провал (и это включает в себя практически каждый объектно-ориентированный подход к параллелизму). Лучший язык, который я знаю в этом отношении, - это Clojure - у него есть уникальный подход к управлению параллелизмом, который сочетает программную транзакционную память с неизменяемыми структурами данных, чтобы получить новую, надежную и составную среду параллелизма. См. Http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey для получения дополнительной информации
источник
Чем менее мощный язык, тем меньше у него возможностей стрелять ногой.
Языки высокого уровня, такие как Java и C #, будут вызывать меньше ошибок, чем языки низкого уровня, такие как C ++.
Сказав, что я считаю, что Java является более безопасным, чем C #. Java искусственно ограничена, так что обычный программист без дополнительных знаний может освоить ее и создавать стабильные программы.
источник
На мой взгляд, Delphi. Основанный на Pascal, язык достаточно прост и интуитивно понятен для простого программиста (или даже неопытного программиста) , а его богатый инструмент и поддержка библиотеки позволяют легко находить большинство ошибок.
if (alert = RED) {LaunchNukes;}
, например, не будет компилироваться.)источник
var I: Integer; Pointer(I)^ := $00;
Одна вещь, которую нужно принять во внимание, - это поворот во времени.
Последние пять лет я в основном занимался разработкой веб-приложений на Java (JSF, Seam и т. Д.). Недавно я получил новую работу, и мы используем Perl (с Catalyst и Moose).
Я гораздо более продуктивен в Perl, чем в Java.
Отсутствие необходимости компиляции и (горячего) развертывания - одна из причин. Я также считаю, что написание сценариев использования проще, поскольку это можно сделать более итеративным способом. И фреймворки в Java кажутся ненужными сложными, по крайней мере, для проектов, в которых я принимал участие.
Я предполагаю, что количество ошибок в моем Perl-коде более или менее совпадает с количеством ошибок в моем Java-коде, оно может быть даже выше. Но я считаю, что найти и исправить эти ошибки проще и быстрее.
источник
Возможно, можно дать представление о количестве инструментов, доступных для статического и динамического анализа кода для каждого языка программирования. Чем больше инструментов для языка, тем больше вероятность того, что язык будет либо очень популярен среди пользователей, либо очень популярен для генерации трудно обнаруживаемых ошибок. Но я не могу заставить Google указать мне на любое исследование, сделанное на эту тему. Следует также отметить, что некоторые языки, такие как C, могут использоваться для устранения основных ошибок в оборудовании, а также для устранения износа оборудования по мере его старения.
источник
Вместо того, чтобы говорить о языках, что говорить о языковых особенностях
источник