본문 바로가기
프로그래밍언어론

[프로그래밍언어론] 29. 스크립팅 언어(Scripting Languages)

by 파스텔코랄 2023. 11. 6.

스크립팅 언어

  • 컴퓨터를 실제로 사용하려면 여러 프로그램을 결합해야 하는 경우가 많다.
  • 예) 디렉토리의 모든 로그 파일에서 특정 유형의 오류 메시지를 인쇄
    • A : 디렉터리의 모든 로그 파일을 나열
    • B : 목록에서 각 로그 파일을 읽기
    • C : 해당 유형의 오류 메시지를 찾기
    • D : 발견된 메시지를 특정 형식으로 인쇄

 



Glue 언어

  • 스크립팅 언어는 Glue 언어라고 불린다.
  • 목표를 달성하기 위해 여러 프로그램을 함께 연결(Glue)
  • 두 조상 : 쉘/터미널(sh, bash) + 텍스트 처리(sed, awk).
  • 범용 스크립팅 언어
    • Perl, Python, Ruby, PowerShell, AppleScript 등
  • 웹용
    • PHP, JSP, Ruby on Rails, JavaScript, TypeScript 등

 



공통적인 특징

  • 일반적으로 배치 모드(batch)와 대화형 모드(interactive)를 모두 제공한다.
  • 작성하기가 더 쉽다 - 간단한 표현
Public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!")l
    }
}
  • 선택적 선언이 포함된 간단한 범위 지정 규칙
    • 모든 이름을 전역(global) 또는 지역(local)으로 간주
    • 선언은 필수가 아니다.
# 파이썬
a = 10 + 3
b = a + 2
print(a, b)
  • 유연하고 역동적인 타이핑
    • 대부분 동적 유형 검사를 사용
    • 하나의 변수는 서로 다른 상황에서 서로 다른 유형으로 사용된다.
자바스크립트
a = 3
console.log(typeof a) // number

str = "string"
a = str + 3
console.log(typeof a) // string
  • 패턴 매칭 및 문자열 조작에 적합
  • 상위 수준(High-level)데이터 구조
    • 튜플, 리스트, 딕셔너리
    • Python에서는 기본 언어 기능이 지원
    • C++, Java에서는 표준 라이브러리(예: 확장 또는 사전 구현된 라이브러리)에서 지원

 



문제 도메인

  • 쉘 스크립트(Shell Scripts)
    • 파일 및 디렉토리 조작
    • Unix 명령을 대화형으로 연결
  • 텍스트 처리 및 보고서 생성
    • 패턴 매칭 및 문자열 조작 지원
    • Perl: 실용적인 추출 및 보고 언어(Practical Extraction and Report Language)
    • 생물 정보학 - 유전자 서열 분석에 사용됩니다.
  • 수학 및 통계
    • 쓰기 쉽고 데이터 조작도 쉽다.
    • R과 Python이 사용
    • 범용 Glue 언어
    • 한 프로그램의 출력을 다른 프로그램의 입력에 연결하거나 리디렉션할 수 있다.
  • 확장 언어(Extension Language)
    • 스크립팅 언어는 기존 프로그램에 더 유용한 기능(예: 새 명령)을 추가하는 데 자주 사용된다.
    • Lua: 게임 산업에서 많이 사용된다.
    • 퀘스트, 스킬, 아이템, 몬스터 사양.
    • 추가 기능/확장 개발.
  • 웹 애플리케이션
    • 서버측과 클라이언트측 모두에서 사용된다.

 



Python 범위 규칙(Problem Domains)

  • Python에는 독특한 범위 규칙
  • 변수는 명시적으로 선언되지 않는 한 지역 변수로 간주
  • 읽기만 하고 블록에 쓰지 않는 변수는 쓰기가 포함된 가장 가까운 둘러싸는(enclosing) 범위에서 찾을 수 있습니다.
i = 1; j = 3 # 글로벌 변수
def outer():
    def middle(k):
        def inner():
            global i
            i = 4
        inner()
        return i, j, k
    i = 2
    return middle(j)

print(outer()) # (i, j, k) = (2, 3, 3)
print(i, j)        # 4 3
  • outer()는 i를 읽지 않지만 i에 새 값을 쓴다.
    • j를 읽고 이를 middle()에 전달한다.
  • middle()은 i와 j를 모두 읽는다.
  • inner()는 전역 i를 쓴다.

 



작업 : 오류 로그 인쇄

  • 일련의 로그 파일이 디렉터리에 저장된다.
  • 로그 파일 이름에는 날짜가 포함된다.
  • 각 파일에서 로그 유형은 헤더로 표시된다.
    • 예) [build], [error], [normal]
  • [error] 로그만 새 파일에 저장한다.
[build] build task xxx started.
[normal] /usr/local/bin/python3 ...
[error] cannot resolve dependencies...
[normal] /usr/local/bin/python3 ...
[error] failed to compile XXX.
[error] cannot execute task YYY.
[build] build task xxx completed.
  • Java
    • 표준 라이브러리만 사용하는 경우 파일 자체를 읽는 것은 편리한 작업이 아니다.
      • 물론 Java 7부터 java.nio.file.Files를 사용할 수 있다.
    • 코드 작성 → 컴파일 → 실행
      • IDE를 사용하지 않는 경우에도 이 단계는 쉽지 않다.
  • Python
    • 여러 줄의 코드만으로도 요구 사항을 충족할 수 있다.
    • REPL을 사용하면 필요한 코드를 더 쉽게 작성하고 실행할 수 있다.
      • 중간 결과를 확인하고 즉시 코드를 수정할 수도 있다.

댓글