Tại sao không có hệ điều hành dựa trên ngôn ngữ cấp cao? Ngôn ngữ cấp thấp có hiệu quả hơn không?


44

Không tự phụ, tôi muốn bạn xem xét khả năng này. Hầu hết các hệ điều hành ngày nay đều dựa trên các ngôn ngữ cấp độ khá thấp (chủ yếu là C / C ++) Ngay cả những ngôn ngữ mới như Android sử dụng JNI và triển khai cơ bản là bằng C

Trên thực tế, (đây là quan sát cá nhân), nhiều chương trình được viết bằng C chạy nhanh hơn nhiều so với các đối tác cấp cao của chúng (ví dụ: Transmission (máy khách bittorrent trên Ubuntu) nhanh hơn nhiều so với Vuze (Java) hoặc Deluge (Python) ). Ngay cả trình biên dịch python được viết bằng C, mặc dù PyPy là một ngoại lệ.

Vì vậy, có một lý do cụ thể cho việc này? Tại sao tất cả cái gọi là "Ngôn ngữ cấp cao" của chúng tôi với các khái niệm "OOP" tuyệt vời không thể được sử dụng để tạo ra một hệ điều hành vững chắc?

Vì vậy, tôi có 2 câu hỏi về cơ bản.

  1. Tại sao các ứng dụng được viết bằng ngôn ngữ cấp thấp hiệu quả hơn so với các đối tác HLL của chúng? Các ngôn ngữ cấp thấp có hoạt động tốt hơn vì lý do đơn giản là chúng ở cấp độ thấp và được dịch sang mã máy dễ dàng hơn không?
  2. Tại sao chúng ta không có một hệ điều hành chính thức hoàn toàn dựa trên Ngôn ngữ cấp cao?

36
Bạn ngụ ý rằng chỉ "Ngôn ngữ cấp cao" là hướng đối tượng, điều này không đúng.
Uooo

2
@rtindru "Ngôn ngữ cấp thấp" (chủ yếu là C / C ++)? Định nghĩa của bạn về ngôn ngữ cấp cao là gì? Bạn cần phải rõ ràng về định nghĩa / giải thích của bạn về ngôn ngữ cấp cao. Python thực sự là một ngôn ngữ kịch bản khi nó được thực thi trực tiếp trên công cụ của nó (IDLE hoặc thiết bị đầu cuối dòng lệnh), nếu bây giờ bạn không nhận ra điều đó. Có một lý do rất chính đáng (triết học và thực tiễn) tại sao C / C ++ được sử dụng làm ngôn ngữ triển khai cho nhiều hệ điều hành, nhưng tôi chắc chắn rằng những người sử dụng năng lượng ở đây có thể sẽ không nhảy vào câu hỏi này.
mặc cả

10
Android không phải là một hệ điều hành hoàn toàn mới. Nó chỉ là một hương vị Linux khác.
Den

3
@hagubear Có một lý do rất chính đáng (triết học và thực tiễn) tại sao C / C ++ được sử dụng làm ngôn ngữ triển khai cho nhiều HĐH . Lý do rất tốt này là gì?
rtindru

2
Nếu tôi hiểu chính xác, hệ điều hành cho các máy LISP đã được viết bằng LISP. Mặc dù có lẽ có thể lập luận rằng phương ngữ được sử dụng là ngôn ngữ cấp thấp?
Robert Fisher

Câu trả lời:


38

Microsoft đã thực hiện một số nghiên cứu rất thú vị theo hướng này, nếu bạn nhìn vào Singularity:

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

Ngoài ra, Mothy Roscoe và cộng sự đã làm việc trên Barrelfish, sử dụng ngôn ngữ lập trình ràng buộc Eclipse làm dịch vụ HĐH để loại bỏ tất cả các loại vấn đề về quản lý và phân bổ tài nguyên hệ điều hành:

http://www.barrelfish.org/


Ồ, tôi không thể bỏ phiếu, cần 15 đại diện ... mới tham gia hôm nay! Cảm ơn rất nhiều.
rtindru

