문제

안전하는 소프트웨어의 개발, 특히 프로그래밍 언어의 선택이 그러한 개발에 미치는 영향을 연구하고 있습니다.

일반적으로 사용되는 언어와 그 이유를 자세히 설명하십시오.

도움이 되었습니까?

해결책

아다 그리고 불꽃 (정적 검증을위한 일부 후크가있는 ADA 방언) 항공 우주 원으로는 항공 전자 시스템과 같은 높은 신뢰성 소프트웨어를 구축하기 위해 사용됩니다. 무언가가 있습니다 이러한 언어에 대한 코드 검증 툴링 생태계,이 기술도 존재하지만 더 많은 주류 언어도 있습니다.

Erlang ~였다 처음부터 설계되었습니다 ~을 위한 높은 신뢰성 작성 통신 코드. 오류 복구에 대한 관심의 분리를 용이하게하도록 설계되었습니다 (즉, 오류를 생성하는 서브 시스템은 오류를 처리하는 서브 시스템과 다릅니다). 이 기능은 실제로 연구 서클에서 멀리 떨어져 있지 않았지만 공식적인 증거를받을 수도 있습니다.

기능적 언어 ~와 같은 Haskell 자동화 된 시스템으로 공식적인 증거를받을 수 있습니다. 선언적 성격 언어의. 이를 통해 부작용이있는 코드는 모나디 한 기능에 포함될 수 있습니다. 공식적인 정확성 증거의 경우 나머지 코드는 지정된 것 외에는 아무것도하지 않는 것으로 가정 할 수 있습니다.

그러나 이러한 언어는 쓰레기가 수집되고 쓰레기 수집은 코드에 투명하므로 이러한 방식으로 추론 할 수는 없습니다. 쓰레기 수집 된 언어는 일반적으로 어려운 실시간 응용 프로그램에 대해 충분히 예측할 수 없습니다.

에펠 그리고 그 후손들은 계약에 의한 디자인 사전 및 후 확인을위한 강력한 런타임 메커니즘을 제공합니다. 불변. Eiffel은 실제로 붙잡지 못했지만, 고 신뢰성 소프트웨어를 개발하는 것은 실제로 기능을 작성하기 전에 실패 모드에 대한 필기 점검 및 핸들러로 구성되는 경향이 있습니다.

하지만 그리고 C ++ 이러한 유형의 응용 프로그램을 위해 특별히 설계되지 않았으며 여러 가지 이유로 임베디드 및 안전 크리티컬 소프트웨어에 널리 사용됩니다. 메모리 관리 (예 : 쓰레기 수집을 피할 수 없음), 단순하고 잘 디버깅 된 핵심 런타임 라이브러리 및 성숙한 도구 지원에 대한 메모리 관리 (예 : 쓰레기 수집을 피할 수 없음)에 대한 제어입니다. 오늘날 사용중인 많은 임베디드 개발 도구 체인은 1980 년대와 1990 년대에 현재 기술이었고 당시 널리 퍼진 유닉스 문화에서 나온 1980 년대와 1990 년대에 처음 개발되었으므로 이러한 도구는 이러한 종류의 작업에 인기가 남아 있습니다.

오류를 피하기 위해 수동 메모리 관리 코드를 신중하게 점검해야하지만, 쓰레기 수집. 그만큼 핵심 실행 시간 라이브러리 C 및 C ++ 언어는 비교적 단순하고 성숙하며 잘 이해되므로 가장 안정적인 플랫폼 중 하나입니다. ADA에 사용되는 모든 정적 분석 도구가 C 및 C ++를 지원하는 것은 아니며, 많은 사람들이 있습니다. C.. 거기 있습니다 또한 몇몇의 넓게 사용된 C/C ++ 기반을 둔 도구 쇠사슬; ADA에 사용되는 대부분의 도구 체인은 C 및/또는 C ++를 지원하는 버전으로 제공됩니다.

공식적인 방법 ~와 같은 공리 의미 (PDF), Z 표기법 또는 순차적 프로세스 커뮤니케이션 프로그램 논리를 수학적으로 검증 할 수 있도록하고 종종 응용 프로그램이 적용 할 수있을 정도로 간단한 안전 중요 소프트웨어 설계에 사용됩니다 (일반적으로 임베디드 제어 시스템). 예를 들어, 내 전 강사 중 하나 독일 철도 네트워크에 대한 신호 시스템의 공식적인 정확성 증거를 수행했습니다.

