동적 프로그래밍 언어
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
동적 프로그래밍 언어는 런타임에 코드의 구조와 동작을 변경할 수 있는 프로그래밍 언어를 의미한다. 이러한 언어들은 eval 함수, 객체 런타임 변경, 타입 추론, 변수 메모리 할당, 리플렉션, 매크로 등의 기능을 제공한다. 널리 사용되는 동적 프로그래밍 언어로는 자바스크립트, 파이썬, 루비, PHP, Lua, Perl 등이 있으며, Lisp와 Smalltalk와 같은 언어는 고유한 기능을 갖추고 있다. 동적 언어의 정의는 모호하며, 가상 머신과 런타임 컴파일러를 사용하는 언어와의 경계가 불분명하다.
더 읽어볼만한 페이지
- 평가 전략 - 식 (프로그래밍)
식(프로그래밍)은 프로그래밍 언어에서 값을 계산하는 데 사용되는 구문 요소이며, 연산자, 피연산자, 함수 호출 등으로 구성되고, 대입은 변수에 값을 할당하는 동작이다. - 평가 전략 - 느긋한 계산법
느긋한 계산법은 계산 결과가 필요할 때까지 계산을 늦추는 방식으로, 함수형 프로그래밍 언어에서 유용하게 사용되며 무한 데이터 구조를 다루거나 불필요한 계산을 피하는 데 효과적이다. - 동적 프로그래밍 언어 - PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다. - 동적 프로그래밍 언어 - 펄
펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.
동적 프로그래밍 언어 | |
---|---|
개요 | |
정의 | 동적 프로그래밍 언어는 런타임에 프로그램의 동작을 수정하거나 확장할 수 있는 프로그래밍 언어임 |
특징 | 런타임 코드 생성 및 수정 런타임에 새로운 타입 및 객체 정의 프로그램 실행 중 함수 및 클래스 수정 리플렉션 (반사)을 통한 객체 정보 접근 및 조작 |
장점 | 높은 유연성 및 적응성 코드 재사용성 향상 개발 생산성 향상 메타프로그래밍 지원 |
단점 | 정적 언어에 비해 성능 저하 가능성 런타임 오류 발생 가능성 증가 코드 복잡성 증가 가능성 |
특징 (상세) | |
런타임 수정 | 프로그램이 실행되는 동안 클래스, 객체, 함수 등을 수정할 수 있음 |
리플렉션 | 프로그램이 자신의 구조와 동작을 검사하고 수정할 수 있음 |
메타프로그래밍 | 프로그램을 작성하는 프로그램을 작성할 수 있음 |
동적 타입 | 변수의 타입이 런타임에 결정될 수 있음 |
종류 | |
주요 동적 프로그래밍 언어 | 루비 파이썬 자바스크립트 PHP 펄 Lisp 스몰토크 (Smalltalk) |
기타 동적 프로그래밍 언어 | 오브젝티브-C Lua Tcl REBOL Pike 리플렉티브 프로그래밍 언어 |
2. 구현
동적 프로그래밍 언어는 런타임에 프로그램의 구조나 동작을 변경할 수 있도록 여러 기능을 제공한다. 동적 프로그래밍과 밀접하게 관련된 몇 가지 기능은 다음과 같다.
- 객체 런타임 변경: 동적 언어에서는 런타임에 객체의 타입을 변경할 수 있다. 일반적으로 런타임에 타입이나 객체 시스템을 수정할 수 있으며, 이는 런타임 정의 또는 기존 타입이나 객체의 믹스인을 기반으로 새로운 객체를 생성하는 것을 의미한다. 또한, 상속 또는 타입 트리를 변경하여 기존 타입의 동작 방식(특히 메서드 호출)을 변경할 수도 있다.
- 타입 추론: 많은 동적 언어는 동적 타입 시스템을 갖추고 있으며, 내부 해석을 위해 값에 기반한 런타임 타입 추론이 일반적이다. 값 타입은 해석 과정에서 변경될 수 있으므로, 원자적 연산을 수행할 때 자주 사용된다.[1]
- 변수 메모리 할당: 정적 프로그래밍 언어와 달리 동적 언어는 프로그램의 개별 연산에 따라 메모리를 암묵적으로 (재)할당하는데, 이는 객체 런타임 변경과 관련이 있다.
- 리플렉션: 반사는 많은 동적 언어에서 흔히 사용되며, 일반적 또는 다형적 데이터의 유형 및 메타데이터에 대한 분석을 포함한다.[3]
이러한 기능들은 동적 언어의 필수 요소는 아니지만, 동적 언어에서 널리 사용된다.
2. 1. Eval 함수
일부 동적 언어는 eval 함수를 지원한다. eval 함수는 코드를 문자열 파라미터로 받아서 그 코드를 실행시킨다.[1]에릭 메이어와 피터 드레이튼은 eval이 제공하는 런타임 코드 생성을 공유 라이브러리가 제공하는 동적 로딩과 구별하며, 많은 경우 eval이 단지 고차 함수를 구현하거나(함수를 문자열로 전달하여) 역직렬화를 구현하기 위해 사용된다고 경고한다.[1]
eval은 LISP영어에서 도입된 용어이며, S식이라고 불리는 데이터 구조로 표현된 명령 열을 실행하는 프로세스를 가리킨다. 오늘날에는 텍스트 등 기계어 이외의 데이터로 표현된 프로그램을 실행하는 어떤 기구 또는 프로세스를 가리켜 eval영어이라고 한다.[1]
에릭 마이어와 피터 드레이튼은 실행 시 실행 코드를 로드할 수 있는 임의의 언어는 (설령, 해당 코드가 DLL의 기계어 코드라 할지라도) 일종의 eval영어 기능을 갖추고 있다고 할 수 있다고 주장했다. 그들은 고차 함수가 동적 프로그래밍의 본질이며, eval영어은 고차 함수의 대용품에 불과하다고 말했다.[1]
2. 2. 객체 런타임 변경
동적 언어에서는 런타임 중에 객체의 타입이 변경될 수 있다. 타입 또는 객체 시스템은 일반적으로 동적 언어에서 런타임 중에 수정될 수 있다. 이는 런타임 정의 또는 기존 타입이나 객체의 믹스인을 기반으로 새로운 객체를 생성하는 것을 의미할 수 있다. 또한, 상속 또는 타입 트리를 변경하여 기존 타입의 동작 방식을 변경하는 것(특히 메서드 호출과 관련하여)을 의미할 수도 있다.스몰토크의 클래스 등록 등이 두드러진 예이다. 다음은 클래스 정의를 위한 전용 구문이 아니라, Object라는 클래스 객체에 클래스 등록용 메시지를 보내는 코드이다.
```smalltalk
Object
subclass: #Some
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Example'.
```
실행 중에 등록할 수 있을 뿐만 아니라 삭제도 실행 중에 가능하다.
2. 3. 타입 추론
많은 동적 언어는 동적 타입 시스템을 갖추고 있으므로, 내부 해석을 위해 값에 기반한 런타임 타입 추론은 흔한 작업으로 여겨진다. 값 타입은 해석 과정에서 변경될 수 있으므로, 원자적 연산을 수행할 때 자주 사용된다.[1]2. 4. 변수 메모리 할당
정적 프로그래밍 언어는 컴파일 전에 개발자가 사용할 메모리 크기를 (간접적으로) 정의해야 한다(포인터 로직으로 우회하는 경우는 제외). 반면, 동적 언어는 프로그램의 개별 연산에 따라 메모리를 암묵적으로 (재)할당하는데, 이는 객체 런타임 변경과 관련이 있다.동적 언어에서는 객체 시스템과 타입 시스템을 런타임에 변경하는 것이 일반적이다. 이는 런타임 정의에 따라 새로운 객체를 생성하거나, 기존 타입 및 객체의 합성을 기반으로 새로운 객체를 생성하는 것을 의미한다. 또한, 상속 관계나 타입의 트리 구조 변경도 포함하며, 이에 따라 기존 타입의 동작(특히 메서드 호출 관점)도 변화한다. 스몰토크의 클래스 등록 등이 대표적인 예이다.
2. 5. 리플렉션
반사는 많은 동적 언어에서 흔히 사용되며, 일반적으로 일반 또는 다형적 데이터의 유형 및 메타데이터에 대한 분석을 포함한다.[3] 그러나 Lisp가 S-표현식 분석에서 제공하는 기능과 같이 프로그램의 코드를 데이터로 완전히 평가하고 수정하는 것을 포함할 수도 있다.[3]2. 6. 매크로
일부 동적 프로그래밍 언어는 코드 인트로스펙션(클래스, 함수, 키워드가 무엇인지, 무엇을 하는지, 무엇을 아는지 알 수 있는 기능)과 eval을 결합한 매크로라는 기능을 제공한다. 오늘날 '매크로'라는 용어를 알고 있는 대부분의 프로그래머는 C 또는 C++에서 매크로를 접했을 것이다. 여기서 매크로는 언어의 작은 하위 집합에 내장된 정적 기능이며, 프로그램 텍스트에 대한 문자열 대체만 수행할 수 있다. 그러나 동적 언어에서 매크로는 컴파일러의 내부 작동 방식에 대한 접근 권한과 인터프리터, 가상 머신 또는 런타임에 대한 전체 접근 권한을 제공하여 코드 최적화 또는 언어의 구문이나 문법을 수정할 수 있는 언어와 유사한 구조를 정의할 수 있다.3. 동적 프로그래밍 언어의 예
다음은 동적 프로그래밍 언어로 간주되는 언어들이다.
언어 |
---|
액션스크립트(ActionScript) |
BeanShell [2] |
코볼스크립트(CobolScript) |
클로저(Clojure) |
어도비 콜드퓨전(ColdFusion) |
커먼 리스프(Common Lisp) (참고: 리스프) |
Dylan |
그루비(Groovy) [3] |
Gambas |
E |
Fancy |
자바스크립트(JavaScript) |
줄리아(Julia) |
루아(Lua) |
매트랩(MATLAB) / Octave |
Objective-C |
펄(Perl) |
PHP |
윈도우 파워셸(Powershell) |
파이썬(Python) |
R |
루비(Ruby) |
스몰토크(SmallTalk) |
Tcl |
VB스크립트 |
자바(Java) (Reflection 이용) |
커먼 리스프와 커먼 리스프 객체 시스템(CLOS)을 이용해 동적 기능을 나타내는 예제가 있다.
어셈블리어, C 언어, C++, 초기 Java, FORTRAN 등은 동적 프로그래밍 언어가 아니다.
3. 1. 주요 동적 프로그래밍 언어
자바스크립트, 파이썬, 루비, PHP, Lua, Perl 등이 널리 사용되는 동적 프로그래밍 언어에 속한다.다음은 일반적으로 동적 프로그래밍 언어로 간주되는 언어 목록이다.
- 액션스크립트(ActionScript)
- BeanShell[2]
- 코볼스크립트(CobolScript)
- 클로저(Clojure)
- 어도비 콜드퓨전(ColdFusion)
- 커먼 리스프(Common Lisp, 참고: 리스프)
- Dylan
- 그루비(Groovy)[3]
- Gambas
- E
- 자바스크립트(JavaScript)
- 줄리아(Julia)
- 루아(Lua)
- 매트랩(MATLAB) / Octave
- Objective-C
- 펄(Perl)
- PHP
- 윈도우 파워셸(Powershell)
- 파이썬(Python)
- R
- 루비(Ruby)
- 스몰토크(SmallTalk)
- Tcl
- VB스크립트
- 자바(Java, Reflection 이용)
3. 2. 기타 동적 프로그래밍 언어
액션스크립트, 클로저, 커먼 리스프, Objective-C, R, 스몰토크, Tcl, VB스크립트, 줄리아, 그루비 등이 동적 프로그래밍 언어에 해당한다.[2][3]4. 한계와 모호성
동적 언어의 정의는 "컴파일"과 "실행 시"의 구분뿐만 아니라 "코드"와 "데이터"의 구분도 관련되어 있기 때문에 매우 모호하다. 가상 머신이나 런타임 컴파일러 등, 기계어에 어떠한 추상화를 가하여 기계어를 실행 시에 생성하는 언어 처리 시스템이 많다. 일반적으로 어떤 언어가 동적이라는 것은, 해당 언어의 능력을 명확하게 나타낸다기보다는, 동적인 기능의 사용 편의성을 가리킨다고 할 수 있다.
5. Lisp와 Smalltalk의 추가 기능
Lisp나 Smalltalk를 비롯한 몇몇 언어는 분기나 반복을 위한 전용 제어 구문을 가지지 않는다. 익명 함수와 고차 함수의 조합으로 모든 것을 대체한다.[1]
```smalltalk
[
Error signal: '처리 실패'.
]
on: Exception
do:
[ :exception |
"예외를 포착"
].
```
위 코드는 Smalltalk를 사용한 예외 처리의 예시이다. 클래스 등록과 마찬가지로 언어 기능에 의한 전용 구문은 아니다.[1]
6. 함수형 프로그래밍
함수형 프로그래밍 개념은 많은 동적 언어에 갖춰져 있으며, 이는 LISP를 기원으로 한다.[1]
6. 1. 계속(Continuation)
계속은 재호출 가능한 실행 상태를 나타낸다. 예를 들어, 파서가 중간 결과와 계속을 반환하고, 나중에 재호출되면 입력의 구문 분석을 다시 시작한다. 계속은 클로저 등 스코프와 복잡하게 관련되어 있기 때문에, 계속을 제공하는 동적 언어는 많지 않다.[1]7. 메시지 전달
스몰토크 계열 객체 지향 언어에서 주로 발견된다. 하나의 메서드에 여러 선택자를 연결하거나, 모든 메시지를 수신하는 메서드를 정의할 수 있다. 이를 통해 메시지를 수신하는 객체가 메시지와 동일한 선택자(selector)를 가진 메서드를 갖추고 있지 않더라도 메시지를 수신할 수 있다.[1]
위는 스몰토크에서 이미 `#open:`이라는 선택자를 가진 메서드에 `#onClick:`이라는 선택자를 추가한 것이다.[1]
참조
[1]
간행물
Static Typing Where Possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages
https://people.dsv.s[...]
"[[Microsoft]] Corporation"
[2]
웹사이트
Chapter 24. Dynamic language support
http://static.spring[...]
2013-07-17
[3]
웹사이트
Groovy - Home
http://groovy.codeha[...]
2014-03-02
[4]
웹사이트
Static Typing Where Possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages
http://pico.vub.ac.b[...]
"[[マイクロソフト|Microsoft]] Corporation"
2008-01-18
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com