Có ngôn ngữ nào chuyển mã sang C, với cú pháp tốt hơn không? [đóng cửa]


19

CoffeeScript là ngôn ngữ chuyển mã sang JavaScript, với cú pháp rõ ràng, lấy cảm hứng từ Ruby. Có một ngôn ngữ tương tự chuyển mã sang C, cho phép mã dễ đọc hơn mà không ảnh hưởng đến hiệu suất? Nếu không có gì như thế tồn tại, có lý do chính đáng cho việc không tạo ra nó?


10
Tuy nhiên, lưu ý rằng "biên dịch thành C" không đồng nghĩa với "nhanh như các chương trình C gốc". Khi một cái gì đó biên dịch thành C, nó sẽ thường tạo mã thay vì (hoặc hoàn toàn) khác với những gì người bình thường sẽ viết trong C. Nó có thể dễ dàng chậm hơn đáng kể (hoặc đôi khi nhanh hơn) so với những gì bạn thường viết bằng tay.
Jerry Coffin

4
Điều tôi không thích về bất kỳ câu trả lời nào trong số này, là họ đề xuất các ngôn ngữ hoàn toàn khác nhau, chẳng hạn như Vala. Điều về CoffeeScript là, đó là Javascript, nhưng với một cú pháp khác.
Giáo sư Falken hỗ trợ Monica

2
pascal hay fortran ?

5
Tôi thực sự muốn "transcompile" (từ) sẽ chết. Đó là "biên dịch" và "trình biên dịch". Bạn không cần một từ mới chỉ vì ngôn ngữ đầu ra không phải là x86 (và nếu bạn nghĩ bạn làm thế, bạn không hiểu trình biên dịch).
Leushenko

2
Từ transpile có nghĩa là (hoặc gần đây có nghĩa là) để dịch mã sang mã nguồn của một ngôn ngữ khác có cùng ngữ nghĩa , thường là câu lệnh cho câu lệnh tương đương (cho phép tạo bản đồ nguồn). Không ai tuyên bố rằng các bộ chuyển đổi làm một cái gì đó khác với trình biên dịch. Transpilers là một loại trình biên dịch cụ thể.
Carl Smith

Câu trả lời:


23

CoffeeScript biên dịch thành JavaScript vì một lý do rất đơn giản, JavaScript là ngôn ngữ phía máy khách thực tế và sẽ không hợp lý khi mong đợi các nhà cung cấp trình duyệt hỗ trợ CoffeeScript, khi tất cả những gì nó cung cấp là một cú pháp thay thế.

Theo cách tương tự, điểm chính của ngôn ngữ cấp cao đối với người dịch C là tính di động ngay lập tức, vì có trình biên dịch C cho hầu hết mọi nền tảng và sự phong phú của các thư viện C. Vala , ví dụ, được thiết kế để :

  1. là trình biên dịch cho GObject ,
  2. xây dựng các tệp thực thi riêng (thông qua trình biên dịch C của máy),
  3. tự động đếm tham chiếu, và
  4. vẫn có thể truy cập được đối với các lập trình viên Gnome C

Gnome là một dự án theo định hướng C truyền thống và GObject được viết bằng C, Vala có lẽ sẽ không tìm thấy nhiều tình yêu giữa các nhà phát triển Gnome nếu nó được biên dịch thành mã máy, bất kể bản chất thân thiện hơn (và cú pháp). Không phải ai cũng thích cú pháp, đến mức một ngôn ngữ khác, Genie , được xây dựng để cải thiện nó.

Đối với một ví dụ về C ++, Facebook đã phát triển HipHop , một dịch giả từ PHP sang C ++. Họ đã cố gắng giải quyết một vấn đề rất cụ thể, sử dụng CPU, mà không phải thay thế tất cả mã PHP của họ và đào tạo lại các kỹ sư của họ (hoặc tệ nhất là thay thế chúng). Đây là một ví dụ cụ thể hơn nhiều, vì các vấn đề về khả năng mở rộng của Facebook là tốt, duy nhất và một lần nữa có quyền truy cập vào mã C ++ trung gian có thể hữu ích, vì các phần mở rộng PHP được viết bằng C và C ++.

Vì vậy, một dịch giả từ một ngôn ngữ cấp cao sang ngôn ngữ khác là một ý tưởng tốt chủ yếu khi bạn truy cập vào mã trung gian là bắt buộc. Đối với CoffeeScript, mã JavaScript là cần thiết vì sự chấp nhận rộng rãi của trình duyệt và đối với Vala, Genie và HipHop vì cơ sở mã hiện có. Rõ ràng có quyền truy cập vào mã trung gian có nghĩa là bạn có thể tối ưu hóa thêm nếu cần.

