Là một ngôn ngữ lắp ráp phổ quát cho tất cả các máy tính có thể?


23

Tôi muốn hỏi một vài câu hỏi về ngôn ngữ hội. Tôi hiểu rằng nó rất gần với ngôn ngữ máy, làm cho nó nhanh hơn và hiệu quả hơn.

Vì chúng ta có các kiến ​​trúc máy tính khác nhau tồn tại, điều đó có nghĩa là tôi phải viết các mã khác nhau trong hội cho các kiến ​​trúc khác nhau? Nếu vậy, tại sao không hội, viết một lần - chạy mọi loại ngôn ngữ? Sẽ không dễ dàng hơn để làm cho nó trở nên phổ biến, để bạn chỉ viết một lần và có thể chạy nó trên hầu hết mọi máy có cấu hình khác nhau? (Tôi nghĩ rằng điều đó là không thể, nhưng tôi muốn có một số câu trả lời cụ thể, sâu sắc)

Một số người có thể nói C là ngôn ngữ tôi đang tìm kiếm. Trước đây tôi chưa sử dụng C nhưng tôi nghĩ nó vẫn là ngôn ngữ cấp cao, mặc dù có lẽ nhanh hơn Java chẳng hạn. Tôi có thể sai ở đây.


10
Bạn đã làm nghiên cứu gì? Chúng tôi hy vọng bạn thực hiện nghiên cứu trước khi hỏi, để giúp bạn hỏi một câu hỏi tốt hơn. Có rất nhiều chữ viết trên ngôn ngữ lắp ráp.
DW

4
Chúng tôi hy vọng bạn thực hiện một số lượng đáng kể nghiên cứu / tự nghiên cứu trước khi hỏi và cho chúng tôi biết trong câu hỏi bạn đã thực hiện nghiên cứu nào. Trong trường hợp này, nghiên cứu có thể bao gồm đọc các bài viết Wikipedia có liên quan (ví dụ, về ngôn ngữ lắp ráp và kiến ​​trúc máy tính) và đọc sách giáo khoa kiến ​​trúc máy tính. Để làm cho câu hỏi này tốt hơn: thực hiện nghiên cứu đó, nếu bạn chưa có, và sau đó chỉnh sửa câu hỏi để giải thích nghiên cứu bạn đã thực hiện. Thường thì loại nghiên cứu đó giúp bạn hình thành một câu hỏi hay hơn; và trong mọi trường hợp, nó giúp người trả lời tránh lặp lại những gì bạn đã biết.
DW

15
Bắt đầu với sự hiểu biết rằng / tại sao không có ngôn ngữ gọi là hội.
Raphael

2
một vấn đề "cổ điển" với tính di động C là các kích thước nguyên thủy (ví dụ số nguyên) khác nhau trên phần cứng khác nhau và có một số vấn đề khác được trích dẫn.
vzn

3
Đây là một vấn đề xã hội nhiều hơn là vấn đề kỹ thuật - bạn cần thuyết phục tất cả các nhà sản xuất CPU để làm cho CPU của họ chấp nhận cùng một ngôn ngữ máy. (Trên thực tế, x86 gần như sẽ là thế này, tình cờ - sau đó điện thoại thông minh đã tắt)
user253751

Câu trả lời:


45

Ngôn ngữ hội là cách viết hướng dẫn cho tập lệnh của máy tính , theo cách dễ hiểu hơn đối với các lập trình viên con người.

Các kiến ​​trúc khác nhau có các bộ hướng dẫn khác nhau: bộ hướng dẫn được phép là khác nhau trên mỗi kiến ​​trúc. Do đó, bạn không thể hy vọng có một chương trình lắp ráp viết một lần chạy ở mọi nơi. Chẳng hạn, bộ hướng dẫn được bộ xử lý x86 hỗ trợ trông rất khác so với bộ hướng dẫn được bộ xử lý ARM hỗ trợ. Nếu bạn đã viết chương trình lắp ráp cho bộ xử lý x86, nó sẽ có rất nhiều hướng dẫn không được hỗ trợ trên bộ xử lý ARM và ngược lại.

