고급 프로그래밍 언어

High-level programming language

컴퓨터 과학에서 고급 프로그래밍 언어는 컴퓨터의 세부 사항에서 강한 추상화를 가진 프로그래밍 언어입니다.저수준 프로그래밍 언어와는 달리, 저수준 언어를 사용하는 경우보다 자연언어 요소사용하는 경우, 사용하기 쉬운 경우, 또는 컴퓨팅 시스템의 중요한 영역(메모리 관리 등)을 자동화(또는 완전히 숨김)하여 프로그램 개발 프로세스를 저수준 언어를 사용하는 경우보다 쉽고 이해하기 쉽게 만들 수 있습니다.제공되는 추상화의 양은 프로그래밍 언어가 얼마나 "고급"[1]인지 정의합니다.

1960년대에 컴파일러를 사용하는 고급 프로그래밍 언어는 일반적으로 자동 [2]코드라고 불렸다.자동 코드의 예로는 COBOL과 [3]Fortran있습니다.

컴퓨터를 위해 설계된 최초의 고급 프로그래밍 언어는 Konrad [4]Zuse에 의해 만들어진 Plankalkül이었다.그러나 그의 시대에는 실행되지 않았고, 하인즈 루티샤우저의 슈퍼플랜 언어에 대한 영향과 어느 정도 ALGOL에 대한 영향 외에, 그의 원래 기여는 제2차 세계대전 때문에 다른 발전과는 크게 분리되었다.최초로 널리 보급된 고급 언어는 Fortran으로, IBM의 초기 Autocode 시스템을 기계에서 독립적으로 개발한 것입니다.1958년에 정의된 ALGOL 58과 1960년에 정의된 ALGOL 60을 가진 ALGOL 패밀리는 재귀어휘 범위 내의 중첩 함수를 도입했습니다.ALGOL 60은 또한 값과 이름 매개 변수와 그에 상응하는 [5]의미론 사이의 명확한 구별을 가진 최초의 언어였다.또한 ALGOL은 다음과 같은가지 구조화된 프로그래밍 개념을 도입했습니다.while-do그리고.if-then-elseConstructs와 구문은 공식적인 표기법인 Backus-Naur 형식(BNF)으로 기술된 최초의 것입니다.대략 같은 기간 동안, COBOL은 레코드(구조라고도 함)를 도입했고, Lisp는 프로그래밍 언어로 완전히 일반적인 람다 추상화를 최초로 도입했다.

특징들

"고급 언어"는 기계어에서 더 높은 수준의 추상화를 의미합니다.높은 수준의 언어는 레지스터, 메모리 주소 및 콜 스택을 다루는 대신 변수, 배열, 객체, 복잡한 산술식 또는 부울식, 서브루틴과 함수, 루프, 스레드, 잠금 및 기타 추상적인 컴퓨터 과학 개념을 처리합니다.하위 어셈블리 언어와 달리 상위 레벨 언어에는 기계의 기본 연산 코드로 직접 변환되는 언어 요소가 거의 없습니다.문자열 처리 루틴, 객체 지향 언어 기능, 파일 입출력 등의 다른 기능도 있을 수 있습니다.고급 프로그래밍 언어에서 주의해야 할 점은 이러한 언어가 프로그래머를 기계에서 분리 및 분리할 수 있다는 것입니다.즉, 어셈블리나 기계어와 같은 낮은 수준의 언어와 달리, 높은 수준의 프로그래밍은 프로그래머의 명령을 증폭시키고 프로그래머가 알지 못하는 사이에 백그라운드에서 많은 데이터 이동을 유발할 수 있습니다.명령을 실행하는 책임과 권한은 프로그래머로부터 기계에 넘겨졌습니다.

추상 패널티

