Знаете ли вы, что 256 бит достаточно, чтобы хранить свыше 1016 возрастов Вселенной в планковских единицах измерения времени? Это наименьшая степень двойки, дающая достаточно места, чтобы хранить возраст, диаметр и массу Вселенной в планковских единицах измерения:

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

Предлагаю отныне не мелочиться, а выбрать машинное слово размером в 32 байта раз и навсегда.

Тип uint256_t - наше все! В прямом смысле этого слова.

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>

main()
{
        uint256_t age = getage();

        printf("Happy %" PRIu256 " Planck times!\n", age);

        return 0;
}
http://www.knosof.co.uk/poschk.html

Applications POSIX.1 conformance testing

Derek Jones
derek@knosof.co.uk
Knowledge Software Ltd
Farnborough, Hants
UK


ABSTRACT

The Standards for POSIX and C were designed to enable the portability of applications across platforms. A lot of work has gone into checking compilers and environments for conformance to these Standards, but almost nothing has been done to check applications conformance. The incorrect assumption being made that the development compiler will warn about any construct that needs looking at. This paper discusses a tool that checks applications software for conformance to these Standards at compile, link and runtime as well as the library interface. Any application that can pass through this checker without producing any warnings is a conforming POSIX program and a strictly conforming C program.

© Copyright 1992,95. Knowledge Software Ltd. All rights reserved;

Presented at the EurOpen & USENIX Spring 1992 Workshop/Conference
This is how you perform word expansions using wordexp() system interface:

alexo@kuha:~/wordexp$ make
        cc    -o wordexp wordexp.c
        ./wordexp
echo hello world
0: 'echo'
1: 'hello'
2: 'world'
"\$HOME = $HOME" '$PWD'\ =\ $PWD
0: '$HOME = /home/alexo'
1: '$PWD = /home/alexo/wordexp'
alexo@kuha:~/wordexp$

https://gist.github.com/4492253

Source )

Emacs

Jan. 7th, 2013 01:02 am
IEEE 1003.1-2008, C.4.3 Exclusion of Utilities:

emacs

The community of emacs editing enthusiasts was adamant that the full emacs editor not be included in the base documents because they were concerned that an attempt to standardize this very powerful environment would encourage vendors to ship versions conforming strictly to the standard, but lacking the extensibility required by the community. The author of the original emacs program also expressed his desire to omit the program. Furthermore, there were a number of historical UNIX systems that did not include emacs, or included it without supporting it, but there were very few that did not include and support vi.
This script was written on Solaris 11 running inside VirtualBox.

set -Cex

ROOT=/opt/euromake
DEFROUTER=10.0.2.2
NETWORK=17
MIN=10
MAX=99

cd $ROOT

mkdir -p vacant
for p in $(ls vacant); do
	test -d "vacant/$p"
	if echo $$ >"vacant/$p/lock"; then
		POOL=$p
		trap 'rm -f "vacant/$POOL/lock"' INT TERM EXIT
		break
	fi
done

test "$POOL" -ge "$MIN"
test "$POOL" -le "$MAX"

read ZONE <vacant/$POOL/next
test "$ZONE" -ge "$MIN"
test "$ZONE" -le "$MAX"

ZONENAME=$NETWORK.$POOL.$ZONE
ZONEPATH=/zones/clones/$NETWORK/$POOL/$ZONE

# Comment at your own risk!
echo \
zonecfg -z $ZONENAME <<-COMMIT
	create
	set zonepath=$ZONEPATH
	select anet linkname=net0
		set defrouter=$DEFROUTER
		set allowed-address=10.$ZONENAME
	COMMIT
echo \
zoneadm -z $ZONENAME clone origin # from /zones/origin

NEXT=$(($ZONE + 1))
if [ "$NEXT" -le "$MAX" ]; then
	echo $NEXT >|vacant/$POOL/next
	rm -f vacant/$POOL/lock
else
	mkdir -p full
	test ! -e "full/$POOL"
	mv vacant/$POOL full
