JavaRush /Java Blog /Random-KO /프로그래밍 언어의 수준
Marat Sadykov
레벨 41

프로그래밍 언어의 수준

Random-KO 그룹에 게시되었습니다

소개

프로그래밍 언어에는 무엇이 있나요? 그 안에는 어떤 개념이 담겨져 있나요? 그들은 어떻게 발전했는가? 이 기사에서는 기계 코드(컴퓨터 하드웨어에 가까운 낮은 수준)부터 Java 또는 C#과 같은 언어(높은 수준)까지 소위 수준을 기반으로 프로그래밍 언어의 유형을 살펴보겠습니다. 프로그램의 텍스트 목록이 0과 1의 집합으로 바뀌는 과정에서 겪는 변형이 적을수록 레벨이 낮아집니다.
프로그래밍 언어 수준 - 1
다음으로 우리는 다음을 살펴볼 것입니다:
  1. 저수준 언어(기계어 및 어셈블리)
  2. 중급 수준(C, Fortran….)
  3. 높은 수준(C++, Java, Python, Ruby, JavaScript...)
이 수준은 또한 구현을 구현하기 위해 향후 프로그램 목록을 얼마나 자세히 설명해야 하는지를 나타냅니다. 인간에게는 이 과정이 얼마나 간단한가? 언어의 수준이 해당 기능의 명확한 지표로 간주되어서는 안됩니다. 프로그래밍 언어는 한 영역에서는 효과적이지만 다른 영역에서는 유용하지 않은 도구입니다. 소목공과 목수 모두 나무를 가지고 일합니다. 첫 번째에는 주요 도구-끌 세트, 두 번째 도구-도끼가 있습니다. 그러나 목수는 조각된 캐비닛을 더욱 우아하게 만들고, 목수는 집을 더 빨리 지을 것입니다. 비록 각자가 상대방의 작업을 수행할 수는 있지만 훨씬 덜 효율적으로 수행하게 됩니다. 컴퓨터의 다양한 데이터는 0과 1의 집합으로 표시됩니다. 처리를 위한 제어 명령은 필요한 정보의 위치와 수정 방법을 결정하는 명령이 포함된 동일한 데이터입니다.

기계어(최하위 수준)

소프트웨어 영역에서 하드웨어 영역까지 잠시 살펴보겠습니다. 단순화된 형태로 살펴보자. 프로세서는 컴퓨터의 주요 "두뇌"입니다. 설치된 마더보드에는 버스(통신용 데이터 채널)를 통해 다른 장치와 상호 작용하는 데 사용되는 컨트롤러가 포함되어 있습니다.
프로그래밍 언어 수준 - 2
일부는 고속으로 작동합니다(빨간색 화살표). 프로세서는 메모리에서 명령을 끌어 데이터를 조작하며, 비디오 카드는 특히 3D 게임에서 모니터 화면에 이미지를 생성하기 위해 엄청난 양의 텍스처, 모양, 픽셀 좌표 및 기타 개체를 소비합니다. . 다른 것들은 (정보 교환 속도의 제한으로 인해) 그렇게 높은 지표가 필요하지 않습니다. 다양한 내부 및 외부 장치는 녹색 화살표로 다이어그램에서 연결됩니다.

프로세서의 내부 세계

모든 프로세서 명령은 바이너리 형식으로 실행하기 위해 메모리에서 나옵니다. 명령어의 형식, 수, 하위 집합은 아키텍처에 따라 다릅니다. 그들 대부분은 서로 양립할 수 없으며 서로 다른 이념을 따릅니다. 또한 명령 유형은 프로세서가 작동하는 모드(8/16/32... 비트 심도)와 데이터 소스(메모리, 레지스터, 스택...)에 따라 크게 달라집니다. 동일한 작업이 다른 명령으로 표시될 수 있습니다. 프로세서에는 두 개의 피연산자를 추가(ADD X,Y)하고 지정된 피연산자에 하나를 추가(INC X)하는 명령이 있습니다. 피연산자에 트리플을 추가하는 것은 ADD X,3으로 수행하거나 INC X를 세 번 호출하여 수행할 수 있습니다. 그리고 다른 프로세서의 경우 이러한 방법 중 속도나 메모리 공간 측면에서 어떤 방법이 최적인지 예측하는 것은 불가능합니다. 편의상 이진 정보는 16진수 형식으로 작성됩니다. 친숙한 프로그램(Java와 구문이 유사한 C 언어)의 일부를 고려해 보겠습니다.
int func() {
    int i = getData("7") ;
    return ++i;
   ...
}
프로세서에 대한 일련의 명령 형식으로 동일한 작업을 구현하는 코드: ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... 이것이 Intel 프로세서용 저수준 프로그래밍 언어의 실제 모습입니다. 인수를 사용하여 메서드를 호출하고 1씩 증가된 결과를 반환하는 프래그먼트입니다. 이는 변환 없이 프로세서로 직접 전송되어 실행되는 기계어(코드)입니다. 장점:
  • 우리는 상황의 완전한 주인이며 프로세서와 컴퓨터 하드웨어를 사용할 수 있는 가장 광범위한 가능성을 가지고 있습니다.
  • 코드 구성 및 최적화를 위한 모든 옵션을 사용할 수 있습니다.