공식적인 방법의 주요 단점은 기본 시스템이 입증 된 것과 관련하여 기하 급수적으로 성장하는 경향이 있다는 것입니다. 이는 증거에 오류가 발생할 위험이 심하기 때문에 실질적으로 상당히 간단한 응용 프로그램으로 제한됩니다. 공식적인 방법은 하드웨어 버그가 특히 대량 시장 제품에서 수정하는 데 매우 비싸기 때문에 하드웨어 정확성을 확인하는 데 매우 널리 사용됩니다. 이후 펜티엄 FDIV 버그, 공식적인 방법은 많은 관심을 끌었고 FPU의 정확성을 확인하는 데 사용됩니다 Pentium Pro 이후 모든 인텔 프로세서에서.

다른 많은 언어들이 신뢰할 수있는 소프트웨어를 개발하는 데 사용되었습니다. 주제에 대한 많은 연구가 이루어졌습니다. 합리적으로 주장 할 수 있습니다 방법론은 플랫폼보다 더 중요합니다 단순성 및 선택 및 의존성 제어와 같은 원칙이 있지만 특정 플랫폼의 사용을 배제하십시오.

다른 여러 사람들이 언급했듯이, 특정 O/S 플랫폼에는 Watchdog 타이머 및 보장 된 인터럽트 응답 시간과 같은 신뢰성 및 예측 가능한 동작을 촉진하는 기능이 있습니다. 단순성은 또한 신뢰성의 강력한 동인이며, 많은 RT 시스템은 고의적으로 매우 간단하고 컴팩트하게 유지됩니다. Qnx (내가 익숙한 유일한 O/s는 콘크리트 배치 시스템 그것을 기반으로)는 매우 작으며 단일 플로피에 맞습니다. 비슷한 이유로, 사람들도 마찬가지입니다 OpenBsd - 강력한 보안 및 철저한 코드 감사로 유명합니다. 또한 시스템을 단순하게 유지하십시오.

편집하다: 이 게시물 특히 안전 중요 소프트웨어에 대한 좋은 기사에 대한 링크가 있습니다. 여기 그리고 여기. 소스를 위해 S.Lott와 Adam Davis에게 소품을 소품합니다. 이야기의 이야기 Therac-25 이 분야에서 약간의 고전적인 작품입니다.

다른 팁

C ++의 경우 Joint Strike Fighter (F-35) C ++ 코딩 표준은 잘 읽습니다.

http://www.stroustrup.com/jsf-av-rules.pdf

나는 믿는다 아다 안전 및/또는 미션 크리티컬 인 일부 정부 프로젝트에서 여전히 사용 중입니다. 나는 언어를 사용한 적이 없지만 에펠과 함께 "학습"목록에 있습니다. 에펠 펠은 계약에 따라 설계를 제공하며, 이는 신뢰성과 안전을 향상시켜야합니다.

첫째, 안전 중요 소프트웨어는 클래식 기계 및 전기 엔지니어링 분야에서 볼 수있는 동일한 원칙을 준수합니다. 중복성, 결함 공차 및 실패 안전.

제쳐두고 이전 포스터가 암시했던 것처럼 (그리고 어떤 이유로 덕분에),이를 달성 할 수있는 가장 중요한 요소는 팀이 진행중인 모든 것에 대한 견고한 이해를 갖는 것입니다. 당신의 좋은 소프트웨어 디자인이 핵심이라는 것은 말할 필요도 없습니다. 그러나 그것은 또한 접근 가능하고 성숙하며 잘 지원되는 언어를 의미하며, 공동 지식이 많고 경험이 풍부한 개발자가 있습니다.

많은 포스터는 이미 OS가 결정적이어야하기 때문에 가장 사실 인 핵심 요소라고 이미 언급했습니다 (QNX 또는 VXWorks 참조). 이것은 당신을 위해 무대 뒤에서 일을하는 가장 많이 해석 된 언어를 배제합니다.