fi

trap - INT TERM EXIT

Debugging )
У вас все еще непозикс? Тогда мы идем к вам!

Этот ваш гнушный readline - жалкое беспомощное существо по сравнению с vi Line Editing Command Mode в POSIX Shell.

Добавьте команду set -o vi в ~/.profile или ~/.*shrc (по обстоятельствам), если, как и мне, лень ее набирать вручную каждый раз, нажимайте Escape, и будет вам счастье: v, h, j, k, l, /, N, n, c, I, A, b, w, 0, $ и еще много вкусных слов. И мерзкий Tab ваш тоже запретим: есть =, \ и даже *. В общем, пользуйтесь на здоровье!

В Solaris 8 эта часть стандарта реализована в интерпретаторе Korn Shell.
dmitris-imac:~ dmvo$ telnet austin.local
Trying 192.168.1.2...
Connected to austin.
Escape character is '^]'.


SunOS 5.8

login: dmvo
Password: 
Last login: Mon Dec 10 20:07:36 from mac
Sun Microsystems Inc.   SunOS 5.8       Generic Patch   February 2004
$ uname -a
SunOS austin 5.8 Generic_108528-29 sun4u sparc SUNW,Ultra-5_10
$ df -kP .
Filesystem           1024-blocks        Used   Available Capacity  Mounted on
mac:/Users/dmvo/Desktop
                      1952363672   273263664  1678844008    14%    /home/dmvo
$ echo $PROJECTDIR
alexo
$ ls -al /export/home/alexo/src
total 6
drwxrwxr-x   3 alexo    staff        512 Dec 10 21:17 .
drwxr-xr-x  12 alexo    staff        512 Dec 10 18:40 ..
drwxrwxr-x   2 alexo    staff        512 Dec 10 20:50 SCCS
$ ls
$ ed
a 
# %W%

all: rip
        ./rip

clean:
        -rm -f rip
.
w Makefile
43
q
$ sccs create Makefile

Makefile:
1.1
7 lines
$ rm ,Makefile
$ ed
a
#include <stdio.h>

static const char version[] = "%W%";

int main()
{
        printf("R. I. P.\n");
        return 0;
}
.
w rip.c
121
q
$ sccs create rip.c

rip.c:
1.1
9 lines
$ rm ,rip.c
$ ls # The moment of truth!
$ make
sccs  get -s Makefile -GMakefile
sccs  get -s rip.c -Grip.c
cc    -o rip rip.c 
./rip
R. I. P.
$ what rip
rip:
        rip.c   1.1
        stdio.h 1.78    99/12/08 SMI
        stdio_iso.h     1.2     99/10/25 SMI
        feature_tests.h 1.18    99/07/26 SMI
        isa_defs.h      1.20    99/05/04 SMI
        va_list.h       1.12    99/05/04 SMI
        stdio_tag.h     1.3     98/04/20 SMI
        stdio_impl.h    1.8     99/06/10 SMI
$ which cc
/opt/SUNWspro/bin/cc
$ date # Guess why?
Mon Dec 10 20:51:35 EET 1984
$ exit
Connection closed by foreign host.
dmitris-imac:~ dmvo$ 
  • Английский язык.
  • Десятипальцевая печать.
    • Аппликатура.
    • Раскладка клавиатуры для левой руки и модификаторы справа.
    • Раскладка клавиатуры для правой руки и модификаторы слева.
    • Caps-lock.
  • E-mail.
    • Оформление писем.
      • Plain text.
      • Обращение, приветствие, введение.
      • Соответствующий языковой стиль текста.
      • Заключение и подпись.
      • Постскриптум и краткая подпись.
    • Carbon-copy и blind-carbon-copy.
    • Reply и reply-to-all.
    • Forwarding.
  • Базовые навыки работы с операционной системой
  • Элементы предметной области.
    • LaTeX.
    • Web.
    • Portable System Interface.
  • Практика программирования.
