2009-08-12 3 views
3

다른 질문을 읽으 셨다면 아시다시피 프로그래밍 언어를 쓰고 있습니다. 큰 걱정거리 중 하나는 많은 언어가 이전 버전과의 호환성에 문제가 있다는 것입니다. 나는 그러한 문제를 피하고 싶습니다. 한편으로 파이썬 3000으로의 전환과 관련하여 파이썬 공동체에서 많은 어려움과 고통을 겪었습니다. 반면에 C++로 시작한 C++은 C 구문으로 시작되었고 실제로 복구되지 않았습니다. 즉, C의 구문은 많은 C++ 구문에 적합하지 않습니다.프로그래밍 언어는 어떻게 이전 버전과의 호환성을 유지하고 설계 실수를 수정합니까?

내 솔루션은 프로그래머가 컴파일러 지시문을 파일에 추가하여 컴파일 할 때 사용할 언어 버전을 컴파일러에 알려주는 것입니다. 하지만 내 질문은, 어떻게 다른 언어 가이 문제를 처리합니까? 시도 된 다른 솔루션이 있습니까? 그리고 이러한 솔루션이 얼마나 성공적 이었습니까?

답변

7

무언가가 깨지면 용감한 언어 디자이너는 이전 버전과의 호환성을 두려워해서는 안됩니다. 나는 그것을 할 수있는 두 가지 좋은 방법을 알고 :

  • Glasgow Haskell Compiler는 일반적으로 원치 않는 기능을 deprecates 다음 두 가지 버전 이후 지원 삭제합니다.

  • Lua 팀은 이전 버전과의 호환성을 깰 수있는 각 주요 릴리스 (1993 년부터 5가 있었다) 정책을 가지고 있지만 일반적으로 사용자가 최신 버전으로 마이그레이션하는 데 도움이 호환성 계층을 제공합니다. (게다가 그들은 가능한 모든 것을 유지에 대한 꼼꼼하다, 현재 버전은 5.1입니다하지만 난 여전히 유지 루아 2.5 코드가, 내가 루아 2.5에서 버그를 발견하면, 그들은   해결됩니다 그것.)

+1

+1 좋은 조언과 훌륭한 변경 정책. –

6

쉬운 : 새로운 방법이나 기능을 사용할 수있는 경우 중단은

, 그들은 단순히 이전 내용을 제거하지 않습니다. 그들은 단지 그들을 비난했다. 따라서 새로운 컴파일러를 사용하는 개발자는 어느 시점에서 해당 기능의 새 버전을 사용해야하거나 미래에 프로그램이 컴파일되지 않는다는 것을 알고 있습니다. 그런 식으로 그들은 '하위 호환성'이 있지만 동시에 새로운 기능의 사용을 강요합니다.

+0

라이브러리의 호환성에는 좋지 만 언어 호환성은 언급하지 않습니다. 버전 2.0에서는 foreach 문을 추가 할 수 있습니다.이 문은 버전 1.0 소스 코드의 구문 오류입니다. –

+0

@Jim Ferrans : 당신은 하위 호환성 (올바른?)이 아닌 순방향 호환성에 대해 이야기하고 있습니다. v1.0 컴파일러가 v2.0 언어 구문 AFAIK를 허용 할 수있는 합리적인 방법은 없지만 그 반대는 사실이 아닙니다. –

+0

컴파일러 역 호환성은 새 컴파일러에서 실행되는 오래된 코드를 의미합니다. 귀하의 예는 '이전 호환성'입니다. 이는 이전 컴파일러에서 실행되는 새로운 코드를 의미합니다. 나는 아직 그 컴파일러들을 보지 못했다. – Freddy

2

필자는 컴파일러 지시어를 제대로 사용하고 있다고 생각합니다. 컴파일러에 명령 줄 인수로 패키지하는 것이 더 좋습니다.

상관없이이 같은 버전 뭔가에 대해 테스트 할 수 있습니다 컴파일러 논리에서 무엇 :

if (language_major_version > 2) // 2.00.00 and above 
    ... normal processing ... 