ADA는 가능성이 있지만 도구와 지원이 적으며 더 중요한 것은 훌륭한 사람들이 쉽게 구할 수 없다는 것입니다.

C ++는 가능성이 있지만 서브 세트를 엄격하게 시행하는 경우에만 가능합니다. 이와 관련하여 그것은 우리의 삶을 더 쉽게 만들겠다고 약속하지만 종종 너무 많은 일을하는 것은 악마의 도구입니다.

C는 이상적입니다. 매우 성숙하고 빠르며 다양한 도구와 지원 세트가 있으며 많은 숙련 된 개발자, 크로스 플랫폼 및 매우 유연한 하드웨어 근처에서 작동 할 수 있습니다.

나는 Smalltalk에서 Ruby에 이르기까지 모든 것을 발전 시켰으며, 고중심 언어가 제공하는 모든 것을 즐기고 즐기고 있습니다. 그러나 중요한 시스템 개발을 할 때 총알을 물고 C를 고수합니다 (방어 및 많은 클래스 II 및 III 의료 기기)은 더 적습니다.

다른 모든 것보다 안전하다면 Haskell을 데리러 올 것입니다. Haskell은 매우 견고한 정적 유형 확인을 가지고 있기 때문에 테스트하기가 매우 쉬운 방식으로 부품을 제작하는 프로그래밍을 촉진합니다.

그러나 나는 언어를 많이 신경 쓰지 않을 것입니다. 프로젝트를 전반적으로 조건을 유지하고 마감일없이 작업함으로써 타협하지 않고 훨씬 더 큰 안전을 얻을 수 있습니다. 전반적으로 모든 기본 프로젝트 관리가 마련된 것과 마찬가지로. 아마도 모든 코너 케이스 + 더 많은 것을 포괄하는 테스트와 같은 모든 것이 작동하는지 확인하기 위해 광범위한 테스트에 집중할 것입니다.

언어와 OS는 중요하지만 디자인도 중요합니다. 베어 본을 유지하고 간단하게 생각하십시오.

나는 최소한의 상태 정보 (런타임 데이터)를 사용하여 일관성이 없을 가능성을 최소화하는 것으로 시작합니다. 그런 다음 결함-장애 목적으로 중복성을 원한다면 데이터에서 일관성이 없어지는 방법이 없어야합니다. 불일치로부터 회복하는 방법이없는 중복성은 단지 문제를 요구하는 것입니다.

요청 된 조치가 합리적인 시간 안에 완료되지 않을 때 항상 폴백이 있습니다. 그들이 항공 교통 관제에서 말했듯이, 무시 무시한 클리어런스는 허가가 아닙니다.

폴링 방법을 두려워하지 마십시오. 몇주기를 낭비하더라도 간단하고 신뢰할 수 있습니다. 이벤트 또는 알림에만 의존하는 처리에서 부끄러워합니다. 쉽게 삭제하거나 복제하거나 오도 할 수 있기 때문입니다. 폴링의 보조제로서, 그들은 괜찮습니다.

아폴로 프로젝트의 내 친구는 한때 컴퓨터가 끔찍하게 느리지 만 사건보다는 여론 조사에 의존하기로 결정했을 때 심각 해지고 있다는 것을 알았습니다.

추신 : 방금 C ++ 공기 차량 표준을 읽습니다. 그들은 괜찮지 만, 많은 클래스, 데이터, 포인터 및 동적 메모리 할당이 있다고 가정하는 것 같습니다. 그것이 바로 절대적으로 필요한 것보다 더 이상 없어야 할 것입니다. 큰 낫을 가진 데이터 구조 czar가 있어야합니다.

OS는 언어보다 더 중요합니다. VXWorks 또는 QNX와 같은 실시간 커널을 사용하십시오. 우리는 산업용 로봇을 제어하기 위해 둘 다보고 VXWorks와 함께 가기로 결정했습니다. 실제 로봇 제어에 C를 사용합니다.

항공기 오토 랜드 시스템과 같은 진정한 중요한 소프트웨어의 경우 여러 프로세서가 독립적으로 실행하여 결과를 교차 확인하기를 원합니다.