9
@rtindru: thậm chí với 1 điểm lặp lại, bạn có thể chấp nhận câu trả lời Có nghĩa là gì khi câu trả lời được "chấp nhận"?
Marjan Venema

6
Chấp nhận một câu trả lời có xu hướng cắt giảm các câu trả lời / thảo luận mới. Cá nhân, tôi khuyên bạn không nên chấp nhận (đối với câu hỏi cụ thể này) trong ít nhất một ngày nữa.
Brian

1
Tôi sẽ thêm Cosmos vào nhóm: nguồn mở, bên thứ ba, không thú vị như số ít nhưng có một số ý tưởng hay! cosmos.codeplex.com
Lorenzo Dematté

38

Rất nhiều phụ thuộc vào nơi bạn đặt sự phân chia giữa các ngôn ngữ cấp thấp và cấp cao. Ví dụ, những người khác nhau có xu hướng đặt một ngôn ngữ như C ++ trên các mặt khác nhau của sự phân chia đó.

Về câu hỏi của bạn:

  1. Tôi không tin có sự khác biệt như vậy giữa ngôn ngữ cấp thấp và cấp cao, nhưng sự khác biệt nhiều hơn giữa ngôn ngữ được giải thích và ngôn ngữ biên dịch theo hướng dẫn bản địa.

    Nhưng cũng có thể có một sự khác biệt về văn hóa giữa các lập trình viên, trong đó một lần sử dụng ngôn ngữ cấp thấp tập trung nhiều hơn vào các khía cạnh hiệu suất của các lựa chọn (thiết kế) mà họ đưa ra.

  2. Nếu bạn coi C ++ là cấp cao, thì có ít nhất một HĐH được viết hoàn toàn bằng ngôn ngữ cấp cao (Hệ điều hành Symbian được viết bằng C ++). Điều ngăn bạn viết HĐH bằng hầu hết các ngôn ngữ cấp cao là hai điều:

    • Một hệ điều hành cần truy cập cấp thấp vào bộ nhớ và phần cứng và thực hiện các thủ thuật bẩn trên chúng. Loại truy cập này thường được coi là không an toàn cho các chương trình cấp ứng dụng, vì vậy nhiều ngôn ngữ cấp cao không cho phép.
    • Một hệ điều hành cần phải thực thi mà không có phần mềm hỗ trợ, chẳng hạn như thông dịch viên. Điều này khiến việc viết một HĐH bằng ngôn ngữ không thể dễ dàng biên dịch thành các hướng dẫn riêng.

35
Không có thứ gọi là ngôn ngữ diễn giải hay ngôn ngữ biên dịch theo hướng dẫn bản địa. Một ngôn ngữ là một tập hợp các quy tắc toán học, nó không được giải thích hay biên dịch, nó chỉ . Interp. và Comp. là những đặc điểm của, tốt, thông dịch viên hoặc trình biên dịch, không phải ngôn ngữ. Mọi ngôn ngữ có thể được thực hiện bằng trình biên dịch hoặc trình thông dịch. Hầu hết các ngôn ngữ ngày nay đều có cả việc thực hiện và biên dịch. Có các trình thông dịch cho C và tất cả các triển khai JavaScript chính được biên dịch thành mã gốc. Và mã nguồn là gì? Nếu tôi biên dịch Java thành mã byte JVM và chạy
Jörg W Mittag

11
rằng trên CPU Java và tôi biên dịch mã C thành ARM và chạy mã đó trên trình thông dịch ARM vì PC của tôi không có CPU ARM, vậy thì điều gì làm cho ARM bản địa và JVML không?
Jörg W Mittag

5
@ JörgWMittag: Nếu bạn có CPU có thể thực thi trực tiếp mã byte Java (mà không cần sử dụng JVM bổ sung), thì mã byte Java là mã gốc cho CPU đó. Ngoài ra, tôi không loại trừ khả năng viết HĐH bằng ngôn ngữ thường được diễn giải hoặc thực thi trong VM, nhưng điều đó làm cho chúng trở thành những lựa chọn ít rõ ràng hơn.
Bart van Ingen Schenau