else 
    ... emit compatibility/deprecation error ... 

의 VoiceXML, 음성 대화 상자를 지정하는 XML 기반 언어의에서 지시 퍼팅의 한 예이다 소스 코드 : 구문은 항상 XML을 잘 형성된다

<?xml version="1.0"?> 
<vxml version="2.1"> 
    ... 
</vxml> 

때문에,이 거의 부정 행위, 구현하기가 정말 쉽다,

+0

메모로, 소스 코드에서 명령 줄에서 전달 된 버전으로 재정의 할 수있는 옵션이있는 컴파일러 지시문으로 구현할 계획입니다. 소스 파일의 버전이 다른 상황을 처리하는 방법을 정확히 알지 못하기 때문에 여전히이 문제가 있습니다. – Imagist

+0

고통이 될 수 있습니다. 이런 식으로 하나의 "컴파일러"에서 VoiceXML 1.0, 2.0 및 2.1 구문을 지원했지만이 모든 것이 올바른 형식의 XML 이었기 때문에 매우 간단했습니다. 저는 @ 브리튼의 조언이 당신의 언어를 일반적인 가상 머신이나 인터프리터로 매핑하는 것을 좋아합니다. 최악의 경우, (1) 버전을 판별하기 위해 신속하고 더러운 구문 분석을 수행하고, (2a) v1.0 특정 구문 분석기로 전체 구문 분석을 수행하거나 (2b) v2.0 특정 구문 분석을 전체 구문 분석을 수행 할 수 있습니다. (3) 표준 백엔드로 나머지 컴파일/해석 단계를 수행하십시오. –

1

내가가는거야 g는 정말 가혹한 냉철한 목소리로 말하면서 다음과 같이 말합니다. 죄송하지만, 통계는 당신에게 불리합니다.이 문제가 될 않는 드문 경우에

이 내가이 문제에 사용되는 본 적이 전략

  • 그것에 대해 걱정 단지 이전 버전과의 호환성을 중단하지 마십시오있다

  • 이전 버전의 인터프리터를 새 버전으로 유지하고 일부 지시어 또는 다른 종류의 메타 데이터를 사용하여 전환하십시오.

  • 새 버전을 이전 버전보다 엄격하게 설정하십시오. 이렇게하면 모든 이전 프로그램이 새로운 버전의 컴파일러/인터프리터에서 컴파일됩니다.

  • 이전 스타일 프로그램을 새 스타일 프로그램으로 변환하는 변환기를 제공하십시오.

  • 모든 언어 버전에서 컴파일 된 바이트 코드를 허용하는 가상 컴퓨터에서 해당 언어를 사용하십시오. 서로 다른 버전이 서로 "대화"할 수있는 기능이 있는지 확인하십시오.

  • 타협과 모두 오프 대신 청중의 절반의

  • 새로운 버전은 기본적으로 느슨한 모드와 "엄격한"모드를 가지고, 전 후자 엄격하게 호환되는 소변 결국 에서 선택하는 사람들을 위해 오래되고 파열 기능을 제거.

좋은 소식은 이러한 전략 중 어느 것도 매우 잘 작동하지 않을 것입니다, 그래서 당신은 소설 새로운 방식으로 창의적이고 엉망이 될 수있는 기회를 가질 수있다.

0

일반적으로 말하자면 적어도 하나 이상의 새 버전에 대해 모든 이전 기능을 지원하는 것이 좋습니다. 그런 다음 해당 기능이 감가 상각됩니다. 기능을 사용하기 전에 응용 프로그램을 업데이트하는 것은 해당 언어 사용자의 몫입니다.

0

언어가 이전 버전과의 호환성을 다룬 다른 하나의 방법을 잊어 버렸습니다. 결코 언어를 업데이트하지 말라 고집합니다. 이 예를 보려면 Donald Knuth의 TEX를 참조하십시오.

+0

공정하게 말하면, TEX의 마지막 버전 이후 조판은 많이 바뀌지 않았습니다. – Imagist

+0

사실, TEX은 아시아 언어를 잘 지원하지 않습니다. 이해합니다. – Breton

관련 문제