고급 언어 기반 OS가없는 이유는 무엇입니까? 저수준 언어가 더 효율적입니까?


44

뻔뻔스럽지 않게, 나는 당신이 이것의 가능성을 고려하고 싶습니다. 오늘날 대부분의 OS는 저수준 언어 (주로 C / C ++)를 기반으로합니다. Android와 같은 새로운 언어조차 JNI를 사용하고 기본 구현은 C로되어 있습니다.

실제로 (개인 관찰) C로 작성된 많은 프로그램이 높은 수준의 프로그램보다 훨씬 빠르게 실행됩니다 (예 : 전송 (Ubuntu의 bittorrent 클라이언트)는 Vuze (Java) 또는 Deluge (Python)보다 훨씬 빠릅니다. ). PyPy는 예외이지만 파이썬 컴파일러조차 C로 작성되었습니다.

특별한 이유가 있습니까? 훌륭한 "OOP"개념을 가진 소위 "고수준 언어"를 모두 견고한 OS를 만드는 데 사용할 수없는 이유는 무엇입니까?

그래서 기본적으로 두 가지 질문이 있습니다.

  1. 저수준 언어로 작성된 응용 프로그램이 HLL 응용 프로그램보다 더 효율적인 이유는 무엇입니까? 저수준 언어가 저수준이고 기계 코드로 쉽게 번역되기 때문에 저수준 언어가 더 잘 수행됩니까?
  2. 전적으로 고급 언어를 기반으로 한 본격적인 OS가없는 이유는 무엇입니까?

36
"고급 언어"만이 객체 지향이며 이는 사실이 아닙니다.
Uooo

2
@rtindru "예쁜 저수준 언어"(주로 C / C ++)? 그렇다면 High-Level Language에 대한 정의는 무엇입니까? 고급 언어의 정의 / 해석에 대해 명확해야합니다. 파이썬은 실제로 엔진 (IDLE 또는 명령 행 터미널)에서 직접 실행되므로 스크립트 언어입니다. C / C ++가 많은 OS에 대한 구현 언어로 사용되는 이유는 매우 철학적이며 실용적인 이유가 있지만 여기서 파워 유저는 아마도이 질문에 뛰어 들지 않을 것입니다.
hagubear

10
안드로이드는 새로운 OS가 아닙니다. 또 다른 리눅스 맛입니다.
Den

3
@hagubear C / C ++가 많은 OS의 구현 언어로 사용되는 이유는 매우 철학적이며 실용적인 이유가 있습니다 . 이것이 매우 좋은 이유는 무엇입니까?
rtindru

2
올바르게 이해하면 LISP 시스템 용 OS가 LISP로 작성되었습니다. 아마도 사용 된 방언이 저수준 언어 였다고 주장 될 수 있을까요?
Robert Fisher

답변:


38

특이점을 살펴보면 Microsoft는이 방향으로 매우 흥미로운 연구를 수행했습니다.

http://research.microsoft.com/en-us/projects/singularity/

또한 Mothy Roscoe 등은 Eclipse 제약 조건 프로그래밍 언어를 OS 서비스로 사용하여 모든 종류의 OS 관리 및 리소스 할당 문제를 정리하는 Barrelfish를 연구하고 있습니다.

http://www.barrelfish.org/


와, 투표 할 수없고, 15 명의 담당자가 필요합니다 ... 오늘 막 참가했습니다! 고마워
rtindru

9
@rtindru : 1 개의 응답 포인트로도 답변을 수락 할 수 있습니다 . 답변이 "허용됨"은 무엇을 의미합니까?
Marjan Venema 2016 년

6
답변을 받아들이면 새로운 답변 / 토론이 줄어 듭니다. 개인적으로, 나는 적어도 하루 이상 (이 특정 질문에) 수락하지 않는 것이 좋습니다.
Brian

1
나는 오픈 소스, 타사, 특이점만큼 재미는 없지만 멋진 아이디어를 가지고 있습니다. cosmos.codeplex.com
Lorenzo Dematté

38

저수준 언어와 고급 언어 사이의 구분에 따라 달라집니다. 예를 들어, 다른 사람들은 C ++과 같은 언어를 그 구분의 다른 측면에 두는 경향이 있습니다.