단점:
  • 프로세서의 기능에 대한 광범위한 지식이 필요하고 코드를 실행할 때 많은 하드웨어 요소를 고려해야 합니다.
  • 주어진 예제보다 약간 더 복잡한 프로그램을 만들면 코드 작성 및 디버깅에 소요되는 시간이 급격히 늘어납니다.
  • 플랫폼 의존성: 한 프로세서용으로 작성된 프로그램은 일반적으로 다른 프로세서에서는 작동하지 않습니다. 이 프로세서의 경우 다른 작동 모드에서는 코드 편집이 필요할 수 있습니다.
기계어 코드는 컴퓨터 초기에 널리 사용되었으며, 컴퓨터 개척 시대에는 다른 프로그래밍 방법이 없었습니다. 현재는 마이크로 전자 공학 엔지니어가 프로세서를 개발하거나 낮은 수준의 테스트를 할 때 가끔 사용됩니다.

어셈블리 언어(낮은 수준)

컴퓨터와 달리 당신과 나는 디지털 형식보다는 텍스트/의미론적 형식으로 정보를 더 잘 인식합니다. 스마트폰에서 50명의 연락처 이름을 쉽게 지정할 수 있지만 해당 전화번호를 암기할 수는 없습니다. 프로그래밍에서도 마찬가지다. 우리는 세 가지 기본 단계를 거쳐 유형 사다리를 올라갑니다.
  • 하나의 기호 명령어를 해당 작업을 수행하는 디지털 프로세서 명령어 그룹에 연결해 보겠습니다.
  • 프로세서 명령어의 인수를 별도로 강조해 보겠습니다.
  • 메모리 영역, 변수, 개별 명령의 위치에 이름을 지정하는 기능을 소개하겠습니다.
이전 프로그램의 기계어 코드(가운데)와 어셈블리 언어(오른쪽)를 비교해 보겠습니다.
2004b0     48 83 ec 08      sub    $0x8,%rsp
2004b4     bf bc 05 20 00   mov    $0x2005bc,%edi
2004b9     31 c0            xor    %eax,%eax
2004bb     e8 e8 fe ff ff   callq  getData
2004c0     48 83 c4 08      add    $0x8,%rsp
2004c4     83 c0 01         add    $0x1,%eax
보시다시피 프로그램 작성 프로세스가 단순화되었습니다. 디지털 명령 값 생성, 전환 길이 계산, 셀 전체에 메모리에 데이터 배포 및 기타 프로세서 기능을 위해 참고서를 사용할 필요가 없습니다. 우리는 일련의 기호 명령과 실행 논리에 필요한 인수로부터 원하는 작업을 설명하고 번역기 프로그램은 텍스트 파일을 프로세서가 이해할 수 있는 0과 1의 집합으로 변환합니다. 장점:
  • 코드 작성 및 수정 과정이 단순화되었습니다.
  • 모든 하드웨어 리소스에 대한 제어가 유지되었습니다.
  • 프로그램을 다른 플랫폼으로 포팅하는 것이 상대적으로 쉽지만 하드웨어 호환성에 따라 수정이 필요합니다.
단점:
  • 어셈블리 언어는 저수준 프로그래밍 언어입니다. 작은 코드 섹션을 만드는 것도 어렵습니다. 또한 장비의 구체적인 작동도 고려해야 합니다.
  • 플랫폼 의존성.
