스택큐힙리스트

왜 스크립팅 언어(예: 펄, 파이썬, 루비)는 셸 언어로 적합하지 않은가요? [닫힘] 본문

카테고리 없음

왜 스크립팅 언어(예: 펄, 파이썬, 루비)는 셸 언어로 적합하지 않은가요? [닫힘]

스택큐힙리스트 2023. 4. 24. 10:56
반응형

현재 이 질문은 우리의 Q&A 형식에 적합하지 않습니다. 우리는 답변이 사실, 참고 자료 또는 전문 지식에 기반한 것을 기대하지만, 이 질문은 논쟁, 투표 또는 논의를 유발할 가능성이 높습니다. 이 질문을 개선하고 다시 열 수 있다고 생각하는 경우, visit the help center 에게 지원을 요청하십시오.

9년 전 닫혔습니다.

쉘 언어인 Bash ( bash ), Z shell ( zsh ), Fish ( fish )과 셸에 더 적합하게 만드는 스크립트 언어와의 차이점은 무엇인가요?

명령줄을 사용할 때, 셸 언어는 훨씬 쉬운 것 같습니다. 예를 들어, 셸 프로필을 사용하는 것보다는 bash를 사용하는 것이 더 부드러운 느낌입니다. 대부분은 중간에서 큰 규모의 프로그래밍이 Bash보다는 Python으로 훨씬 쉽다는 데 동의할 것입니다. 저는 가장 익숙한 언어로 Python을 사용합니다. 동일한 내용이 # $ * ^ @ *! $ $ & 와 # $ ^! * $$ @ $ & 에도 적용됩니다.

나는 그 이유를 명확히 표현해 보았지만, 문자열에 대한 처리 방식이 서로 다른 것과 관련이 있을 것이라는 가정을 제외하고는 이해할 수 없다.

이 질문의 이유는 두 국가에서 모두 사용 가능한 언어를 개발하고자 하는 것입니다. 그러한 언어를 아시는 경우 함께 포스팅해 주시기 바랍니다.

S.Lott이(가) 설명하는 대로, 이 질문은 명확한 해석이 필요합니다. 저는 쉘 언어와 스크립팅 언어 간의 특징에 대해 묻는 것입니다. 따라서 비교 대상은 히스토리 및 명령 줄 치환과 같은 다양한 대화형 ( REPL ) 환경의 특성과 관련이 없습니다. 이 질문에 대한 대체 표현은 다음과 같습니다.

복잡한 시스템 설계에 적합한 프로그래밍 언어가 파일 시스템에 액세스하거나 작업을 제어 할 수 있는 유용한 한줄 코드를 표현 할 수 있을까요? 프로그래밍 언어가 크기를 확장하면서 크기를 축소 할 수 있을까요?

답변 1

저는 생각 스트림을 따라 몇 가지 차이점이 있다고 생각합니다. 특정한 순서 없이 이야기하자면,

파이썬과 관련된 도구들은 스크립트 작성에 뛰어나도록 설계되었습니다. 반면, Bash와 관련된 도구들은 스크립트 작성에만 뛰어나도록 상호 보완 없이 설계되었습니다. 다시 말해, 파이썬은 스크립트와 비스크립트 모두에 뛰어나도록 설계되었지만 Bash는 스크립팅에만 관심이 있습니다.

배시 및 그 동료는 타입이 없고, 파이썬 및 그 동료는 강력한 타입입니다. 이것은 숫자 123, 문자열 123 및 파일 123이 크게 다르다는 것을 의미합니다. 그러나 이들은 정적으로 타입이 아니므로, 이들을 분리하기 위해 서로 다른 리터럴이 필요합니다.

예:

| Ruby | Bash

-----------------------------------------

number | 123 | 123

string | '123' | 123

regexp | /123/ | 123

file | File.open('123') | 123

file descriptor | IO.open('123') | 123

URI | URI.parse('123') | 123

command | `123` | 123

파이썬과 같은 언어는 10000줄, 100000줄, 아마도 1000000줄 프로그램까지 확장 가능하도록 설계되었지만, 반면 배쉬와 같은 언어는 10자 프로그램까지 축소할 수 있도록 설계되었습니다.

Bash & Co.에서 파일, 디렉토리, 파일 디스크립터, 프로세스는 모두 일급 객체입니다. 반면, Python에서는 Python 객체만 일급 객체입니다. 파일, 디렉토리 등을 조작하려면 먼저 Python 객체에 래핑해야합니다.

셸 프로그래밍은 기본적으로 데이터 플로우 프로그래밍입니다. 이것을 쓰는 사람들도 그렇고, 셸을 쓰는 사람들조차도 이것을 깨달은 사람은 거의 없지만, 셸은 상당히 그것에 능하며, 일반적인 언어들은 그렇지 않습니다. 일반적인 프로그래밍 세계에서는 데이터 플로우가 대부분 동시성 모델로만 본다는 것이 큰 문제입니다.