15
@ JörgWMittag - Tôi đồng ý rằng bất kỳ ngôn ngữ nào cũng có thể được biên dịch hoặc giải thích (biên dịch tập lệnh bash; sử dụng C ++ (CINT / Cling)), nhưng nhiều quyết định trong thiết kế ngôn ngữ sẽ được giải thích, biên dịch hoặc cả hai. Một ngôn ngữ khiến bạn khai báo / khởi tạo thủ công các biến được nhập tĩnh, cấp phát thủ công / bộ nhớ trống, làm số học con trỏ, nhớ kiểm tra giới hạn mảng sẽ kém thuận tiện hơn trong trình thông dịch (so với ngôn ngữ thu gom bộ nhớ, loại động, kiểm tra giới hạn mảng). Là dòng này rõ ràng 100%? Không, nhưng sự khác biệt tồn tại trong thực tế.
dr jimbob

15

Có một số lý do tốt cho việc này.

Ngôn ngữ cấp thấp ngày nay là ngôn ngữ cấp cao của ngày hôm qua

Có, tin hay không, ngày xưa, ngay cả C cũng được xem là ngôn ngữ cấp cao. Thậm chí ~ 20 năm trước, nó đủ phổ biến để xem nó được mô tả như một ngôn ngữ "trung cấp". Đây là một thời gian trước khi OO phổ biến như ngày nay, Java không tồn tại, C # không tồn tại, thậm chí C ++ chưa được chuẩn hóa đúng cách.

Quán tính lịch sử

Hệ điều hành mà bạn sử dụng ngày nay có nguồn gốc sâu xa trong lịch sử. Windows quay trở lại đầu thập niên 80 / giữa, Unix quay trở lại đầu thập niên 70 / giữa. Có rất nhiều mã làm việc cũ trong các hệ điều hành và bạn thường không muốn viết lại mã làm việc cũ.

Đến một lúc nào đó bạn phải xuống phần cứng

Điều này xảy ra trong kernel, nó xảy ra trong trình điều khiển, nó xảy ra trong các hệ thống con quản lý bộ nhớ, nó xảy ra trong hệ thống tập tin. Chắc chắn bạn có thể đặt một ngôn ngữ cấp cao lên trên nó, nhưng bạn vẫn cần khả năng truy cập trực tiếp hơn vào phần cứng mà ngôn ngữ cấp thấp hơn cung cấp.

Tính di động

Tôi không có nghĩa là tính di động đối với phần cứng khác nhau hoặc một hệ điều hành khác vì ngày nay nó được hiểu phổ biến hơn; Điều này là tinh tế hơn. Có một lợi thế lớn khi cung cấp giao diện dựa trên C cho một thứ gì đó, và đó là thực tế là hầu như mọi ngôn ngữ khác tồn tại đều có thể liên kết với C. Ngay cả API Windows vẫn là API dựa trên C ngày nay vì lý do đó.

Sở thích cá nhân

Một số người chỉ thích lập trình theo cách này, và đó có thể là một yếu tố chính. Ví dụ, Linus Torvalds có một câu nói nổi tiếng chống lại C ++ , điều này cho thấy khá rõ rằng theo như anh ta quan tâm, C sẽ luôn là công cụ lựa chọn của anh ta cho loại công việc này (nội dung của câu thần chú và bạn có đồng ý với nó không không liên quan đến cuộc thảo luận này, thực tế là lời nói tồn tại là đủ).

Được kết hợp với nhau, những điều này sẽ xác định rõ ràng lý do tại sao một hệ điều hành ban đầu được viết bằng thứ gì đó như C trở lại vào thời xưa và tại sao những phần rất quan trọng của nó - ngay cả ngày nay - vẫn còn như vậy.


13

Một lý do chính cho sự thống trị của C đối với các hệ điều hành nằm trong lịch sử - các hệ điều hành chính hiện tại như Windows và tất cả các dạng Unix (BSD, Solaris, HP-UX, MacOS X, ... cũng như các bản sao như Linux) đã quay trở lại một thời gian dài, trước khi OO và các cấu trúc "cấp cao" khác trở thành xu hướng.

