LINUX.ORG.RU
Ответ на: комментарий от Stanson

Но чтобы его таки пользовать, язык должен в него уметь. Жаба не умеет. Для неё аж целое JNI городить пришлось, чтобы оно хоть как-то перестало быть сферической жабой в вакууме.

Если говорить на чистоту - то из Java тоже можно вызвать нативные методы, не обращаясь к промежуточным библиотекам, например так (это самодостаточный компилируемый код):

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public class HelloWorld {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
            (Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i = 0; i < args.length; i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

Это называется JNA

qrck ★★
()
Ответ на: комментарий от qrck

А теперь всё то же самое только без import

Вопрос в том, можно ли написать работающий helloworld без сторонних библиотек на отдельно взятом языке. Если можно - то язык может теоретически быть native. Если нельзя - то опаньки. На жабе нельзя. Жаба не может стать нативным языком.

Чтобы жаба смогла быть нативной - нужно как минимум реализовать в ней способ делать системные вызовы. Однако, концепция жабы как раз подразумевает полный отказ от этого, ради переносимости там и прочих соображений. Поэтому, её место среди питонов, жабоскриптов и всяких прочих.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

А теперь всё то же самое только без import

А вы сможете сделать тоже самое на C, не используя #include и ассемблерные вставки, и не линкуя libc?

Вопрос в том, можно ли написать работающий helloworld без сторонних библиотек на отдельно взятом языке. Если можно - то язык может теоретически быть native. Если нельзя - то опаньки. На жабе нельзя. Жаба не может стать нативным языком.

Что считается сторонними библиотеками? Почему libc можно использовать в коде на C но нельзя в коде на Java?

qrck ★★
()
Последнее исправление: qrck (всего исправлений: 1)
Ответ на: комментарий от qrck

А вы сможете сделать тоже самое на C, не используя #include и ассемблерные вставки?

#include не нужен, а ассемблерные вставки - часть языка.

В жабе, как языке, принципиально нет никаких конструкций для общения с ядром системы. В разных вариантах жабы (и прочих принципиально ненативных языках) это общение реализуется либо сторонними классами написанными совсем не на жабе, либо жабомашиной, либо каким-нибудь JIT компилятором который тоже не на жабе писан.

Что считается сторонними библиотеками? Почему libc можно использовать в коде на C но нельзя в коде на Java?

libc вовсе не обязателен для написания helloworld.

/* test.c */
#define __NR_exit       1
#define __NR_write      4

#define my_sys_write(a,b,c)     asm( "int $0x80" : : "a" (__NR_write),"b" (a),"c" (b),"d" (c) )
#define my_sys_exit(a)          asm( "int $0x80" : : "a" (__NR_exit), "b" (a) );

void _start()
{
    char *b = "Hello world!\n";
    my_sys_write( 0, b, 13 );
    my_sys_exit( 0 );
}

Потом gcc -nostdlib -nostdinc -o test test.c

и получаем в чистом виде совершенно нативное приложение для линукса без всяких библиотек и сторонних сущностей.

То же самое можно сделать и на других языках программирования, но вот жаба к ним не относится вообще ни разу.

А на жабе helloworld без чего-то написанного на нативном для системы языке невозможен. Ну жабу специально так задумали - типа такой сферический язык в вакууме, без возможности общения с системой из кода, а для всякого ввода-вывода и т.п. для каждой системы будут написаны на каких-нибудь сях классы стандартного образца, чтоб связь с внешним миром обеспечить.

Stanson ★★★★★
()
Ответ на: комментарий от qrck

Если говорить на чистоту - то из Java тоже можно вызвать нативные методы, не обращаясь к промежуточным библиотекам ... Это называется JNA

JNA если педивикия нам не врет использует С-шный libffi. То есть это обертка над JNI просто более засахареная.

antares0 ★★★★
()
Ответ на: комментарий от qrck

Это называется JNA

Кстати, вопрос: Ну и зачем же жабе нужен какой-то Java Native Access если она сама якобы Native в ведроиде? К какому такому ещё Native этот Access у Java происходит, и почему этот Native окзался внезапно не на Java?

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Кстати, вопрос: Ну и зачем же жабе нужен какой-то Java Native Access если она сама якобы Native в ведроиде? К какому такому ещё Native этот Access у Java происходит, и почему этот Native окзался внезапно не на Java?

А зачем C нужен ABI для вызова функций из libc?

qrck ★★
()
Ответ на: комментарий от qrck

А зачем C нужен ABI для вызова функций из libc?

С нужен ABI вовсе не для вызова функций из libc, он нужен для вызова функций вообще. Так язык устроен. Вызов какой-нибудь open() из libc ничем не отличается от вызова foo() из той же программы.

В жабе же, вызов нативного класса через JNI принципиально отличается от вызова жабного класса. Более того, сам жабокод этого сделать не может, в силу отсутствия в байткоде каких-то специальных команд для этого, нативный код вызывает JVM когда обнаруживает, что жабокод вызвал класс с native.

В исходном коде hello world тоже нет прямых syscall-ов, однако в скомпилированном x86 блобе - они внезапно появляются (если конечно мухлевать и собирать со -static, иначе их там тоже нет)

Во-первых, нет никакой разницы между кодом программы и кодом подгруженной libc. Во-вторых, исходный код helloworld с сисколлами на несколько сообщений выше, а в третьих, в жабобайткоде в принципе не может быть никаких сисколлов. А без сисколлов программа не может в ввод-вывод и, следовательно, совершенно бесполезна.

Это разделение называется managed code / unmanaged code. И managed code вполне может исполняться как native, одно другому не мешает.

Конечно может. Есть даже сопроцессор для ARM - Jazelle который может выполнять жабобайткод в железе. Но даже он не способен вызвать сисколл. Поэтому должна быть какая-то native прослойка, между жабопрограммой и системой, чтобы программа имела смысл. А сама программа на жабе, вне зависимости от способа выполнения жабобайткода никак не может быть native, потому что будет совершенно бесполезна без настоящей native прослойки между жабой и системой.

Почти все, что называется OS Android, написано на Java. та часть, которая на C/C++ - не так принципиально чтобы это вообще был Linux.

Вот только любое другое ядро будет устроено точно так же, и точно так же у жабы не будет никакой возможности с ядром общаться без native прослойки между жабой и ядром. И как раз вот эта прослойка и будет native, а вовсе не жаба.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Вы либо русский язык понимаете плохо, либо вообще не пытаетесь вникнуть в то, что вам отвечают.

Я умываю руки, живите дальше в своей бронированной криокамере :)

qrck ★★
()
Ответ на: комментарий от qrck

Иррациональное желание считать жабу native языком, а приложения на жабе native приложениями есть прямое свидетельство того, что в бронированной жабокриокамере находитесь именно вы.

Вот зачем вам нужно чтобы жабософт внезапно считался native? Что, от этого жаба или написанный на ней софт внезапно как-то изменятся? Ну клепаете жабософт и клепайте дальше, от того, что он в принципе не может быть native ни на одной системе он не станет хуже.

Это что, комплекс жабокодеров, что-ли? Или какое-то профзаболевание? Вы ощущаете себя неполноценным из-за того, что приходится писать на ненативном языке ненативные приложения, что-ли? Тогда зачем вы выбрали язык, который изначально и был задуман именно как ненативный, и именно эта его особенность позиционируется как преимущество жабы?

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Лол. С чего вы решили, что я пишу на Java? Ваша интуиция вас постоянно подводит. Более того, я думаю что и родную вашу «сишечку» я знаю получше вас (судя по вашему коду на гитхабе)

qrck ★★
()
Последнее исправление: qrck (всего исправлений: 1)
Ответ на: комментарий от qrck

Лол. С чего вы решили, что я пишу на Java?

Ну если не пишете - то это тогда вообще клиника - всячески мечтать о том, чтобы неблизкий язычок где-нибудь считался native.

Более того, я думаю что и родную вашу «сишечку» я знаю получше вас (судя по вашему коду на гитхабе)

И как же это можно сишечку «знать получше»? goto и указатели не использовать, что-ли? :)

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Ну если не пишете - то это тогда вообще клиника - всячески мечтать о том, чтобы неблизкий язычок где-нибудь считался native.