Напомним, что подпроект inet (см. "Анонс нового языка программирования", "Интерфейс к симуляторам систем взаимодействия" и "Пример работы симулятора системы взаимодействия") был предназначен, прежде всего, для декодирования и печати результатов работы нашей слепой системы (см. "Взаимодействие с эффектами"). А именно, мы построили специальную систему взаимодействия для выполнения "readback", наделив ее правила побочными действиями:

Σ = {(ε, 0), (γ, 2), (ψ, 2), (c, 1), (@l, 2), (@r, 2)} ∪ {(xi, 0) | i ∈ N} ∪ {(λi, 1) | i ∈ N};

λii(ε)] >< xj + "xj";
λi[a] >< γ[λi + 1(c(a)), xi] + "(λxi.";
xi >< ψ[xi, xi];
xi >< γ[a, @l(xi, a)];
λ[a] >< @l[λ(@r(b, a)), b] + "(";
λ[a] >< c[λ(a)] + ")";
λ[ε] >< @r[λ(c(a)), a] + " ".

Теперь же для подобных систем у нас есть специальный язык программирования и компилятор для него. С его помощью мы добавили readback-модуль в наш интерпретатор MLC незамысловатым изменением (слепую систему мы будем заставлять работать только по мере того, как автоматически сгененрированный readback-модуль будет вызывать функцию inaux() против недостающих частей вычисляемого выражения):

diff --git a/Makefile b/Makefile
index 3c480f1..32a7b9c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,6 @@
 CFLAGS = -Iblind
 YFLAGS = -dv
+INC = inet/inc
 
 OBJS = \
 	eval.o \
@@ -10,6 +11,7 @@ OBJS = \
 	new.o \
 	parser.o \
 	prepare.o \
+	readback.o \
 	show.o
 
 all: subdir example.mlc
@@ -34,6 +36,13 @@ lexer.o: parser.o
 $(OBJS): human.h
 
 clean:
-	-rm -fr mlc y.* *.o lib.a
+	-rm -fr mlc in.* y.* *.o lib.a
 	cd blind && $(MAKE) clean
 	cd inet && $(MAKE) clean
+
+.SUFFIXES: .in
+
+.in.o:
+	$(INC) <$<
+	$(CC) $(CFLAGS) -c in.tab.c
+	mv in.tab.o $@
diff --git a/readback.in b/readback.in
new file mode 100644
index 0000000..04e7419
--- /dev/null
+++ b/readback.in
@@ -0,0 +1,31 @@
+${
+#include <stdio.h>
+}$
+
+\lambda_{i}[\lambda_{i}(\epsilon)] {
+	printf("x%d", j);
+} \x_{j};
+
+\lambda_{i}[a] {
+	printf("(x%d: ", i);
+} \gamma[\lambda_{i + 1}(\c(a)), \x_{i}];
+
+\x_{i} {
+	/* Unsharing. */
+} \psi[\x_{i}, \x_{i}];
+
+\x_{i} {
+	/* Application. */
+} \gamma[a, \appl(\x_{i}, a)];
+
+\abstr[a] {
+	putchar('(');
+} \appl[\abstr(\appr(b, a)), b];
+
+\abstr[a] {
+	putchar(')');
+} \c[\abstr(a)];
+
+\abstr[\epsilon] {
+	putchar(' ');
+} \appr[\abstr(\c(a)), a].

Отныне inet планируется поддерживать в репозитарии MLC, но прежний репозитарий пока останется для истории. Рецензия кода inet, его дополнительное тестирование и предложения по улучшению работы компилятора, а также интерфейса к нему всячески приветствуются.

https://github.com/euromake/mlc/tree/master/inet
Месяц назад мы анонсировали новый язык программирования. Чуть позже мы подготовили проектную документацию. Теперь же мы реализовали компилятор этого языка программирования. Ниже пример работы тестового приложения, которое задействует симулятор простой системы взаимодействия, автоматически сгенерированный из ее описания.