Đối với cốt lõi của hệ điều hành bên cạnh hiệu năng, cần phải rất cụ thể về các hướng dẫn phần cứng và người ta cần kiểm soát hoàn toàn bộ nhớ mà các ngôn ngữ như C làm rất tốt.

Đối với các hệ thống nhúng đôi khi có các hệ điều hành sử dụng các ngôn ngữ cấp cao hơn cho các phần lớn hơn của hệ thống. Một ví dụ đáng chú ý là JavaOS của Sun.

Đối với các hệ điều hành rộng rãi, một ví dụ đáng chú ý không sử dụng C cũng là MacOS cổ điển trước MacOS X - phần lớn được viết bằng phương ngữ Pascal cho phép một số dạng định hướng đối tượng.


12

Đầu tiên, có một số vấn đề bootstrap. Hầu hết các tính năng giúp ngôn ngữ cấp cao trở nên dễ dàng hơn dựa trên sự trừu tượng mà hạt nhân phải tự cung cấp. Làm thế nào để bạn viết một trình quản lý bộ nhớ bằng ngôn ngữ yêu cầu trình quản lý bộ nhớ? Làm thế nào để bạn viết trình điều khiển I / O mà không sử dụng các thư viện chuẩn I / O đẹp của ngôn ngữ của bạn? Làm thế nào để bạn tạo các nguyên thủy luồng và đồng bộ hóa mà không sử dụng các thư viện của ngôn ngữ?

Thứ hai, nó cực kỳ hữu ích và dễ đọc hơn nhiều khi viết các hệ điều hành để có thể gán một biến cho một vị trí bộ nhớ cụ thể. Điều này là dễ dàng trong C, và mọi lập trình viên C đơn lẻ đều biết cách thực hiện. Nếu nó thậm chí có thể với các ngôn ngữ cấp cao hơn, thì rất hiếm khi chỉ có các bậc thầy mới biết cách làm điều đó.

Nói cách khác, khi bạn tính đến tất cả các giới hạn và sửa đổi bạn sẽ phải chấp nhận, C và C ++ bắt đầu dễ dàng hơn rất nhiều.


2
Đoạn đầu tiên của bạn không có ý nghĩa. Trình điều khiển I / O trong C cũng không sử dụng stdio.h. Một triển khai mutex tùy chỉnh không sử dụng pthreads. Đó chính xác là ý nghĩa của việc tự thực hiện nó! Và đó là độc lập với ngôn ngữ bạn đang sử dụng. Điều đó không có nghĩa là các ngôn ngữ cấp cao là một lựa chọn tốt cho các nhiệm vụ cấp thấp (chúng thường không theo kinh nghiệm của tôi).

Tôi biết điều đó. Tôi chỉ chỉ ra rằng rất nhiều thứ phân biệt cấp độ cao với ngôn ngữ cấp thấp nằm trong những phần của ngôn ngữ không có sẵn trong phát triển kernel. Khi bạn so sánh lõi ngôn ngữ với lõi, C sẽ không còn giống Spartan nữa.
Karl Bielefeldt

Không hoàn toàn đúng. Mặc dù bạn sẽ cần một số mã không sử dụng X để triển khai X, tất cả các mã còn lại có thể phụ thuộc vào mã đó và sử dụng X.

Đó là một điểm hay.
Karl Bielefeldt

6

Trước hết, bootstrapping yêu cầu ít nhất một phần nhỏ được viết bằng hội hoặc tương đương.

Thứ hai, có một hệ điều hành được viết trong một indisputably HLL - Lisp Machine . (Việc nó thất bại về mặt thương mại có liên quan nhiều hơn đến việc phần cứng khác trở nên rẻ hơn nhanh hơn và chiến thắng của Worse tốt hơn so với sự thiếu sót về triết lý hoặc thiết kế của nó).

Thứ ba, C ++ khá hướng đối tượng và mức độ cao, vì vậy, như những người khác đã chỉ ra, hệ điều hành Symbian là một ví dụ khác.