실시간 환경에는 일반적으로 "안전성 중요"요구 사항이 있습니다. 그런 종류의 일을 위해, 당신은 vxworks, 인기있는 실시간 운영 체제. 현재 Boeing Aircraft, BMW Idrive Internals, Raid Controllers 및 다양한 우주 공예와 같은 다양한 다양한 경기장에서 사용되고 있습니다. (확인 해봐.)

VXWorks 플랫폼의 개발은 여러 도구로 수행 할 수 있습니다. , 워크 벤치, 점수, 다른 사람. C, C ++, Ada 및 Fortran (예, Fortran)도 지원됩니다.

당신은 플랫폼을 제공하지 않기 때문에 C/C ++라고 말해야합니다. 대부분의 실시간 플랫폼에서, 당신은 어쨌든 옵션이 비교적 제한적입니다.

C의 단점은 발에서 자신을 촬영할 수 있도록하는 경향이 코드의 검증을위한 도구 수와 플랫폼의 하드웨어 기능에 대한 코드의 안정성 및 직접 매핑을 상쇄합니다. 또한 중요한 것은 광범위하게 검토되지 않은 타사 소프트웨어에 의존 할 수 없습니다. 여기에는 대부분의 라이브러리가 포함되어 있습니다.

모든 것이 귀하의 책임이되므로 안정적인 컴파일러, 예측 가능한 동작 및 하드웨어에 대한 밀접한 매핑을 원합니다.

다음은 내가 보지 못했던 몇 가지 도구에 대한 몇 가지 업데이트입니다.

LLVM 컴파일러 인프라, 메인 페이지의 짧은 블루트 (C 및 C ++의 프론트 엔드 포함. Java, 체계 및 기타 언어의 프론트 엔드 포함);

컴파일러 인프라 -LLVM은 언어 및 컴파일 전략을 구현하는 소스 코드 모음이기도합니다. LLVM 인프라의 주요 구성 요소는 GCC 기반 C & C ++ 프론트 엔드, X86, X86-64, PowerPC의 정적 백엔드 세트를 갖춘 링크 타임 최적화 프레임 워크입니다. 32/64, 팔, 썸, IA-64, 알파, SPARC, MIPS 및 Cellspu 아키텍처, 휴대용 C 코드를 방출하는 백엔드 및 X86, X86-64, PowerPC 32/64의 정시 컴파일러를 방출합니다. 프로세서 및 MSIL의 이미 터.

VCC;

VCC는 주석이 달린 동시 C 프로그램의 정확성을 입증하거나 문제를 발견하는 도구입니다. VCC는 유형 불변성뿐만 아니라 전제 조건과 같은 계약 기능으로 설계로 C를 확장합니다. 주석이 달린 프로그램은 Boogie 도구를 사용하여 논리 공식으로 번역되어 자동화 된 SMT 솔버 Z3로 전달하여 유효성을 확인합니다.

VCC는 최근에 출시 된 것을 사용합니다 공통 컴파일러 인프라.

이 두 도구 인 LLVM 또는 VCC는 여러 언어 및 아키텍처를 지원하도록 설계되었습니다. 계약 및 기타 공식적인 검증 관행에 의한 코딩이 증가하고 있다고 생각합니다.

WPF (MS 프레임 워크가 아님 :), 프로그램 검증 공간에서 최근 연구 및 도구 중 일부를 평가하려는 경우 시작하기에 좋은 장소입니다.

WG23 그러나 상당히 최신적이고 구체적인 기본 리소스입니다. 중요한 시스템 개발 언어 세부 사항. 그들은 ADA, C, C ++, Java, C#, Scripting 등의 모든 것을 다루며 언어 별 결함 및 취약점에 대한 정보를 업데이트하기위한 방향에 대한 적절한 참조 및 지침을 가지고 있습니다.

좋은 참조가 많이 있습니다 http://www.dwheeler.com ( "높은 자료 소프트웨어").

자동차 제품은 Misra C 표준을 참조하십시오. C 그러나 당신은 두 가지 수준의 포인터와 그와 같은 다른 것들을 사용할 수 없습니다.

Adahome.com은 Ada에 대한 좋은 정보를 가지고 있습니다. 이 C ++에서 ADA 튜토리얼을 좋아했습니다. http://adahome.com/ammo/cpp2ada.html