alexo@euromake:~/inet$ make
./inc <example.in
cc  -c in.tab.c
mv in.tab.o example.o
cc     test.c example.o   -o test
./test
fan_1 >< fan_2
inaux: rewires
inaux: returns
inaux: returns
inaux: returns
inaux: returns
erase >< fan_3
erase >< fan_3
erase >< erase
fan_3 >< fan_3
erase >< erase
alexo@euromake:~/inet$ 
#if 0
#include <stdbool.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static enum bool {
	true = 0xdead, false = 0xbeaf
} bool;

static enum cast {
	const_cast,
	dynamic_cast,
	reinterpret_cast,
	static_cast
} cast;

static struct class {
	struct class *namespace;
	int explicit;
	int friend;
	int mutable;
	int private;
	int protected;
	int public;
	int virtual;
} class;

static catch()
{
	return 0;
}

static try()
{
	return 0;
}

static throw()
{
	return 0;
}

static delete()
{
	return 0;
}

static export()
{
	return 0;
}

static usage(str)
	const char *str;
{
	fprintf(stderr, "Usage: %s id type op\n", str);
	exit(EXIT_FAILURE);
}

main(argc, argv)
	char *argv[];
{
	void *new = &class;
	char *typeid, *typename, *operator;
	int this;
	int using;

	if (4 > argc)
		usage(argv[0]);

	class.namespace = new;
	typeid = argv[1];
	typename = argv[2];
	operator = argv[3];
	this = !strcmp(typename, "this");
	using = atoi(typeid);
	printf("ID#%d is %s\n", using, this ? "mine" : "yours");
	return 0;
}
https://gist.github.com/4139831

Вместо того, чтобы писать функцию, которая строит дерево, напишите функцию, генерирующую код, который строит это дерево. Более точно, определите функцию gen() так, чтобы она печатала код на Си в stdout и программа на выходе кодогенератора создавала то же самое дерево, что пришло в аргументе функции. Ниже некоторые детали:

alexo@euromake:/tmp$ git clone git://gist.github.com/4139831.git gentree
Cloning into gentree...
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 8 (delta 1), reused 5 (delta 1)
Receiving objects: 100% (8/8), done.
Resolving deltas: 100% (1/1), done.
alexo@euromake:/tmp$ cd gentree/
alexo@euromake:/tmp/gentree$ make
cc     gentree.c   -o gentree
./gentree 0 >output.c
make output
make[1]: Entering directory `/tmp/gentree'
cc     output.c   -o output
make[1]: Leaving directory `/tmp/gentree'
[ 0 = $(./output) ]
alexo@euromake:/tmp/gentree$ git grep Grammar
gentree.c:/* Grammar: <tree> ::= '0' | '1' <tree> <tree>. */
alexo@euromake:/tmp/gentree$ make TEST=1101000
./gentree 1101000 >output.c
make output
make[1]: Entering directory `/tmp/gentree'
cc     output.c   -o output
make[1]: Leaving directory `/tmp/gentree'
[ 1101000 = $(./output) ]
make: *** [all] Error 1
alexo@euromake:/tmp/gentree$ git grep TODO
gentree.c:      /* TODO: print some code in stdout. */
alexo@euromake:/tmp/gentree$ vi gentree.c
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/c99.html

-O optlevel

Specify the level of code optimization. If the optlevel option-argument is the digit '0' , all special code optimizations shall be disabled. If it is the digit '1' , the nature of the optimization is unspecified. If the -O option is omitted, the nature of the system's default optimization is unspecified. It is unspecified whether code generated in the presence of the -O 0 option is the same as that generated when -O is omitted. Other optlevel values may be supported.


P. S. А когда Остин очень-очень хочет, но никак не может, получается

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/logger.html
[livejournal.com profile] ramlamyammambam @ 2012-11-16 00:16:00:

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

#define VOIDPTRF "(void *)0x%" PRIxPTR

main()
{
	printf("\t" VOIDPTRF "\n", (uintptr_t)main);
	return 0;
}

