@fraczak/k 7.0.2 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/DOCS/FILE_FORMATS.md +238 -15
  3. package/DOCS/POLYMORPHIC_IR.md +104 -0
  4. package/JOURNAL.md +288 -0
  5. package/README.md +10 -2
  6. package/access-table.mjs +343 -0
  7. package/backend-api.mjs +18 -0
  8. package/backends/llvm/README.md +20 -21
  9. package/backends/llvm/bin/k-llvm-build.mjs +105 -32
  10. package/backends/llvm/bin/k-llvm-compile.mjs +63 -24
  11. package/backends/llvm/bin/k-llvm.mjs +292 -0
  12. package/backends/llvm/runtime/krt.c +8 -0
  13. package/backends/llvm/runtime/krt.h +1 -0
  14. package/backends/llvm/src/cli.mjs +95 -17
  15. package/backends/llvm/src/executable.mjs +128 -11
  16. package/backends/llvm/src/kvm2llvm.mjs +10 -5
  17. package/backends/llvm/src/llvm.mjs +121 -9
  18. package/backends/llvm/tests/integration.sh +11 -11
  19. package/backends/llvm/{bin → tests}/k-llvm-run.mjs +48 -22
  20. package/backends/llvm/tests/perf-support.mjs +24 -3
  21. package/backends/llvm/tests/test-llvm.mjs +22 -1
  22. package/backends/wasm/bin/k-wasm-compile.mjs +46 -20
  23. package/backends/wasm/bin/k-wasm-run.mjs +61 -20
  24. package/backends/wasm/bin/k-wasm.mjs +47 -13
  25. package/backends/wasm/src/cli.mjs +141 -19
  26. package/backends/wasm/src/wasm.mjs +130 -23
  27. package/browser/repl-browser.mjs +16 -5
  28. package/codecs/k-parse.mjs +29 -8
  29. package/codecs/k-print.mjs +22 -6
  30. package/codecs/runtime/codec-sdk.mjs +8 -4
  31. package/codecs/show.mjs +20 -6
  32. package/k.mjs +56 -16
  33. package/kir.mjs +58 -19
  34. package/kvm.mjs +49 -12
  35. package/objects/compile.mjs +37 -23
  36. package/objects/decompile.mjs +40 -10
  37. package/objects/extract-aliases.mjs +44 -14
  38. package/objects/inspect.mjs +19 -14
  39. package/objects/validate.mjs +18 -11
  40. package/package.json +10 -3
  41. package/pkir.mjs +772 -0
  42. package/repl.mjs +36 -18
  43. package/scripts/build-repl-html.mjs +14 -2
  44. package/scripts/perf-ieee.mjs +264 -13
  45. package/scripts/perf-int.mjs +315 -22
  46. package/scripts/perf-multiplication.mjs +58 -7
  47. package/scripts/perf-poly.mjs +306 -24
  48. package/scripts/run-tests.mjs +3 -0
  49. package/tests/test-access-table.mjs +213 -0
  50. package/tests/test-pkir.mjs +530 -0
  51. package/tests/test-polymorphic-tdd.mjs +196 -0
  52. package/tests/test-repl-html.mjs +15 -2
  53. package/tests/test-repl.mjs +30 -1
  54. package/backends/llvm/bin/k-llvm-jit.mjs +0 -160
@@ -6,20 +6,26 @@ import { decodeObject } from "../object.mjs";
6
6
  import { objectToKIRP } from "../kir.mjs";
7
7
 
8
8
  function helpText() {
9
+ const prog = argv[1] || "inspect.mjs";
9
10
  return [
10
11
  "Inspect a k .ko or .klib object.",
11
12
  "",
12
- `Usage: ${argv[1]} [options] [object-file]`,
13
+ `Usage: ${prog} [options] [object-file]`,
13
14
  "",
14
15
  "Arguments:",
15
- " object-file Input .ko or .klib file. Reads from stdin when omitted.",
16
+ " object-file Input .ko or .klib file (default: stdin).",
16
17
  "",
17
18
  "Options:",
18
19
  " --kir Print the KIR-P JSON view.",
19
- " --summary Print a compact section summary. This is the default.",
20
+ " --summary Print a compact section summary (default).",
20
21
  " -h, --help Show this help.",
21
22
  "",
22
- "KIR-P is an inspection/export view; it does not change the stored object format."
23
+ "KIR-P is an inspection/export view; it does not change the stored",
24
+ "object format.",
25
+ "",
26
+ "Examples:",
27
+ ` ${prog} program.ko`,
28
+ ` ${prog} --kir program.ko`
23
29
  ].join("\n");
24
30
  }
25
31
 
@@ -66,22 +72,21 @@ try {
66
72
  }
67
73
 
68
74
  let mode = "summary";
