Bash++ 클래스
소개
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++ 프로젝트를 확인하십시오!
Reference
이 문제에 관하여(Bash++ 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jrbrtsn/bash-classes-5e4e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)