Как человек более разбирающися в мобильной разработке, я просто указал вам на то, что весь мир имеет в виду под термином «mobile native app». Вы можете не соглашаться, ваше право.

И как же это можно сишечку «знать получше»? goto и указатели не использовать, что-ли? :)

Ну как минимум не делать ляпов откровенных, в отличии от того, что я видел у вас

qrck ★★
()
Ответ на: комментарий от qrck

Как человек более разбирающися в мобильной разработке, я просто указал вам на то, что весь мир имеет в виду под термином «mobile native app». Вы можете не соглашаться, ваше право.

Хотелось бы увидеть как «весь мир» считает жабопрограммы native app. Я такую чушь слышал только от жабофилов, пока что.

Ну как минимум не делать ляпов откровенных, в отличии от того, что я видел у вас

И что же за ляпы откровенные, интересно? Ткните же пальчиком, может окажется что это вовсе не ляпы, а просто вы чего-то не знаете. :)

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

И что же за ляпы откровенные, интересно? Ткните же пальчиком, может окажется что это вовсе не ляпы, а просто вы чего-то не знаете. :)

не знаю, что например указатели, возвращаемые из сторонних библиотечных функций, нужно проверять на NULL? (один из косяков ваших, другие - не расскажу, вы своим поведением не заслуживаете того, чтобы вас бесплатно учили)

qrck ★★
()
Последнее исправление: qrck (всего исправлений: 1)
Ответ на: комментарий от qrck

не знаю, что например указатели, возвращаемые из сторонних библиотечных функций, нужно проверять на NULL?

А нахрена мне это нужно, если альтернативы действий при получении NULL в принципе нету? Нет уж, пусть оно в корку свалится, будет что gdb скормить.

Я ж говорю - вы просто малообразованы, так что ваше «обучение» мне совершенно ни к чему.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

А нахрена мне это нужно, если альтернативы действий при получении NULL в принципе нету? Нет уж, пусть оно в корку свалится, будет что gdb скормить.

«Безопасный код», не, не слышали..

P.S. Извините, но дальше действительно нет смысла продолжать дискуссию. Такой феерический бред, как несете вы, может нести человек только очень далекий от разработки ПО.

qrck ★★
()
Последнее исправление: qrck (всего исправлений: 1)
Ответ на: комментарий от qrck

«Безопасный код», не, не слышали..

Ох уж эти жабосказочки, ох уж эти жабосказочники. :)

Чтобы получить безопасный код, нужно выловить все возможные ошибки как в самом приложении, так и в низлежащих библиотеках, а не затыкать 100500 дыр всякими сраными «проверками на NULL», которые часто смысла вообще не имеют в силу особенностей работы конкретной ОС.

Проверь malloc на NULL :) Флаг в руки и барабан на шею.

Stanson ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.