당신의 질문에 관하여 :

  1. 저수준 언어와 고수준 언어 사이에는 차이가 없다고 생각하지만 통역 언어와 기본 명령어로 컴파일되는 언어 사이에는 차이가 더 큽니다.

    그러나 저수준 언어를 사용하는 사람들이 선택한 (디자인) 선택의 성능 측면에 더 초점을 맞추는 프로그래머들 사이의 문화에 차이가있을 수도 있습니다.

  2. C ++을 고급 레벨로 간주하면 고급 언어로 작성된 OS가 하나 이상 있습니다 (Symbian OS는 C ++로 작성 됨). 대부분의 고급 언어로 OS를 작성하지 못하게하는 것은 다음 두 가지입니다.

    • OS는 메모리 및 하드웨어에 대한 저수준 액세스가 필요하며 더티 트릭을 수행합니다. 이러한 종류의 액세스는 일반적으로 응용 프로그램 수준의 프로그램에서는 안전하지 않은 것으로 간주되므로 많은 고급 언어에서는 허용하지 않습니다.
    • 운영체제와 같은 지원 소프트웨어가 없어도 OS를 실행해야합니다. 따라서 기본 명령어로 쉽게 컴파일 할 수없는 언어로 OS를 작성하기가 매우 어렵습니다.

35
해석 언어 나 네이티브 명령어로 컴파일되는 언어는 없습니다. 언어는 수학 규칙의 집합으로 해석되거나 컴파일되지 않으며 단지 입니다 . Interp. 그리고 Comp. 언어가 아닌 통역사 또는 컴파일러의 특성입니다. 모든 언어는 컴파일러 또는 인터프리터를 사용하여 구현할 수 있습니다. 오늘날 대부분의 언어는 해석과 컴파일 된 구현을 모두 가지고 있습니다. C에 대한 인터프리터가 있으며 모든 주요 JavaScript 구현은 기본 코드로 컴파일됩니다. 그리고 어쨌든 네이티브 코드는 무엇입니까? Java를 JVM 바이트 코드로 컴파일하고 실행하는 경우
Jörg W Mittag

11
내 PC에는 ARM CPU가 없기 때문에 Java CPU에서 C를 ARM 기계 코드로 컴파일하고 ARM 인터프리터에서 실행하면 ARM 네이티브와 JVML이 아닌 이유는 무엇입니까?
Jörg W Mittag 2016 년

5
@ JörgWMittag : 추가 바이트를 사용하지 않고 Java 바이트 코드를 직접 실행할 수있는 CPU가있는 경우 Java 바이트 코드는 해당 CPU의 기본 코드입니다. 또한 일반적으로 VM에서 해석되거나 실행되는 언어로 OS를 작성할 가능성을 배제하지는 않지만 덜 명확한 선택을합니다.
Bart van Ingen Schenau

15
@ JörgWMittag-나는 모든 언어가 컴파일되거나 해석 될 수 있다는 것에 동의합니다 (bash 스크립트를 컴파일하십시오; 해석 된 C ++ (CINT / Cling)를 사용하십시오). 언어 디자인의 많은 결정은 해석, 컴파일 또는 둘 다에 근거합니다. 정적 타입 변수를 수동으로 선언 / 초기화하고, 메모리를 수동으로 할당 / 해제하고, 포인터 산술을 수행하고, 인터프리터에서 배열 경계를 확인하는 것을 기억하십시오 (가비지 수집 메모리, 동적 유형을 추론하는 언어), 배열 범위를 확인합니다). 이 선이 100 % 깨끗합니까? 아니요, 그러나 실제로 차이가 있습니다.
dr jimbob

15

이에 대한 여러 가지 이유가 있습니다.

오늘의 저급 언어는 어제의 고급 언어였습니다

예, 한때 C조차도 고급 언어로 여겨졌습니다. ~ 20 년 전에도 "중급"언어로 묘사되는 것을 볼 수있을 정도로 일반적이었습니다. OO가 오늘날처럼 인기를 끌기 전, Java는 존재하지 않았고 C #도 존재하지 않았으며 C ++도 아직 제대로 표준화되지 않았습니다.

역사적 관성