이러한 포인트를 일반 목적 프로그래밍 언어에 디자인 패턴이나 DSL을 추가해서 해결하려는 시도는 제대로 된 구현을 본 적 없다는 느낌이 듭니다. Ruby에서 쉘을 실행하려고 하는 RuSH(Ruby Shell)나 Ruby에서 쉘 프로그래밍을 위한 내부 DSL인 rush 등이 있지만, Bash, Zsh, fish 등과 경쟁할 만한 것은 아니라고 생각합니다. 또한 Python 쉘인 Hotwire도 있지만 마찬가지입니다.

실제로 내 개인적인 의견으로는 현재 최고의 쉘은 Microsoft PowerShell입니다. 이는 몇십 년 동안 계속해서 최악의 쉘을 가지고 있다는 사실을 고려할 때 매우 놀라운 것입니다. COMMAND.COM? 정말요? (불행하게도 아직도 우수하지 않은 터미널을 가지고 있습니다. 여전히 Windows 3.0부터 존재한 명령 프롬프트입니다.)

파워쉘은 기본적으로 마이크로소프트가 한 것을 무시하고 ( COMMAND.COM , CMD.EXE , VBScript, JScript) Unix 셸에서 시작하여 모든 역방향 호환성 쓰레기 (command substitution에 대한 backticks와 같은 것)를 제거하고 윈도우 친화적으로 만들기 위해 조금 마사지 한 것 입니다. (윈도우즈의 경로 구성 요소 구분 기호 인 백슬래시 대신 지금은 사용되지 않는 backtick을 이스케이프 문자로 사용하는 등) 그 후에 마술이 일어나는 것입니다.

Python과 반대로 기존의 대규모 프로그램 문제와 작은 스크립트를 해결하기 위해 Bash는 스크립트에 중점을 두고, PowerShell는 대규모 프로그램에 먼저 관심을 두고 스크립트를 처리합니다. PowerShell의 주요 디자이너 인 제프리 스노버와의 인터뷰에 참여하며 PowerShell로 어느 정도 크기의 프로그램을 작성할 수 있는지 라는 질문을 받았고 스노버는 80자라고 대답했습니다. 이 때, 제프리 스노버는 셸 프로그래밍을 이해하는 마이크로소프트의 사람 중 하나라는 것을 깨달았으며, PowerShell이 마이크로소프트의 프로그래밍 언어 그룹이 아닌 서버 그룹에서 개발되었다는 것도 알게되었습니다. (즉, 쉘을 직접 사용하는 시스템 관리자들이 개발하였습니다). 따라서 PowerShell에 대해 심각하게 고려해 보아야 한다는 결론에 이르렀습니다.

번호 2는 인자를 정적으로 입력함으로써 해결됩니다. 따라서 당신이 단지 123를 작성하면 PowerShell은 그것이 문자열인지, 숫자인지 또는 파일인지를 알 수 있습니다. 왜냐하면 cmdlet (PowerShell에서 셸 명령어라고 불리는 것)은 셸에 인자의 유형을 선언합니다. 이에는 깊은 영향이 있습니다. Unix와는 달리 각 명령어가 자체 인수 파싱을 담당하는 대신 (셸은 기본적으로 인수를 문자열 배열로 전달합니다), PowerShell에서는 인수 파싱이 셸에서 수행됩니다. cmdlet은 모든 옵션, 플래그 및 인수, 그리고 유형, 이름 및 설명(!)을 셸에 지정하여 셸에서 중앙에서 인수 파싱, 탭 자동 완성, IntelliSense, 인라인 설명 팝업 등을 수행할 수 있습니다. (이것은 혁신적인 것이 아니며, PowerShell 설계자들은 DIGITAL Command Language (DCL) 및 IBM OS/400 Command Language (CL)과 같은 셸을 선행 기술로 인정합니다. AS/400를 사용한 적이 있는 사람이라면 익숙할 것입니다. OS/400에서는 셸 명령을 작성하고 특정 인수의 구문을 모르면 해당 인수를 빠뜨려 F4를 누르면 레이블이 지정된 필드, 드롭다운, 도움말 텍스트 등이 포함된 메뉴(HTML 양식과 유사)가 표시됩니다. 이것은 OS가 모든 가능한 인수 및 그 유형을 알고 있기 때문에 가능합니다.) Unix 셸에서는 이 정보가 종종 세 번 중복됩니다: 명령 자체에서 인수 파싱 코드에서, 탭 완성을 위한 bash-completion 스크립트에서, 및 man 페이지에서.

4번은 PowerShell이 파일, 프로세스, 폴더와 같은 강력한 유형의 객체를 다루기 때문에 해결됩니다.

5번은 특히 흥미롭습니다. PowerShell은 내가 알고 있는 셸 중에서 유일하게 셸이 실제로 데이터 흐름 엔진이라는 사실을 알고 있었고 의도적으로 데이터 흐름 엔진으로 구현했다는 것을 개발자들이 알고 있었기 때문입니다.