alexo@euromake:/tmp/voidptrf$ make
cc     voidptrf.c   -o voidptrf
./voidptrf
        (void *)0x80483c4
alexo@euromake:/tmp/voidptrf$  
This is how you convert C source code (or any other ASCII text) into strings in C using Shell.

make(1) rules:

all: verbatim.h

verbatim.h: txt2cs.sed def.h sim.c
	printf '#define %s \\\n%s\n\n' >$*.tmp \
		INDEF "$$(sed -f txt2cs.sed def.h)"
	printf '#define %s \\\n%s\n' >>$*.tmp \
		INSIM "$$(sed -f txt2cs.sed sim.c)"
	mv $*.tmp $@

clean:
	-rm -fr verbatim.h *.tmp

sed(1) script:

s/\\/\\\\/g
s/"/\\"/g
s/	/\\t/g

$!s/^\(.*\)$/	"\1\\n" \\/
$s/^\(.*\)$/	"\1\\n"/

Output )
Приняты следующие дизайнерские решения относительно автоматического генератора симуляторов систем взаимодействия (см. "Анонс нового языка программирования"). Некоторые детали проектной документации подлежат уточнению позднее.

Определения

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

typedef struct {
  void *type;
  int index;
  void *aux[INAUXLEN];
} inagent;

extern const struct insign {
  void *offline;
  void *wire;
  void *type1;
  void *type2;
  ...
} insign;


Проект

1. Компилятор генерирует симулятор на языке ISO/IEC 9899:1999 за конечное время. Симулятор имеет один общий стек для всех активных пар. Симулятор предоставляет интерфейс приложению для проталкивания в вершину стека: void inpush(inagent *left, inagent *right). Только сам симулятор выталкивает вершину стека. Симулятор предоставляет интерфейс к запуску взаимодействия: void interact(void). Возврат из функции interact() происходит по достижении дна стека активных пар.

2. Симулятор вызывает внешнюю функцию inagent *inaux(void *aux, void *offline), определяемую приложением, чтобы получить ячейку, связанную своим главным портом с дополнительным портом aux. Значение аргумента берется только из массива aux в структуре inagent одного из агентов активной пары только на вершине стека. Симулятор не предполагает какой-либо структуры по адресу aux, никогда не разыменовывает его и использует аргумент функции inaux() исключительно в качестве идентификатора. Приложение полностью решает само, какой характер носит значение aux. Симулятор никогда не сохраняет возвращаемое значение функции и только копирует данные из памяти по этому адресу.

3. Сигнатура insign содержит поля offline, wire, type1, type2..., где type1, type2... - различные имена, участвующие в описании системы взаимодействия в виде \type1, \type2... Всем полям структуры insign присвоены различные целые значения. Если в описании системы взаимодействия участвует имя \offline, \wire или \special, где special - ключевое или зарезервированное слово ISO/IEC 9899:1999, результат компиляции неопределен.

4. Приложение определяет каждую связь между двумя дополнительными портами с порядковыми номерами a и b произвольных inagent alpha и inagent beta, соответственно, такой парой структур inagent left и inagent right, что insign.wire == left.type, insign.wire == right.type, left == right.aux[0], right == left.aux[0], left == alpha.aux[a] и right == beta.aux[b]. Если wire1 и wire2 - идентификаторы этих двух структур, то после вызова inaux(wire1, offline) симулятор ожидает, что последующий вызов inaux(wire2, unused) вернет указатель на такую структуру inagent agent, что agent.type == insign.offline и agent.aux[0] == offline. Если в описании одного правила имя соединения между двумя дополнительными портами используется один или более двух раз, результат компиляции неопределен.

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

Обоснование )