오늘날 사용하는 운영 체제는 역사에 깊은 뿌리를두고 있습니다. Windows는 80 년대 초반 중반으로, Unix는 70 년대 초반 중반으로 돌아갑니다. 운영 체제에는 많은 오래된 작업 코드가 있으며 일반적으로 오래된 작업 코드를 다시 작성하고 싶지 않습니다.

어느 시점에서 하드웨어로 내려 가야합니다

커널에서 발생하고 드라이버에서 발생하며 메모리 관리 하위 시스템에서 발생하며 파일 시스템에서 발생합니다. 물론 그 위에 고급 언어를 계층화 할 수는 있지만 하위 언어가 제공하는 하드웨어에 더 직접 액세스 할 수 있어야합니다.

이식성

오늘날보다 일반적으로 이해되는 다른 하드웨어 나 다른 OS 로의 이식성을 의미하지는 않습니다. 이것은 더 미묘합니다. 무언가를위한 C 기반 인터페이스를 제공하는 것의 한 가지 주요 이점이 있습니다. 그것이 존재하는 거의 모든 다른 언어가 C에 링크 될 수 있다는 사실입니다. Windows API조차도 요즘 여전히 C 기반 API입니다.

개인 취향

어떤 사람들은 이런 방식으로 프로그래밍하는 것을 선호하는데, 이것이 중요한 요소가 될 수 있습니다. 예를 들어, Linus Torvalds는 C ++에 대해 유명한 rant를 가지고 있습니다. 이 논의와 관련이 없으며, rant가 존재한다는 사실만으로도 충분합니다).

이 두 가지를 종합하면 운영 체제가 이전에 C와 같이 원래 작성된 이유와 오늘날에도 매우 중요한 부분이 왜 그렇게 남아 있는지 분명히 밝혀야합니다.


13

운영 체제에서 C를 지배하는 주된 이유는 Windows와 같은 현재 주류 운영 체제 및 모든 형태의 Unix (BSD, Solaris, HP-UX, MacOS X 등 ... Linux와 같은 복제본) OO와 다른 "높은 수준"구조가 주류가되기까지 오랜 시간이 걸렸습니다.

성능 외에 운영 체제의 핵심에는 하드웨어 명령어에 대해 매우 구체적으로 설명해야하며 C와 같은 언어가 잘 수행하는 메모리를 완전히 제어해야합니다.

임베디드 시스템의 경우 시스템의 더 많은 부분을 위해 더 높은 수준의 언어를 사용하는 운영 체제가있는 경우가 있습니다. 주목할만한 예로 Sun의 JavaOS 가 있습니다.

널리 사용되는 운영 체제의 경우 C를 사용하지 않는 주목할만한 예는 MacOS X 이전의 고전적인 MacOS 입니다. 파스칼방언으로 작성된 일부 부분이 객체 지향의 형태를 허용했습니다.


12

먼저 부트 스트랩 문제가 있습니다. 고급 언어를보다 쉽게 ​​만드는 대부분의 기능은 커널이 제공해야하는 추상화를 기반으로합니다. 메모리 관리자가 필요한 언어로 메모리 관리자를 어떻게 작성합니까? 언어의 멋진 I / O 표준 라이브러리를 사용하지 않고 어떻게 I / O 드라이버를 작성합니까? 언어 라이브러리를 사용하지 않고 스레딩 및 동기화 프리미티브를 어떻게 작성합니까?

둘째, 특정 메모리 위치에 변수를 할당 할 수 있도록 운영 체제를 작성할 때 매우 유용하고 읽기 쉽습니다. 이것은 C에서 쉬우 며 모든 C 프로그래머는 그것을하는 방법을 알고 있습니다. 더 높은 수준의 언어로도 가능하다면, 전문가 만이 그 방법을 알고있는 경우는 거의 없습니다.

다시 말해, 모든 제한 사항과 수정 사항을 고려할 때 C와 C ++가 훨씬 더 쉽게 보이기 시작합니다.


2
첫 번째 단락은 의미가 없습니다. C의 I / O 드라이버도 사용하지 않습니다 stdio.h. 커스텀 뮤텍스 구현은 pthread를 사용하지 않습니다. 그것이 바로 그것을 직접 구현한다는 의미입니다! 그리고 그것은 당신이 사용하는 언어와 무관합니다. 높은 수준의 언어가 낮은 수준의 작업에 적합하다는 것은 아닙니다.