가장 인기 있는 Java 데모 예:
public static void main(String[] args) {
    System.out.println("Hello World!");
}
다음과 같이 보입니다(Windows API 및 kernel32.lib를 사용하는 NASM 구문).
global _main
	extern  _GetStdHandle@4
	extern  _WriteFile@20
	extern  _ExitProcess@4

	section .text
_main:
	; DWORD  bytes;
	mov 	ebp, esp
	sub 	esp, 4

	; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
	push	-11
	call	_GetStdHandle@4
	mov 	ebx, eax

	; WriteFile( hstdOut, message, length(message), &bytes, 0);
    push	0
	lea 	eax, [ebp-4]
	push	eax
	push	(message_end - message)
	push	message
	push	ebx
	call	_WriteFile@20

	; ExitProcess(0)
	push	0
	call	_ExitProcess@4

	; never here
	hlt
message:
	db  	'Hello, World', 10
message_end:
기계 코드와 마찬가지로 어셈블리 언어는 엔지니어와 시스템 프로그래머가 더 자주 사용합니다. 다양한 주변 장치용 드라이버 구현 기능에 시간이 중요하거나 중요한 운영 체제 커널의 하드웨어 종속 부분을 작성하는 데 사용됩니다. 그러나 최근에는 이 프로그램을 사용하면 다른 플랫폼으로의 프로그램 이식성이 크게 줄어들기 때문에 점점 더 적게 사용하고 있습니다. 때때로 그들은 디스어셈블리 프로세스를 사용합니다. 즉, 작은 조각을 실행하기 위한 논리를 구문 분석하기 위해 디지털 코드에서 프로그램의 어셈블러 목록을 생성합니다. 드문 경우지만 원래의 상위 수준 코드를 사용할 수 없는 경우: 바이러스를 분석하여 바이러스를 퇴치하거나 소스 코드가 손실됩니다. 어셈블리 언어는 1세대/2세대 로 간주됩니다 (어셈블러가 등장하기 전의 의사 코드 및 기호 명령과의 차이점은 별도로 고려하지 않습니다). 나는 데모 장면에서 어셈블러의 사용을 강조하고 싶습니다. 예술, 수학, 저수준 코딩의 융합, 리소스 제한이 있는 비디오 클립을 생성하는 프로그램 형태로 제작자의 예술적 아이디어를 구현하는 것입니다. 프로그램과 데이터 파일의 총 크기는 256바이트를 초과해서는 안 되는 경우가 많습니다(4/64킬로바이트 형식도 널리 사용됨). 다음은 4KB 프로그램의 예입니다.

그룹 C/포트란 언어(중급/고급)