Интерфейс к симуляторам систем взаимодействия выбран по аналогии с теми в IEEE 1003.1-2008, что между утилитой yacc и приложениями, в том числе генерируемыми с помощью утилиты lex (см. "Interface to the Lexical Analyzer").
Чтобы упростить разработку симулятора нашей системы слепой перезаписи графов, мы подготовили проект нового языка программирования на основе нотации Lafont с описанием побочных действий на языке Си. По аналогии с yacc(1) и lex(1) выходными данными нашего компилятора будет модуль на языке Си. Синтаксис нашего языка программирования выбран близким к тому, как записываются правила взаимодействия в LaTeX.

    1 text: '$' CODE '$' rest

    2 rest: rule ';' rest
    3     | rule '.'

    4 rule: side CODE side

    5 side: cell
    6     | cell '[' list ']'

    7 tree: leaf
    8     | cell '(' list ')'

    9 list: tree
   10     | tree ',' list

   11 leaf: cell
   12     | NAME

   13 cell: '\\' NAME
   14     | '\\' NAME '_' CODE

Ниже пример программы на этом языке. Как видно по данному "Hello World", программы похожи по структуре к описанию парсеров и лексических анализаторов на yacc(1) и lex(1), с помощью которых и будет реализован компилятор нашего языка.

${
/* An example interaction system. */

#include <stdio.h>
}$

\fan_{i}[x, y] {
	printf("fan_%d >< fan_%d\n", i, j);
} \fan_{i}[x, y];

\fan_{i}[\fan_{i + j}(a, b), \fan_{i + j}(c, d)] {
	IFF(i != j);
	printf("fan_%d >< fan_%d\n", i, j);
} \fan_{j}[\fan_{i + j}(a, c), \fan_{i + j}(b, d)];

\erase {
	printf("erase >< fan_%d\n", j);
} \fan_{j}[\erase, \erase];

\erase {
	printf("erase >< erase\n");
} \erase.

https://github.com/codedot/inet
Ранее мы обозначили проблему декодирования результатов работы нашей системы (см. "Компиляция λ-выражений"). Это не новая проблема: "readback" известен своей сложностью в рамках темы оптимальной редукции, и едва ли не треть монографии на данной теме уделена "readback". Чтобы продолжить разработку нашего симулятора, нам потребуется разумное решение, которое бы подходило для нашей слепой стековой машины.

Напомним, что ранее мы ограничили множество λ-термов до λI-исчисления, чтобы упростить их компиляцию. Взамен мы получили право забыть об агентах ε, при этом не пожертвовав выразительными возможностями языка с точки зрения частичных рекурсивных функций. Теперь же мы дополнительно затребуем от вычисляемых выражений отсутствие свободных переменных. Это немного упростит "readback", избавив нас от рассмотрения особых случаев.

Итак, мы предполагаем некоторый λΙ-комбинатор. Головная нормальная форма λI-комбинатора всегда имеет вид λx1.…λxn.xi M1 … Mm, где m ≥ 0, n > 0, 0 < i < n. С точки зрения представлений в виде графов, подобных оптимальной редукции, - в том числе и в нашей системе слепой перезаписи - это, в частности, означает, что при условии наличия головной нормальной формы (в противном случае результат нас не интересует из-за бессмысленности выражения) становится возможным "readback" в виде следующей системы взаимодействия с побочными действиями:

Σ = {(ε, 0), (γ, 2), (ψ, 2), (c, 1), (@l, 2), (@r, 2)} ∪ {(xi, 0) | i ∈ N} ∪ {(λi, 1) | i ∈ N};

λii(ε)] >< xj + "xj";
λi[a] >< γ[λi + 1(c(a)), xi] + "(λxi.";
xi >< ψ[xi, xi];
xi >< γ[a, @l(xi, a)];
λ[a] >< @l[λ(@r(b, a)), b] + "(";
λ[a] >< c[λ(a)] + ")";
λ[ε] >< @r[λ(c(a)), a] + " ".

Нетрудно проверить, что такое "readback"-взаимодействие не зависит от симуляции основной системы. Таким образом, выполнять "readback" можно даже по мере редукции, не дожидаясь ее завершения.
Page generated Nov. 25th, 2025 01:24 pm
Powered by Dreamwidth Studios