고급 언어는 공통 태스크를 표준화하고 풍부한 디버깅을 허용하며 아키텍처 불가지론을 유지하는 기능을 제공하지만, 하위 언어는 특정 시스템 아키텍처에 대한 최적화를 통해 보다 효율적인 코드를 생성하는 경우가 많습니다.추상화 패널티는 높은 수준의 프로그래밍 기술이 낮은 수준의 특정 아키텍처 리소스를 활용하지 않기 때문에 성능을 최적화하거나 특정 하드웨어를 사용할 수 없기 때문에 발생하는 비용입니다.고급 프로그래밍은 보다 일반적인 데이터 구조 및 운영, 런타임 해석 및 중간 코드 파일과 같은 기능을 나타냅니다. 이러한 기능은 종종 필요 이상의 작업 실행, 메모리 소비 및 이진 프로그램 크기를 [6][7][8]초래합니다.이 때문에 특히 빠르고 효율적으로 실행할 필요가 있는 코드에서는 상위 언어의 사용이 쉬워지더라도 하위 언어의 사용이 필요할 수 있습니다.대부분의 경우 프로그램의 중요한 부분을 어셈블리 언어로 수작업으로 코딩할 수 있기 때문에 훨씬 빠르고 효율적이며 단순히 기능적으로 최적화된 프로그램을 만들 수 있습니다.

그러나 현대 마이크로프로세서 아키텍처의 복잡성이 증가함에 따라 고급 언어용 잘 설계된 컴파일러는 대부분의 하위 수준의 프로그래머가 수작업으로 만들 수 있는 코드와 비슷한 효율을 내는 경우가 많습니다.또한 추상화를 통해 하위 수준의 프로세서보다 더 강력한 기술을 통해 전체적인 결과를 얻을 수 있습니다.특정 [9]설정에 대응합니다.고급 언어는 특정 컴퓨팅 시스템 아키텍처와는 독립적으로 설계됩니다.이를 통해 인터프리터드 프로그램 또는 JIT 프로그램을 지원하는 모든 컴퓨팅 시스템에서 이러한 언어로 작성된 프로그램을 쉽게 실행할 수 있습니다.고급 언어는 디자이너가 발전함에 따라 향상될 수 있습니다.다른 경우에서는 새로운 고급 언어가 하나 이상의 다른 언어에서 발전하여 가장 인기 있는 구성 요소를 새로운 기능 또는 개선된 기능으로 집약하는 것을 목표로 합니다.예를 들어, Java와의 하위 호환성을 유지하는 Scala는 프로그래밍 숍이 Scala로 전환하더라도 Java로 작성된 프로그램과 라이브러리는 계속 사용할 수 있다는 것을 의미합니다.이것에 의해, 이러한 높은 레벨의 코딩의 이행이 용이하게 되어, 수명이 무기한으로 됩니다.이와는 대조적으로, 하위 레벨의 프로그램은 주요 리비전 없이 작성된 시스템 아키텍처를 넘어서는 경우가 거의 없습니다.이것이 '추상 패널티'의 엔지니어링 '트레이드오프'입니다.

상대적 의미

현재 사용 중인 고급 프로그래밍 언어의 예로는 Python, JavaScript, Visual Basic, Delphi, Perl, PHP, ECMAScript, Ruby, C#, Java 등이 있습니다.

상위 수준과 하위 수준이라는 용어는 본질적으로 상대적입니다.수십 년 전만 해도 C 언어와 유사한 언어는 표현식 평가, 매개 변수화된 재귀 함수, 데이터 유형 및 구조와 같은 개념을 지원했기 때문에 "고급"으로 간주되는 경우가 가장 많았으며 어셈블리 언어는 "저급"으로 간주되었습니다.오늘날 많은 프로그래머들은 C가 대규모 런타임 시스템이 없고(가비지 컬렉션 등이 없음), 기본적으로 스칼라 연산만 지원하며 직접적인 메모리 주소 지정을 제공하기 때문에 C를 로우 레벨이라고 부를 수 있습니다.따라서 어셈블리 언어 및 CPU마이크로 컨트롤러의 머신 레벨과 쉽게 조합됩니다.또한 K&R의 The C Programming Language (제2판)의 소개 장에서 C는 비교적 낮은 수준의 [10]언어로 간주됩니다.