알고 있습니다. 저수준 언어와 고수준을 구별하는 많은 부분이 커널 개발에서 사용할 수없는 언어 부분에 있다고 지적합니다. 언어와 코어를 비교할 때 C는 더 이상 스파르타처럼 보이지 않습니다.
Karl Bielefeldt

사실이 아닙니다. X를 사용하여 X를 구현하지 않는 일부 코드가 필요하지만 나머지 코드는 모두 해당 코드에 따라 X를 사용할 수 있습니다.

그건 좋은 지적이야.
Karl Bielefeldt

6

우선 부트 스트랩을하려면 최소한 작은 부품을 조립품 또는 이와 동등한 것으로 작성해야합니다.

둘째, 틀림없이 HLL- Lisp Machine으로 작성된 OS 가 있었습니다 . (상업적으로 실패했다는 사실은 다른 하드웨어가 더 저렴 해지고 더 빠르며 Worse 의 승리 는 철학이나 디자인의 결함보다 좋습니다.)

셋째, C ++은 객체 지향적이고 수준이 높기 때문에 다른 사람들이 지적했듯이 Symbian OS 가 또 다른 예입니다.

넷째, 현재로서는 새로운 OS가 거의 필요하지 않습니다. 우리는 이미 거의 모든 하드웨어에서 실행되는 꽤 많은 Linux 및 bsd 특징을 가지고 있으며 새로운 OS를 처음부터 새로 만드는 것은 상당히 비쌉니다.


버로우즈 B5000 메인 프레임을 놓쳤습니다. 그들의 운영 체제는 Burroughs Extended ALGOL로 작성되었습니다.
John R. Strohm

1
there is little need for new OSes at this time이것이 사실인지 아닌지에 대해서는 아직 스스로 결정하지 않았습니다. 그렇습니다. 현대 OS (현대 창 (NT) / 현대 유닉스)는 우리가 필요로하는 기능, 성능 및 성능면에서 전부입니다. 그러나 간신히 : "넷"이 기업 / 대학이고 사용자가 신뢰할 수있는 다른 영역에서 태어 났으며 multiproc은 2/4 프로세서였습니다. 그것들은 신뢰 (루트킷, 악성 코드, 바이러스 등)를 초과하여 어느 정도 "불명확"하다. 현대적이고 안전하며 고립 된 OS를위한 공간이 있다고 생각하기 시작했습니다. 병렬 처리도 지원합니다 (스레드보다 낫습니다)
Lorenzo Dematté

리스프 이다 낮은 수준, CAR그리고 CDR있습니다 매크로 어셈블러 IBM 704 ! C 조차도 다른 함수로 취급하지 않고 인라인 어셈블리를 분리 합니다. Lisp CARCDRx86, ARM 및 수많은 ISA에 대한 작업을 고려할 때 이는 이식성이 뛰어난 어셈블리입니다. (I 혼란 수도 사람에게 사이드 노트 : 예, 리스프는 높은 수준의 언어입니다. CAR그리고 CDR있는 어셈블러 매크로는 구현 세부 아닌 주요 기능이었다.))
8bittree

4

내가 이전에 쓴 것을 더 잘 단계 화하기 위해.

Burroughs 5xxx-6xxx 시스템에는 어셈블리 언어가 없습니다. 가장 낮은 언어는 Algol의 확장이었습니다. Algol은 하드웨어로 구현되었습니다. OS와 모든 언어는 Algol로 작성되었습니다. 그것은 당시의 모든 경쟁사 장비보다 뛰어났습니다. 또한 유지 관리가 훨씬 쉬워 진 코드가 훨씬 적었습니다. Algol과 같은 재귀 언어를 지원하는 스택 하드웨어가있었습니다.

버로우즈 운영 체제는 MCP라는 버전으로 발전했습니다. MCP는 현재 Unisys 시스템에서 실행됩니다.


3

언급 한 대부분의 고급 언어에는 운영 체제에 적합하지 않은 기능이 있습니다. 자동 메모리 관리. 실시간 (작은 운영 체제) 또는 최악의 하드 시스템을 작성할 때는 가비지 수집기에 의존 할 수 없습니다. Tanenbaum [i]를 인용하려면 :

