-1

什麼是可編譯爲可執行文件的最高級別語言?當我說編譯爲可執行文件時,我並不是指字節碼,而是像C,C++的意義上的本地彙編代碼。什麼是可以編譯的最高級別的語言?

編輯:我遇到的一個問題是,客戶端ssh訪問限制訪問帳戶中的我的服務器。他們需要運行我的一些腳本,但我不希望他們看到源代碼。與只需要執行權限的本地編譯程序不同,Python腳本(或任何其他腳本)不能在沒有讀取權限的情況下執行。

+0

我會問「可以編譯爲可執行文件的高級別」。 COBOL/FORTRAN/...比Java/Scala/...更高級的語言嗎? – PeterMmm 2010-06-22 07:05:00

+0

也許你可以問關於混淆的問題? – 2010-06-22 07:25:22

回答

1

我的投票將用於Java + GCJ。

http://en.wikipedia.org/wiki/Gcj

它可以跳過字節碼,並直接編譯成機器代碼:有關GCJ的更多信息可以在這裏找到。

+0

謝謝!我不知道有一個完全跳過JVM的Java實現。 – jairajs89 2010-06-22 07:12:20

+0

+1讓我想去Java。 – 2010-06-22 07:24:09

+0

直到你使用它。除非自從我上次使用它之後大幅改進,否則它生成的二進制文件對於被認爲是機器代碼而言是不可忍受的緩慢。 – cHao 2010-06-22 07:31:10

2

任何語言都可以可能被編譯。 .net包含一個本地代碼生成器(NGEN),可將字節碼轉換爲本地代碼,並可能用於創建本機二進制文件。實際上,編譯爲字節碼的任何語言都可以具有相同的功能。

當你進入腳本語言(Python,PHP,Perl等)時,它開始變得棘手。在那些版本中,將腳本與解釋器捆綁在單個可執行文件中通常更容易。但是,除了兩種語言的「eval」函數幾乎都需要解析和執行文本的能力之外,沒有什麼能夠阻止某人編寫PHP或Perl編譯器 - 這意味着您最終會得到一個至少與程序鏈接的解釋器無論如何。

更大的問題是,「它停止在什麼水平上值得編譯?」。對此,我會回答「當你運行必須能夠解釋自己的代碼時」。 IE:我不打算編譯任何具有「eval」語句/函數的語言,除非我被允許刪除語句/函數。

+0

我遇到的一個問題是客戶端在限制訪問帳戶中有ssh訪問我的服務器的權限。他們需要運行我的一些腳本,但我不希望他們看到源代碼。與只需要執行權限的本地編譯程序不同,Python腳本(或任何其他腳本)不能在沒有讀取權限的情況下執行。 – jairajs89 2010-06-22 07:08:09

+0

如果這是一個問題,你可能會有一個「跑步者」計劃,其唯一目的是運行你的腳本。它可能是setuid,腳本可能受到限制,只有「runner」程序的用戶才能讀取它。唯一的問題是如果它需要編寫輸出文件會發生什麼,因爲它們通常由跑步者程序的所有者擁有,而不是啓動該程序的用戶。 – cHao 2010-06-22 07:11:39

+0

它的主要功能是編寫輸出文件,客戶端可以訪問... – jairajs89 2010-06-22 07:13:33

0

你很困惑。計算機編程語言的重點在於它們可以自動執行,最終總是意味着編譯成機器指令。因此,根據定義,每種語言的程序原則上都可以轉化爲可執行文件。有些實際上並沒有採取這一步驟,並滿足於解釋字節碼,但大多數語言都有本地代碼的轉換器(例如,甚至是Java,JIT編譯器可以生成特定於處理器的操作碼而不是字節碼)。

唯一的區別是高級語言需要多一點的編譯器基礎結構才能包含在可執行文件中;沒有編譯器可以擺脫垃圾收集機制或運行時類型信息,或者它不再是同一個程序。但是一種無法自動翻譯成可運行的計算機編程語言將毫無意義。

除了像Malbolge,或者當然,這裏寫的「Hello world」是一個多年的努力故意不正常的語言......

+0

呵呵,對不起,我不清楚我的問題。閱讀我的編輯。 – jairajs89 2010-06-22 07:11:39

+1

不,傳統的解釋器沒有編譯他們的語言,並且可以創建無法編譯的語言(例如,MSDOS批處理文件無法編譯,因爲您可以在批處理文件執行時重寫該批處理文件)。 – 2010-06-22 08:20:40

+0

@pete那麼是什麼?編譯器可以將自身插入到已編譯的程序中,並在更改後重新運行批處理文件的編譯。彙編絕不是不可能的,有時候毫無意義。大多數lisp以類似的方式攜帶編譯器。 – 2012-11-08 17:09:17

1

許多Lisp的方言有本機代碼的編譯器,因爲這樣做哈斯克爾,OCaml中,與標準ML。

相關問題