Lý do cốt lõi để sử dụng ngôn ngữ lắp ráp là vì nó cho phép kiểm soát mức độ rất thấp đối với chương trình của bạn và tận dụng tất cả các hướng dẫn của bộ xử lý: bằng cách tùy chỉnh chương trình để tận dụng các tính năng duy nhất cho bộ xử lý cụ thể. sẽ chạy trên, đôi khi bạn có thể tăng tốc chương trình. Triết lý viết một lần chạy ở mọi nơi về cơ bản là mâu thuẫn với điều đó.


1
Tôi nghĩ rằng câu hỏi đã được trả lời bởi đoạn 3 của câu trả lời của tôi. Như bạn đã nói, một sơ đồ như vậy sẽ không hiệu quả, vì vậy về cơ bản nó sẽ mâu thuẫn với lý do cốt lõi là sử dụng ngôn ngữ lắp ráp.
DW

26
@nTuply Ngay sau khi bạn sửa đổi ngôn ngữ lắp ráp của mình để phục vụ cho các máy khác nhau, nó sẽ trở thành ngôn ngữ cấp cao với cú pháp kiểu lắp ráp khủng khiếp. Khi bạn đã quyết định sử dụng ngôn ngữ cấp cao, bạn cũng có thể sử dụng ngôn ngữ có cú pháp thân thiện hơn và để trình biên dịch thực hiện công việc khó khăn.
David Richerby

15
Đây không phải là một ý tưởng hoàn toàn ngu ngốc khi có một "ngôn ngữ lắp ráp" được dịch cho các máy khác nhau, vì về cơ bản đó là "IR" của LLVM. Tuy nhiên, vì những lý do David đưa ra, bạn thường không viết lắp ráp LLVM. Ngoài ra bởi vì 99 lần trong số 100 bạn làm công việc viết nó tồi tệ hơn so với việc dịch C sang LLVM của bạn. Ngôn ngữ hội có khả năng hiệu quả cao hơn ngôn ngữ cấp cao, nhưng trong tay hầu hết các lập trình viên thực tế với một lượng thời gian điển hình có sẵn để tối ưu hóa, dù sao họ cũng không đạt được tiềm năng của mình.
Steve Jessop

9
@nTuply, tồn tại. Quá trình đi từ ngôn ngữ lắp ráp thêm đó sang hướng dẫn máy được gọi là biên dịch.
Paul Draper

3
@PJTraill Không có lý do gì để viết trình biên dịch trong trình biên dịch chương trình trên một hệ thống hiện đại, ngoại trừ bước bootstrapping đầu tiên (và hầu hết thời gian, thậm chí không phải lúc đó). Trình biên dịch viết bằng ngôn ngữ cấp cao là bao la nhiều khả năng để thực sự được duy trì. Cũng so sánh Làm thế nào một ngôn ngữ có trình biên dịch được viết bằng C có thể nhanh hơn C? . Mục đích của trình biên dịch là dịch từ một ngôn ngữ (ngôn ngữ nguồn) sang ngôn ngữ khác (thường là ngôn ngữ máy cho một kiến ​​trúc và hệ điều hành cụ thể); điều này có thể được viết bằng bất kỳ ngôn ngữ nào
một CVn

13

ĐỊNH NGH ofA của ngôn ngữ lắp ráp là ngôn ngữ có thể được dịch trực tiếp sang mã máy. Mỗi mã hoạt động trong ngôn ngữ lắp ráp chuyển thành chính xác một thao tác trên máy tính đích. (Chà, nó phức tạp hơn một chút so với điều đó: một số nhà lắp ráp tự động xác định "chế độ địa chỉ" dựa trên các đối số cho một mã op. Tuy nhiên, nguyên tắc là một dòng lắp ráp dịch sang một lệnh ngôn ngữ máy.)

Không còn nghi ngờ gì nữa, bạn có thể phát minh ra một ngôn ngữ trông giống ngôn ngữ lắp ráp nhưng sẽ được dịch sang các mã máy khác nhau trên các máy tính khác nhau. Nhưng theo định nghĩa, đó sẽ không phải là ngôn ngữ lắp ráp. Nó sẽ là một ngôn ngữ cấp cao hơn giống với ngôn ngữ lắp ráp.

Câu hỏi của bạn giống như hỏi, "Có thể làm một chiếc thuyền không nổi hoặc có cách nào khác để đi trên mặt nước, nhưng có bánh xe và động cơ và có thể đi trên đất liền không?" Câu trả lời sẽ là theo định nghĩa, một chiếc xe như vậy sẽ không phải là một chiếc thuyền. Nghe có vẻ giống một chiếc xe hơi.