C에는없는 내장 문자열, 스레드, 패키지, 클래스, 객체, 유형 안전 및 가비지 수집이 포함되지 않습니다. 마지막은 운영 체제의 쇼 스토퍼입니다. C의 모든 스토리지는 프로그래머가 정적 또는 명시 적으로 할당하고 릴리스하며 일반적으로 mallocfree 라이브러리 함수 를 사용 합니다. C를 운영 체제 작성에 매력적으로 만드는 명백한 포인터와 함께 후자의 속성-메모리에 대한 전체 프로그래머 제어-입니다. 운영 체제는 기본적으로 실시간 시스템이며 어느 정도는 범용 시스템입니다. 인터럽트가 발생하면 운영 체제는 몇 가지 조치 만 수행하거나 중요한 정보를 잃을 수 있습니다. 가비지 수집이 임의의 순간에 시작되는 것은 참을 수 없습니다.

이제 C ++은 수동 메모리 관리를 제공하기 때문에 좋은 후보라고 주장 할 수 있습니다. C ++은 이미 Symbian ( Bart가 언급 한 ) 및 BeOS 와 같은 일부 운영 체제에서 사용되었습니다 . 그러나 IMHO C는 여전히 특정 아키텍처의 어셈블리와 달리 많은 노력없이 많은 아키텍처에서 이식 될 수있는 가장 빠른 언어입니다.

[i] : 최신 운영 체제 3 판, 73 페이지


3
Symbolics 머신에는 자동 메모리 관리 기능이있었습니다. 스몰 토크는 알토에서 했어요. 그것은 80 년대였습니다. 리니어 타입 시스템은 GC의 필요성을 완전히 제거합니다. 우리가 그것을 기억할 수 있다면 이것들은 해결 된 문제입니다!
Frank Shearar

언어가 자동 메모리 관리를 포함 할 수 있지만 특별한 종류의 "고정 된"참조를 포함하고 메소드가 고정되지 않은 참조에 액세스하지 않거나 그렇게 할 수있는 메소드를 호출하지 않을 것이라고 명시 적으로 선언 할 수 있습니다. GC에 의해 수정 될 수있는 객체에 액세스하지 않는 메소드에서 실행중인 코드를 방해 할 세계 가비지 수집기가 필요하지 않습니다.
supercat

2

다른 사람들이 지적했듯이 여러 운영 체제가 고급 언어로 작성되었습니다. 아마도 성공적인 대량 시장, 범용 OS가 어셈블리, C 및 C ++의 조합으로 작성되었다는 의미일까요?

대부분의 고급 언어에는 관련 성능 비용을 운반하는 유용한 기능이 많이 있습니다. 자동화 된 메모리 관리는 명백한 예입니다. 배열의 범위 검사는 또 다른 것입니다. 범용 OS를 작성하는 경우 이러한 유용한 기능의 성능 저하가 지불하고자하는 것보다 많은 상황에 처할 수 있습니다. 그 시점에서 당신은 그것들을 끌 수 있기를 원합니다. Python, C # 및 Java와 같은 언어는 해제 할 수있는 기능에 따라 다르지만이 점에서 C 또는 C ++만큼 다재다능한 것은 없습니다.

이러한 측면에서 C와 C ++는 순수한 어셈블리만큼 다재다능합니다. 10 개의 서로 다른 메모리 할당 시나리오를 다루는 10 개의 서로 다른 메모리 관리자가 필요하다고 결정한 경우 모두 C 및 C ++로 구현하고 적절하다고 판단되면로드 및 언로드 할 수 있습니다. 원하지 않는 경우 표준 C 런타임 라이브러리 또는 시작 코드에 연결할 필요조차 없습니다.


0

진정한 대답은 입니다. 고급 언어 OS의 이점을 충분히 인식하지 못하여 리소스를 빌드 하고이를 주류로 밀어 넣는 데 정당화 할 수 는 없습니다. 예를 들어, 지원해야하는 각 하드웨어에 대해 새 드라이버를 작성하는 데는 엄청난 비용이 듭니다.

OberonSingularity 와 같은 주요 연구 목적으로 고급 언어로 작성된 다양한 OS가 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.