파워쉘에서 좋은 점 중 하나는 네이밍 규약이다. 모든 cmdlet은 Action-Object으로 이름이 지어지며, 또한 특정 작업과 객체에 대한 표준화된 이름도 있다. (이 역시 OS/400 사용자에게는 익숙할 것이다.) 예를 들어, 어떤 정보를 수집하는 것과 관련된 것은 Get-Foo로 불린다. 또한, (서브-)객체 위에서 동작하는 모든 것은 Bar-ChildItem로 불린다. 따라서 ls에 해당하는 것은 Get-ChildItem이다. (파워쉘은 내장된 별칭인 ls와 dir도 제공한다. 실제로 논리적인 경우, 유닉스와 CMD.EXE 별칭과 약어도 제공한다. 이 경우에서는 gci이 해당된다.)

하지만 내 개인적인 의견으로는 강한 유형화된 객체 파이프 라인이 가장 강력한 기능입니다. PowerShell은 유닉스 쉘에서 파생되었지만 매우 중요한 차이점이 하나 있습니다. 유닉스에서 통신은(관련된 쉘 명령어 인수와 함께) 모두 타입이 지정되지 않은 구조가 없는 문자열을 사용합니다. PowerShell에서는 모두 강력하게 유형화된 구조적 객체입니다. 이것은 굉장히 강력하기 때문에 아무도 이것을 생각하지 않았을까 진심으로 의문이 듭니다. (실제로는, 생각해봤지만 인기를 얻지 못했습니다.) 내 쉘 스크립트에서 명령어 중 약 1/3은 공통 텍스트 형식이 없는 두 명령어 사이에서 어댑터로 작동하는 것으로 추정됩니다. PowerShell에서는 명령어가 구조화된 객체를 교환하므로 이러한 어댑터가 많이 사라지게 됩니다. 또한 명령어 내부를 살펴보면 대개 3 단계로 구성되는데, 텍스트 입력을 내부 객체 표현으로 구문 분석하고 이들 객체를 조작하고 다시 텍스트로 변환합니다. 다시 말해, 첫 번째와 세 번째 단계는 데이터가 이미 객체로 제공되기 때문에 사실상 사라집니다.

그러나 디자이너들은 적응형 타입 시스템이라는 것을 통해 셸 스크립트의 동적성과 유연성을 보존하기 위해 최선을 다하고 있습니다.

어쨌든, 나는 이것을 PowerShell 광고로 만들고 싶지 않다. PowerShell에 대해 그다지 좋지 않은 점이 많이 있지만, 대부분은 Windows나 특정 구현과 관련이 있고 개념과는 별로 관련이 없다. (예를 들어, .NET에서 구현되었기 때문에 .NET 프레임워크가 파일 시스템 캐시에 이미 존재하지 않는 경우 몇 초 동안 쉘을 시작하는 것이 매우 불편합니다. 대개 쉘을 사용하는 시간은 1초 미만이지만 이는 전혀 용납할 수 없습니다.)

제가 전달하고 싶은 가장 중요한 점은 Unix 및 Ruby/Python/Perl/PHP 계열에 머무르지 않고 스크립팅 언어 및 셸의 기존 작업물을 살펴보시려면 Tcl 같은 언어보다는 Rexx 나 Emacs Lisp 같은 다른 언어도 살펴보시는 것이 좋습니다. 또한, OS/400 명령줄 및 DCL과 같은 기존 메인프레임/미드레인지 셸과 Plan9의 rc도 있습니다.

답변 2

스크립트 언어 (예 : Perl, Python 및 Ruby)가 셸 언어로 적합하지 않은 이유는 무엇인가요?

스크립트 언어는 편리하게 사용할 수 있지만, 셸 언어로 사용하기에 적합하지 않습니다. 이유는 몇 가지가 있습니다.

첫째, 셸 환경은 스크립트 언어와는 다르게 명령줄 인터페이스를 제공합니다. 이는 사용자가 명령어를 입력하고 실행 결과를 바로 확인할 수 있는 방식입니다. 반면 스크립트 언어는 완전한 프로그래밍 환경을 제공하고, 복잡한 문제를 해결할 수 있지만, 명령어 실행과 같은 간단한 작업을 처리하기에는 너무 복잡합니다.

둘째, 셸 환경에서는 실행할 명령어를 검색하고 호출하는 데 많은 노력이 필요합니다. 스크립트 언어에서는 이러한 작업을 매우 간단하게 처리할 수 있지만, 이는 스크립팅 언어가 본래 설계된 용도와는 상반되는 기능입니다.

셋째, 스크립트 언어는 거의 모든 운영 체제에서 실행될 수 있지만, 셸 환경에서는 특정 운영 체제에 종속되며, 다양한 셸 환경에서 호환성 문제가 발생할 수 있습니다.

따라서 스크립트 언어는 셸 언어로 사용하기에 적합하지 않습니다. 대신 셸 언어를 사용하여 명령어 실행 및 간단한 작업을 처리하고, 스크립트 언어는 프로그래밍 작업과 같이 복잡하고 고도화된 작업을 처리하는 데 사용하는 것이 좋습니다.

반응형
Comments