1
C thường được mô tả là "ngôn ngữ lắp ráp di động."
Larry Gritz

2
@LarryGritz Chắc chắn. Và khi C được phát minh, điều đó là đột phá: Nó mang lại nhiều sức mạnh của ngôn ngữ lắp ráp với sự dễ sử dụng được biên dịch. Nhưng theo định nghĩa, nó vẫn là một ngôn ngữ được biên dịch
Jay

8

Không có lý do khái niệm (tôi dám, không có khoa học máy tính ) chống lại việc có một ngôn ngữ lắp ráp cho tất cả các máy tính trên thế giới. Trong thực tế, điều đó sẽ làm cho nhiều thứ dễ dàng hơn nhiều. Theo như lý thuyết có liên quan, dù sao thì tất cả chúng đều giống nhau, cho đến một vài điều thú vị.

Tuy nhiên, trên thực tế, có các chip khác nhau cho các mục đích khác nhau, với các hoạt động và nguyên tắc thiết kế khác nhau (ví dụ RISC so với CISC) phục vụ các mục tiêu khác nhau và các bộ hướng dẫn vận hành chúng và các ngôn ngữ lắp ráp khác nhau. Cuối cùng, câu trả lời giống như khi hỏi tại sao có quá nhiều ngôn ngữ lập trình khác nhau: mục tiêu khác nhau, quyết định thiết kế khác nhau.

Điều đó nói rằng, tất nhiên bạn có thể giới thiệu các mức độ trừu tượng để có được một số giao diện được chia sẻ. x86, chẳng hạn, đã bị loại bỏ ở cấp độ chip khá lâu; có một phần cứng nhỏ dịch các hướng dẫn x86 sang bất cứ bộ xử lý nào của bạn thực sự hoạt động. Các ngôn ngữ như C sẽ là một bước tiến xa khỏi phần cứng (nếu là một ngôn ngữ nhỏ bé có thể tranh cãi), tất cả các ngôn ngữ như Haskell, Java hoặc Ruby. Vâng, trình biên dịch là một trong những thành tựu chính của khoa học máy tính bởi vì chúng làm cho nó có thể tách rời các mối quan tâm theo cách này.


6
"Nếu một người nhỏ bé được cho là" - có hai loại lập trình viên của bạn ngay tại đó. Những người coi C là ngôn ngữ cấp thấp vì các hoạt động cơ bản của nó trông rất giống với các loại thứ xuất hiện trong các tập lệnh CPU và những người coi C là ngôn ngữ cấp cao vì nó không giống với bộ lệnh.
Steve Jessop

Nếu bằng ngôn ngữ lắp ráp, bạn có nghĩa là một người kiểm soát hoàn toàn mã máy được tạo cho một loại phần cứng (hoặc gia đình) cụ thể, thì có thể định nghĩa một ngôn ngữ cho tất cả các máy tính trong thế giới của chúng ta tại một thời điểm nhất định, nhưng nó sẽ phải tiếp tục thay đổi Nó sẽ thừa nhận (nếu được thiết kế tốt) rút ngắn thời gian học mã hóa cho kiến ​​trúc mới, nhưng tôi hy vọng bất kỳ công việc nào bạn muốn làm với nó thay vì trình biên dịch sẽ chỉ áp dụng cho một phần nhỏ kiến ​​trúc. Các máy tính giống nhau ở mức độ trừu tượng là cá trích đỏ, đó là về mã máy.
PJTraill

7

Bạn đề cập đến cụm từ "viết một lần chạy bất cứ nơi nào" mà dường như không nhận thấy tầm quan trọng của nó. Đó là khẩu hiệu tiếp thị cho Sun Microsystems rằng mục đích thương mại đã phát minh ra khái niệm về một "máy ảo""bytecode" cho Java, mặc dù có thể là ý tưởng có thể có nguồn gốc từ học viện 1 st. Ý tưởng này sau đó đã được Microsoft sao chép cho .Net sau khi họ bị Sun kiện thành công vì vi phạm vi phạm cấp phép Java. Mã byte Java là một triển khai của ý tưởng lắp ráp máy chéo hoặc ngôn ngữ máy. Chúng được sử dụng cho một số ngôn ngữ khác ngoài Java và về mặt lý thuyết có thể được sử dụng để biên dịch bất kỳ ngôn ngữ nào. Sau nhiều năm tối ưu hóa rất tiên tiến, Java đã tiến gần đến hiệu suất đối với các ngôn ngữ được biên dịch cho thấy mục tiêu của nền tảng công nghệ máy ảo không tin tưởng nền tảng hiệu suất cao nói chung là có thể đạt được.