Thứ tư, có rất ít nhu cầu về hệ điều hành mới tại thời điểm này. Chúng tôi đã có khá nhiều hương vị linux và bsd chạy trên bất kỳ phần cứng nào và việc tạo ra một hệ điều hành hoàn toàn mới từ đầu khá tốn kém.


Bạn đã bỏ lỡ các máy tính lớn B5000 của Burroughs. Hệ điều hành của họ được viết trong Burroughs Extended ALGOL.
John R. Strohm

1
there is little need for new OSes at this timeTôi vẫn chưa quyết định liệu điều này có đúng hay không .. Vâng, các hệ điều hành hiện đại (cửa sổ hiện đại (NT) / Unix hiện đại) là tất cả những gì chúng ta cần, chức năng và hiệu năng khôn ngoan. Nhưng hầu như không: họ được sinh ra ở một khu vực khác, nơi "mạng" là công ty / trường đại học và người dùng đáng tin cậy, và bội số là 2/4 bộ xử lý. Họ bị "vấy bẩn", ở một mức độ nào đó, bởi sự tin tưởng quá mức (rootkit, phần mềm độc hại, virus ..). Tôi bắt đầu nghĩ rằng có không gian IS cho một hệ điều hành hiện đại, an toàn, tách biệt ... với sự hỗ trợ tốt hơn cho sự song song (tốt hơn là các chủ đề)
Lorenzo Dematté

Lisp mức thấp, CARCDRIBM 704 lắp ráp macro ! Ngay cả C tách riêng lắp ráp nội tuyến , thay vì coi nó như bất kỳ chức năng nào khác. Xem xét Lisp CARCDRlàm việc trên x86, ARM và một loạt các ISA, đó là một số lắp ráp di động ấn tượng. (Lưu ý Side cho bất cứ ai tôi có thể đã nhầm lẫn: Vâng, Lisp là một ngôn ngữ cấp cao. CARCDRlà macro lắp ráp đã được chỉ là một chi tiết thực hiện, không phải là một tính năng quan trọng;.))
8bittree

4

Để giai đoạn tốt hơn những gì tôi đã viết trước đây.

Các máy Burxxs 5xxx - 6xxx không có ngôn ngữ lắp ráp. Ngôn ngữ thấp nhất có sẵn là một phần mở rộng cho Algol. Algol được thực hiện trong phần cứng. HĐH và tất cả các ngôn ngữ được viết bằng Algol. Nó vượt trội hơn tất cả các máy cạnh tranh thời đó. Nó cũng yêu cầu mã ít hơn đáng kể giúp bảo trì dễ dàng hơn nhiều. Nó có phần cứng ngăn xếp hỗ trợ một ngôn ngữ đệ quy như Algol.

Hệ điều hành Burroughs đã phát triển thành một phiên bản gọi là MCP. MCP hiện đang chạy trên các hệ thống Unisys.


3

Hầu hết các ngôn ngữ cấp cao hơn mà bạn đề cập đều có một tính năng không phù hợp với hệ điều hành: Quản lý bộ nhớ tự động. Bạn không thể dựa vào trình thu gom rác khi viết hệ thống thời gian thực - mềm (đó là hệ điều hành) hoặc thậm chí là khó nhất. Để trích dẫn Tanenbaum [i]:

Một số thứ mà C không có bao gồm chuỗi, luồng, gói, lớp, đối tượng, an toàn kiểu và bộ sưu tập rác tích hợp. Cái cuối cùng là một nút chặn hiển thị cho các hệ điều hành. Tất cả lưu trữ trong C là tĩnh hoặc được phân phối rõ ràng và được phát hành bởi lập trình viên, thường là với chức năng thư viện mallocmiễn phí . Đây là thuộc tính thứ hai - tổng kiểm soát lập trình viên trên bộ nhớ - cùng với các con trỏ rõ ràng làm cho C hấp dẫn để viết các hệ điều hành. Các hệ điều hành về cơ bản là các hệ thống thời gian thực ở một mức độ nào đó, thậm chí là các mục đích chung. Khi xảy ra gián đoạn, hệ điều hành có thể chỉ có một vài micro giây để thực hiện một số hành động hoặc mất thông tin quan trọng. Có bộ sưu tập rác đá vào một thời điểm tùy ý là không thể chịu đựng được.