어셈블리 언어 자체는 상수 및 (제한된) 식, 때로는 변수, 프로시저 및 데이터 구조 등의 개념을 지원하므로 기계 코드의 상위 수준(그러나 매크로 없이 사용되는 경우에는 여전히 일대일) 표현으로 간주될 수 있습니다.기계 코드는 본질적으로 많은 [11]프로세서에서 내부적으로 사용되는 마이크로 코드나 마이크로 오퍼레이션보다 약간 높은 수준입니다.

실행 모드

현대의 고급 언어에는 다음과 같은 세 가지 일반적인 실행 모드가 있습니다.

통역 완료
언어로 작성된 코드를 해석하면 구문을 읽고 컴파일 단계 없이 직접 실행합니다.인터프리터라고 불리는 프로그램이 프로그램 흐름을 따라 각 프로그램 문장을 읽고 무엇을 할지 결정하고 실행한다.인터프리터와 컴파일러의 하이브리드는 명령문을 머신코드로 컴파일하여 실행한다.그 후 머신코드는 폐기되고 행이 다시 실행되면 다시 해석된다.인터프리터는 일반적으로 여기에 열거된 다른 두 가지 변형과 비교하여 언어의 동작을 가장 단순하게 구현한 것입니다.
컴파일 완료
언어로 작성된 코드가 컴파일되면 구문은 실행 전 실행 가능한 형식으로 변환됩니다.컴파일에는 다음 두 가지 유형이 있습니다.
기계코드 생성
일부 컴파일러는 소스 코드를 머신 코드로 직접 컴파일합니다.이것이 원래 컴파일 방식이며, 이와 같이 직접적이고 완전하게 기계 원어민 코드로 변환되는 언어는 진정한 컴파일 언어라고 할 수 있다.어셈블리 언어를 참조하십시오.
중간 표현
언어로 작성된 코드가 중간 표현으로 컴파일되면 소스 파일을 다시 읽을 필요 없이 나중에 실행할 수 있도록 표현을 최적화하거나 저장할 수 있습니다.중간 표현이 저장될 때 바이트 코드 등의 형식이 될 수 있습니다.그런 다음 중간 표현을 해석하거나 추가로 컴파일하여 실행해야 합니다.바이트 코드를 직접 실행하거나 바이트 코드를 기계 코드로 더 변환하는 가상 머신은 중간 표현과 진정으로 컴파일된 언어의 구분을 모호하게 만들었습니다.
소스 투 소스 번역 또는 컴파일 완료
언어로 작성된 코드는 네이티브 코드 컴파일러가 이미 보편화된 하위 언어로 번역될 수 있습니다.JavaScript언어 C는 이러한 번역자의 공통 타깃입니다.예를 들어 CoffeeScript, Chicken Scheme Eiffel을 참조하십시오.특히 생성된 C 및 C++ 코드는 컴파일된 에펠 프로젝트의 EIFGENs 디렉토리에서 (Eiffl Studio IDE를 사용할 때 Eiffl 언어에서 생성된) 확인할 수 있습니다.에펠에서는 번역된 프로세스를 트랜스 컴파일 또는 트랜스 컴파일이라고 하며 에펠 컴파일러는 트랜스 컴파일러 또는 소스소스 컴파일러라고 합니다.