컴퓨터 기술의 발전으로 인해 어셈블러의 기능 수준과 코드 구현 시기는 더 이상 만족스럽지 못했습니다. 프로그램 작성, 테스트 및 유지 관리 비용은 해당 기능보다 훨씬 빠르게 증가했습니다. 장비의 기능에 대한 지식 측면에서 프로그래머의 요구 사항을 줄이고 인간 논리에 가까운 언어로 작성할 수 있는 도구를 제공해야 했습니다. 새로운 수준의 프로그래밍 언어 유형으로 이동하십시오. 추가 순차 호출(절차적 프로그래밍 패러다임)을 통해 다양한 모듈로 분할할 수 있는 기능 제공, 다양한 유형의 데이터를 구성할 수 있는 기능 제공 등을 제공합니다. 또한 이러한 조치를 통해 다른 플랫폼으로의 코드 이식성이 향상되고 보다 편안한 구성이 가능해졌습니다. 팀워크. 위의 모든 것을 지원하는 최초의 언어 중 하나는 지난 세기 50년대에 개발된 Fortran 이었습니다 . 루프, 분기, 서브루틴을 사용하고 배열로 작동하며 실수, 정수 및 복소수 형태로 데이터를 표시하는 실행 논리에 대한 설명과 함께 텍스트 형식으로 생성하는 기능은 엔지니어와 과학자를 기쁘게 했습니다. 짧은 시간 안에 과학적인 "프레임워크"와 라이브러리가 만들어졌습니다. 이 모든 것은 좁은 과학적 환경에도 불구하고 Fortran이 오늘날에도 여전히 관련성이 있고 개발 중이라는 사실의 결과였습니다. 개발 수하물이 매우 크기 때문에 IMSL 라이브러리만으로도 1970 년(!) 이후 적극적으로 개발해 왔습니다. 비슷한 관련 소프트웨어가 많이 있다는 것을 기억하시나요? 이 수준의 언어 개발의 또 다른 분야는 C 입니다. Fortran이 과학자를 위한 도구가 되었다면 C는 프로그래머가 운영 체제, 드라이버 등의 응용 프로그램 소프트웨어를 만드는 데 도움을 주기 위해 만들어졌습니다. 이 언어를 사용하면 메모리 할당을 수동으로 제어하고 하드웨어 리소스에 직접 액세스할 수 있습니다. C 프로그래머는 하위 수준 엔터티를 제어해야 하므로 많은 사람들은 C가 고급 어셈블리 언어이며 종종 "중간 수준" 언어라고 불립니다. 절차적 및 모듈형 프로그래밍의 요소인 어셈블러에 데이터 타이핑을 도입한 C 언어는 여전히 시스템 프로그래밍의 주요 언어 중 하나이며, 이는 최근 몇 년간 마이크로 전자 공학의 급속한 발전으로 인해 더욱 촉진되었습니다. 모든 종류의 장치, 컨트롤러, 네트워크 및 기타 장치에는 드라이버, 협업을 위한 프로토콜 구현 및 장비와의 상호 작용을 구현하는 기타 상대적으로 낮은 수준의 소프트웨어가 필요합니다. 위의 모든 사항은 오늘날 언어에 대한 수요에 기여합니다. 객체 지향 및 기능적 원칙은 C 구문에서 많은 부분을 취하여 C++, C#, Java의 형태로 추가로 개발되었습니다 .
  • 코드 생성 프로세스 단순화: 유형 도입, 모듈 분할, 프로그램 목록 감소.
  • Прозрачная логика заложенного алгоритма вследствие ухода от машинных codeов к более понятным для человека командам в семантически описательном стиле.
  • Переносимость. Стало достаточно перекомпorровать текст программы для выполнения на другой платформе (возможно, с небольшой модификацией).
  • Скорость откомпorрованных программ.
Минусы:
  • Отсутствие автоматического управления памятью и необходимость постоянного её контроля.
  • Отсутствие реализации концепций an objectно-ориентированного и функционального программирования.

Развитие языков высокого уровня

소프트웨어 작성 측면에서 고급 프로그래밍 언어는 점차 기계어 코드에서 벗어나 절차적 패러다임 외에도 다양한 프로그래밍 패러다임을 구현하기 시작했습니다. 여기에는 객체지향 원칙의 구현도 포함됩니다. C++, Java, Python, JavaScript, Ruby... - 이 유형의 언어 범위는 오늘날 가장 인기 있고 수요가 많습니다. 이는 다양한 소프트웨어를 구현할 수 있는 더 많은 기회를 제공하며 각 소프트웨어의 "전문성"을 명확하게 결정하는 것은 불가능합니다. 그러나 관련 분야에서 애플리케이션이 인기를 끄는 이유는 JavaScript - Frontend 와 같은 애플리케이션 작업을 위한 라이브러리/프레임워크 때문입니다 . 이 언어는 클라이언트 웹 브라우저와 사용자 및 원격 서버 간의 상호 작용을 위해 설계되었습니다. 가장 널리 사용되는 라이브러리는 Angular, React 및 VUE입니다. 현재는 웹이나 기타 서버(백엔드)에서 상대적으로 활발하게 사용되고 있으며, 특히 Node.js가 인기가 높습니다. 루비 - 백엔드. 스크립트(서비스 파일)를 생성하고 웹 서버에서 사용됩니다. 주요 프레임워크는 Ruby On Rails입니다. Python 은 웹 도메인 외에 과학 및 엔지니어링 도메인입니다. 이는 표준 컴퓨팅 및 수학 패키지(Mathematica, Octave, MatLab...)에 대한 대안이지만 언어의 일반적인 의미와 많은 수의 라이브러리를 가지고 있습니다. 기계 학습 시스템, 통계 및 인공 지능 분야에 많은 팬을 보유하고 있습니다. 자주 사용되는 라이브러리에는 django, numpy, pandas 및 tensorflow가 포함됩니다. C++ – C 언어의 보편적이고 혁신적인 개발로, 하위 수준 하드웨어와 상호 작용하는 기능을 잃지 않으면서 기능적 객체 지향 프로그래밍 기능을 제공합니다. 이로 인해 소프트웨어를 만들 때 생산성과 유연성이 실현되지만 가격도 이에 상응합니다. 언어의 복잡한 사양으로 인한 높은 진입 장벽, 프로그램 실행 시 리소스에 대한 독립적인 제어가 필요합니다. 운영 체제 모듈(Windows, Symbian...), 게임, 편집기(Adobe Photoshop, Autodesk Maya...), 데이터베이스(MSSQL, Oracle...), 플레이어( WinAmp...) 등 최신 소프트웨어는 여러 프로그래밍 언어를 동시에 사용하여 개발하는 복잡한 제품이므로 각 언어의 참여 정도를 결정하는 것이 매우 어려울 수 있습니다. 전반적인 결과.