69
- while (args.length > 0 && args[0].startsWith("--")) {
70
- const option = args.shift();
71
- if (option === "--kir") {
75
+ let inputPath = null;
76
+ for (const arg of args) {
77
+ if (arg === "--kir") {
72
78
  mode = "kir";
73
- } else if (option === "--summary") {
79
+ } else if (arg === "--summary") {
74
80
  mode = "summary";
81
+ } else if (arg.startsWith("-")) {
82
+ throw new Error(`Unknown option: ${arg}`);
83
+ } else if (inputPath == null) {
84
+ inputPath = arg;
75
85
  } else {
76
- throw new Error(`Unknown option: ${option}`);
86
+ throw new Error(`Unexpected argument: ${arg}`);
77
87
  }
78
88
  }
79
89
 
80
- const inputPath = args.shift() || null;
81
- if (args.length > 0) {
82
- throw new Error(`Unexpected argument: ${args[0]}`);
83
- }
84
-
85
90
  const buffer = inputPath == null ? await readStdinBytes() : fs.readFileSync(inputPath);
86
91
  const object = decodeObject(buffer);
87
92
  if (mode === "kir") {
@@ -346,19 +346,25 @@ export function validateKIRP(kir) {
346
346
  }
347
347
 
348
348
  function helpText() {
349
+ const prog = argv[1] || "validate.mjs";
349
350
  return [
350
351
  "Validate a k .ko/.klib object or KIR-P JSON file.",
351
352
  "",
352
- `Usage: ${argv[1]} [options] [input-file]`,
353
+ `Usage: ${prog} [options] [input-file]`,
353
354
  "",
354
355
  "Arguments:",
355
- " input-file Input .ko/.klib file, or KIR JSON with --kir. Reads stdin when omitted.",
356
+ " input-file Input .ko/.klib file, or KIR JSON with --kir.",
357
+ " Reads stdin when omitted.",
356
358
  "",
357
359
  "Options:",
358
- " --kir Validate input as KIR-P JSON instead of a k object.",
360
+ " --kir Validate input as KIR-P JSON instead of an object.",
359
361
  " -h, --help Show this help.",
360
362
  "",
361
- "Object validation also validates the derived KIR-P export view."
363
+ "Object validation also validates the derived KIR-P export view.",
364
+ "",
365
+ "Examples:",
366
+ ` ${prog} program.ko`,
367
+ ` ${prog} --kir program.kir.json`
362
368
  ].join("\n");
363
369
  }
364
370
 
@@ -382,18 +388,19 @@ async function main() {
382
388
  }
383
389
 
384
390
  let mode = "object";
385
- while (args.length > 0 && args[0].startsWith("--")) {
386
- const option = args.shift();
387
- if (option === "--kir") {
391
+ let inputPath = null;
392
+ for (const arg of args) {
393
+ if (arg === "--kir") {
388
394
  mode = "kir";
395
+ } else if (arg.startsWith("-")) {
396
+ throw new Error(`Unknown option: ${arg}`);
397
+ } else if (inputPath == null) {
398
+ inputPath = arg;
389
399
  } else {
390
- throw new Error(`Unknown option: ${option}`);
400
+ throw new Error(`Unexpected argument: ${arg}`);
391
401
  }
392
402
  }
393
403
 
394
- const inputPath = args.shift() || null;
395
- if (args.length > 0) throw new Error(`Unexpected argument: ${args[0]}`);
396
-
397
404
  const input = inputPath == null ? await readStdinBytes() : fs.readFileSync(inputPath);
398
405
  if (mode === "kir") {
399
406
  validateKIRP(JSON.parse(input.toString("utf8")));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fraczak/k",
3
- "version": "7.0.2",
3
+ "version": "7.1.0",
4
4
  "description": "k — a language for content-addressable schemas and data transformations over algebraic data types (products and tagged unions); includes runtime, contract derivation, REPL, and codec toolchain",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -21,9 +21,17 @@
21
21
  "benchmark:html": "node scripts/render-benchmark.mjs",
22
22
  "perf:ieee": "node scripts/perf-ieee.mjs",
23
23
  "perf:ieee:full": "node scripts/perf-ieee.mjs --full",
24
+ "perf:ieee:pkir": "BACKENDS=pkir node scripts/perf-ieee.mjs",
25
+ "perf:ieee:llvm-pkir": "BACKENDS=llvm-pkir node scripts/perf-ieee.mjs",
24
26
  "perf:int": "node scripts/perf-int.mjs",
27
+ "perf:int:pkir": "BACKENDS=pkir node scripts/perf-int.mjs",
28
+ "perf:int:llvm-pkir": "BACKENDS=llvm-pkir node scripts/perf-int.mjs",
25
29
  "perf:mult": "node scripts/perf-multiplication.mjs",
30
+ "perf:mult:pkir": "node scripts/perf-multiplication.mjs --backends pkir",
31
+ "perf:mult:llvm-pkir": "node scripts/perf-multiplication.mjs --backends llvm-pkir",
26
32
  "perf:poly": "node scripts/perf-poly.mjs",
33
+ "perf:poly:pkir": "BACKENDS=pkir node scripts/perf-poly.mjs",
34
+ "perf:poly:llvm-pkir": "BACKENDS=llvm-pkir node scripts/perf-poly.mjs",
27
35
  "perf:poly:trace": "node scripts/perf-poly.mjs --trace",
28
36
  "perf:idempotency": "node scripts/benchmark-idempotency.mjs",
29
37
  "deps:graph": "node scripts/generate-dependency-graph.mjs",
@@ -44,10 +52,9 @@
44
52
  "k-inspect-object": "objects/inspect.mjs",
45
53
  "k-validate-object": "objects/validate.mjs",
46
54
  "k-kir": "kir.mjs",
55
+ "k-llvm": "backends/llvm/bin/k-llvm.mjs",
47
56
  "k-llvm-build": "backends/llvm/bin/k-llvm-build.mjs",
48
57
  "k-llvm-compile": "backends/llvm/bin/k-llvm-compile.mjs",
49
- "k-llvm-jit": "backends/llvm/bin/k-llvm-jit.mjs",
50
- "k-llvm-run": "backends/llvm/bin/k-llvm-run.mjs",
51
58
  "k-wasm": "backends/wasm/bin/k-wasm.mjs",
52
59
  "k-wasm-compile": "backends/wasm/bin/k-wasm-compile.mjs",
53
60
  "k-wasm-run": "backends/wasm/bin/k-wasm-run.mjs",