Một ý tưởng mới khác trong giai đoạn đầu / lưu hành liên quan đến yêu cầu của bạn được gọi là dự án tính toán lại và dành cho nghiên cứu khoa học mặc dù có thể được sử dụng cho các mục đích khác. Ý tưởng là làm cho các thí nghiệm tính toán có thể nhân rộng thông qua công nghệ máy ảo. Đây chủ yếu là ý tưởng mô phỏng các kiến ​​trúc máy khác nhau trên phần cứng tùy ý.


8
Sun đã không phát minh ra máy ảo hoặc mã byte, họ thậm chí không phải là nhóm đầu tiên kiếm tiền từ chúng. Tra cứu mã p.
jmoreno

@jmoreno: anh ấy cũng có thể muốn tìm kiếm Smalltalk.
Bob Jarvis - Tái lập Monica

bài viết không yêu cầu mặt trời phát minh ra máy ảo / mã byte. có lịch sử khác không được trích dẫn nhưng ám chỉ. btw một công nghệ quan trọng khác rất phù hợp ở đây: google client client (tính năng chrome)
vzn

5

Lý do cấp cao

Khi bạn nghĩ về nó, một bộ vi xử lý làm một điều tuyệt vời: nó cho phép bạn lấy một máy (như máy giặt hoặc thang máy), và thay thế toàn bộ các cơ chế hoặc mạch được thiết kế tùy chỉnh bằng silicon rẻ tiền, sản xuất hàng loạt Chip. Bạn tiết kiệm rất nhiều tiền cho các bộ phận, và rất nhiều thời gian cho thiết kế.

Nhưng treo trên, một con chip tiêu chuẩn , thay thế vô số thiết kế tùy chỉnh ? Không thể có một bộ vi xử lý duy nhất, hoàn hảo, hoàn hảo cho mọi ứng dụng. Một số ứng dụng cần giảm thiểu sử dụng năng lượng nhưng không cần phải nhanh; những người khác cần phải nhanh chóng nhưng không cần phải dễ lập trình, những người khác cần chi phí thấp, v.v.

Vì vậy, chúng ta có nhiều "hương vị" khác nhau của bộ vi xử lý, mỗi loại có điểm mạnh và điểm yếu riêng. Tất cả họ đều mong muốn sử dụng một bộ hướng dẫn tương thích, bởi vì điều này cho phép tái sử dụng mã và giúp dễ dàng tìm thấy những người có kỹ năng phù hợp. Tuy nhiên, bộ hướng dẫn không ảnh hưởng đến chi phí, độ phức tạp, tốc độ, tính dễ sử dụng và các ràng buộc vật lý của bộ xử lý và do đó chúng tôi có một thỏa hiệp: có một vài bộ hướng dẫn "chính thống" (và nhiều bộ phụ) và trong mỗi tập lệnh có nhiều bộ xử lý với các đặc tính khác nhau.

Ồ, và khi công nghệ thay đổi, tất cả những sự đánh đổi này đều thay đổi, vì vậy các bộ hướng dẫn phát triển, những cái mới xuất hiện và những cái cũ sẽ chết. Ngay cả khi có một bộ hướng dẫn "tốt nhất" ngày hôm nay, nó có thể không tồn tại trong 20 năm.

Chi tiết phần cứng

Có lẽ quyết định thiết kế lớn nhất trong một tập lệnh là kích thước từ , tức là số lượng lớn bộ xử lý có thể "tự nhiên" thao tác. Bộ xử lý 8 bit xử lý các số từ 0-255, trong khi bộ xử lý 32 bit xử lý các số từ 0 đến 4.294.967.295. Mã được thiết kế cho một người cần phải được xem xét lại hoàn toàn cho người khác.