추가 진행

최근에는 기능적(언어 수준의 추가 개발)이라는 또 다른 유형의 프로그래밍이 인기를 얻고 있습니다 . 다음은 계산을 위한 또 다른 추상화 유형입니다. 함수 집합을 인수로 사용하고 다른 함수를 반환하는 함수입니다. 변수의 역할은 동일한 함수에 의해 수행됩니다(우리에게 친숙한 변수는 Java의 유형 선언 이전에 final과 유사한 단순한 상수 표현식입니다). 함수 자체는 해당 범위 내에서 닫혀 있으며, 해당 작업의 결과는 전달된 인수에만 의존합니다. 두 가지 놀라운 특성이 여기에 따릅니다.
  • 테스트에는 함수 인수만 필요합니다(작업 결과는 외부 변수 등에 의존하지 않습니다).
  • 기능적 스타일 프로그램은 기적적으로 동시성이 준비되어 있습니다. 순차 함수 호출은 이웃 스레드에서 실행될 수 있으며(외부 요인의 영향을 받지 않기 때문에) 잠금이 필요하지 않습니다(즉, 동기화 문제가 없습니다). 멀티 코어 프로세서의 광범위한 채택을 고려할 때 이 주제에 시간을 할애할 좋은 인센티브입니다.
그러나 진입 임계값은 OOP보다 높습니다. 효과적인 코드를 위해서는 실행 알고리즘을 함수 형식으로 설명하는 프로그램을 작성해야 합니다. 그러나 순수 기능적 스타일의 경우에도 논리 및 범주 이론의 기본을 아는 것이 좋을 것입니다. 가장 인기 있는 것은 Haskell, Scala, F#입니다. 그러나 두려워하지 마십시오. 함수형 프로그래밍의 요소는 Java(및 기타 최신 3세대 언어)에 등장했으며 OOP와 결합될 수 있습니다. JavaRush 온라인 인턴십을 통해 이러한 모든 세부 사항을 더 자세히 알게 될 것입니다. 논리 프로그래밍 분야 (언어의 다음 단계)는 수요가 낮기 때문에 아직 폭넓은 실용성을 찾지 못했습니다. 프로그램을 구축하려면 이산 수학, 술어 논리, 제약 조건 도구 및 기타 수학적 논리 분야의 기초에 대한 지식이 필요합니다. 가장 널리 사용되는 활성 언어는 Prolog입니다.

결론

현재 가장 일반적인 언어는 OOP입니다. Java는 처음부터 항상 상위권을 유지해 왔으며 일반적으로 인기 있는 상위 3개 언어에 속합니다. OOP 외에도 함수형 프로그래밍 요소가 포함되어 있으며 다양한 스타일의 프로그램 작성을 결합할 수 있습니다. Java의 애플리케이션 범위는 매우 넓습니다. 이는 비즈니스 작업, 웹 서버 구현(백엔드), Android 애플리케이션 생성을 위한 기본 언어, 크로스 플랫폼 프로그래밍 환경 및 작업 공간(IDE/AWM) 및 모델링 등을 포함합니다. . Java의 위치는 특히 고품질, 수명이 긴 코드와 가장 복잡한 비즈니스 로직의 구현이 필요한 기업 소프트웨어 영역인 엔터프라이즈 부문에서 강력합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION