Java 프로그래밍 언어
Java는 크로스 플랫폼 응용 소프트웨어를 작성할 수 있는 객체 지향 프로그래밍 언어로 1995년 5월 Sun Microsystems에서 출시한 Java 프로그래밍 언어이자 Java 플랫폼입니다. JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))의 총칭.
이 글에서는 주로 C, C++98, C++11, Java 및 Go를 분석하고 언어의 주요 기능을 주로 논의합니다. 논의 과정에서 우리는 화웨이의 언어 프로그래밍 전문가와 화웨이의 통신 소프트웨어 내 주요 개발자 간의 교류를 결합할 것입니다. 우리는 언어 선호도나 언어 종파에 대한 논쟁을 버리고 각 언어의 특징과 단점을 객관적인 관점에서 논의하려고 노력할 것입니다. 공정한 관점에서 언어 선택이 객관적인 참고 자료가 됩니다.
이 내용을 작성하고 모든 분들의 수정과 피드백을 받아 전체 분석이 더욱 객관적이 되도록 Go에 대한 심층적인 분석과 참고에 중점을 두겠습니다. 콘텐츠가 많고 기대가 당신을 방해하지 않을 것입니다.
언어 전체 개요
1. Go
동시성 측면에서 고루틴 및 채널 메커니즘은 언어 수준에서 가볍고 원활한 동시성 메커니즘을 제공합니다. 성능 측면에서는 Java보다 열등하지 않은 성능을 제공합니다(성능은 잘못된 제안입니다). 메모리 리소스 소비 측면에서 Java 및 기타 동적 언어에 비해 구문 측면에서 몇 가지 장점이 있습니다. Python의 동적 언어 기능 중 개체 초기화 측면에서 구성 및 직렬화는 매우 간결한 표현을 제공하며 이러한 처리 코드는 특히 데이터 처리, 구성 및 프로토콜 매핑 시나리오에서 코드의 10%~50%를 차지할 수 있습니다. C, C++, Java에서는 이러한 측면이 서투른데, 이것이 동적 언어가 매력적인 이유의 핵심입니다.
이것이 Go 언어의 첫 번째 버전이 출시되었을 때 많은 관심을 받았던 핵심 이유이기도 합니다. 특히 동적 언어의 경우 동적 언어에는 없는 동시성 및 성능 이점을 제공합니다. Pike Go 언어를 설계하는 목적은 C/C++의 또 다른 선택적인 역할을 수행하는 것입니다(참고로 Go 언어의 아버지이자 수석 소프트웨어 엔지니어인 Pike는 대체가 아니며 설계 목표도 이를 대체하는 것이 아닙니다). Google에서는 2012년 "Road to Simplicity" 연설에서 목표는 좌절감으로 가득 차 있으며 다음과 같은 인용문을 언급했습니다. "우리는 C++ 프로그래머가 Go를 대안으로 볼 것으로 예상했지만 대신 대부분의 Go 프로그래머는 언어 출신입니다. C++에서 나온 언어는 거의 없습니다." C++ 가치의 핵심은 언어가 보다 광범위한 추상화, 우아함 및 유연한 기능을 제공하며 이러한 표현 기능은 하드웨어 비용이 전혀 들지 않는다는 것입니다. C 언어는 하드웨어 비용이 전혀 들지 않습니다. 디자인 목표는 처음부터 있지만 언어 표현 능력은 C++로 해결되며 Go의 생각 방향은 분명히 Zero Cost가 아니며 적어도 CPU 비용이 Zero가 아니며 Go의 제안은 프로그래머의 작업량을 최소화하는 것입니다.
하나는 비용이 전혀 들지 않는 하드웨어를 궁극적으로 추구하는 것이고, 다른 하나는 누구도 가장 중요한 부분을 대체할 수 없다는 것입니다. Go는 두 가지 목표를 동시에 달성할 수 없습니다. 동적 구문을 선택하고 gc는 개발 효율성을 선택하고 개발 효율성을 위해 하드웨어 효율성을 희생할 운명이므로 다른 방향으로 갑니다. 이는 Java가 잘하는 애플리케이션 방향, 특히 좋은 표준 라이브러리가 필요한 현재 네트워크 및 HTTP 애플리케이션과 같은 애플리케이션 방향입니다. 표준 라이브러리 측면에서 Go는 tcp/http/xml/json/암호화 및 복호화 등을 처리하기 위한 보다 가볍고 뛰어난 코드 라이브러리를 제공할 뿐만 아니라 핵심 프로토콜인 http에 대한 높은 동시성 지원을 제공합니다. 네트워크를 활용하기 위한 디딤돌이 제공되었습니다.
그러나 우리는 현재의 단점을 직시해야 합니다. 중요한 언어 기능과 엄밀함 측면에서 아직 성숙하지 못했으며, 아직 결함이나 임시 해결책이 많이 남아 있어 생태계의 성숙도에도 영향을 미치게 됩니다. 이러한 문제는 새 버전에서 여전히 해결되어야 합니다. Go 언어의 첫 번째 버전은 2012년 3월 28일에 공식적으로 출시되었습니다. 현재까지 버전 1.7이 출시되었습니다. 거의 1년 만에 두 가지 주요 버전이 출시되었으며, 그 사이에 여러 베타 버전과 RC 버전이 출시되었습니다. Go 언어는 아직 완성되지 않았습니다.
요약
Go는 애플리케이션 개발, 특히 HTTP 관련 애플리케이션 측면에서 동적 언어 성능 요구 사항 측면에서 Python 및 Ruby에 대한 이상적인 후보임이 입증되었습니다. Java에 대한 도전자로서 리소스에 대한 제어가 그다지 강력하지 않은 곳에서는 C/C++ 외에 또 다른 역할을 제공합니다.
생산성 측면에서 언어 기능과 생태계가 아직 성숙하지 않았고 버전이 여전히 빠르게 반복되고 있습니다. 동적 언어 및 Java와 비교할 때 현 단계에서는 장점이 없습니다. , 이러한 언어는 특정 시나리오에서 제한됩니다. 장기적으로는 Google의 강력한 지원으로 새로운 기능과 라이브러리 응용 프로그램 기능이 계속 추가될 것입니다. 그러나 이 단계에서는 프로그램의 규모와 복잡성을 조정해야 합니다. 언어와 생태계는 아직 완전히 개발되지 않았습니다. 건전한 지원을 제공하려면 미숙함과 빠른 버전 반복으로 인한 위험도 인식해야 합니다.
2. 자바
Java의 성공은 10년 전 유닉스 시스템을 중심으로 하던 SUN, IBM, 오라클 등 대기업들의 전폭적인 지원 덕분에 엔터프라이즈 애플리케이션 분야에서 확고한 입지를 다질 수 있었다. 그리고 WEB 애플리케이션, 그리고 이후 10년간 상반기에는 x86+Linux의 혁명에 힘입어 하반기에도 점유율을 유지할 수 있었습니다. 비틀거리다가 멈춘 뒤 다시 정상에 오른다. 지난 20년 동안 Java는 가장 강력한 생태계를 축적해 왔다고 할 수 있습니다. Java가 오랫동안 항공모함의 거대한 몸체였음은 의심의 여지가 없으며, 이는 그 위상과 성공을 입증하기에 충분합니다. . 그러나 언어, 라이브러리, 프레임워크 및 생태계의 복잡성은 동시성, 언어의 동기화 메커니즘, 표준 라이브러리의 알림 및 동시성 등 기술자에게 큰 장애물을 제기하며 HTTP는 Apache+tomcat 컨테이너 등을 통해 얻을 수도 있습니다. , JVM 기술을 기반으로 Java는 동시성 측면에서 Scala와 같은 다른 언어와의 상호 운용성이 우수합니다. 물론 Scala로 작성된 Akka를 선택할 수 있습니다. 물론 업계에서는 nginx 및 기타 혼합 일치를 선택합니다. 더 많은 시나리오가 있습니다...
이것은 Java의 세계입니다. 결코 너무 많지 않으며, 이것이 Java 성공의 열쇠입니다. 그것은 역사에 의해 촉발되었으며 Java는 너무 많은 옵션을 제공합니다. 심층적으로 연구하면 Java의 학습 비용이 C++보다 높고 프로그래머에 대한 요구 사항이 C++보다 높다는 것을 알게 될 것입니다. 7년 또는 10년 전에도 여전히 Java 기술을 사용하고 있는 기술 담당자는 프레임워크를 구성하고 매우 신중하게 설계해야 합니다. 그렇지 않으면 다양한 재사용의 결과로 극도로 비대해진 프로그램이 되어 런타임 중 리소스 소비가 때때로 겁을 먹게 될 것입니다. 이것이 Java를 기반으로 개발된 너무 많은 플랫폼이 널리 비판받는 주요 이유입니다. 재사용은 단일 크기보다는 맞춤형이 필요합니다. , 언어 및 표준 라이브러리가 가장 좋고 가장 직접적인 옵션을 제공하지 않는 한.
요약
Java는 지난 10년 동안 기본적으로 가장 강력한 생태계를 축적해 온 언어임을 오랫동안 입증해 왔습니다. 다음 오해를 명확히 하기 위해: 오늘날 Java의 학습 비용과 개발자의 기술 요구 사항은 C/C++보다 훨씬 높습니다. 아마도 대부분의 개발자는 Java의 항공모함을 제어할 수 없습니다. Java를 오랫동안 사용하려면 최신 Java 기술을 따라가는 동시에 재사용에 대한 감각도 높아야 합니다. 무서운 응용 프로그램이 될 리소스 점유 및 런타임 효율성을 작성하기가 매우 쉽습니다.
3. C, C++98, C++11...
C/C++는 여전히 임베디드 및 시스템 수준 프로그래밍에서 확고한 위치를 차지하고 있습니다. Go와 같은 언어의 주요 초점은 분명히 개발 효율성 측면에 있습니다. Go에 대한 이전 장의 논의를 참조하십시오.
그러나 동시성, 네트워크 및 애플리케이션 프로그래밍 측면에서 언어 자체는 어떠한 지원도 제공하지 않으며 너무 얇은 표준 라이브러리는 이에 대한 야망이 없습니다. C/C++ 표준 C/C++는 대규모 상업 회사에 의해 제어되지 않고 완전히 "자유 범위"이기 때문에 라이브러리의 크기가 Java 및 Go와 비교할 수 없을 것 같습니다. 대규모 상업 기업의 지속적인 투자가 필요한 이유입니다. C++98 표준 라이브러리가 주요 업데이트를 받는 데 13년이 걸렸습니다. 이로 인해 다양한 하드웨어 플랫폼의 시스템 API를 캡슐화하기 위한 C/C++가 필요하게 되었습니다. linux+x86이 Unix를 대규모로 압도하기 전에는 수많은 Unix 시스템이 크로스 플랫폼 프로그래밍을 더욱 어렵게 만들었습니다. 플랫폼 프로그램이 나타났습니다. 그리고 매크로 정적 전역 변수로 가득 찬 Windows 플랫폼의 마찬가지로 나쁜 MFC 라이브러리는 한때 프로그래머에 의해 생명을 구하는 짚으로 간주되었습니다. 이제 여러분은 분명히 이해할 수 있습니다. 왜 그렇게 많은 사람들이 C/C++가 비밀스러워지는 것을 두려워합니까? 이때 Java는 JVM 기술을 기반으로 하는 멀티스레딩, 네트워크 및 애플리케이션 개발과 크로스 플랫폼 지원을 위한 표준 라이브러리를 제공하여 Java를 주류 프로그래밍 언어로 끌어 올렸으며 이는 처음 10년 동안 Java 성공의 열쇠였습니다.
C/C++ 프로그래머에게는 흥미로운 이벤트가 있습니다. C++11은 C++98에 비해 언어 및 표준 라이브러리 측면에서 큰 도약이 아닙니다. C++의 아버지가 새로운 언어라고 하면 과장입니다. 동시에 수많은 최고 C++ 전문가들이 Boost 라이브러리(실제로는 실시간 표준 라이브러리임)에 기여한 덕분에 이미 측면에서는 큰 변화가 있었습니다. 네트워킹, 동시 프로그래밍 및 일부 기본 응용 프로그램은 라이브러리에 최고의 성능을 제공하여 이 영역의 개발 어려움을 크게 줄여줍니다. 기존 C++ 프로그래머는 가능한 한 빨리 C++11로 전환해야 하며, 이를 위해서는 컴파일 환경 업데이트가 필요하며, 컴파일 환경 업데이트는 한때 가장 강력했던 메모리 감지 및 성능 분석을 위한 가장 강력한 도구를 제공하게 됩니다. 메모리의 국경 간 누출 문제와 관련하여 gcc5.2 버전과 Intel의 최신 CPU에 직면하여 메모리 과부하가 동시에 감지될 수 있는 것은 Intel에서 제공하는 vtune 성능 분석 도구입니다. 지금까지 만난 가장 강력한 도구입니다.
요약
기존 C++ 프로그래머는 가능한 한 빨리 C++11로 전환하고 새로운 표준 라이브러리와 부스트를 수용해야 합니다. 이를 통해 임베디드 및 시스템 수준 프로그래밍의 개발 및 유지 관리 효율성이 크게 향상됩니다. 우리는 새로운 언어를 수용해야 하며, 언어의 대대적인 업그레이드도 넓은 의미에서 새로운 언어로서 기존 자산의 효율성을 더 잘 활용하기 위해 똑같이 중요한 위치에 배치되어야 합니다. 애플리케이션 개발에 있어서 표준 라이브러리는 자바는 물론 현 단계에서 Go와 경쟁할 수 있을 것으로 기대하지 않기 때문에 자신이 가장 잘하는 분야에서는 솔직하게 최선을 다해야 한다.
언어 기능
1. 동시성
Go는 가볍고 단순하다는 점에서 가장 큰 장점을 갖고 있습니다. 고루틴과 채널 메커니즘은 가볍고 부드러운 언어 수준의 동시성 메커니즘인 표준 라이브러리를 제공합니다. 또한 이를 기반으로 하는 애플리케이션 라이브러리도 제공합니다.
동시성 세계에서 하이브리드 프로그래밍 측면에서 Java는 가장 많은 선택권과 생태학적 지원을 제공합니다. 10년 전 java.util.concurrent 출시 이후 Java는 동시 프로그래밍의 정점. 클라우드에서 Java는 C/C++98에 비해 Scala
C++11과 같은 높은 동시성 프레임워크와 우수한 상호 운용성을 제공합니다. , 표준 라이브러리 및 확장 라이브러리 부스트 라이브러리는 뛰어난 크로스 플랫폼 캡슐화를 제공하여 10년 전 Java의 동시 패키지 출시와 마찬가지로 운영 체제 API 유지 관리에 작별을 고하여 이 언어의 비용을 크게 절감했습니다. 동시 프로그래밍 측면에서는 플랫폼 간 정신적 부담이 있지만 스레드 스케줄링 및 관리 측면에서는 여전히 신중하게 유지 관리해야 합니다.
C/C++98의 경우 Huawei 통신 소프트웨어만 SNE/에 의존합니다. ENIP, 일부는 ACE에 의존하고 일부는 서로 다른 스타일의 자체 크로스 플랫폼 패키지를 가지고 있습니다. 특히 10년 전에는 Windows, Linux, Solaris, Aix 및 기타 플랫폼을 지원해야 했으며 동시 프로그래밍의 암흑기에는 어려움이 있었습니다. C/C++ 개발의 대부분은 동시성 때문이었고 네트워크 프로그래밍은 언어와 라이브러리에서 지원되지 않으므로 처음부터 시작해야 합니다.
요약
개발 난이도 Go
2. 객체 지향
Java, C++ 및 Python은 모두 디자인 패턴, 유형 시스템 및 도구 체인을 지원하여 우수한 객체 지향 언어 지원을 제공합니다. 대규모 프로그램의 기본 요소를 구축하는 능력 Go 언어는 객체 지향을 지원한다고 주장하지만 메서드 및 인터페이스 등을 통해 간접적으로 시뮬레이션되며 객체 구조를 직접적이고 명확하게 구성하고 초기화 및 파괴할 수 없습니다. C와 마찬가지로 수많은 전역 객체와 구조로 채워질 것이며, 객체 관리 비용이 상대적으로 높기 때문에, 대규모 프로그램을 구축한다는 측면에서는 아직 언어 능력이 상대적으로 약하고, 새로운 언어 기능이 필요합니다. 추가됩니다.
3. 물리적 구조 구성
중대형 프로그램의 경우 클래스 인터페이스 등 논리적 구조 표현보다 물리적 구조 구성이 더 중요한 역할을 합니다. 약 100만 줄의 C++ 코드 구조가 제대로 구성되지 않은 경우 영향은 전략적 수준에 있습니다(대규모 프로그램에 대한 논리적 구조 구성의 영향은 전술적 수준에 있음). 코드 한 줄 변경의 경우 , 컴파일 및 연결 시간이 10분 이상, 심지어 몇 시간이 걸릴 수도 있습니다. 컴파일하고 다시 시작하는 데 소요되는 시간만으로도 전체 개발 효율성이 저하될 수 있습니다.
패키지: 코드 구성 측면에서 패키지의 역할은 자세히 설명할 필요가 없습니다. Java와 Go는 기본적으로 이러한 언어 기능을 갖추고 있지만 C/C++에는 분명히 이러한 기능이 없습니다. 이름 충돌을 피하기 위한 상대적으로 약한 이름(논리적 구조 구성에 대한 자세한 내용) 및 매우 신중하게 처리하고 설계해야 하는 디렉터리, 헤더 파일/소스 파일/HPP 파일을 통한 코드 분류 구성에 대한 자세한 내용, 그렇지 않으면 주기 도입 혼란스러운 종속성이 일반적이므로 대규모 프로그램을 구성하려면 더 높은 인력 기술이 필요합니다.
라이브러리: 프로그램 실행 측면에서 Java는 jar 패키지의 동적 로딩을 지원하고 확장 및 업그레이드 기능이 좋은 반면 C/C++는 정적 및 동적 링크 방법을 모두 지원하지만 로딩 방법 측면에서 기본적으로 Control은 Java만큼 유연하지 않습니다. Go는 기본적으로 Linux에서 libc 라이브러리에만 의존하며, 동적 링크는 지원하지 않고, 마지막으로 gdb 형식과 호환되는 실행 프로그램만 지원합니다. , 배포 측면에서 최소한의 구성을 사용하지만 프로그램 크기를 제어해야 합니다. 그렇지 않으면 운영 도메인에서 연결된 업그레이드가 발생할 수 있습니다.
요약
이런 점에서는 Java가 최고인 반면 C++는 주의해서 다루어야 하며 Go는 그 사이 어딘가에 있습니다.
4. 유형 시스템 및 제네릭
Java/C++는 모두 강력한 유형의 컴파일 시간 감지를 지원하여 낮은 수준의 유형 오류를 쉽게 발견할 수 있도록 컴파일 시간 유형 안전성을 제공합니다. 또한 Go 언어가 지원하는 일반 알고리즘 및 컨테이너의 표현을 용이하게 합니다. Python의 동적 구문은 유형 선언 정의 처리 측면에서 코드가 더 간결하지만 유형이 약간 약합니다. 이 단계에서는 제네릭이 지원되지 않으므로 일반 알고리즘 및 컨테이너 표현에 큰 장애물과 유형 불안정이 발생합니다. 인터페이스 {} 시뮬레이션하려면 C 언어 세계의 void *나 10년 전 제네릭이 없는 Java와 마찬가지로 해당 객체는 모두 Object에서 상속됩니다. 물론 인터페이스 {}는 단순한 객체 또는 데이터 구조 유형이 아닙니다. Java는 이 길이 작동하지 않을 것이라는 것을 입증했습니다. 조만간 제네릭에 도달할 것이므로 Go 언어는 현재 단계에서 이를 지원하지 않지만 장기적으로 지원해야 한다고 개발자도 말했습니다. 아직 발견되지 않았습니다.
요약
언어 수준에서는 여전히 새로운 기능이 필요합니다. 제네릭 측면에서는 현재 언어 중에서 C++11이 가장 좋습니다. , Java 및 C++98이 뒤따르며 제네릭 유형을 처리할 때 모호하고 매우 어려운 구문 오류가 발생하는 경우가 많습니다.
5. 초기화
초기화는 프로그램의 견고성, 유연성 및 가독성을 위한 중요한 링크입니다. 프로그램은 다양한 복잡한 시나리오에서 변수에 값을 잘 할당할 수 없습니다. 상상.
Java가 더 좋고, gc가 좋고, 객체 지향적이며, 전역 변수를 지원하지 않고, 데이터 멤버가 단계적 초기화를 지원하고, 표시되지 않은 할당에 대한 명확한 초기 값이 있으며, 작업 중에도 사용할 수 있습니다. 클래스 로딩. 클래스와 jar 패키지 간의 복잡한 종속성을 제어합니다.
C의 초기화에 대한 언어 지원은 가장 원시적이며 경멸적인 의미에서 "최악"입니다. 명확한 의미가 없는 객체 지향, 전역 변수, 자유 함수 및 초기 값을 지원하지 않습니다. 절차적인 문제가 많다.
C++는 더 나은 지원을 제공하고 객체 지향적입니다. 객체 파괴 및 RAII를 지원하는 언어 중 C++는 복잡한 객체 간의 초기화 관리를 가장 강력하게 제어합니다. +11 C++의 성능을 향상시키기 위해 auto 및 decltype과 같은 동적 기능을 도입했지만 C언어의 잘못된 초기화와도 호환됩니다. C++를 C언어와 동일하게 사용할 수 있습니다. 이것은 C++가 비판받는 부분이기도 합니다. 이는 C 언어 자산 상속의 부정적인 측면 중 하나입니다. 매우 잘 수행될 수도 있고 매우 나쁘게 수행될 수도 있습니다.
Go 초기화 측면에서 Go는 Python에서 동적 언어의 일부를 차용하여 변수, 배열, 구조체, 목록, 맵과 같은 구조 측면에서 Go를 본 사람이라면 누구나 Go의 단순성을 칭찬할 것이라고 믿습니다. . 그러나 성숙하려면 더 많은 버전이 필요합니다. gc는 1.5 이전 버전에 비해 크게 개선되었습니다. 현재는 생성 및 소멸을 지원하지 않으며 어느 정도 시뮬레이션을 연기하지만 C++의 RAII 및 Java 개체와 비교하면 최종적으로 다른 메커니즘은 아직 성숙되지 않았으며 성능 및 리소스 누출과 같은 결함이 발생하기 쉽습니다. 초기화가 균일하지 않으며 New, make, {} 등과 같은 특정 필드의 다양한 초기화 방법도 언어 설계를 노출합니다. Go. 성숙한 측면에서는 Java, C++ 및 C에는 new 또는 malloc 하나만 필요하다는 점을 알아야 합니다.
6. 오류 처리
오류 처리는 복잡한 논리의 구성과 프로그램의 견고성에 매우 중요합니다. 예를 들어, 간단한 파일을 읽으려면 C 언어 처리에서 파일을 열어야 합니다. 판단 결과를 열고, 데이터를 읽은 결과를 판단하고, 데이터를 객체에 매핑하고, 각 매개변수의 결과를 판단합니다. 오류 처리가 얼마나 번거로운지 알게 됩니다.
Java/C++/Python/C#과 같은 건전한 프로그래밍 언어는 의심할 바 없이 예외 처리를 최우선으로 생각합니다. 불행히도 Go는 현재 이를 지원하지 않으며, 대신 다중 값 반환 오류 코드 또는 패닉 복구 메커니즘을 사용하여 전체 논리를 오류 처리 코드로 채웁니다.
7. 동적 구문
왜 동적 구문을 핵심 항목으로 여겨야 할까요? Python 등을 사용해 본 분들은 다른 운영 효율성 요소와 상관없이 분명 새로워지실 거라 믿습니다. 단순성으로 인해 특히 개체 초기화 및 구성에 있으며 특히 데이터, 구성 및 분석을 처리하는 시스템의 경우 프로그램 코드의 10% 또는 심지어 50%가 여기에 있을 수 있습니다.
8. 기타 중요한 언어 기능
연산자 오버로딩은 의심할 여지 없이 확장 가능한 유형의 작업에 가장 적합합니다. 함수 오버로딩은 점진적인 유지 관리 및 개발에 유용하며 다양한 간단한 호출을 지원한다고 합니다. 또한 필수입니다. 람다는 이미 건전한 일반 언어 C++11/Java/python/C#에 필수 옵션입니다. 람다는 의심할 여지 없이 데이터 초기화 및 제어 논리 표현 측면에서 강력한 도구입니다. Go 언어는 아직 지원되지 않습니다. 이러한 중요한 구문 기능은 후속 버전에서 개선이 필요합니다.
생태학
1. 표준 라이브러리
Java의 표준 라이브러리는 의심할 여지 없이 가장 성숙하고 강력하며, 바퀴를 다시 만들 필요 없이 바로 사용할 수 있는 재사용성이 높은 클래스와 라이브러리를 제공합니다. 이것이 Java 성공의 열쇠이지만 지금까지 Java 개발은 언어, 클래스 라이브러리 및 프레임워크는 이미 항공모함이 되었으며 JVM을 중심으로 새로운 기술과 새로운 라이브러리가 지속적으로 등장하고 있습니다. 이를 마스터하는 데 드는 학습 비용은 C++와 마찬가지로 실제로 뒤쳐져 있습니다. 7년, 심지어 10년 전의 Java 기술이 여전히 사용될 수 있습니다. Java 애플리케이션 분야에서는 새로운 기술의 속도를 따라가야 하는 동시에 프레임워크와 디자인을 매우 신중하게 구성해야 합니다. 다양한 재사용의 결과는 예외가 될 수 있습니다. 실행 시 비대한 프로그램의 리소스 소비는 때때로 겁을 줄 수 있으며, 이는 일부 플랫폼이 널리 비판받는 핵심 포인트입니다. 모든 것에 적용되는 것보다는 제작된 것입니다. 응용 프로그램의 규모는 의심할 여지 없이 가장 비쌉니다.
Go는 C++11 표준 라이브러리 및 부스트 라이브러리와 유사한 기본 기능을 제공하는 것 외에도 애플리케이션 라이브러리, 특히 네트워크 및 WEB 프로그래밍 측면에서 동시성을 지원하는 우수한 라이브러리도 제공합니다. 기능 Java의 약점과 거대함을 두려워하는 Go는 의심할 여지 없이 직면할 수 있는 좋은 선택입니다.
C++11, 동시 프로그래밍 등이 표준 라이브러리에 통합되었습니다. 동시에 실시간 표준 확장 라이브러리 부스트가 C++11이 수행하는 기본 애플리케이션 재사용 기능을 제공합니다. 크로스 플랫폼 동시성 및 네트워크 애플리케이션 프로그래밍 측면에서 기존 C/C++98을 완전히 대체하여 암흑기에 큰 진전을 이룰 수 있습니다. 그러나 WEB, 데이터베이스 및 데이터 분석과 같은 엔터프라이즈 애플리케이션 개발 측면에서 C++11 라이브러리는 여전히 매우 얇습니다.
2. 툴 체인
C/C++/Java 툴 체인을 자세히 설명할 필요는 없습니다. 편집기, 코드 탐색, 디버깅, 코드 문서 자동 생성, 복잡성 측정, 버그 찾기, 메모리 문제 해결, 성능 모니터링 등은 이미 매우 정통합니다. Huawei의 CI 환경도 훌륭한 지원을 제공하므로 자세히 설명하지 않겠습니다.
Go 언어에 중점을 둡니다. 개발 환경은 일반적으로 Eclipse 또는 LiteIDE를 선택합니다. Eclipse를 선택하면 Great Wall로 인해 플러그인을 직접 얻을 수 없습니다. Go 프로젝트에는 GoEclipse가 필요합니다. 코드 점프에는 gocode와 코드가 필요합니다. 디버깅을 위해서는 gdb를 별도로 다운로드해야 합니다. 좀 더 강력하게 하려면 Guru와 godef를 설치해야 합니다. 일부는 Eclipse가 설치된 상태에서 컴파일해야 합니다. 개인적인 사정으로 작업시간은 0.5~2일 정도 소요되므로 LiteIDE가 기본적으로 패키지에 포함되어 있으며, 설치 후 거의 사용하실 수 있습니다. 그러나 이러한 환경은 단순하게만 사용할 수 있으며 개발 작업 중에 다음과 같은 많은 중요한 경험 문제에 직면하게 됩니다.
편집 및 읽기에 대한 중요한 경험 부족
코드 탐색: 객체, 코드가 없는 함수, 변수 전역 탐색 및 검색 기능은 하나씩만 열어서 볼 수 있습니다. 파일이 많은 대형 프로젝트의 경우 Eclipse, 소스 통찰력 및 .net에 익숙하다면 미쳐버릴 것입니다. 탐색, 코드 검색 및 점프: 이름을 인쇄할 수 없고 함수 클래스 인터페이스 등이 자동으로 나열될 수 있으며 앞으로 및 뒤로 점프 기능을 기본적으로 사용할 수 없습니다. 이는 대규모 프로젝트의 경우 큰 경험 손실입니다. 리팩토링이 없습니다. 도구, 자동 코드 생성 도구 없음, 컴파일 오류 등 원하는 대로 할 수 없습니다...
코드 디버깅에 대한 중요한 경험 부족
Windows 디버깅은 Gdb에 의존합니다. Windows 환경에서는 별로 신뢰성이 떨어지므로 Windows 환경에서 예상대로 잘 작동할 것이라고 기대하지 마십시오. Windows 환경에 익숙하다면 Linux 환경에서 디버그하거나 콘솔에 인쇄하는 것이 가장 좋습니다. , 새로운 비그래픽 환경에 적응해야 할 수도 있습니다.
동적 및 정적 탐지 도구 부족
순환 복잡성 부족, 코덱스 제품군 보안 검사(C/C++ 코드 직접 호출 가능), 메모리 검사(포인터 직접 사용 및 C 코드 호출 가능) .
요약
기본적으로는 사용 가능하지만 효율성을 높이는 중요한 경험이 손실됩니다. 현 단계에서 Java/C++ 개발 환경에 5점을 주면 2점만 줄 수 있습니다. Go 환경에는 1년에 거의 2개의 주요 버전이 있으며 이는 개발 환경에 있어서도 중요한 과제입니다(Java/C++는 5년 또는 심지어 10년 전에도 이 환경을 사용합니다). 그리고 반복으로 인한 전환의 영향을 신속하게 제어해야 합니다. 성숙되기 전 구글의 초기 오픈소스 목적 중 하나는 업계가 더 많은 도구를 제공할 것을 기대하는 것인데, 그 도구는 기본적으로 오픈소스 세계의 공헌이다. 안드로이드는 자바를 기반으로 개발되었기 때문에 구글이 직접 사용할 수 있고, Go도 가능하다. , 완전히 새로운 언어인 Go는 현재 개발 환경 측면에서 부족합니다.
3. 언어 인기도와 오픈소스 프로젝트 분석
언어로 치면 필연적으로 TIOBE, PYPL, GitHub의 순위를 살펴보겠습니다. 🎜>
TIOBE 데이터 언어의 인기는 권위 있는 TIOBE 세계 언어 순위에 따라 결정됩니다. 2016년 6월 최신 데이터 순위: 새로운 언어인 Go의 최신 순위는 48위, Java와의 인기 격차는 100배입니다. 2년 전인 2014년 7월에는 Go 언어가 0.222%의 지수로 30위를 기록했습니다. 2015년 7월 Go 언어는 상위 50위 안에 들지 못했습니다. 가장 최근인 2016년 5월 순위는 50+, 38, 48이었습니다. , 44 및 42. .지난 30년간 언어 인기 순위:
PYPL 최신 데이터
GITHUB 데이터
오픈 소스 커뮤니티, Github에서 가장 대표적인 오픈 소스 언어 순위를 선택하세요:
댓글
주류 프로그래밍 언어는 항상 강력한 활력을 갖고 있습니다. Java, C, C++, C#, Python, JavaScript 및 PHP는 지난 10년간의 데이터에 따르면 상위 10위권을 벗어난 적이 없습니다. 다른 언어의 재생은 어떤 경우에는 선택적인 역할입니다. 현재 해당 언어의 쇠퇴 징후가 없기 때문에 이러한 주류 언어를 대체할 수는 없습니다.
Java는 지난 10년 동안 항상 왕이었습니다. C/C++는 항상 임베디드 및 시스템 수준 프로그래밍과 Python의 단순성 측면에서 지배적인 위치를 차지했습니다. 물론, 언어의 역할은 웹사이트처럼 성능을 많이 요구하지 않는 서버측 프로그램을 작성하는 데에도 사용될 수 있습니다. 말할 필요도 없이 웹사이트의 70%는 여전히 언어로 작성되어 있습니다. PHP.
2009년 Go의 공식 버전은 출시를 불과 2년 앞둔 시점에서 Go 언어의 아버지가 말했듯이 Python/Ruby에 성능이 필요할 때 또 다른 역할을 만들어 냈습니다. 선택적인 역할은 Java에 비해 더 가볍고 효율적인 역할을 만들어 선사시대의 괴물인 Java를 활용할 수 있는 발판을 제공하지만 생산성 측면에서 언어, 표준 라이브러리 및 도구 체인의 성숙도가 중요합니다. 아직 준비되지 않았습니다. 새로운 언어로서 스케줄러도 아직 준비되지 않았습니다. 이에 대해 별도로 논의하려면 다른 문서를 참조하세요.
4. 산업 응용
Java, C, C++의 경우 생산성 측면에서 이미 설명했듯이 Java는 이미 포괄적인 항공모함입니다. 성능이 요구되는 상황에서도 C/C++는 여전히 확고하게 자리 잡고 있습니다. Go의 경우 성능이 필요할 때 Python, Ruby 등의 스크립팅 언어에 대한 옵션임이 실제로 입증되었으며 이러한 동적 언어 스크립트는 기본적으로 관리 영역인 환경 자원 애플리케이션 모니터링 및 배포에 사용됩니다. 등을 사용하며 일부는 서버 측 개발에 사용하며 성능이 중요한 경우 이러한 언어는 Java/C/C++가 잘하는 영역에서 실제로 좋지 않습니다. Go는 데이터 분석이나 HTTP 애플리케이션과 같은 일부 시나리오에서는 선택적 역할이며 일반적이고 복잡한 애플리케이션 비즈니스 분야에서는 언어, 생태 및 성숙도에 관계없이 준비가 되어 있지 않습니다. Go에는 아직 해야 할 일이 많고, 더 많은 반복 작업이 필요합니다.
업계의 다른 주류 언어에 대한 간략한 소개
Python/JavaScript/C#은 지난 10년 동안 가장 인기 있는 언어 중 하나였으며, 해당 분야는 Java/C/C++/PHP 이며, 이러한 언어는 어느 정도 부서에 적용되지만 비업무 모듈로 인해 실제로는 페이지, 도구 및 관리 도메인에는 중요한 경험 문제가 포함되어 있으므로 충분히 주의를 기울여야 합니다. 그렇지 않으면 누적된 코드가 더 많아지면 유지 관리성과 경험에 대한 부담이 커집니다.
1. Shell/Python
설치, 배포, 업그레이드 및 모니터링 관리 작업 측면에서 기본적으로 c 쉘 또는 b 쉘 스크립트의 구문이 사용됩니다. 쉘은 모호하고 가독성이 매우 낮습니다. 동시에 편집 및 디버깅 환경이 가장 원시적이며 개발 및 유지 관리 효율성이 기본적으로 가장 낮습니다. 그러나 이러한 비업무 구성 요소는 일반적으로 무시됩니다. 그리고 코드가 많이 축적되어 있어 전담 인력이 쉘 유지 관리에 익숙해야 합니다. 문자열, 컨테이너, 환경을 처리하는 데 있어서 Python은 이 기사에 나열된 언어 중에서 가장 간단하고 생산적인 언어입니다.
운영 도메인에서는 스크립트는 최대한 Python을 사용하는 것이 좋습니다. 관리 도메인에서는 글루 언어라는 이름이 어울리지 않으며 기본적으로 Python이 상위 5개 언어 중 하나입니다. 순위에서.
2. JavaScript/Typescript
JavaScript는 가장 인기 있는 웹 스크립팅 언어라고 할 수 있지만 그 디자인에는 두 가지 결함이 있는데 하나는 너무 단순하다는 것입니다. .형, 문법 오류는 런타임까지 발견되지 않습니다. 알 수 없는 이유로 웹 페이지에 팝업되는 경고 상자를 본 적이 없는 사람은 없습니다. JS 코드가 10,000줄을 초과하면 간단한 구문과 약한 타이핑으로 인해 유지 관리 담당자에게 큰 부담이 됩니다. 저는 JS 페이지를 몇 백 줄만 작성했는데, 약한 타이핑도 참을 수 없습니다. .com 전에 복잡한 포털 사이트의 JS 코드를 보다가 솔직히 더 깊이 들어가지 못하면 그냥 포기하는 경우가 많습니다. Typescript는 JavaScript의 이러한 두 가지 디자인 결함을 정확하게 해결하기 위해 등장했습니다.
Typescript의 경우 JavaScript에 익숙한 사람들은 표현력을 높이는 객체지향 언어 기능이 단순성을 복잡하게 만든다고 생각하여 거부할 수도 있습니다. 그러나 또 다른 기능은 JavaScript에 컴파일 타임 유형 검사를 무료로 추가하는 것입니다. 잘못된 접근 방식을 지적하기 위해 기사를 작성하는 것처럼 누구도 그러한 기능을 거부하지 않을 것입니다. 따라서 JS 페이지를 작성하는 사람들은 TS의 상위 집합으로 전환해야 합니다.
3.C#
C#은 Huawei에서 훨씬 더 틈새 시장이지만 Java의 지위에 실제로 도전할 수 있는 언어 중 하나이기도 합니다. 불행하게도 Microsoft는 이를 Windows 시스템으로 제한하고 있으며 이는 또한 세계 최고의 언어이기도 합니다. 덴마크의 기계 전문가인 Anders Hejlsberg의 영향으로 C#은 현재 가장 강력한 통합 환경을 기반으로 하는 오픈 소스로 나아가고 있습니다.
위 내용은 Go, Java, C 및 기타 주류 프로그래밍 언어에 대한 분석입니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(www.php.cn)를 주목하세요!