Nhưng nói chung , sẽ không nên xây dựng một ngôn ngữ dịch sang C hoặc bất kỳ ngôn ngữ nào khác, nếu bạn không sử dụng mã kết quả. Có rất nhiều ngôn ngữ ngoài kia, nếu bạn không thể đối phó với C, chỉ cần chọn một ngôn ngữ khác. Thật trùng hợp, trình biên dịch C ++ đầu tiên được viết bởi Bjarne Stroustrup, CFront, là một trình dịch từ C sang Class sang C, nhưng điều đó chủ yếu là vì là một ngôn ngữ mới, không thể bootstrap C với Classes.


3
Có cả Nim.
noɥʇʎԀʎzɐɹƆ

Swift cũng có thể biên dịch thành C.
Quazi Irfan

9

Tôi sẽ đề cập đến một vài điểm mà Yannis Rizos đã không đưa ra trong câu trả lời tuyệt vời của mình.

Vâng, nhiều ngôn ngữ tồn tại. C là một mục tiêu phổ biến cho các back-end của trình biên dịch vì nó cực kỳ di động và được tối ưu hóa mạnh mẽ, mặc dù với LLVM không có nhiều điểm cho nó.

Một vài triển khai tôi biết rằng làm điều này là:

  • C ++ (Ít nhất là trong những ngày đầu)
  • GHC Haskell (Mặc dù trình tạo mã chính là C--)
  • Chương trình Gambit / Gà / Bigloo
  • ECL (Lisp thông thường)
  • Perl
  • Vala & Thần

nhanh như chương trình C gốc

Không, chỉ vì nó sử dụng C làm ngôn ngữ trung gian không có nghĩa là bạn sẽ đạt được tốc độ của nó. Lý do C nhanh là vì phương pháp viết mã rõ ràng khác với các ngôn ngữ khác. Nó chỉ là một lắp ráp di động, không có gì đặc biệt.


1
C ở rất xa hội đồng ...
SUND Borsch

1
Một số người nghĩ về C là "trình biên dịch cấp cao". Nó khá gần với máy, nhưng tất nhiên nó không phải là một loạt các opcode.
dstromberg

6

Rock là một trình biên dịch ooc tạo nguồn C99. Các OOC-lang là một ngôn ngữ lập trình với các đối tượng, chức năng hạng nhất, và kỳ lân màu hồng. Các OOC là một động lực ngôn ngữ và đi rất xa. Nó tạo ra mã c béo hơn và chậm hơn. bạn cần sửa đổi nhiều hơn để đáp ứng yêu cầu của bạn. Nhưng đó là một điểm khởi đầu tốt.


4

ValaGenie đều là ngôn ngữ biên dịch thành C. haxe biên dịch thành C ++, nhưng tôi không chắc đó là thứ bạn muốn.


2
bạn có muốn mở rộng một chút về những gì mỗi tài nguyên này có và tại sao bạn lại đề xuất những tài nguyên này khi trả lời câu hỏi không? "Câu trả lời chỉ liên kết" không được chào đón tại Stack Exchange
gnat

4

OCaml có thể biên dịch để bytecode, để mã gốc, có thể được giải thích trực tiếp, hoặc có thể biên dịch C .


1
bạn có phiền giải thích thêm về những gì nó làm không và tại sao bạn lại đề nghị nó như trả lời câu hỏi được hỏi? "Câu trả lời chỉ liên kết" không được chào đón tại Stack Exchange
gnat

3
Tôi không thấy câu trả lời của mình là "câu trả lời chỉ liên kết". Trên thực tế, tôi có thể xóa liên kết và nó vẫn sẽ là một câu trả lời hợp lệ. Câu hỏi là "Có ngôn ngữ nào làm X" và câu trả lời của tôi là "ngôn ngữ Y hiện X". Nhận xét này cũng áp dụng cho câu trả lời của Bilijk.
barjak

3
  • Trình biên dịch C ++ gốc của Bjarne Stroustrop, "cfront", đã biên dịch C ++ thành C, sau đó nó sẽ tùy chọn chạy trình biên dịch C để tạo mã đối tượng. C ++ là về "phi lý thuyết" như bạn có thể nhận được :-)
  • Trình biên dịch trình biên dịch Unix "yacc" và GNU "Bison" dịch ngôn ngữ đầu vào của họ sang C. Nhiều, nhiều hệ thống tinh vi đã được viết cùng với chúng.
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.