Đây không chỉ là vấn đề dịch các hướng dẫn từ tập lệnh này sang tập lệnh khác. Một cách tiếp cận hoàn toàn khác nhau có thể được ưa thích hơn trong một tập lệnh khác. Ví dụ, trên bộ xử lý 8 bit, bảng tra cứu có thể là lý tưởng, trong khi trên bộ xử lý 32 bit, hoạt động số học sẽ tốt hơn cho cùng một mục đích.

Có sự khác biệt lớn khác giữa các bộ hướng dẫn. Hầu hết các hướng dẫn rơi vào bốn loại:

  • Tính toán (Số học và logic)
  • Kiểm soát dòng chảy
  • Truyền dữ liệu
  • Cấu hình bộ xử lý

Bộ xử lý khác nhau về loại tính toán mà chúng có thể thực hiện, cũng như cách chúng tiếp cận luồng điều khiển, truyền dữ liệu và cấu hình bộ xử lý.

Ví dụ, một số bộ xử lý AVR không thể nhân hoặc chia; trong khi tất cả các bộ xử lý x86 có thể. Như bạn có thể tưởng tượng, việc loại bỏ các mạch cần thiết cho các tác vụ như nhân và chia có thể làm cho bộ xử lý đơn giản hơn và rẻ hơn; các thao tác này vẫn có thể được thực hiện bằng các thói quen phần mềm nếu cần thiết.

x86 cho phép các hướng dẫn số học tải các toán hạng của chúng từ bộ nhớ và / hoặc lưu kết quả của chúng vào bộ nhớ; ARM là một kiến ​​trúc lưu trữ tải và do đó chỉ có một vài hướng dẫn chuyên dụng để truy cập bộ nhớ. Trong khi đó x86 có các hướng dẫn nhánh có điều kiện dành riêng, trong khi ARM thực tế cho phép tất cả các lệnh được thực hiện có điều kiện. Ngoài ra, ARM cho phép thay đổi bit được thực hiện như một phần của hầu hết các hướng dẫn số học. Những khác biệt này dẫn đến các đặc tính hiệu suất khác nhau, sự khác biệt trong thiết kế bên trong và giá thành của chip và sự khác biệt về kỹ thuật lập trình ở cấp độ ngôn ngữ lắp ráp.

Phần kết luận

Lý do không thể có ngôn ngữ lắp ráp phổ quát là vì, để chuyển đổi chính xác mã lắp ráp từ tập lệnh này sang tập lệnh khác, người ta phải thiết kế lại mã một lần nữa.


Câu trả lời tuyệt vời! Mọi người không hiểu rõ rằng điện toán hóa những thứ cần được lập trình ở khắp mọi nơi trong chúng ta. Đó không chỉ là các ứng dụng chúng ta thấy đang chạy trên màn hình. Có bao nhiêu tỷ chip được sản xuất mỗi năm?
phs

4

Thêm vào câu trả lời tuyệt vời của DW: nếu bạn muốn có một trình biên dịch, nó sẽ cần duy trì tất cả các kiến ​​trúc, người dịch hoàn hảo trong số họ và hoàn toàn hiểu bạn đang làm gì.
Một số mã được tối ưu hóa mạnh cho mỗi một kiến ​​trúc sẽ cần phải được tối ưu hóa, được hiểu ở mức độ trừu tượng hơn và được tối ưu hóa cho nhau.
Nhưng nếu điều này là có thể, chúng ta sẽ có trình biên dịch C hoàn hảo và việc viết trong lắp ráp thuần túy sẽ không có ích gì cả.
Điểm chính của việc sử dụng trình biên dịch là hiệu năng, không thể nén được từ các trình biên dịch gần đây.
Viết chương trình như vậy thậm chí còn khó hơn các trình biên dịch hiện có và duy trì tất cả các kiến ​​trúc mới đang được tạo sẽ làm cho nó thậm chí còn khó hơn.
Và đối với chương trình "chỉ có một", nó cũng có nghĩa là khả năng tương thích ngược hoàn toàn.


Đối với phần lớn các trường hợp, gcc thực hiện tối ưu hóa tốt hơn so với một lập trình viên có thể. Điểm chính của việc sử dụng trình biên dịch chương trình là để thực hiện những thứ bạn không thể làm trong C như truy cập các thanh ghi. Nếu bạn nhìn vào cây nguồn Linux, đó là những gì họ sử dụng để lắp ráp.
slebetman

@slebetman - gcc cho phép bạn đặt một biến vào một thanh ghi mà không cần dùng đến lắp ráp.
Jirka Hanika

