При всей популярности Андроида, как нищебродской девелоперсокй платформы, вызывает удивление то, насколько под него мало живых скриптовых движков с библиотеками, а особенно то, насколько дохлый SL4A. Хотя сама по себе его дохлость не вызывает удивления потому, что следует из невостребованности.
Но вот откуда невостребованность?.. По-моему это просто замечательно, когда для телефона можно писать скрипты. И, более того, паршиво, когда нельзя.
И всё это на фоне того, что программирование под Андроид на родной Java -- ни разу не sexy. Куча скучного недообъектного императивного кода, куча скучного тошнотворного XML, тяжеленный симулятор для отладки... Мне доводилось программировать на КОБОЛе для мейнфреймов, так вот, большой разницы нет (собственно известно, что Java и есть современный КОБОЛ, а C++ -- PL/I). Да даже J2ME как-то веселее была по ощущениям (хотя тоже говно, скажем прямо).
Небольшую надежду вселяют системы типа PhoneGap. Но и они несколько тяжеловаты. За деревьями лес плохо видно.
Но откройте мне наконец глаза, почему SL4A никому не нужен?..
/К сожалению, некоторые старые версии Python (в частности, интерпретатор) были утеряны вследствие повреждения репозитория, поэтому обратимся к чуть более поздним версиям, чтобы увидеть, как были реализованы объекты/
http://habrahabr.ru/company/mailru/blog/234747/
Году кажется в 2002, довольно скоро после того, как я практически познакомился с Питоном впервые, мне почему-то приснилось, что внезапно исходники интерпретатора (CVS по всей видимости, кто же ещё) остались у меня одного. Знаете, эдакий приятный сон о том, как спасаешь что-нибудь ценное, прямо как Аркадий Паровозов.
Мне этот сон показался неумным тогда, и кажется неумным до сих пор. Сейчас это звучит уже совсем невероятно: слишком большое сообщество и нормальный распределённый контроль версий. Да и в 2002 г. тоже уже не было реально, чего уж там.
Однако оговорка в статье заставила меня об этом сне вспомнить...
Старперский пост какой-то получился.
Компенсирую тем, что в 1990 г., когда Питон уже кое-как был, я ходил в начальную школу и компьютер, если не считать микрокалькуляторов, руками к тому моменту трогал раз пять (впервые я лет в 5 пытался мочить Space Invaders на болгарском клоне PDP-11 у папы на работе). Только через год у меня появился Спектрум и только ещё через год я ощутил кайф во время собственных попыток на нём что-то запрограммировать.
нужная штука http://eleks.github.io/js2js/
Только поковыряв какой-нибудь транслятор Бейсика, до конца осознаёшь, насколько это очароватеьлно идиотский язык.
Кто-нибудь ковырялся с Emscripten?
В общем "Здравствуй, мир!" оно компилит хорошо.
А как с чем-нибудь посложнее?
#include <stdio.h>
int main()
{
char name[10];
printf("1: ");
scanf("%9s", name);
printf("1. Is instruction ordering ok, <%s>?\n", name);
printf("2: ");
scanf("%9s", name);
printf("2. Still ok, <%s>? =)\n", name);
return 0;
}
А так: выдаётся JavaScript, который сперва всё печатает, а потом радостно спрашивает то, что его попросили в scanf
, причём один раз.
Разумно предположить, что это у меня руки кривые и я как-то неправильно Emscripten поставил ил запускаю. Ок, генерю LLVM-код при помощи CLang:
; ModuleID = 'test.c'
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"
target triple = "i386-pc-cygwin"
@.str = private unnamed_addr constant [4 x i8] c"1: \00", align 1
@.str1 = private unnamed_addr constant [4 x i8] c"%9s\00", align 1
@.str2 = private unnamed_addr constant [38 x i8] c"1. Is instruction ordering ok, <%s>?\0A\00", align 1
@.str3 = private unnamed_addr constant [4 x i8] c"2: \00", align 1
@.str4 = private unnamed_addr constant [23 x i8] c"2. Still ok, <%s>? =)\0A\00", align 1
define i32 @main() nounwind {
%1 = alloca i32, align 4
%name = alloca [10 x i8], align 1
store i32 0, i32* %1
%2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0))
%3 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
%4 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([4 x i8]* @.str1, i32 0, i32 0), i8* %3)
%5 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
%6 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([38 x i8]* @.str2, i32 0, i32 0), i8* %5)
%7 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str3, i32 0, i32 0))
%8 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
%9 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([4 x i8]* @.str1, i32 0, i32 0), i8* %8)
%10 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
%11 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([23 x i8]* @.str4, i32 0, i32 0), i8* %10)
ret i32 0
}
declare i32 @printf(i8*, ...)
declare i32 @scanf(i8*, ...)
Код нормально работает при помощи lli
, компилится в нормальный ассемблер при помощи llc
, в общем код ок.
Запускаю его при помощи вот этой демо-странички от Emscripten. Получаю, что характерно, аналогичную кривость, но почти наоборот, попробуйте сами.
ЧЯДНТ?
Я когда года три назад попробовал попрограммировать Ведроид штатным для него способом (скучная фригидная Java, жирный неуклюжий Eclipse, все дела), удивился тому, что гуйню к коду надо привязывать вручную. Не то чтобы я десятками леплю контролы на экран, но раздражает всё же.
Прямо вспомнилось заклинание раннего DHTML — document.getElementById. Только ещё мрачнее.
Я тогда заподозрил, что на самом деле это круто, просто я за час проникнуться не успел. Сейчас, поскольку ничего не изменилось, я заподозрил то же самое.
Помогите мне развеять подозрения и скажите: зачем оно всё такое убогое?
А как лучше перевести на по-английский "говнокод" и "говнокодить"?
Не зря студентам говорят, что код должен быть хорошо прокомментирован: https://github.com/gorohovart/hometasks/pull/1/files
Уже много лет С/С++ позволяет достаточно безболезненно печатать в консоль wchar_t.
Например на С++ пиши:
locale::global(locale(""));
wcout.imbue(locale());
wcin.imbue(locale());
пользуйся iostream и не горюй... казалось бы... пока где-то не попытаешься воспользоваться не-юникодными cout или printf. Или пока какая-нибудь библиотека не попытается. А вот тогда всё нафиг сломается и дальше нормально печатать будет только ASCII, а весь Юникод будет ломать к чертям!
Вы думаете это компилятор кривой, или библиотека дырявая? Ну как же, такой ведь косяк. Нет ребята, это /by design/: http://stackoverflow.com/questions/8947949/mixing-cout-and-wcout-in-same-program/8957069#8957069
Значит ECMAScript язык кривой, а Питон-нет?
http://habrahabr.ru/post/192098/
Ну ну.
Венок из 50 программ, порождающих друг друга https://github.com/mame/quine-relay
ООП — такая же лажа, как теория относительности. Только ЛИСП, только эфир!
http://m.livejournal.com/read/user/science_freaks/2380873
http://lenta.ru/comments/news/2013/07/04/programmers/
/В частности, Шойгу поручил разыскать петербургских студентов, пять раз становившихся чемпионами по программированию/
Они напрограммируют... Олимпиадное программирование имеет мало общего с промышленным и оборонным. Да и с профессиональным программированием вообще.
Самая маленькая сбойная программа на Си.main;
http://habrahabr.ru/post/181021/