실시간으로 Tom Hawkins는 흥미로운 Haskell 작업을 수행했습니다. 참조 : 개선 (언어는 검증 조건을 확인하기 위해 SMT 솔버를 통합) 및 Atom (실제 스레드 또는 작업을 사용하지 않고 실시간 실시간 동시 프로그래밍을위한 EDSL)을 참조하십시오.

신중한 패턴을 부과하는 언어는 도움이 될 수 있지만 어셈블러, 심지어 모든 언어를 사용하여 신중한 패턴을 부과 할 수 있습니다. 모든 가치에 대한 모든 가정은 가정을 테스트하는 코드가 필요합니다. 예를 들어, 나누기 전에 항상 0에 대한 디바이저를 테스트하십시오.

재사용 가능한 구성 요소를 더 많이 신뢰할수록 작업이 쉬워 지지만 재사용 가능한 구성 요소는 비판적 사용으로 거의 인증을받지 않으며 규제 안전 프로세스를 통해 얻을 수 없습니다. 작은 OS 커널을 사용한 다음 임의의 입력으로 테스트 된 단위를 구축해야합니다. 에펠과 같은 언어는 도움이 될 수 있지만은 총알은 없습니다.

모든 소프트웨어 제품은 모든 도구를 사용하여 DO-178B 인증 프로세스를 통과 할 수 있지만 질문은 얼마나 어려운지입니다. 컴파일러가 인증되지 않은 경우 조립 수준에서 코드가 추적 할 수 있음을 시연해야 할 수도 있습니다. 따라서 컴파일러가 인증을 받았다는 것이 도움이됩니다. 우리는 프로젝트에서 C를 사용했지만 어셈블리 수준에서 확인하고 Optimizer, 제한된 스택 사용, 제한된 인터럽트 사용, 투명한 인증 가능한 라이브러리 등을 포함한 코드 표준을 사용해야했습니다. ADA는 Pixie Dust는 아니지만 PSAC 계획은 더욱 달성 가능해 보입니다.

애플리케이션이 커지면 조립 코드는 덜 실행 가능한 선택이됩니다. ARM 프로세서는 C ++를 초대하지만 Kiel과 같은 회사에 요청하면 도구가 인증되어 있으면 "Huh"로 돌아갑니다. 또한 Verificaton 도구도 인증을 받아야한다는 것을 잊지 마십시오. LabView 테스트 프로그램을 확인하십시오.

새로운 Java의 안전 크리티컬 표준 현재 개발 중입니다. JSR 302 : 안전 치명적인 Java 기술.

그만큼 안전 크리티컬 Java (SCJ)는 RTSJ의 서브 세트를 기반으로합니다. 목표는 안전 중요 인증 (DO-178B, 레벨 A 및 기타 안전 크리티컬 표준)을위한 안전 중요 프로그램 개발 및 분석에 적합한 프레임 워크를 갖는 것입니다.

예를 들어 SCJ는 RTSJ에 여전히 존재하는 힙을 제거하며 응용 프로그램과 VM 구현이 모두 준수 할 수있는 3 가지 준수 수준을 정의하면 컴플라이언스 수준이 다양하게 복잡한 응용 프로그램의 인증을 완화하기 위해 정의됩니다.

자원:

나는 내가 어떤 언어를 사용할 언어를 모르지만, 내가 어떤 언어를 사용하지 않을지 알고 있습니다.

Java 지원에 대한 참고 사항. 소프트웨어 제품에는 Java로 작성된 프로그램에 대한 지원이 포함되어 있습니다. Java Technology는 결함이 없으며 핵 시설, 항공기 내비게이션 또는 통신 시스템, AIR의 운영과 같은 실패 성능을 요구하는 위험한 환경에서 온라인 제어 장비로 사용 또는 재판매를 위해 설계, 제조 또는 재판매를위한 것이 아닙니다. Java 기술의 실패로 직접 사망, 개인 상해 또는 심각한 신체적 또는 환경 적 손상으로 이어질 수있는 교통 통제, 직접 생명 지원 기계 또는 무기 시스템.

HAL/S는 우주 왕복선에 사용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top