@JirkaHanika: bạn đang nói về các thanh ghi CPU hoặc các thanh ghi phần cứng cho mục đích đặc biệt được giải quyết với các hướng dẫn đặc biệt? Tôi nghi ngờ slebetman có nghĩa là sau này.
PJTraill

"Tất cả các mã" - "GCC làm tốt hơn" = "bạn sử dụng trình biên dịch chương trình". Có, bạn có thể truy cập vào các thanh ghi mà không cần chèn trình biên dịch.
Ác

@PJTraill - Nhận xét của Slebetman nói chung là tuyệt vời và có lẽ nên được đưa vào câu trả lời. Nhưng, cả hai ví dụ của anh ấy (truy cập đăng ký và cây nguồn Linux) có thể cung cấp những hiểu lầm phổ biến hơn là chúng sẽ là những ví dụ tuyệt vời về những gì người ta không thể làm trong C với các phần mở rộng gcc; những người nên được thay thế hoặc bỏ qua. (Nếu có một hướng dẫn HW để làm điều gì đó ngày hôm nay, bạn sẽ có phần mở rộng gcc tương ứng mỗi năm từ nay Không phải lúc nào, nhưng rất thường Ví dụ tuổi...)
Jirka Hanika

3

Microsoft đã phát minh ra MSIL là ngôn ngữ lắp ráp trung gian. Các chương trình sẽ biên dịch từ C # hoặc VB.Net sang MSIL. Trong thời gian chạy, MSIL đã được biên dịch thành mã máy cho máy đang chạy nó bằng trình biên dịch JIT . Tệp có chứa MSIL là tệp .EXE với một vài hướng dẫn ở đầu X86 để bắt đầu chương trình. Trên bộ xử lý ARM, bạn nhập từ đơn âm trước tên chương trình để chạy.


Sự khác biệt giữa "ngôn ngữ lắp ráp trung gian" và "máy ảo" là gì?
Bob Jarvis - Phục hồi Monica

@BobJarvis: Một là mã trong khi cái còn lại là thông dịch viên. Bạn nên hỏi sự khác biệt giữa lắp ráp trung gian và mã byte
slebetman

Điều này dường như không trả lời câu hỏi. Miễn là mỗi máy biên dịch / lắp ráp MSIL khác nhau, không có gì phổ biến về nó và mục đích của việc biên dịch đó là chuyển chức năng chung và không khai thác một tập lệnh cụ thể, như DW chỉ ra, là (hoặc a) lý do sử dụng trình biên dịch chương trình.
PJTraill

3

Như đã lưu ý, LLVM là thứ gần nhất cho đến nay. Một rào cản lớn đối với một ngôn ngữ thực sự phổ quát sẽ là những khác biệt cơ bản liên quan đến sự đánh đổi ngầm: đồng thời, sử dụng bộ nhớ, thông lượng, độ trễ và tiêu thụ năng lượng. Nếu bạn viết theo kiểu SIMD rõ ràng, bạn có thể sử dụng quá nhiều bộ nhớ. Nếu bạn viết theo kiểu SISD rõ ràng, bạn sẽ có được sự song song dưới mức tối ưu. Nếu bạn tối ưu hóa cho thông lượng, bạn làm tổn thương độ trễ. Nếu bạn tối đa hóa thông lượng một luồng (tức là: tốc độ xung nhịp), bạn sẽ làm giảm tuổi thọ pin.

Ít nhất, mã sẽ cần được chú thích với sự đánh đổi. Điều có thể quan trọng nhất là ngôn ngữ có các thuộc tính đại số / loại tốt cung cấp cho trình biên dịch rất nhiều phòng ngọ nguậy để tối ưu hóa và phát hiện sự không nhất quán logic.

Sau đó là câu hỏi về hành vi không xác định. Phần lớn tốc độ của ngôn ngữ C và ngôn ngữ lắp ráp đến từ hành vi không xác định. Nếu bạn thừa nhận hành vi không xác định thực sự xảy ra, thì cuối cùng bạn sẽ xử lý chúng như các trường hợp đặc biệt (ví dụ: kiến ​​trúc và các vụ hack cụ thể theo ngữ cảnh).


0