Bây giờ, bạn có thể lập luận rằng C ++ cũng là một ứng cử viên tốt vì nó cung cấp quản lý bộ nhớ thủ công. C ++ đã được sử dụng trong một số hệ điều hành như Symbian (được đề cập bởi Bart ) và BeOS. Nhưng IMHO C vẫn là ngôn ngữ nhanh nhất có thể được chuyển trong nhiều kiến ​​trúc mà không cần nỗ lực lớn (trái ngược với lắp ráp một kiến ​​trúc cụ thể).

[i]: Phiên bản thứ 3 của Hệ điều hành hiện đại, trang 73


3
Máy tượng trưng có quản lý bộ nhớ tự động. Smalltalk đã làm trên một chiếc Alto. Đó là vào những năm 80. Một hệ thống loại tuyến tính loại bỏ hoàn toàn sự cần thiết cho GC. Đây là những vấn đề được giải quyết, nếu chỉ chúng ta có thể nhớ điều đó!
Frank Shearar

Ngôn ngữ có thể bao gồm quản lý bộ nhớ tự động, nhưng bao gồm một loại tham chiếu "được ghim sâu" đặc biệt và cho phép các phương thức tuyên bố rõ ràng rằng chúng sẽ không truy cập bất kỳ tham chiếu không ghim nào hoặc gọi bất kỳ phương thức nào có thể làm như vậy. Sẽ không cần người thu gom rác thế giới can thiệp vào mã đang chạy trong một phương thức sẽ không truy cập vào bất kỳ đối tượng nào có thể được sửa đổi bởi GC.
supercat

2

Như những người khác đã chỉ ra, một số hệ điều hành đã được viết bằng các ngôn ngữ cấp cao. Có lẽ điều bạn muốn nói là tất cả các hệ điều hành chung, thị trường đại chúng, thành công đã được viết bằng một số kết hợp của lắp ráp, C và C ++?

Hầu hết các ngôn ngữ cấp cao có hàng tấn các tính năng hữu ích mang chi phí hiệu suất liên quan. Quản lý bộ nhớ tự động là một ví dụ rõ ràng, kiểm tra giới hạn của mảng là khác. Nếu bạn đang viết một HĐH cho mục đích chung, bạn có khả năng gặp phải tình huống trong đó hình phạt hiệu năng của các tính năng hữu ích này nhiều hơn mức bạn sẵn sàng trả. Tại thời điểm đó, bạn muốn có thể tắt chúng đi. Các ngôn ngữ như Python, C # và Java khác nhau về các tính năng bạn có thể tắt, nhưng không có ngôn ngữ nào linh hoạt như C hoặc C ++ về vấn đề này.

Ở khía cạnh này, C và C ++ gần như linh hoạt như lắp ráp thuần túy. Nếu bạn quyết định rằng bạn cần mười trình quản lý bộ nhớ khác nhau bao gồm mười kịch bản phân bổ bộ nhớ khác nhau, bạn có thể thực hiện tất cả chúng trong C và C ++, và tải và hủy tải chúng khi bạn thấy phù hợp. Heck, bạn thậm chí không phải liên kết với các thư viện thời gian chạy C tiêu chuẩn hoặc mã khởi động nếu bạn không muốn.


0

Câu trả lời thực sự là Tiền . Không có đủ lợi ích nhận thức của một hệ điều hành ngôn ngữ cấp cao để biện minh cho việc chi tiêu tài nguyên để xây dựng một hệ thống và sau đó đẩy nó vào dòng chính. Chẳng hạn, có chi phí lớn liên quan đến việc xây dựng trình điều khiển mới cho từng phần cứng cần hỗ trợ.

Có nhiều hệ điều hành khác nhau được viết bằng các ngôn ngữ cấp cao, với mục đích chính là nghiên cứu, như OberonSingularity .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.