Bash++ 클래스

4465 단어 clinuxbashcpp

소개



Bash는 객체 지향 프로그래밍(OOP)과 자주 연관되지 않는 해석 언어입니다. 아마도 이 목적을 위한 일급 기능을 제공하지 않기 때문일 것입니다. 그러나 메모리를 동적으로 할당할 수 있고 포인터를 지원하는 모든 언어는 OOP에 사용할 수 있습니다. 결국 OOP는 잠재적으로 힙에 있는 데이터를 관리하는 스타일일 뿐입니다.

역사적 맥락



1990년대에 저는 16비트 Psion 핸드헬드 컴퓨터용 창고 인벤토리 앱을 작성하는 일을 했습니다. 이 플랫폼을 위한 언어 선택은 Basic 또는 C였습니다. 그 당시 저는 C로 10년, C++로 5년을 코딩했습니다. 사용 가능한 옵션이 주어지면 당연히 C를 선택했습니다.
C++에 대한 내 경험은 이미 내 사고 프로세스를 OOP로 왜곡했기 때문에 C에서 이를 계속 진행하려고 노력했습니다. 몇 시간 동안 만지작거리면 다음과 같은 결과가 나왔습니다.

// Class declaration
typedef struct _Class {
   int ival1;
   char *dyn_str;
   /* ... And so on ... */
} Class

// Constructor
Class* Class_constructor(
   Class *self,
   int ival,
   const char *str
)
{
   self->ival1= ival;
   self->dyn_str= strdup(str);
   return self;
}

// Destructor
void* Class_destructor(Class *self)
{
   if(self->dyn_str)
      free(self->dyn_str);
   return self;
}

// Member function
void Class_printStuff(const Class *self)
{
   printf("%s %d\n", self->dyn_str, self->ival1);
}

// Program starts here
int main()
{
   Class obj;
   Class_constructor(&obj, 25, "You feel like you are");
   Class_printStuff(&obj);
   Class_destructor(&obj);
   return 0;
}

흠, C++과 꽤 비슷하지 않나요? C++의 'new' 및 'delete' 연산자의 기능을 제공하기 위해 몇 가지 짧은 매크로를 추가했고 경주에 참가했습니다. 클라이언트는 오늘날 스마트폰 앱과 매우 흡사한 GUI를 가진 최종 제품에 매우 만족했습니다. 이 성공으로 나는 C에서 OOP를 계속 추구했습니다. 1년 안에 나는 그것이 C++로 할 수 있는 것보다 훨씬 빠르게 C로 OO 코드를 작성하고 있다는 것을 깨달았습니다. 게다가 그 당시 다양한 C++ 컴파일러의 호환성은 개탄스러웠습니다.
저는 다형성과 가상 기능, 그리고 안전한 멀티스레드 OO 프로그래밍에 필요한 모든 현대적인 시설을 갖춘 표준 툴킷을 연구했습니다. 지금까지 저는 C++보다 C로 OO 프로그램을 작성하는 것이 훨씬 더 생산적이며 C 또는 C와 C++의 혼합이 실용적인 옵션일 때마다 그렇게 합니다.

빨리 감기



약 5년 전 저는 Bash에서 OOP라는 아이디어를 가지고 놀기 시작했습니다. 몇 시간 동안 이 작업을 수행한 후 Bash에 일반화된 함수 반환 기능이 없다는 문제에 직면했습니다(데이터 동시성을 방해하는 서브쉘을 호출하지 않음). 급여를 받는 일과 삶이 개입했고, 그 아이디어가 내 생각의 전면에 떠올랐던 것은 이번 주뿐입니다.

배쉬 확장



분명히 말씀드리자면, 저는 Bash 자체의 소스 코드를 수정할 생각이 없습니다. Bash의 주요 가치 제안은 거의 모든 POSIX 플랫폼(읽기: 임베디드 Linux 및 BSD)에 이미 설치된 강력하고 유연하며 성숙한 인터프리터입니다. ssh를 비대화형으로 사용하면 이제 수만 개의 이기종 임베디드 시스템을 병렬로 쿼리 및/또는 관리할 수 있습니다.

반환 시설: 완료



이번 주 초에 저는 Bash에서 . 이것은 원래 문제를 해결할 뿐만 아니라 모든 함수(예: Python)에서 여러 반환 값을 꽤 잘 지원합니다.



그 후 'malloc'과 'new', 'delete', 'fetch'(접근자) 및 'call'(멤버 함수) 연산자를 구현했습니다.
작동하는 Bash 클래스는 다음과 같습니다.

# import oop facilities
source ../bash++

function FirstClass::FirstClass ()
###################################
# Constructor for FirstClass
#
{
   local opts=$(shopt -o -p nounset)
   # Necessary to avoid "unbound variable" exception
   set +u

   local this=$1
   shift

   # Concatenate all constructor args separated by a space
   local catStr
   while [[ -n $1 ]]; do

      if [[ -z $catStr ]]; then
         catStr="$1"
      else
         catStr="$catStr $1"
      fi

      shift
   done

   # Assign value to class member
   eval $this[catstr]='$catStr'

   # Restore options
   eval $opts
}

function FirstClass::~FirstClass ()
###################################
# Destructor for FirstClass
#
{
   local this=$1

   # Free resources
   eval unset $this[catstr]
}

function FirstClass::wordCount ()
###################################
# Return the word count of catstr
# Arguments:
#   None
# Returns:
#   Word count on the return stack
#
{
   # For clarity
   local this=$1

   # Retrive the catstr member value
   fetch $this.catstr; RTN_pop R1

   # Run through 'wc' command, store result
   # on return stack.
   RTN_push $(wc -w <<<"$R1")

}

###################################
### Execution starts here #########
###################################

# Create an instance of FirstClass
new FirstClass 'Here are' '3 constructor' 'arguments'

# Pop the address of the object into a handle
RTN_pop h_fc

# Debug print object to stdout
show $h_fc

# Access a member value
fetch $h_fc.catstr; RTN_pop str

# Print member value
echo "catstr= '$str'"

# Get the word count
call $h_fc.wordCount; RTN_pop n
echo "word count= $n"

# Delete object
delete $h_fc

결론



이런 종류의 것이 흥미롭다면 Github에서 제 bash++ 프로젝트를 확인하십시오!

좋은 웹페이지 즐겨찾기