이 답변 에는 다른 언어가 프로젝트에 뚜렷한 이점을 제공 할 수있는 이유에 대한 훌륭한 설명과 링크가 있습니다. 그러나 프로젝트가 여러 언어를 사용하는 이유는 언어 적합성에 그치지 않습니다.
프로젝트는 6 가지 주요 이유로 여러 언어를 사용합니다.
- 다른 언어로 작성된 코드를 재사용하면 비용이 절감됩니다.
- 레거시 코드를 포함하고 수용 할 필요성
- 특정 언어에 대한 코더의 가용성;
- 특수 요구를위한 특수 언어의 필요성;
- 레거시 언어 편향; 과
- 빈약 한 프로젝트 관리 (계획되지 않은 다국어 사용).
이유 1 ~ 4는 직접 문제를 해결하면 고품질의 제품과보다 쉬운 장기 지원으로 프로젝트를보다 빠르고 효율적으로 결론을 내릴 수 있다는 긍정적 인 이유입니다. 이유 5와 6은 부정적이며, 필요한 변화에 대한 내성의 증상, 계획이 잘못되었거나, 비효율적 인 관리 또는 이러한 모든 요소의 일부 조합입니다. 불행히도 이러한 부정적인 요소는 "우연한"다국어 사용의 일반적인 원인입니다.
재사용의 비용 이점 인 이유 1 은 오픈 소스 소프트웨어의 역할이 커지고 웹에서 올바른 코드 구성 요소를 찾을 수있는 기능이 향상되어 프로젝트에서 여러 언어를 사용할 수있는 강력한 이유가되었습니다. 지난 수십 년간의 "내부적으로 코드를 작성하자"라는 철학은 경제 현실에 직면하여 계속 사라지고 있으며, 새로운 프로젝트에있어 가장 비용 효율적인 방법은 아닙니다. 결과적으로 프로젝트 내에서 단일 언어 사용을 엄격하게 시행 할 수있는 기회가 줄어 듭니다.
특히 잘 관리되는 오픈 소스 구성 요소를 재사용하는 프로젝트의 경우, 재사용 된 구성 요소가 잘 설계된 인터페이스 뒤에 숨겨져 있고 비용이 많이 들지 않는 외부 그룹에 의해 독립적으로 유지 관리되므로 여러 언어를 사용하면 전체적으로 큰 비용 이점을 얻을 수 있습니다. 최상의 시나리오에서 이러한 종류의 재사용을 통해 언어를 혼합하는 것은 운영 체제 구성 요소를 사용하는 것보다 비용이 많이 들지 않습니다. 필자는 브라우저에서 Microsoft가 오픈 소스 소프트웨어를 대규모로 채택한 것보다이 접근 방식의 가치에 대한 더 나은 예를 알고 있지 않습니다.
레거시 코드를 수용해야하는 이유 2 는 대규모 프로젝트의 위험에 따라 무시됩니다. 그러나 레거시 코드가 많은 문제를 일으킬 수 있지만, 새로운 언어로 새 코드로 쉽게 교체 할 수 있다고 가정하면 순진하게 위험 할 수 있습니다. 레거시 코드, 심지어 레거시 코드조차도 레거시 제품을 사용하는 커뮤니티에서 예상되는 기능의 암시 적 "계약"에 해당하는 양이 종종 포함됩니다. 이 커뮤니티는 종종 회사의 주요 수입원이거나 정부 소프트웨어 지원의 주요 목표입니다. 묵시적 계약을 버리는 것만으로도 운전중인 고객을 인식 할 수 있으며 다른 옵션을 쉽게 사용할 수있는 경우 밤새 회사를 파산 할 수 있습니다.
동시에, 오래된 언어로 된 오래된 코드를 교체 하지 않는 것은 도매하는 것만 큼 위험 할 수 있습니다. 최악의 예는 미국 재향 군인 관리국인데, 컴퓨터 과학자가 아닌 의사가 설계 한 MUMPS (농담 없음)라는 언어로 코딩 된 많은 필수 시스템이 있습니다. 아무도 MUMPS를 배우기를 원하지 않으며 그것을 알고있는 사람들은 말 그대로 죽어 가고 있습니다. 따라서 프로그래머는보다 일반적이고 강력하며 더 잘 유지 관리되는 다른 언어를 사용하려는 경우에도 MUMPS를 수용해야합니다.
이 유형의 다국어 사용에는 신중한 계획이 필요합니다. 이러한 계획은 수십 년 동안 고객 지식을 잃어 버리는 것과 다른 한편으로는 소프트웨어를 지원할 수있는 능력을 잃는 것 사이의 경계를 탐색해야합니다. 이전 코드를 잘 정의 된 인터페이스로 격리하고 동작이 잘 문서화 된 후 이전 코드를 대체 할 수있는보다 강력한 새 코드를 가능하게하는 기술이 도움이 될 수 있습니다. 그러나이 레거시 시나리오는 결코 쉬운 일이 아니며 광범위한 회사에서 많은 회사와 조직이 사망 한 원인이되었습니다.
다양한 언어의 코더를 사용할 수있는 이유 3 은 프로젝트가 위험에 처한 것을 무시하는 실용적인 요소입니다. 그러나 많은 프로젝트 주최자는 특정 언어가 목표에 가장 적합하다고 생각할 수 있습니다 (올바르거나 잘못). 해당 언어가 사용 가능한 언어 전문 지식 풀과 충돌하는 경우 제품의 일정과 품질이 학습으로 인해 어려움을 겪을 수 있습니다. 새로운 언어를 배우려고 노력하는 프로그래머의 곡선.
보다 합리적인 접근 방식은 기능 영역을 기반으로 프로젝트의 언어 요구를 분석하는 것입니다. 예를 들어, 프로젝트를주의 깊게 살펴보면 일반적으로 덜 사용되는 언어의 코딩 전문 지식을 필요로하는 일부 독점 알고리즘을 구현하기 위해 고 가치 코드의 작은 "정점"만 있음을 알 수 있습니다. 대규모 프로젝트의 다른 부분은 종종 더 일반적인 언어 또는 잘 관리되는 오픈 소스 제품으로 쉽게 수용 할 수 있습니다. 따라서 언어 요구에 따라 프로젝트를 분석하면 특수 언어로 특수 전문 지식을 고용하거나 임대하는 데 훨씬 더 현실적이고 비용 효율적인 방법을 제공 할 수 있으며 단일 프로젝트 내에서 언어 간 인터페이스를 선명하게 할 수 있습니다.
다양한 요구에 다른 언어를 사용하는 이유 4 는 그러한 종류의 프로젝트 요구에 대한 분석을 수행하는 즉시 즉각적으로 이어집니다. 단일 프로젝트 내에서 지원할 언어를 너무 많이 선택하면 지원 및 구성 요소 간 인터페이스가 복잡해 지므로 폭발적으로 복잡해질 수 있습니다. 비용 대비 가장 안전한 경로는 항상 재사용이 가능한 최대 기회를 찾는 것입니다. 특히 커스터마이즈 이상으로 프로젝트 요구를 충족시킬 수있는 우수한 패키지가있는 경우 더욱 그렇습니다. 다음으로, 식별 된 대부분의 요구를 해결할 수있는 소수의 언어에 대해 어떤 종류의 결정을 내려야합니다. 재사용 집약적 인 개발에서 이것은 종종 일종의 접착제 코드 일 것입니다.
프로젝트의 일부 멤버는 다른 멤버와 유사하기 때문에 매우 유사한 기능을 가진 여러 언어를 선택하는 것은 일반적으로 좋지 않습니다 . 그러나 특수 언어 기술을 활용할 수있는 잘 정의되고 잘 정의 된 기능 하위 집합이있는 경우 새로운 코드 개발에 여러 언어를 사용하는 것이 좋습니다.
사용 된 언어의 필요한 변경에 대한 저항 인 이유 5 는 심각한 프로젝트 중단 및 내부 분쟁의 원인이 될 수 있습니다. 사용자 Daveo이 답변에 대한 의견에서 지적했듯이 일부 프로젝트 직원에게는 변경이 매우 어려울 수 있습니다. 동시에, 변화에 대한 저항은 결코 간단한 문제가 아니며, 그것이 많은 투쟁을 일으킬 수있는 이유입니다. 레거시 언어가 충분히 강력 할 경우 레거시 언어 기술을 사용하면 프로젝트 생산성이 크게 향상 될 수 있으며, 원활하게 운영되고 품질을 존중하는 팀에서 우수한 품질의 제품으로 이어질 수 있습니다. 그러나 레거시 언어 기술은 고급 기능, 구성 요소 가용성, 오픈 소스 옵션 및 지능형 도구 키트 지원 측면에서 더 많은 최신 언어를 더 이상 최신 언어로 완성 할 수 없다는 사실과 균형을 이루어야합니다.
그 당시와 현재, 더 약하고, 읽기 어렵거나, 덜 생산적인 레거시 언어를 계속 사용한다는 가장 일반적인 (그리고 아이러니하게도, 가장 자주 올바른) 단일 주장은 오래된 언어가 더 효율적인 코드를 생성 할 수 있다는 것이 었습니다. 이것은 어셈블리 언어 사용자가 종종 FORTRAN과 LISP에서 프로그래밍의 출현을 다시 불러 일으켰을 때 1950 년대로 거슬러 올라가는 오래된 논쟁입니다. 현재까지도 코드 효율성 인수가 유효 할 수있는 예는 운영 체제 커널과 같은 처리 집약적 코드에서 볼 수 있습니다. 여기서 운영 체제 커널은 C가 C ++보다 선호하는 언어로 남아 있습니다 (단순한 효율성을 넘어서는 이유가 있습니다).
그러나 전 세계적으로 네트워크화되고 강력하게 기계적으로 지원되는 새로운 밀레니엄 프로젝트 환경에서 프로젝트 언어 선택의 주요 논거 인 코드 효율성은 더욱 약화되었습니다. 인공 지능 응용 프로그램의 대량 마케팅을 가능하게 한 컴퓨팅 및 네트워킹 하드웨어의 폭발은 인간 프로그래밍 비용이 놀라 울 정도로 저렴한 하드웨어 및 클라우드웨어에서 비효율적 인 코드 실행의 비용을 쉽게 능가 할 수 있음을 의미합니다. 최신 버전의 구성 요소 라이브러리, 오픈 소스 옵션 및 고급 지능형 툴 키트에 대한 가용성이 높아지면 효율성을 이유로 언어를 유지하는 경우가 매우 좁아집니다. 적용되는 경우에도
프로젝트가 레거시 언어를 유지하는 더 매력적인 이유는 프로젝트가 직원 변경 옵션이 거의 없거나 전혀없는 경우에 발생합니다. 예를 들어 주요 레거시 제품군이 기존 직원 만 능숙한 언어로 완전히 코딩 된 경우에 발생할 수 있습니다. 이러한 경우 프로젝트는 구식 언어로 프로그래밍하려는 노력을 계속하거나 기존 직원에게 새로운 언어 사용 방법을 교육시켜야합니다.
새로운 언어로 레거시 언어 직원을 훈련시키는 것은 그 자체로 위험 할 수 있습니다. 나는 C에서 C ++로 방금 훈련되고 전환 된 프로젝트 멤버가 객체 지향 메소드의 이점을 이해하지 못했다고 진정으로 나에게 불평 한 사례를 회상합니다. 내가 그의 코드를 볼 때, 그는 이전의 103 C 함수를 단일 C ++ 객체 클래스에 대한 103 메소드로 변환했으며 ... 어떻게 도움이되는지 보지 못했습니다.
더 깊은 메시지는 사람들이 수십 년 또는 수십 년 동안 단일 언어 및 언어 스타일로 프로그래밍했을 때 새로운 훈련 방식으로 "생각"하기가 어려워 질 수 있다는 것입니다. 어떤 경우에는 현재의 트렌드와 방법에 더 잘 적응하는 젊은 디자이너와 프로그래머를 불러오는 것 외에 다른 옵션이 없을 수도 있습니다.
프로젝트 관리가 열악한 이유 6 은 그 자체를 말합니다. 프로젝트에서 언어 선택 및 사용은 항상 명시 적으로 고려되고 평가되어야하며 우연히 발생해서는 안됩니다. 최소한 언어 선택은 프로젝트의 장기적인 운명과 지원 비용에 큰 차이를 만들 수 있으므로 항상 고려하고 계획해야합니다. MUMPS가되지 마십시오!