Có lẽ những gì bạn đang tìm kiếm là một ký hiệu Máy tiện vạn năng nơi mọi người đồng ý về các ký hiệu cho các lệnh. ( https://en.wikipedia.org/wiki/Universal_Turing_machine )

Một 'trình biên dịch' dịch ngôn ngữ Biến được chấp nhận sang mã máy cụ thể của nhà cung cấp cơ bản và được xây dựng cho bất kỳ thứ gì chúng ta gọi là máy tính.

Trong Nghệ thuật lập trình máy tính , có một ví dụ về điều này có thể trông như thế nào.

Nhưng hãy xem xét câu hỏi "tại sao không phải là ngôn ngữ phổ biến thương mại có thể sử dụng được với tất cả các máy tính", tôi đề nghị những ảnh hưởng thống trị nhất là (1) tiện lợi, không phải tất cả các ngôn ngữ lắp ráp đều được sử dụng nhiều nhất; (2) kinh tế, cung cấp, không tương thích giữa các máy của các thương hiệu và nhà cung cấp khác nhau là một chiến lược kinh doanh cũng như kết quả của nguồn lực hạn chế (thời gian / tiền bạc) để thiết kế máy.


Câu hỏi đặt ra là về một ngôn ngữ lắp ráp có thể được sử dụng để lập trình cho bất kỳ máy tính nào, không phải là ngôn ngữ lắp ráp phổ biến theo nghĩa "máy Turing phổ dụng".
David Richerby

1
Church-Turing cho chúng ta biết UTC có thể làm những gì mà bất kỳ máy tính lập trình nào cũng có thể làm được. Ngoài các vấn đề lưu trữ vật lý hữu hạn. Một ngôn ngữ lắp ráp cho một UTC là khá khả thi. Nhưng như tôi đã nói thực tế văn hóa và kinh tế có thể hạn chế việc thực hiện và áp dụng thực tế trên thị trường.
Chris

Bạn đang thiếu vấn đề lớn nhất, đó là hiệu suất ! Tại sao sử dụng ngôn ngữ chậm hơn 1000 lần chỉ cho một số mục tiêu cao cả là không tin tưởng vào phần cứng? Máy Turing là một mô hình khủng cho máy tính thực tế.
Artelius

1
Các nhà bình luận quan tâm để cung cấp bất kỳ khoa học máy tính để ủng hộ tuyên bố của họ? Đây là sau khi tất cả các diễn đàn khoa học máy tính.
Chris

1
Tôi không phải là chuyên gia về CS. Nhưng điều tôi tin là kiến ​​trúc von Neumann là một kỹ thuật tuyệt vời tạo ra sự cân bằng giữa khả năng lập trình và hiệu suất, trong khi mục đích của máy Turing là cho thấy ngay cả cỗ máy cơ bản nhất cũng có thể tính toán bất cứ thứ gì mà một cỗ máy phức tạp hơn có thể. Chắc chắn, bạn có thể tiếp tục bổ sung ngày càng nhiều tính năng vào máy Turing (nhiều băng, số học), nhưng sau đó bạn gặp vấn đề tương tự bạn gặp phải ở nơi đầu tiên, cụ thể là mọi người không đồng ý với tập lệnh. Thêm vào đó, việc thiếu truy cập ngẫu nhiên tạo ra các chi phí lớn trong nhiều thuật toán.
Artelius

0

giả định: biên dịch và tối ưu hóa ngôn ngữ cấp cao L1 thành ngôn ngữ cấp thấp L0 dễ dàng hơn so với biên dịch và tối ưu hóa ngôn ngữ cấp cao L2 (cao hơn L1) thành L0; theo nghĩa dễ hiểu hơn là bạn có thể tạo mã được tối ưu hóa hơn khi biên dịch L1 thành L0 so với L2 thành L0.

Tôi nghĩ giả định này có thể đúng, đó là lý do tại sao có lẽ hầu hết các trình biên dịch sử dụng ngôn ngữ trung gian cấp thấp (IR / LLVM).

nếu điều này đúng hơn là sử dụng bất kỳ ngôn ngữ cấp thấp L0 nào và viết trình biên dịch để dịch L0 sang các ngôn ngữ cấp thấp khác. Ví dụ: sử dụng tập lệnh MIPS và biên dịch nó thành x86, arm, power, ...

-Taoufik


Vì vậy, bạn không biết liệu câu trả lời của bạn là đúng? Và không thể hỗ trợ nó?
Ác
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.