언어는 엄밀하게 해석된 언어나 컴파일된 언어가 아닙니다.오히려 언어 행동의 구현은 해석 또는 컴파일을 사용합니다.예를 들어, ALGOL 60과 Fortran은 둘 다 해석되었습니다(더 일반적으로 컴파일되었지만).마찬가지로 Java는 이러한 라벨을 구현이 아닌 언어에 적용하는 것이 어렵다는 것을 보여줍니다.Java는 바이트 코드로 컴파일되고 바이트 코드는 해석(JVM) 또는 컴파일(일반적으로 HotSpot 의 Just-In-Time 컴파일러를 사용하여 다시 JVM에서 실행됨)을 통해 실행됩니다.또한 컴파일, 변환 및 해석은 컴파일러 아티팩트(이진 실행 파일 또는 IL 어셈블리)의 설명에만 한정되지 않습니다.

고급 언어 컴퓨터 아키텍처

또는 컴퓨터가 HLL 코드를 직접 실행하는 고급 언어를 사용할 수도 있습니다.이것은 고급 언어 컴퓨터 아키텍처로 알려져 있습니다.컴퓨터 아키텍처 자체는 특정 고급 언어를 대상으로 설계되어 있습니다.를 들어 [12]Burroughs 대형 시스템은 ALGOL 60의 타깃 머신이었습니다.

「 」를 참조해 주세요.

메모들

레퍼런스

  1. ^ HThreads - RD 용어집
  2. ^ London, Keith (1968). "4, Programming". Introduction to Computers. 24 Russell Square London WC1: Faber and Faber Limited. p. 184. ISBN 0571085938. The 'high' level programming languages are often called autocodes and the processor program, a compiler.{{cite book}}: CS1 유지보수: 위치(링크)
  3. ^ London, Keith (1968). "4, Programming". Introduction to Computers. 24 Russell Square London WC1: Faber and Faber Limited. p. 186. ISBN 0571085938. Two high level programming languages which can be used here as examples to illustrate the structure and purpose of autocodes are COBOL (Common Business Oriented Language) and FORTRAN (Formular Translation).{{cite book}}: CS1 유지보수: 위치(링크)
  4. ^ Giloi, Wolfgang, K. [de](1997년)"콘라드 주세의 플랑카퀼:최초의 고급 "논 폰 노이만" 프로그래밍 언어.IEEE 컴퓨팅 역사 연보, 제19권, 제2호, 페이지 17~24, 1997년 4월~6월. (개요)
  5. ^ 참조 파라미터의 개념이 부족했지만 상황에 따라서는 문제가 될 수 있습니다.ALGOL W, ALGOL 68, Simula, Pascal, ModulaAda포함한 여러 후속 제품에는 참조 매개 변수가 포함되어 있습니다(관련 C 언어 패밀리는 대신 다음과 같은 주소를 허용함).value(파라미터).
  6. ^ Surana P (2006). "Meta-Compilation of Language Abstractions" (PDF). Archived (PDF) from the original on 2015-02-17. Retrieved 2008-03-17. {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)
  7. ^ Kuketayev. "The Data Abstraction Penalty (DAP) Benchmark for Small Objects in Java". Archived from the original on 2009-01-11. Retrieved 2008-03-17.
  8. ^ Chatzigeorgiou; Stephanides (2002). "Evaluating Performance and Power Of Object-Oriented Vs. Procedural Programming Languages". In Blieberger; Strohmeier (eds.). Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002. Springer. p. 367.
  9. ^ Manuel Carro; José F. Morales; Henk L. Muller; G. Puebla; M. Hermenegildo (2006). "High-level languages for small devices: a case study" (PDF). Proceedings of the 2006 International Conference on Compilers, Architecture and Synthesis for Embedded Systems. ACM.
  10. ^ Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language: 2nd Edition. Prentice Hall. ISBN 9780131103627. Archived from the original on 2018-12-13.
  11. ^ Hyde, Randall. (2010). The art of assembly language (2nd ed.). San Francisco: No Starch Press. ISBN 9781593273019. OCLC 635507601.
  12. ^ Chu, Yaohan (1975), "Concepts of High-Level Language Computer Architecture", High-Level Language Computer Architecture, Elsevier, pp. 1–14, doi:10.1016/b978-0-12-174150-1.50007-0, ISBN 9780121741501

외부 링크